// // Run a single type test // void runtest(char type) { try { debug("SStest", "Start test <%c>", type); switch (type) { case '.': // default integrity(); break; case '-': adhoc(); break; case 'a': acls(); break; case 'A': authAcls(); break; case 'b': blobs(); break; case 'c': codeSigning(); break; case 'd': databases(); break; case 'e': desEncryption(); break; case 'k': keychainAcls(); break; case 'K': keyBlobs(); break; case 's': signWithRSA(); break; case 't': authorizations(); break; case 'T': timeouts(); break; default: error("Invalid test selection (%c)", type); } printf("** Test step complete.\n"); debug("SStest", "End test <%c>", type); } catch (CssmCommonError &err) { error(err, "Unexpected exception"); } catch (...) { error("Unexpected system exception"); } }
//쓰레드펑션 void* GraphDog::t_function(void *_insertIndex) { int insertIndex = (int)_insertIndex; // std::map<int, CommandType>& commands = graphdog->commands; // pthread_mutex_lock(&graphdog->cmdsMutex); CommandsType& command = graphdog->commandQueue[insertIndex]; pthread_mutex_lock(&command.caller->t_functionMutex); string token=GraphDog::get()->getToken(); string paramStr = toBase64(desEncryption(graphdog->sKey, command.commandStr)); string dataset = "&token=" + token + "&command=" + paramStr + "&appver=" + GraphDog::get()->getAppVersionString(); string commandurl = "http://www.graphdog.net/command/"; commandurl=commandurl.append(GraphDog::get()->getGraphDogVersion()); commandurl=commandurl.append("/"); commandurl=commandurl.append(GraphDog::get()->aID); // << "¶m=" << paramStr //curl으로 명령을 날리고 겨로가를 얻는다. CURL *handle = GraphDog::get()->getCURL(); curl_easy_setopt(handle, CURLOPT_URL, commandurl.c_str()); curl_easy_setopt(handle, CURLOPT_POSTFIELDS,dataset.c_str()); curl_easy_setopt(handle, CURLOPT_WRITEDATA, (void *)&command.chunk); // curl_setopt($ch,CURLOPT_TIMEOUT,1000); // pthread_mutex_unlock(&graphdog->cmdsMutex); CURLcode resultCode = curl_easy_perform(handle); //## JsonBox::Object resultobj; string resultStr; if(resultCode == CURLE_OK) { resultStr = command.chunk.memory;// gdchunk.memory; if(*resultStr.rbegin() == '#') // success { try { vector<char> encText = base64To(std::string(resultStr.begin(), resultStr.end() - 1) ); // unbase64 resultStr = desDecryption(graphdog->sKey, std::string(encText.begin(), encText.end())); // des Decryption resultobj = GraphDogLib::StringToJsonObject(resultStr);// result.getObject(); } catch(const std::string& msg) { resultCode = CURLE_CHUNK_FAILED; } } else { resultCode = CURLE_CHUNK_FAILED; } } else { //resultCode = CURLE_CHUNK_FAILED; } //callbackparam 통신과 무관함. 넣어준거 그대로 피드백. for(auto iter = command.commands.begin(); iter != command.commands.end(); ++iter) { if(iter->second.paramStr != "") { JsonBox::Object param = GraphDogLib::StringToJsonObject(iter->second.paramStr); resultobj[iter->first]["param"] = JsonBox::Value(param); } } bool newToken = false; // 새토큰발급일 경우 if(resultobj["tokenUpdate"].getString()=="ok"){ //정상결과시 AuID,Token 다시 세팅 if(resultobj["state"].getString()=="ok"){ command.caller->setAuID(resultobj["auID"].getString()); command.caller->setCTime(resultobj["createTime"].getString()); command.caller->isLogin=true; }else{ command.caller->setCTime("9999"); } //첫실행일경우 받아온 nick,flag 저장. // if(resultobj["isFirst"].getBoolean()==true){ // command.caller->setNick(resultobj["nick"].getString()); // command.caller->setFlag(resultobj["flag"].getString()); // } //기존명령 다시 등록 std::vector<CommandParam> vcp; for(std::map<string, CommandType>::const_iterator iter = command.commands.begin(); iter != command.commands.end(); ++iter) { JsonBox::Value param; param.loadFromString(iter->second.paramStr); vcp.push_back(CommandParam(iter->second.action, param.getObject(), iter->second.target, iter->second.selector )); } command.caller->command(vcp); for(std::map<string, CommandType>::iterator iter = command.commands.begin(); iter != command.commands.end(); ++iter) { iter->second.target = 0; iter->second.selector = 0; } newToken = true; } if(resultobj["errorcode"].getInt()==9999){ command.caller->setCTime("9999"); command.caller->errorCount++; if(command.caller->errorCount<5){ std::vector<CommandParam> vcp; for(std::map<string, CommandType>::const_iterator iter = command.commands.begin(); iter != command.commands.end(); ++iter) { JsonBox::Value param; param.loadFromString(iter->second.paramStr); CommandParam cp; cp.action = iter->second.action; cp.param = param.getObject(); cp.selector = iter->second.selector; cp.target = iter->second.target; vcp.push_back(cp); } command.caller->command(vcp); for(std::map<string, CommandType>::iterator iter = command.commands.begin(); iter != command.commands.end(); ++iter) { iter->second.target = 0; iter->second.selector = 0; } } newToken = true; } if(newToken == false) // 새토큰 발급이 아닌 경우. { // for(auto iter = command.commands.begin(); iter != command.commands.end(); ++iter) // { // CommandType test = iter->second; // CCLog("dummy"); // } if(resultobj["state"].getString()=="ok"){ command.caller->errorCount=0; } command.result = resultobj; command.chunk.resultCode = resultCode; } pthread_mutex_unlock(&command.caller->t_functionMutex); return NULL; }