char *call_SuperNET_JSON(char *JSONstr) { cJSON *json,*array; int32_t valid; char NXTaddr[64],_tokbuf[2*MAX_JSON_FIELD],encoded[NXT_TOKEN_LEN+1],*cmdstr,*retstr = 0; struct coin_info *cp = get_coin_info("BTCD"); if ( Finished_init == 0 ) { printf("Finished_init still 0\n"); return(clonestr("{\"result\":null}")); } //printf("got call_SuperNET_JSON.(%s)\n",JSONstr); if ( cp != 0 && (json= cJSON_Parse(JSONstr)) != 0 ) { expand_nxt64bits(NXTaddr,cp->srvpubnxtbits); cJSON_AddItemToObject(json,"NXT",cJSON_CreateString(NXTaddr)); cJSON_AddItemToObject(json,"pubkey",cJSON_CreateString(Global_mp->pubkeystr)); cmdstr = cJSON_Print(json); if ( cmdstr != 0 ) { stripwhite_ns(cmdstr,strlen(cmdstr)); issue_generateToken(0,encoded,cmdstr,cp->srvNXTACCTSECRET); encoded[NXT_TOKEN_LEN] = 0; sprintf(_tokbuf,"[%s,{\"token\":\"%s\"}]",cmdstr,encoded); free(cmdstr); //printf("made tokbuf.(%s)\n",_tokbuf); array = cJSON_Parse(_tokbuf); if ( array != 0 ) { cmdstr = verify_tokenized_json(0,NXTaddr,&valid,array); //printf("cmdstr.%s valid.%d\n",cmdstr,valid); retstr = SuperNET_json_commands(Global_mp,0,array,NXTaddr,valid,_tokbuf); //printf("json command return.(%s)\n",retstr); if ( cmdstr != 0 ) free(cmdstr); free_json(array); } else printf("couldnt parse tokbuf.(%s)\n",_tokbuf); } free_json(json); } else printf("couldnt parse (%s)\n",JSONstr); if ( retstr == 0 ) retstr = clonestr("{\"result\":null}"); return(retstr); }
uint64_t call_SuperNET_broadcast(struct pserver_info *pserver,char *msg,int32_t len,int32_t duration) { int32_t SuperNET_broadcast(char *msg,int32_t duration); int32_t SuperNET_narrowcast(char *destip,unsigned char *msg,int32_t len); char ip_port[64],*ptr; uint64_t txid = 0; int32_t port; if ( 1 || SUPERNET_PORT != _SUPERNET_PORT ) return(0); if ( Debuglevel > 1 ) printf("call_SuperNET_broadcast.%p %p len.%d\n",pserver,msg,len); txid = calc_txid((uint8_t *)msg,(int32_t)strlen(msg)); if ( pserver != 0 ) { port = (pserver->p2pport == 0) ? BTCD_PORT : pserver->p2pport; //fprintf(stderr,"port.%d\n",port); sprintf(ip_port,"%s:%d",pserver->ipaddr,port); txid ^= calc_ipbits(pserver->ipaddr); if ( Debuglevel > 1 ) { char debugstr[4096]; init_hexbytes_noT(debugstr,(uint8_t *)msg,len); debugstr[32] = 0; fprintf(stderr,"%s NARROWCAST.(%s) txid.%llu (%s)\n",pserver->ipaddr,debugstr,(long long)txid,ip_port); } ptr = calloc(1,64 + sizeof(len) + len + 1); memcpy(ptr,&len,sizeof(len)); memcpy(&ptr[sizeof(len)],ip_port,strlen(ip_port)); memcpy(&ptr[sizeof(len) + 64],msg,len); queue_enqueue(&NarrowQ,ptr); return(txid); } else { char *cmdstr,NXTaddr[64]; cJSON *array; int32_t valid; array = cJSON_Parse(msg); if ( array != 0 ) { cmdstr = verify_tokenized_json(0,NXTaddr,&valid,array); if ( cmdstr != 0 ) free(cmdstr); free_json(array); if ( Debuglevel > 1 ) { char debugstr[4096]; init_hexbytes_noT(debugstr,(uint8_t *)msg,len); debugstr[32] = 0; printf("BROADCAST parms.(%s) valid.%d duration.%d txid.%llu len.%d\n",debugstr,valid,duration,(long long)txid,len); } ptr = calloc(1,sizeof(len) + sizeof(duration) + len); memcpy(ptr,&len,sizeof(len)); memcpy(&ptr[sizeof(len)],&duration,sizeof(duration)); memcpy(&ptr[sizeof(len) + sizeof(duration)],msg,len); ptr[sizeof(len) + sizeof(duration) + len] = 0; queue_enqueue(&BroadcastQ,ptr); return(txid); } else printf("cant broadcast non-JSON.(%s)\n",msg); } return(txid); }
char *pNXT_jsonhandler(cJSON **argjsonp,char *argstr,char *verifiedsender) { struct NXThandler_info *mp = Global_mp; long len; struct coin_info *cp; int32_t valid,firsttime = 1; cJSON *secretobj = 0,*json; char NXTACCTSECRET[1024],sender[64],*origparmstxt,*parmstxt=0,encoded[NXT_TOKEN_LEN+1],*retstr = 0; again: sender[0] = 0; if ( verifiedsender != 0 && verifiedsender[0] != 0 ) safecopy(sender,verifiedsender,sizeof(sender)); valid = -1; //printf("pNXT_jsonhandler argjson.%p\n",*argjsonp); if ( *argjsonp != 0 ) { secretobj = cJSON_GetObjectItem(*argjsonp,"secret"); copy_cJSON(NXTACCTSECRET,secretobj); if ( NXTACCTSECRET[0] == 0 && (cp= get_coin_info("BTCD")) != 0 ) { safecopy(NXTACCTSECRET,cp->NXTACCTSECRET,sizeof(NXTACCTSECRET)); cJSON_ReplaceItemInObject(*argjsonp,"secret",cJSON_CreateString(NXTACCTSECRET)); //printf("got cp.%p for BTCD (%s) (%s)\n",cp,cp->NXTACCTSECRET,cJSON_Print(*argjsonp)); } parmstxt = cJSON_Print(*argjsonp); len = strlen(parmstxt); stripwhite_ns(parmstxt,len); //printf("parmstxt.(%s)\n",parmstxt); } if ( *argjsonp == 0 ) { json = cJSON_CreateObject(); cJSON_AddItemToObject(json,"error",cJSON_CreateString("cant parse")); cJSON_AddItemToObject(json,"argstr",cJSON_CreateString(argstr)); retstr = cJSON_Print(json); free_json(json); return(retstr); } else { origparmstxt = parmstxt; parmstxt = verify_tokenized_json(sender,&valid,argjsonp,parmstxt); } retstr = pNXT_json_commands(mp,Global_pNXT,*argjsonp,sender,valid,argstr); //printf("back from pNXT_json_commands\n"); if ( firsttime != 0 && retstr == 0 && *argjsonp != 0 && parmstxt == 0 ) { cJSON *reqobj; uint64_t nxt64bits; char _tokbuf[4096],NXTaddr[64],buf[1024];//,*str; firsttime = 0; reqobj = cJSON_GetObjectItem(*argjsonp,"requestType"); copy_cJSON(buf,reqobj); if ( cJSON_GetObjectItem(*argjsonp,"requestType") != 0 ) cJSON_ReplaceItemInObject(*argjsonp,"time",cJSON_CreateNumber(time(NULL))); else cJSON_AddItemToObject(*argjsonp,"time",cJSON_CreateNumber(time(NULL))); nxt64bits = issue_getAccountId(0,NXTACCTSECRET); expand_nxt64bits(NXTaddr,nxt64bits); cJSON_ReplaceItemInObject(*argjsonp,"NXT",cJSON_CreateString(NXTaddr)); printf("replace NXT.(%s)\n",NXTaddr); //#ifndef __linux__ if ( strcmp(buf,"teleport") != 0 && strcmp(buf,"tradebot") != 0 && strcmp(buf,"makeoffer") != 0 && strcmp(buf,"select") != 0 && strcmp(buf,"checkmessages") != 0 && Global_pNXT->privacyServer != 0 ) { parmstxt = remove_secret(argjsonp,parmstxt); issue_generateToken(mp->curl_handle2,encoded,parmstxt,NXTACCTSECRET); encoded[NXT_TOKEN_LEN] = 0; sprintf(_tokbuf,"[%s,{\"token\":\"%s\"}]",parmstxt,encoded); retstr = sendmessage(NXTaddr,NXTACCTSECRET,_tokbuf,(int32_t)strlen(_tokbuf)+1,Global_pNXT->privacyServer_NXTaddr,_tokbuf); } else //#endif { issue_generateToken(mp->curl_handle2,encoded,origparmstxt,NXTACCTSECRET); encoded[NXT_TOKEN_LEN] = 0; sprintf(_tokbuf,"[%s,{\"token\":\"%s\"}]",origparmstxt,encoded); if ( *argjsonp != 0 ) free_json(*argjsonp); *argjsonp = cJSON_Parse(_tokbuf); if ( origparmstxt != 0 ) free(origparmstxt), origparmstxt = 0; goto again; } } //printf("free parmstxt.%p, argjson.%p\n",parmstxt,*argjsonp); if ( parmstxt != 0 ) free(parmstxt); return(retstr); }