static const XP_UCHAR* and_util_getDevID( XW_UtilCtxt* uc, DevIDType* typ ) { const XP_UCHAR* result = NULL; *typ = ID_TYPE_NONE; UTIL_CBK_HEADER( "getDevID", "([B)Ljava/lang/String;" ); jbyteArray jbarr = makeByteArray( env, 1, NULL ); jstring jresult = (*env)->CallObjectMethod( env, util->jutil, mid, jbarr ); if ( NULL != jresult ) { const char* jchars = (*env)->GetStringUTFChars( env, jresult, NULL ); jsize len = (*env)->GetStringUTFLength( env, jresult ); if ( NULL != util->devIDStorage && 0 == XP_MEMCMP( util->devIDStorage, jchars, len ) ) { XP_LOGF( "%s: already have matching devID", __func__ ); } else { XP_LOGF( "%s: allocating storage for devID", __func__ ); XP_FREEP( util->util.mpool, &util->devIDStorage ); util->devIDStorage = XP_MALLOC( util->util.mpool, len + 1 ); XP_MEMCPY( util->devIDStorage, jchars, len ); util->devIDStorage[len] = '\0'; } (*env)->ReleaseStringUTFChars( env, jresult, jchars ); result = (const XP_UCHAR*)util->devIDStorage; jbyte* elems = (*env)->GetByteArrayElements( env, jbarr, NULL ); *typ = (DevIDType)elems[0]; (*env)->ReleaseByteArrayElements( env, jbarr, elems, 0 ); } deleteLocalRef( env, jbarr ); UTIL_CBK_TAIL(); return result; }
jstring and_util_getMD5SumFor( JNIUtilCtxt* jniutil, const XP_UCHAR* name, const XP_U8* bytes, jsize len ) { JNIEnv* env = *jniutil->envp; jmethodID mid = getMethodID( env, jniutil->jjniutil, "getMD5SumFor", "(Ljava/lang/String;[B)Ljava/lang/String;" ); jstring jname = (*env)->NewStringUTF( env, name ); jbyteArray jbytes = NULL == bytes? NULL : makeByteArray( env, len, (jbyte*)bytes ); jstring result = (*env)->CallObjectMethod( env, jniutil->jjniutil, mid, jname, jbytes ); deleteLocalRefs( env, jname, jbytes, DELETE_NO_REF ); return result; }
jobject and_util_splitFaces( JNIUtilCtxt* jniutil, const XP_U8* bytes, jsize len, XP_Bool isUTF8 ) { jobject strarray = NULL; JNIEnv* env = *jniutil->envp; jmethodID mid = getMethodID( env, jniutil->jjniutil, "splitFaces", "([BZ)[[Ljava/lang/String;" ); jbyteArray jbytes = makeByteArray( env, len, (jbyte*)bytes ); strarray = (*env)->CallObjectMethod( env, jniutil->jjniutil, mid, jbytes, isUTF8 ); deleteLocalRef( env, jbytes ); return strarray; }
int serverTryAgain() { if(step == 0) { if(!ca_skip) { const char *clientin = 0; unsigned int clientinlen = 0; if(in_useClientInit) { clientin = in_clientInit.data(); clientinlen = in_clientInit.size(); } const char *serverout; unsigned int serveroutlen; ca_flag = false; int r = sasl_server_start(con, in_mech.toLatin1().data(), clientin, clientinlen, &serverout, &serveroutlen); if(r != SASL_OK && r != SASL_CONTINUE) { err = saslErrorCond(r); return Error; } out_buf = makeByteArray(serverout, serveroutlen); last_r = r; if(ca_flag && !ca_done) { ca_done = true; ca_skip = true; return AuthCheck; } } ca_skip = false; ++step; if(last_r == SASL_OK) { getssfparams(); return Success; } return Continue; } else { if(!ca_skip) { const char *serverout; unsigned int serveroutlen; int r = sasl_server_step(con, in_buf.data(), in_buf.size(), &serverout, &serveroutlen); if(r != SASL_OK && r != SASL_CONTINUE) { err = saslErrorCond(r); return Error; } if(r == SASL_OK) out_buf.resize(0); else out_buf = makeByteArray(serverout, serveroutlen); last_r = r; if(ca_flag && !ca_done) { ca_done = true; ca_skip = true; return AuthCheck; } } ca_skip = false; if(last_r == SASL_OK) { getssfparams(); return Success; } return Continue; } }
int clientTryAgain() { if(step == 0) { const char *clientout, *m; unsigned int clientoutlen; need = 0; QString list = methodsToString(mechlist); int r; while(1) { if(need) params.extractHave(need); if(in_sendFirst) r = sasl_client_start(con, list.toLatin1().data(), &need, &clientout, &clientoutlen, &m); else r = sasl_client_start(con, list.toLatin1().data(), &need, NULL, NULL, &m); if(r != SASL_INTERACT) break; params.applyInteract(need); if(params.missingAny()) return NeedParams; } if(r != SASL_OK && r != SASL_CONTINUE) { err = saslErrorCond(r); return Error; } out_mech = m; if(in_sendFirst && clientout) { out_clientInit = makeByteArray(clientout, clientoutlen); out_useClientInit = true; } else out_useClientInit = false; ++step; if(r == SASL_OK) { getssfparams(); return Success; } return Continue; } else { const char *clientout; unsigned int clientoutlen; int r; while(1) { if(need) params.extractHave(need); //QByteArray cs(in_buf.data(), in_buf.size()); //printf("sasl_client_step(con, {%s}, %d, &need, &clientout, &clientoutlen);\n", cs.data(), in_buf.size()); r = sasl_client_step(con, in_buf.data(), in_buf.size(), &need, &clientout, &clientoutlen); //printf("returned: %d\n", r); if(r != SASL_INTERACT) break; params.applyInteract(need); if(params.missingAny()) return NeedParams; } if(r != SASL_OK && r != SASL_CONTINUE) { err = saslErrorCond(r); return Error; } out_buf = makeByteArray(clientout, clientoutlen); if(r == SASL_OK) { getssfparams(); return Success; } return Continue; } }