signed applet w praktyce



W poprzednim poście przedstawiłem sposób cyfrowego podpisywania apletów, który umożliwia min. operacje na plikach po stronie klienta. Tym razem skupię się bardziej na praktycznym aspekcie tego zagadnienia. Poniżej pokazałem przykład prostego apletu, który wczytuje obrazek z dysku, a następnie zapisuje odpowiednio wykadrowany obraz we wskazanej lokalizacji. Do tworzenia GUI wykorzystałem bibliotekę controlP5. Kod utworzony oczywiście w języku processing.

Oto kod apletu:
import controlP5.*;
ControlP5 controlP5;
ControlFont font;
PImage img,backgroundImage;
String imgName;
int colorR = 0;
int colorG = 51;
int colorB = 51;

int imgX = 5;
int imgY = 55;

void setup() {
  size(640,480);
  smooth();
  frameRate(30);
  controlP5 = new ControlP5(this);
  controlP5.Button but1,but2;
  but1 = controlP5.addButton("Load",1,100,20,45,20);
  but2 = controlP5.addButton("Save",2,100,50,45,20);
  but1.setColorActive(color(255,50,0,200));
  but1.setColorBackground(color(51,51,51)); 
  but2.setColorActive(color(255,50,0,200));
  but2.setColorBackground(color(51,51,51)); 
  controlP5.addSlider("R",0,255,10,100,80,100,10);
  controlP5.addSlider("G",0,255,10,100,100,100,10);
  controlP5.addSlider("B",0,255,10,100,120,100,10);
  imageMode(CENTER);
}

void draw() {
  background(color(colorR,colorG,colorB));
  if ( img!= null ) {
    if ((mousePressed == true) && (mouseX > 250)) {
      imgX = mouseX;
      imgY = mouseY;
    }
    image(img, imgX,imgY);
  }
}

public void Load(int theValue) {
  imgName = selectInput();
  if ( imgName!= null ) {
    imgName = imgName.replaceAll("\\\\","\\\\\\\\");
    img = loadImage(imgName);
  }
}
public void Save(int theValue) {
  String savePath;
  if ( imgName!= null ) {
    savePath = selectOutput(); 
    if (savePath == null) {
       println("No output file was selected...");
    } else {
      PImage newImg = get();
      newImg.save(savePath);
    }
  }
}

public void R(int theValue) {
  colorR = theValue;
}
public void G(int theValue) {
  colorG = theValue;
}
public void B(int theValue) {
  colorB = theValue;
}

Export kodu w IDE utworzył katalog applet w katalogu projektu, w którym znalazły się trzy pliki jar. Wszystkie pliki należy cyfrowo podpisać narzędziem jarsigner. Zastanawiałem się przez chwilę, czy istnieje możliwość połączenia wszystkich plików do jednego pliku .jar i podpisania tylko tego jednego pliku? Próbowałem utworzyć nowe archiwum poleceniem jar -cf... oraz zmodyfikować jeden z plików, dołączając do niego dwa pozostałe. Oba sposoby niestety zakończyły się niepowodzeniem. Właściwym okazało się to rozwiązanie.

Na załączonym poniżej filmiku przedstawiłem działanie niepodpisanego cyfrowo apletu oraz podpisanego. W przypadku tego drugiego wystarczy potwierdzić certyfikat i dostęp do plików jest odblokowany.


Komentarze