so fertig.
Wenn Du magst, kannst Du dir das in ein Eclipse Projekt tun und das mal ausprobieren.
Morgen schreib ich dann, warum das eindeutig ein Hack, aber trotzdem aus meiner Sicht für diesen Fall absolut i.O. ist.
Welche Notes-Version benutzt ihr eigentlich? Für Notes7 müssten da ein paar Schmankerl geringfügig geändert werden.
Mein Vorschlag:
package test;
import java.awt.image.BufferedImage;
import java.io.BufferedOutputStream;
import java.io.ByteArrayOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.lang.reflect.Field;
import java.util.Locale;
import javax.imageio.ImageIO;
import com.octo.captcha.image.gimpy.Gimpy;
import com.octo.captcha.service.captchastore.FastHashMapCaptchaStore;
import com.octo.captcha.service.image.DefaultManageableImageCaptchaService;
public class NewTest {
private static String BASE_VERZEICHNIS_FUER_BILDER = "/Users/axeljanssen/";
public static void main(String args[]) {
String id = "1";
DefaultManageableImageCaptchaService instance = new DefaultManageableImageCaptchaService();
ByteArrayOutputStream imgOutputStream = new ByteArrayOutputStream();
BufferedImage im = instance.getImageChallengeForID(id, Locale.GERMAN);
BufferedOutputStream fous = null;
try {
Class clazz = instance.getClass().getSuperclass().getSuperclass()
.getSuperclass();
System.out.println(instance.getClass().getSuperclass()
.getSuperclass().getSuperclass().getName()); // SEHR HACK!!!
// for (Field field : clazz.getDeclaredFields()) {
// System.out.println("field:" + field.getName() + ":" +
// field.getClass().getName());
// }
Field firstDoor = clazz.getDeclaredField("store");
firstDoor.setAccessible(true); // hä hä
FastHashMapCaptchaStore firstDoorOpen = (FastHashMapCaptchaStore) firstDoor
.get(instance);
Gimpy gimpy = (Gimpy) firstDoorOpen.getCaptcha(id);
Class <Gimpy>clazz2 = (Class<Gimpy>) gimpy.getClass();
Field secondDoor = clazz2.getDeclaredField("response");
secondDoor.setAccessible(true);
String rattenTanzenInDerSpeisekammer = (String) secondDoor
.get(gimpy);
System.out.println("DER CAPTCHA TEXT IST:" + rattenTanzenInDerSpeisekammer);
// System.out.println("rattenTanzenInDerSpeisekammer=" +
// rattenTanzenInDerSpeisekammer);
} catch (Exception e1) {
e1.printStackTrace();
System.out.println("ECHTER ALARM");
}
try {
ImageIO.write(im, "png", imgOutputStream);
byte[] captchaBytes = imgOutputStream.toByteArray();
fous = new BufferedOutputStream(new FileOutputStream(
BASE_VERZEICHNIS_FUER_BILDER + id + ".png"));
System.out.println("Bild wurde gespeichert in:" + BASE_VERZEICHNIS_FUER_BILDER + id + ".png");
fous.write(captchaBytes);
fous.flush();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
if (fous != null) {
try {
fous.close();
} catch (IOException e) {
// Exception verschlucken i.O. in tcftc Konstrukt.
}
}
}
}
}
Trotzdem: Danke... Ich habe mal kurz drübergeschaut und bin im Domino auf ein kleines Problem gestossen: Wenn ich den Code von Dir 1:1 in eine Java- Library und einen Agenten übernehme, dann kriege ich einen Sicherheits- Fehler (java.lang.reflect.ReflectPermission suppressAccessChecks). Den kann ich (zum testen) per Eintrag in die java.policy wegkriegen, aber interessant ist es dennoch, weil da eigentlich drin steht:
// Standard extensions get all permissions by default
grant codeBase "file:${java.home}/lib/ext/*" {
permission java.security.AllPermission;
};
und die libs liegen unter /lib/ext.
Ausserdem steht drin:
/ Notes java code gets all permissions
grant codeBase "file:${notes.binary}/*" {
permission java.security.AllPermission;
};
Also wo da die Berechtigung fehlt sehe ich nicht wirklich... Aber zumindest läufts mal...