Updated android API.

This commit is contained in:
Armin Novak 2016-02-05 02:32:47 +01:00
parent 6b406bdcda
commit 80d7d639f7
4 changed files with 112 additions and 35 deletions
client/Android
Studio/freeRDPCore/src/main/java/com/freerdp/freerdpcore
android_freerdp.candroid_jni_callback.c

@ -1066,12 +1066,10 @@ public class SessionActivity extends ActionBarActivity implements
} }
@Override @Override
public boolean OnVerifiyCertificate(String subject, String issuer, public int OnVerifiyCertificate(String commonName, String subject, String issuer, String fingerprint, boolean mismatch) {
String fingerprint) {
// see if global settings says accept all // see if global settings says accept all
if (GlobalSettings.getAcceptAllCertificates()) if (GlobalSettings.getAcceptAllCertificates())
return true; return 0;
// this is where the return code of our dialog will be stored // this is where the return code of our dialog will be stored
callbackDialogResult = false; callbackDialogResult = false;
@ -1095,7 +1093,38 @@ public class SessionActivity extends ActionBarActivity implements
} catch (InterruptedException e) { } catch (InterruptedException e) {
} }
return callbackDialogResult; return callbackDialogResult ? 1 : 0;
}
@Override
public int OnVerifiyChangedCertificate(String commonName, String subject, String issuer, String fingerprint, String oldSubject, String oldIssuer, String oldFingerprint) {
// see if global settings says accept all
if (GlobalSettings.getAcceptAllCertificates())
return 0;
// this is where the return code of our dialog will be stored
callbackDialogResult = false;
// set message
String msg = getResources().getString(
R.string.dlg_msg_verify_certificate);
msg = msg + "\n\nSubject: " + subject + "\nIssuer: " + issuer
+ "\nFingerprint: " + fingerprint;
dlgVerifyCertificate.setMessage(msg);
// start dialog in UI thread
uiHandler.sendMessage(Message.obtain(null, UIHandler.SHOW_DIALOG,
dlgVerifyCertificate));
// wait for result
try {
synchronized (dlgVerifyCertificate) {
dlgVerifyCertificate.wait();
}
} catch (InterruptedException e) {
}
return callbackDialogResult ? 1 : 0;
} }
@Override @Override

