From a4f1f411ef60a0f9311585ce1118850fe2151b84 Mon Sep 17 00:00:00 2001 From: Jehan Monnier Date: Tue, 5 Mar 2013 16:35:40 +0100 Subject: [PATCH] full LinphoneAuthInfo impl for Android --- coreapi/authentication.c | 28 +++ coreapi/linphonecore.h | 4 + coreapi/linphonecore_jni.cc | 159 +++++++++++++++--- .../org/linphone/core/LinphoneAuthInfo.java | 20 +++ .../linphone/core/LinphoneCoreFactory.java | 10 ++ .../linphone/core/LinphoneAuthInfoImpl.java | 58 +++++-- .../core/LinphoneCoreFactoryImpl.java | 6 + 7 files changed, 250 insertions(+), 35 deletions(-) diff --git a/coreapi/authentication.c b/coreapi/authentication.c index 4b5d10fa..8ab1c21f 100644 --- a/coreapi/authentication.c +++ b/coreapi/authentication.c @@ -80,6 +80,13 @@ const char *linphone_auth_info_get_userid(const LinphoneAuthInfo *i){ return i->userid; } +const char *linphone_auth_info_get_realm(const LinphoneAuthInfo *i){ + return i->realm; +} +const char *linphone_auth_info_get_ha1(const LinphoneAuthInfo *i){ + return i->ha1; +} + /** * Sets the password. **/ @@ -113,6 +120,27 @@ void linphone_auth_info_set_userid(LinphoneAuthInfo *info, const char *userid){ if (userid && strlen(userid)>0) info->userid=ms_strdup(userid); } +/** + * Sets realm. +**/ +void linphone_auth_info_set_realm(LinphoneAuthInfo *info, const char *realm){ + if (info->realm){ + ms_free(info->realm); + info->realm=NULL; + } + if (realm && strlen(realm)>0) info->realm=ms_strdup(realm); +} +/** + * Sets ha1. +**/ +void linphone_auth_info_set_ha1(LinphoneAuthInfo *info, const char *ha1){ + if (info->ha1){ + ms_free(info->ha1); + info->ha1=NULL; + } + if (ha1 && strlen(ha1)>0) info->ha1=ms_strdup(ha1); +} + /** * Destroys a LinphoneAuthInfo object. **/ diff --git a/coreapi/linphonecore.h b/coreapi/linphonecore.h index 7212f26c..de8a05af 100644 --- a/coreapi/linphonecore.h +++ b/coreapi/linphonecore.h @@ -617,10 +617,14 @@ LinphoneAuthInfo *linphone_auth_info_new(const char *username, const char *useri void linphone_auth_info_set_passwd(LinphoneAuthInfo *info, const char *passwd); void linphone_auth_info_set_username(LinphoneAuthInfo *info, const char *username); void linphone_auth_info_set_userid(LinphoneAuthInfo *info, const char *userid); +void linphone_auth_info_set_realm(LinphoneAuthInfo *info, const char *realm); +void linphone_auth_info_set_ha1(LinphoneAuthInfo *info, const char *ha1); const char *linphone_auth_info_get_username(const LinphoneAuthInfo *i); const char *linphone_auth_info_get_passwd(const LinphoneAuthInfo *i); const char *linphone_auth_info_get_userid(const LinphoneAuthInfo *i); +const char *linphone_auth_info_get_realm(const LinphoneAuthInfo *i); +const char *linphone_auth_info_get_ha1(const LinphoneAuthInfo *i); /* you don't need those function*/ void linphone_auth_info_destroy(LinphoneAuthInfo *info); diff --git a/coreapi/linphonecore_jni.cc b/coreapi/linphonecore_jni.cc index 57ab7c4c..6b6c3f5c 100644 --- a/coreapi/linphonecore_jni.cc +++ b/coreapi/linphonecore_jni.cc @@ -1187,33 +1187,150 @@ extern "C" jboolean Java_org_linphone_core_LinphoneProxyConfigImpl_publishEnable //Auth Info extern "C" jlong Java_org_linphone_core_LinphoneAuthInfoImpl_newLinphoneAuthInfo(JNIEnv* env - , jobject thiz - , jstring jusername - , jstring juserid - , jstring jpassword - , jstring jha1 - , jstring jrealm) { - - const char* username = env->GetStringUTFChars(jusername, NULL); - const char* userid = env->GetStringUTFChars(juserid, NULL); - const char* password = env->GetStringUTFChars(jpassword, NULL); - const char* ha1 = env->GetStringUTFChars(jha1, NULL); - const char* realm = env->GetStringUTFChars(jrealm, NULL); - jlong auth = (jlong)linphone_auth_info_new(username,userid,password,ha1,realm); - - env->ReleaseStringUTFChars(jusername, username); - env->ReleaseStringUTFChars(juserid, userid); - env->ReleaseStringUTFChars(jpassword, password); - env->ReleaseStringUTFChars(jha1, ha1); - env->ReleaseStringUTFChars(jrealm, realm); - return auth; - + , jobject thiz ) { + return (jlong)linphone_auth_info_new(NULL,NULL,NULL,NULL,NULL); } extern "C" void Java_org_linphone_core_LinphoneAuthInfoImpl_delete(JNIEnv* env , jobject thiz , jlong ptr) { linphone_auth_info_destroy((LinphoneAuthInfo*)ptr); } +/* + * Class: org_linphone_core_LinphoneAuthInfoImpl + * Method: getPassword + * Signature: (J)Ljava/lang/String; + */ +JNIEXPORT jstring JNICALL Java_org_linphone_core_LinphoneAuthInfoImpl_getPassword +(JNIEnv *env , jobject, jlong auth_info) { + const char* passwd = linphone_auth_info_get_passwd((LinphoneAuthInfo*)auth_info); + if (passwd) { + return env->NewStringUTF(passwd); + } else { + return NULL; + } + +} +/* + * Class: org_linphone_core_LinphoneAuthInfoImpl + * Method: getRealm + * Signature: (J)Ljava/lang/String; + */ +JNIEXPORT jstring JNICALL Java_org_linphone_core_LinphoneAuthInfoImpl_getRealm +(JNIEnv *env , jobject, jlong auth_info) { + const char* realm = linphone_auth_info_get_realm((LinphoneAuthInfo*)auth_info); + if (realm) { + return env->NewStringUTF(realm); + } else { + return NULL; + } + +} + +/* + * Class: org_linphone_core_LinphoneAuthInfoImpl + * Method: getUsername + * Signature: (J)Ljava/lang/String; + */ +JNIEXPORT jstring JNICALL Java_org_linphone_core_LinphoneAuthInfoImpl_getUsername +(JNIEnv *env , jobject, jlong auth_info) { + const char* username = linphone_auth_info_get_username((LinphoneAuthInfo*)auth_info); + if (username) { + return env->NewStringUTF(username); + } else { + return NULL; + } +} + +/* + * Class: org_linphone_core_LinphoneAuthInfoImpl + * Method: setPassword + * Signature: (JLjava/lang/String;)V + */ +JNIEXPORT void JNICALL Java_org_linphone_core_LinphoneAuthInfoImpl_setPassword +(JNIEnv *env, jobject, jlong auth_info, jstring jpassword) { + const char* password = jpassword?env->GetStringUTFChars(jpassword, NULL):NULL; + linphone_auth_info_set_passwd((LinphoneAuthInfo*)auth_info,password); + if (password) env->ReleaseStringUTFChars(jpassword, password); +} + +/* + * Class: org_linphone_core_LinphoneAuthInfoImpl + * Method: setRealm + * Signature: (JLjava/lang/String;)V + */ +JNIEXPORT void JNICALL Java_org_linphone_core_LinphoneAuthInfoImpl_setRealm +(JNIEnv *env, jobject, jlong auth_info, jstring jrealm) { + const char* realm = jrealm?env->GetStringUTFChars(jrealm, NULL):NULL; + linphone_auth_info_set_realm((LinphoneAuthInfo*)auth_info,realm); + if (realm) env->ReleaseStringUTFChars(jrealm, realm); +} +/* + * Class: org_linphone_core_LinphoneAuthInfoImpl + * Method: setUsername + * Signature: (JLjava/lang/String;)V + */ +JNIEXPORT void JNICALL Java_org_linphone_core_LinphoneAuthInfoImpl_setUsername +(JNIEnv *env, jobject, jlong auth_info, jstring jusername) { + const char* username = jusername?env->GetStringUTFChars(jusername, NULL):NULL; + linphone_auth_info_set_username((LinphoneAuthInfo*)auth_info,username); + if (username) env->ReleaseStringUTFChars(jusername, username); +} + +/* + * Class: org_linphone_core_LinphoneAuthInfoImpl + * Method: setAuthUserId + * Signature: (JLjava/lang/String;)V + */ +JNIEXPORT void JNICALL Java_org_linphone_core_LinphoneAuthInfoImpl_setUserId +(JNIEnv *env, jobject, jlong auth_info, jstring juserid) { + const char* userid = juserid?env->GetStringUTFChars(juserid, NULL):NULL; + linphone_auth_info_set_userid((LinphoneAuthInfo*)auth_info,userid); + if (userid) env->ReleaseStringUTFChars(juserid, userid); +} + +/* + * Class: org_linphone_core_LinphoneAuthInfoImpl + * Method: getAuthUserId + * Signature: (J)Ljava/lang/String; + */ +JNIEXPORT jstring JNICALL Java_org_linphone_core_LinphoneAuthInfoImpl_getUserId +(JNIEnv *env , jobject, jlong auth_info) { + const char* userid = linphone_auth_info_get_userid((LinphoneAuthInfo*)auth_info); + if (userid) { + return env->NewStringUTF(userid); + } else { + return NULL; + } +} + +/* + * Class: org_linphone_core_LinphoneAuthInfoImpl + * Method: setHa1 + * Signature: (JLjava/lang/String;)V + */ +JNIEXPORT void JNICALL Java_org_linphone_core_LinphoneAuthInfoImpl_setHa1 +(JNIEnv *env, jobject, jlong auth_info, jstring jha1) { + const char* ha1 = jha1?env->GetStringUTFChars(jha1, NULL):NULL; + linphone_auth_info_set_ha1((LinphoneAuthInfo*)auth_info,ha1); + if (ha1) env->ReleaseStringUTFChars(jha1, ha1); +} + + +/* + * Class: org_linphone_core_LinphoneAuthInfoImpl + * Method: getHa1 + * Signature: (J)Ljava/lang/String; + */ +JNIEXPORT jstring JNICALL Java_org_linphone_core_LinphoneAuthInfoImpl_getHa1 +(JNIEnv *env , jobject, jlong auth_info) { + const char* ha1 = linphone_auth_info_get_ha1((LinphoneAuthInfo*)auth_info); + if (ha1) { + return env->NewStringUTF(ha1); + } else { + return NULL; + } +} + //LinphoneAddress diff --git a/java/common/org/linphone/core/LinphoneAuthInfo.java b/java/common/org/linphone/core/LinphoneAuthInfo.java index 6590dafe..ed8a8401 100644 --- a/java/common/org/linphone/core/LinphoneAuthInfo.java +++ b/java/common/org/linphone/core/LinphoneAuthInfo.java @@ -63,6 +63,26 @@ public interface LinphoneAuthInfo { * @param realm */ void setRealm(String realm); + /** + * get auth userid has used in authentication header. If null, username is taken for authentication + * @return auth userid + */ + String getUserId(); + /** + * set auth userid has used in authentication header. If null, username is taken for authentication + * + */ + void setUserId(String userid); + /** + * get ha1 + * @return ha1 + */ + String getHa1(); + /** + * set ha1 + */ + void setHa1(String ha1); + } diff --git a/java/common/org/linphone/core/LinphoneCoreFactory.java b/java/common/org/linphone/core/LinphoneCoreFactory.java index 399b9ec8..ea325057 100644 --- a/java/common/org/linphone/core/LinphoneCoreFactory.java +++ b/java/common/org/linphone/core/LinphoneCoreFactory.java @@ -49,10 +49,20 @@ abstract public class LinphoneCoreFactory { return theLinphoneCoreFactory; } abstract public LinphoneAuthInfo createAuthInfo(String username,String password, String realm); + /** + * create {@link LinphoneAuthInfo} + * @param username + * @param userid user id as set in auth header + * @param passwd + * @param ha1 + * @param realm + * */ + abstract public LinphoneAuthInfo createAuthInfo(String username, String userid, String passwd, String ha1,String realm); abstract public LinphoneCore createLinphoneCore(LinphoneCoreListener listener, String userConfig,String factoryConfig,Object userdata) throws LinphoneCoreException; abstract public LinphoneCore createLinphoneCore(LinphoneCoreListener listener) throws LinphoneCoreException; + /** * Constructs a LinphoneAddress object * @param username diff --git a/java/impl/org/linphone/core/LinphoneAuthInfoImpl.java b/java/impl/org/linphone/core/LinphoneAuthInfoImpl.java index 45fd8a45..dee96fe5 100644 --- a/java/impl/org/linphone/core/LinphoneAuthInfoImpl.java +++ b/java/impl/org/linphone/core/LinphoneAuthInfoImpl.java @@ -20,36 +20,66 @@ package org.linphone.core; class LinphoneAuthInfoImpl implements LinphoneAuthInfo { protected final long nativePtr; - private native long newLinphoneAuthInfo(String username, String userid, String passwd, String ha1,String realm); + private native long newLinphoneAuthInfo(); private native void delete(long ptr); + private native String getPassword(long ptr); + private native String getRealm(long ptr); + private native String getUsername(long ptr); + private native void setPassword(long ptr, String password); + private native void setRealm(long ptr, String realm); + private native void setUsername(long ptr, String username); + private native void setUserId(long ptr, String username); + private native void setHa1(long ptr, String ha1); + private native String getUserId(long ptr); + private native String getHa1(long ptr); + protected LinphoneAuthInfoImpl(String username,String password, String realm) { - nativePtr = newLinphoneAuthInfo(username,"",password,"",""); + this(username,null,password,null,null); + } + protected LinphoneAuthInfoImpl(String username, String userid, String passwd, String ha1,String realm) { + nativePtr = newLinphoneAuthInfo(); + this.setUsername(username); + this.setUserId(userid); + this.setPassword(passwd); + this.setHa1(ha1); } protected void finalize() throws Throwable { delete(nativePtr); } public String getPassword() { - // TODO Auto-generated method stub - throw new RuntimeException("not implemeneted yet"); + return getPassword (nativePtr); } public String getRealm() { - // TODO Auto-generated method stub - throw new RuntimeException("not implemeneted yet"); + return getRealm (nativePtr); } public String getUsername() { - // TODO Auto-generated method stub - throw new RuntimeException("not implemeneted yet"); + return getUsername (nativePtr); } public void setPassword(String password) { - // TODO Auto-generated method stub - throw new RuntimeException("not implemeneted yet"); + setPassword(nativePtr,password); } public void setRealm(String realm) { - // TODO Auto-generated method stub - throw new RuntimeException("not implemeneted yet"); + setRealm(nativePtr,realm); } public void setUsername(String username) { - // TODO Auto-generated method stub - throw new RuntimeException("not implemeneted yet"); + setUsername(nativePtr,username); + } + @Override + public String getUserId() { + return getUserId(nativePtr); + } + @Override + public void setUserId(String userid) { + setUserId(nativePtr,userid); + + } + @Override + public String getHa1() { + return getHa1(nativePtr); + } + @Override + public void setHa1(String ha1) { + setHa1(nativePtr,ha1); + } } diff --git a/java/impl/org/linphone/core/LinphoneCoreFactoryImpl.java b/java/impl/org/linphone/core/LinphoneCoreFactoryImpl.java index 2e5c4cf5..7b21ecaa 100644 --- a/java/impl/org/linphone/core/LinphoneCoreFactoryImpl.java +++ b/java/impl/org/linphone/core/LinphoneCoreFactoryImpl.java @@ -166,4 +166,10 @@ public class LinphoneCoreFactoryImpl extends LinphoneCoreFactory { { return System.getProperty("os.arch").contains("armv7"); } + + @Override + public LinphoneAuthInfo createAuthInfo(String username, String userid, + String passwd, String ha1, String realm) { + return new LinphoneAuthInfoImpl(username,userid,passwd,ha1,realm); + } } -- 2.39.2