@ -89,7 +89,12 @@ public class LibFreeRDP {
boolean OnAuthenticate(StringBuilder username, StringBuilder domain, StringBuilder password); boolean OnAuthenticate(StringBuilder username, StringBuilder domain, StringBuilder password);
boolean OnVerifiyCertificate(String subject, String issuer, String fingerprint); int OnVerifiyCertificate(String commonName, String subject,
String issuer, String fingerprint, boolean mismatch);
int OnVerifiyChangedCertificate(String commonName, String subject,
String issuer, String fingerprint, String oldSubject,
String oldIssuer, String oldFingerprint);
void OnGraphicsUpdate(int x, int y, int width, int height); void OnGraphicsUpdate(int x, int y, int width, int height);
@ -330,14 +335,30 @@ public class LibFreeRDP {
return false; return false;
} }
private static boolean OnVerifyCertificate(int inst, String subject, String issuer, String fingerprint) { private static int OnVerifyCertificate(int inst, String commonName, String subject,
String issuer, String fingerprint, boolean
hostMismatch) {
SessionState s = GlobalApp.getSession(inst); SessionState s = GlobalApp.getSession(inst);
if (s == null) if (s == null)
return false; return 0;
UIEventListener uiEventListener = s.getUIEventListener(); UIEventListener uiEventListener = s.getUIEventListener();
if (uiEventListener != null) if (uiEventListener != null)
return uiEventListener.OnVerifiyCertificate(subject, issuer, fingerprint); return uiEventListener.OnVerifiyCertificate(commonName, subject, issuer, fingerprint,
return false; hostMismatch);
return 0;
}
private static int OnVerifyCertificate(int inst, String commonName, String subject,
String issuer, String fingerprint, String oldSubject,
String oldIssuer, String oldFingerprint) {
SessionState s = GlobalApp.getSession(inst);
if (s == null)
return 0;
UIEventListener uiEventListener = s.getUIEventListener();
if (uiEventListener != null)
return uiEventListener.OnVerifiyChangedCertificate(commonName, subject, issuer,
fingerprint, oldSubject, oldIssuer, oldFingerprint);
return 0;
} }
private static void OnGraphicsUpdate(int inst, int x, int y, int width, int height) { private static void OnGraphicsUpdate(int inst, int x, int y, int width, int height) {

@ -417,37 +417,64 @@ static BOOL android_authenticate(freerdp* instance, char** username,
return ((res == JNI_TRUE) ? TRUE : FALSE); return ((res == JNI_TRUE) ? TRUE : FALSE);
} }
static BOOL android_verify_certificate(freerdp* instance, char* subject, static DWORD android_verify_certificate(
char* issuer, char* fingerprint) freerdp* instance, const char* common_name,
const char* subject, const char* issuer,
const char* fingerprint, BOOL host_mismatch)
{ {
JNIEnv* env; WLog_DBG(TAG, "Certificate details:");
jboolean attached = jni_attach_thread(&env); WLog_DBG(TAG, "\tSubject: %s", subject);
jstring jstr1 = (*env)->NewStringUTF(env, subject); WLog_DBG(TAG, "\tIssuer: %s", issuer);
jstring jstr2 = (*env)->NewStringUTF(env, issuer); WLog_DBG(TAG, "\tThumbprint: %s", fingerprint);
jstring jstr3 = (*env)->NewStringUTF(env, fingerprint); WLog_DBG(TAG, "The above X.509 certificate could not be verified, possibly because you do not have "
jboolean res; "the CA certificate in your certificate store, or the certificate has expired."
"Please look at the documentation on how to create local certificate store for a private CA.\n");
res = freerdp_callback_bool_result( JNIEnv* env;
"OnVerifyCertificate", jboolean attached = jni_attach_thread(&env);
"(ILjava/lang/String;" jstring jstr0 = (*env)->NewStringUTF(env, common_name);
"Ljava/lang/String;" jstring jstr1 = (*env)->NewStringUTF(env, subject);
"Ljava/lang/String;)Z", jstring jstr2 = (*env)->NewStringUTF(env, issuer);
instance, jstr1, jstr2, jstr3); jstring jstr3 = (*env)->NewStringUTF(env, fingerprint);
if (attached == JNI_TRUE) jint res = freerdp_callback_int_result("OnVerifyCertificate",
jni_detach_thread(); "(ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Z)I",
instance, jstr0, jstr1, jstr2, jstr3, host_mismatch);
return ((res == JNI_TRUE) ? TRUE : FALSE); if (attached == JNI_TRUE)
jni_detach_thread();
return res;
} }
static BOOL android_verify_changed_certificate( static DWORD android_verify_changed_certificate(freerdp* instance,
freerdp* instance, char* subject, char* issuer, const char* common_name,
char* new_fingerprint, char* old_subject, const char* subject,
char* old_issuer, char* old_fingerprint) const char* issuer,
const char* new_fingerprint,
const char* old_subject,
const char* old_issuer,
const char* old_fingerprint)
{ {
return android_verify_certificate( JNIEnv* env;
instance, subject, issuer, jboolean attached = jni_attach_thread(&env);
new_fingerprint); jstring jstr0 = (*env)->NewStringUTF(env, common_name);
jstring jstr1 = (*env)->NewStringUTF(env, subject);
jstring jstr2 = (*env)->NewStringUTF(env, issuer);
jstring jstr3 = (*env)->NewStringUTF(env, new_fingerprint);
jstring jstr4 = (*env)->NewStringUTF(env, old_subject);
jstring jstr5 = (*env)->NewStringUTF(env, old_issuer);
jstring jstr6 = (*env)->NewStringUTF(env, old_fingerprint);
jint res = freerdp_callback_int_result("OnVerifyChangedCertificate",
"(ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;"
"Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)I",
instance, jstr0, jstr1, jstr2, jstr3, jstr4, jstr5, jstr6);
if (attached == JNI_TRUE)
jni_detach_thread();
return res;
} }
static void* jni_input_thread(void* arg) static void* jni_input_thread(void* arg)

@ -181,7 +181,7 @@ jint java_callback_int(jobject obj, const char * callback, const char* signature
jint res = -1; jint res = -1;
JNIEnv *env; JNIEnv *env;
DEBUG_ANDROID("java_callback: %s (%s)", callback, signature); WLog_DBG(TAG, "java_callback: %s (%s)", callback, signature);
attached = jni_attach_thread(&env); attached = jni_attach_thread(&env);