You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
987 lines
51 KiB
987 lines
51 KiB
/******************************************************************************
|
|
* Copyright © 2014-2015 The SuperNET Developers. *
|
|
* *
|
|
* See the AUTHORS, DEVELOPER-AGREEMENT and LICENSE files at *
|
|
* the top-level directory of this distribution for the individual copyright *
|
|
* holder information and the developer policies on copyright and licensing. *
|
|
* *
|
|
* Unless otherwise agreed in a custom licensing agreement, no part of the *
|
|
* SuperNET software, including this file may be copied, modified, propagated *
|
|
* or distributed except according to the terms contained in the LICENSE file *
|
|
* *
|
|
* Removal or modification of this copyright notice is prohibited. *
|
|
* *
|
|
******************************************************************************/
|
|
|
|
#include "iguana777.h"
|
|
#include "../includes/cJSON.h"
|
|
|
|
char Default_agent[64] = { "ALL" };
|
|
#define IGUANA_FORMS "[ \
|
|
\
|
|
{\"disp\":\"simple explorer\",\"agent\":\"ramchain\",\"method\":\"explore\",\"fields\":[{\"skip\":1,\"field\":\"search\",\"cols\":65,\"rows\":1}]}, \
|
|
{\"disp\":\"block height\",\"agent\":\"ramchain\",\"method\":\"block\",\"fields\":[{\"field\":\"height\",\"cols\":10,\"rows\":1}]}, \
|
|
{\"disp\":\"block hash\",\"agent\":\"ramchain\",\"method\":\"block\",\"fields\":[{\"field\":\"hash\",\"cols\":65,\"rows\":1}]}, \
|
|
{\"disp\":\"txid\",\"agent\":\"ramchain\",\"method\":\"txid\",\"fields\":[{\"skip\":1,\"field\":\"hash\",\"cols\":65,\"rows\":1}]}, \
|
|
{\"disp\":\"status\",\"agent\":\"ramchain\",\"method\":\"status\",\"fields\":[{\"skip\":1,\"field\":\"coin\",\"cols\":1,\"rows\":1}]}, \
|
|
{\"disp\":\"bundleinfo\",\"agent\":\"ramchain\",\"method\":\"bundleinfo\",\"fields\":[{\"skip\":1,\"field\":\"height\",\"cols\":12,\"rows\":1}]}, \
|
|
\
|
|
{\"disp\":\"addcoin\",\"agent\":\"iguana\",\"method\":\"addcoin\",\"fields\":[{\"skip\":1,\"field\":\"coin\",\"cols\":8,\"rows\":1}]}, \
|
|
{\"disp\":\"pausecoin\",\"agent\":\"iguana\",\"method\":\"pausecoin\",\"fields\":[{\"skip\":1,\"field\":\"coin\",\"cols\":1,\"rows\":1}]}, \
|
|
{\"disp\":\"startcoin\",\"agent\":\"iguana\",\"method\":\"startcoin\",\"fields\":[{\"skip\":1,\"field\":\"coin\",\"cols\":1,\"rows\":1}]}, \
|
|
{\"disp\":\"addnode\",\"agent\":\"iguana\",\"method\":\"addnode\",\"fields\":[{\"skip\":1,\"field\":\"ipaddr\",\"cols\":32,\"rows\":1}]}, \
|
|
{\"disp\":\"maxpeers\",\"agent\":\"iguana\",\"method\":\"maxpeers\",\"fields\":[{\"skip\":1,\"field\":\"max\",\"cols\":8,\"rows\":1}]}, \
|
|
{\"disp\":\"peers\",\"agent\":\"iguana\",\"method\":\"peers\",\"fields\":[{\"field\":\"coin\",\"cols\":16,\"rows\":1}]}, \
|
|
{\"disp\":\"nodestatus\",\"agent\":\"iguana\",\"method\":\"nodestatus\",\"fields\":[{\"skip\":1,\"field\":\"ipaddr\",\"cols\":32,\"rows\":1}]}, \
|
|
\
|
|
{\"disp\":\"rates\",\"agent\":\"PAX\",\"method\":\"rates\",\"fields\":[{\"skip\":1,\"field\":\"peg\",\"cols\":16,\"rows\":1}]},\
|
|
{\"disp\":\"prices\",\"agent\":\"PAX\",\"method\":\"prices\",\"fields\":[{\"skip\":1,\"field\":\"peg\",\"cols\":16,\"rows\":1}]},\
|
|
{\"agent\":\"PAX\",\"method\":\"lock\",\"fields\":[{\"skip\":1,\"field\":\"peg\",\"cols\":16,\"rows\":1},{\"skip\":1,\"field\":\"lockdays\",\"cols\":6,\"rows\":1},{\"skip\":1,\"field\":\"units\",\"cols\":12,\"rows\":1}]}, \
|
|
{\"agent\":\"PAX\",\"method\":\"redeem\",\"fields\":[{\"skip\":1,\"field\":\"txid\",\"cols\":65,\"rows\":1},{\"skip\":1,\"field\":\"dest\",\"cols\":65,\"rows\":1}]},\
|
|
{\"disp\":\"balance\",\"agent\":\"PAX\",\"method\":\"balance\",\"fields\":[{\"skip\":1,\"field\":\"address\",\"cols\":44,\"rows\":1}]},\
|
|
{\"agent\":\"PAX\",\"method\":\"rollover\",\"fields\":[{\"skip\":1,\"field\":\"txid\",\"cols\":16,\"rows\":1},{\"skip\":1,\"field\":\"newpeg\",\"cols\":16,\"rows\":1},{\"skip\":1,\"field\":\"newlockdays\",\"cols\":6,\"rows\":1}]},\
|
|
{\"agent\":\"PAX\",\"method\":\"swap\",\"fields\":[{\"skip\":1,\"field\":\"txid\",\"cols\":16,\"rows\":1},{\"skip\":1,\"field\":\"othertxid\",\"cols\":16,\"rows\":1}]},\
|
|
{\"agent\":\"PAX\",\"method\":\"bet\",\"fields\":[{\"skip\":1,\"field\":\"peg\",\"cols\":16,\"rows\":1},{\"skip\":1,\"field\":\"price\",\"cols\":16,\"rows\":1},{\"skip\":1,\"field\":\"amount\",\"cols\":16,\"rows\":1}]},\
|
|
\
|
|
{\"agent\":\"InstantDEX\",\"method\":\"placebid\",\"fields\":[{\"skip\":1,\"field\":\"base\",\"cols\":8,\"rows\":1},{\"skip\":1,\"field\":\"rel\",\"cols\":8,\"rows\":1},{\"skip\":1,\"field\":\"exchange\",\"cols\":16,\"rows\":1},{\"field\":\"price\",\"cols\":16,\"rows\":1},{\"field\":\"volume\",\"cols\":16,\"rows\":1}]}, \
|
|
{\"agent\":\"InstantDEX\",\"method\":\"placeask\",\"fields\":[{\"skip\":1,\"field\":\"base\",\"cols\":8,\"rows\":1},{\"skip\":1,\"field\":\"rel\",\"cols\":8,\"rows\":1},{\"skip\":1,\"field\":\"exchange\",\"cols\":16,\"rows\":1},{\"field\":\"price\",\"cols\":16,\"rows\":1},{\"field\":\"volume\",\"cols\":16,\"rows\":1}]}, \
|
|
{\"agent\":\"InstantDEX\",\"method\":\"orderbook\",\"fields\":[{\"skip\":1,\"field\":\"base\",\"cols\":8,\"rows\":1},{\"skip\":1,\"field\":\"rel\",\"cols\":8,\"rows\":1},{\"skip\":1,\"field\":\"exchange\",\"cols\":16,\"rows\":1}]}, \
|
|
{\"disp\":\"orderstatus\",\"agent\":\"InstantDEX\",\"method\":\"orderstatus\",\"fields\":[{\"skip\":1,\"field\":\"orderid\",\"cols\":32,\"rows\":1}]}, \
|
|
{\"disp\":\"cancelorder\",\"agent\":\"InstantDEX\",\"method\":\"cancelorder\",\"fields\":[{\"skip\":1,\"field\":\"orderid\",\"cols\":32,\"rows\":1}]}, \
|
|
{\"disp\":\"balance\",\"agent\":\"InstantDEX\",\"method\":\"balance\",\"fields\":[{\"skip\":1,\"field\":\"exchange\",\"cols\":16,\"rows\":1}]}, \
|
|
{\"newline\":0,\"disp\":\"allorderbooks\",\"agent\":\"InstantDEX\",\"method\":\"allorderbooks\",\"fields\":[{\"skip\":1,\"field\":\"allorderbooks\",\"cols\":1,\"rows\":1}]}, \
|
|
{\"newline\":0,\"disp\":\"openorders\",\"agent\":\"InstantDEX\",\"method\":\"openorders\",\"fields\":[{\"skip\":1,\"field\":\"openorders\",\"cols\":1,\"rows\":1}]}, \
|
|
{\"newline\":0,\"disp\":\"tradehistory\",\"agent\":\"InstantDEX\",\"method\":\"tradehistory\",\"fields\":[{\"skip\":1,\"field\":\"tradehistory\",\"cols\":1,\"rows\":1}]}, \
|
|
{\"disp\":\"allexchanges\",\"agent\":\"InstantDEX\",\"method\":\"allexchanges\",\"fields\":[{\"skip\":1,\"field\":\"allexchanges\",\"cols\":1,\"rows\":1}]}, \
|
|
\
|
|
{\"agent\":\"pangea\",\"method\":\"bet\",\"fields\":[{\"skip\":1,\"field\":\"tableid\",\"cols\":24,\"rows\":1},{\"skip\":1,\"field\":\"amount\",\"cols\":24,\"rows\":1}]}, \
|
|
{\"disp\":\"call\",\"agent\":\"pangea\",\"method\":\"call\",\"fields\":[{\"skip\":1,\"field\":\"tableid\",\"cols\":1,\"rows\":1}]}, \
|
|
{\"disp\":\"fold\",\"agent\":\"pangea\",\"method\":\"fold\",\"fields\":[{\"skip\":1,\"field\":\"tableid\",\"cols\":1,\"rows\":1}]}, \
|
|
{\"disp\":\"status\",\"agent\":\"pangea\",\"method\":\"status\",\"fields\":[{\"skip\":1,\"field\":\"tableid\",\"cols\":1,\"rows\":1}]}, \
|
|
{\"disp\":\"hand history\",\"agent\":\"pangea\",\"method\":\"handhistory\",\"fields\":[{\"skip\":1,\"field\":\"tableid\",\"cols\":1,\"rows\":1}]}, \
|
|
{\"disp\":\"history\",\"agent\":\"pangea\",\"method\":\"history\",\"fields\":[{\"skip\":1,\"field\":\"coin\",\"cols\":1,\"rows\":1}]}, \
|
|
{\"disp\":\"follow\",\"agent\":\"pangea\",\"method\":\"follow\",\"fields\":[{\"skip\":1,\"field\":\"tableid\",\"cols\":24,\"rows\":1}]}, \
|
|
{\"disp\":\"lobby\",\"agent\":\"pangea\",\"method\":\"lobby\",\"fields\":[{\"skip\":1,\"field\":\"coin\",\"cols\":8,\"rows\":1}]}, \
|
|
{\"disp\":\"join\",\"agent\":\"pangea\",\"method\":\"join\",\"fields\":[{\"skip\":1,\"field\":\"tableid\",\"cols\":24,\"rows\":1}]}, \
|
|
{\"agent\":\"pangea\",\"method\":\"buyin\",\"fields\":[{\"skip\":1,\"field\":\"coin\",\"cols\":8,\"rows\":1},{\"skip\":1,\"field\":\"tableid\",\"cols\":24,\"rows\":1},{\"skip\":1,\"field\":\"amount\",\"cols\":12,\"rows\":1}]}, \
|
|
{\"agent\":\"pangea\",\"method\":\"newtournament\",\"fields\":[{\"field\":\"mintables\",\"cols\":8,\"rows\":1},{\"field\":\"maxtables\",\"cols\":4,\"rows\":1},{\"field\":\"starttime\",\"cols\":16,\"rows\":1},{\"field\":\"prizefund\",\"cols\":12,\"rows\":1},{\"field\":\"coin\",\"cols\":12,\"rows\":1}]}, \
|
|
{\"agent\":\"pangea\",\"method\":\"newtable\",\"fields\":[{\"field\":\"minplayers\",\"cols\":4,\"rows\":1},{\"field\":\"maxplayers\",\"cols\":4,\"rows\":1},{\"field\":\"rake\",\"cols\":4,\"rows\":1},{\"field\":\"bigblind\",\"cols\":12,\"rows\":1},{\"field\":\"ante\",\"cols\":12,\"rows\":1},{\"field\":\"minbuyin\",\"cols\":12,\"rows\":1},{\"field\":\"maxbuyin\",\"cols\":12,\"rows\":1}]}, \
|
|
{\"disp\":\"leave\",\"agent\":\"pangea\",\"method\":\"leave\",\"fields\":[{\"skip\":1,\"field\":\"tableid\",\"cols\":8,\"rows\":1}]}, \
|
|
\
|
|
{\"agent\":\"jumblr\",\"method\":\"send\",\"fields\":[{\"skip\":1,\"field\":\"coin\",\"cols\":8,\"rows\":1},{\"skip\":1,\"field\":\"amount\",\"cols\":13,\"rows\":1},{\"skip\":1,\"field\":\"address\",\"cols\":8,\"rows\":1}]}, \
|
|
{\"agent\":\"jumblr\",\"method\":\"invoice\",\"fields\":[{\"skip\":1,\"field\":\"coin\",\"cols\":8,\"rows\":1},{\"skip\":1,\"field\":\"amount\",\"cols\":13,\"rows\":1},{\"skip\":1,\"field\":\"address\",\"cols\":8,\"rows\":1}]}, \
|
|
{\"agent\":\"jumblr\",\"method\":\"shuffle\",\"fields\":[{\"skip\":1,\"field\":\"coin\",\"cols\":8,\"rows\":1},{\"skip\":1,\"field\":\"amount\",\"cols\":13,\"rows\":1}]}, \
|
|
{\"agent\":\"jumblr\",\"method\":\"balance\",\"fields\":[{\"skip\":1,\"field\":\"coin\",\"cols\":8,\"rows\":1},{\"skip\":1,\"field\":\"address\",\"cols\":13,\"rows\":1}]}, \
|
|
\
|
|
{\"newline\":0,\"disp\":\"InstantDEX\",\"agent\":\"iguana\",\"method\":\"setagent\",\"fields\":[{\"field\":\"InstantDEX\",\"cols\":1,\"rows\":1}]}, \
|
|
{\"newline\":0,\"disp\":\"PAX\",\"agent\":\"iguana\",\"method\":\"setagent\",\"fields\":[{\"field\":\"PAX\",\"cols\":1,\"rows\":1}]}, \
|
|
{\"newline\":0,\"disp\":\"pangea\",\"agent\":\"iguana\",\"method\":\"setagent\",\"fields\":[{\"field\":\"pangea\",\"cols\":1,\"rows\":1}]}, \
|
|
{\"newline\":0,\"disp\":\"jumblr\",\"agent\":\"iguana\",\"method\":\"setagent\",\"fields\":[{\"field\":\"jumblr\",\"cols\":1,\"rows\":1}]}, \
|
|
{\"disp\":\"ramchain\",\"agent\":\"iguana\",\"method\":\"setagent\",\"fields\":[{\"field\":\"ramchain\",\"cols\":1,\"rows\":1}]}, \
|
|
{\"newline\":0,\"disp\":\"iguana\",\"agent\":\"iguana\",\"method\":\"setagent\",\"fields\":[{\"field\":\"iguana\",\"cols\":1,\"rows\":1}]}, \
|
|
\
|
|
{\"agent\":\"hash\",\"method\":\"NXT\",\"fields\":[{\"skip\":1,\"field\":\"password\",\"cols\":100,\"rows\":1}]}, \
|
|
{\"agent\":\"hash\",\"method\":\"curve25519\",\"fields\":[{\"skip\":1,\"field\":\"message\",\"cols\":64,\"rows\":3}]}, \
|
|
{\"agent\":\"hash\",\"method\":\"rmd160_sha256\",\"fields\":[{\"skip\":1,\"field\":\"message\",\"cols\":64,\"rows\":3}]}, \
|
|
{\"agent\":\"hash\",\"method\":\"sha256_sha256\",\"fields\":[{\"skip\":1,\"field\":\"message\",\"cols\":64,\"rows\":3}]}, \
|
|
{\"agent\":\"hash\",\"method\":\"base64_encode\",\"fields\":[{\"skip\":1,\"field\":\"message\",\"cols\":64,\"rows\":3}]}, \
|
|
{\"agent\":\"hash\",\"method\":\"base64_decode\",\"fields\":[{\"skip\":1,\"field\":\"message\",\"cols\":64,\"rows\":3}]}, \
|
|
{\"agent\":\"hash\",\"method\":\"crc32\",\"fields\":[{\"skip\":1,\"field\":\"message\",\"cols\":64,\"rows\":3}]}, \
|
|
{\"agent\":\"hash\",\"method\":\"sha512\",\"fields\":[{\"skip\":1,\"skip\":1,\"field\":\"message\",\"cols\":64,\"rows\":3}]}, \
|
|
{\"agent\":\"hash\",\"method\":\"sha384\",\"fields\":[{\"skip\":1,\"field\":\"message\",\"cols\":64,\"rows\":3}]}, \
|
|
{\"agent\":\"hash\",\"method\":\"sha256\",\"fields\":[{\"skip\":1,\"field\":\"message\",\"cols\":64,\"rows\":3}]}, \
|
|
{\"agent\":\"hash\",\"method\":\"sha224\",\"fields\":[{\"skip\":1,\"field\":\"message\",\"cols\":64,\"rows\":3}]}, \
|
|
{\"agent\":\"hash\",\"method\":\"rmd320\",\"fields\":[{\"skip\":1,\"field\":\"message\",\"cols\":64,\"rows\":3}]}, \
|
|
{\"agent\":\"hash\",\"method\":\"rmd256\",\"fields\":[{\"skip\":1,\"field\":\"message\",\"cols\":64,\"rows\":3}]}, \
|
|
{\"agent\":\"hash\",\"method\":\"rmd160\",\"fields\":[{\"skip\":1,\"field\":\"message\",\"cols\":64,\"rows\":3}]}, \
|
|
{\"agent\":\"hash\",\"method\":\"rmd128\",\"fields\":[{\"skip\":1,\"field\":\"message\",\"cols\":64,\"rows\":3}]}, \
|
|
{\"agent\":\"hash\",\"method\":\"sha1\",\"fields\":[{\"skip\":1,\"field\":\"message\",\"cols\":64,\"rows\":3}]}, \
|
|
{\"agent\":\"hash\",\"method\":\"md2\",\"fields\":[{\"skip\":1,\"field\":\"message\",\"cols\":64,\"rows\":3}]}, \
|
|
{\"agent\":\"hash\",\"method\":\"md4\",\"fields\":[{\"skip\":1,\"field\":\"message\",\"cols\":64,\"rows\":3}]}, \
|
|
{\"agent\":\"hash\",\"method\":\"md5\",\"fields\":[{\"skip\":1,\"field\":\"message\",\"cols\":64,\"rows\":3}]}, \
|
|
{\"agent\":\"hash\",\"method\":\"tiger\",\"fields\":[{\"skip\":1,\"field\":\"message\",\"cols\":64,\"rows\":3}]}, \
|
|
{\"agent\":\"hash\",\"method\":\"whirlpool\",\"fields\":[{\"skip\":1,\"field\":\"message\",\"cols\":64,\"rows\":3}]}, \
|
|
{\"agent\":\"hash\",\"method\":\"hmac_sha512\",\"fields\":[{\"skip\":1,\"field\":\"password\",\"cols\":32,\"rows\":1},{\"field\":\"message\",\"cols\":64,\"rows\":3}]}, \
|
|
{\"agent\":\"hash\",\"method\":\"hmac_sha384\",\"fields\":[{\"skip\":1,\"field\":\"password\",\"cols\":32,\"rows\":1},{\"field\":\"message\",\"cols\":64,\"rows\":3}]}, \
|
|
{\"agent\":\"hash\",\"method\":\"hmac_sha256\",\"fields\":[{\"skip\":1,\"field\":\"password\",\"cols\":32,\"rows\":1},{\"field\":\"message\",\"cols\":64,\"rows\":3}]}, \
|
|
{\"agent\":\"hash\",\"method\":\"hmac_sha224\",\"fields\":[{\"skip\":1,\"field\":\"password\",\"cols\":32,\"rows\":1},{\"field\":\"message\",\"cols\":64,\"rows\":3}]}, \
|
|
{\"agent\":\"hash\",\"method\":\"hmac_rmd320\",\"fields\":[{\"skip\":1,\"field\":\"password\",\"cols\":32,\"rows\":1},{\"field\":\"message\",\"cols\":64,\"rows\":3}]}, \
|
|
{\"agent\":\"hash\",\"method\":\"hmac_rmd256\",\"fields\":[{\"skip\":1,\"field\":\"password\",\"cols\":32,\"rows\":1},{\"field\":\"message\",\"cols\":64,\"rows\":3}]}, \
|
|
{\"agent\":\"hash\",\"method\":\"hmac_rmd160\",\"fields\":[{\"skip\":1,\"field\":\"password\",\"cols\":32,\"rows\":1},{\"field\":\"message\",\"cols\":64,\"rows\":3}]}, \
|
|
{\"agent\":\"hash\",\"method\":\"hmac_rmd128\",\"fields\":[{\"skip\":1,\"field\":\"password\",\"cols\":32,\"rows\":1},{\"field\":\"message\",\"cols\":64,\"rows\":3}]}, \
|
|
{\"agent\":\"hash\",\"method\":\"hmac_sha1\",\"fields\":[{\"skip\":1,\"field\":\"password\",\"cols\":32,\"rows\":1},{\"field\":\"message\",\"cols\":64,\"rows\":3}]}, \
|
|
{\"agent\":\"hash\",\"method\":\"hmac_md2\",\"fields\":[{\"skip\":1,\"field\":\"password\",\"cols\":32,\"rows\":1},{\"field\":\"message\",\"cols\":64,\"rows\":3}]}, \
|
|
{\"agent\":\"hash\",\"method\":\"hmac_md4\",\"fields\":[{\"skip\":1,\"field\":\"password\",\"cols\":32,\"rows\":1},{\"field\":\"message\",\"cols\":64,\"rows\":3}]}, \
|
|
{\"agent\":\"hash\",\"method\":\"hmac_md5\",\"fields\":[{\"skip\":1,\"field\":\"password\",\"cols\":32,\"rows\":1},{\"field\":\"message\",\"cols\":64,\"rows\":3}]}, \
|
|
{\"agent\":\"hash\",\"method\":\"hmac_tiger\",\"fields\":[{\"skip\":1,\"field\":\"password\",\"cols\":32,\"rows\":1},{\"field\":\"message\",\"cols\":64,\"rows\":3}]}, \
|
|
{\"agent\":\"hash\",\"method\":\"hmac_whirlpool\",\"fields\":[{\"skip\":1,\"field\":\"password\",\"cols\":32,\"rows\":1},{\"field\":\"message\",\"cols\":64,\"rows\":3}]}\
|
|
]"
|
|
|
|
char *HTMLheader =
|
|
"<!DOCTYPE HTML> \
|
|
<html style=\"overflow-y:scroll;-webkit-user-select: text\"> \
|
|
<head> \
|
|
<meta http-equiv=\"Pragma\" content=\"no-cache\"> \
|
|
<meta http-equiv=\"Expires\" content=\"-1\"> \
|
|
<title>iguana</title> \
|
|
<script src=\"jquery-2.1.4.min.js\" type=\"text/javascript\"></script> \
|
|
<link rel=\"stylesheet\" href=\"css/bootstrap.css\" type=\"text/css\"> \
|
|
\
|
|
</head> \
|
|
<body data-custom-load=\"true\" data-name=\"iguana\" data-tools=\"pnacl newlib glibc clang-newlib mac\" data-configs=\"Debug Release\" data-path=\"{tc}/{config}\">";
|
|
|
|
// <a href="./iguana/link?field=val">Link</a>
|
|
|
|
char *HTMLfooter =
|
|
"<script type=\"text/javascript\" src=\"js/util.js\"></script> \
|
|
\
|
|
<script type=\"text/javascript\" src=\"common.js\"></script> \
|
|
<script type=\"text/javascript\" src=\"example.js\"></script> \
|
|
\
|
|
<script src=\"js/bootstrap.js\" type=\"text/javascript\"></script> \
|
|
<script src=\"js/api.js\" type=\"text/javascript\" charset=\"utf-8\"></script> \
|
|
<script src=\"js/methods.js\" type=\"text/javascript\" charset=\"utf-8\"></script> \
|
|
<script src=\"js/sites.js\" type=\"text/javascript\" charset=\"utf-8\"></script> \
|
|
<script src=\"js/settings.js\" type=\"text/javascript\" charset=\"utf-8\"></script> \
|
|
<script src=\"js/jay.min.js\"></script> \
|
|
<script src=\"js/jay.ext.js\"></script> \
|
|
\
|
|
</body> \
|
|
</html>";
|
|
|
|
#define HTML_EMIT(str) if ( (str) != 0 && (str)[0] != 0 ) strcpy(&retbuf[size],str), size += (int32_t)strlen(str)
|
|
char Prevjsonstr[1024],Currentjsonstr[1024];
|
|
|
|
char *iguana_rpc(char *agent,cJSON *json,char *data,int32_t datalen,char *remoteaddr)
|
|
{
|
|
//printf("agent.(%s) json.(%s) data[%d] %s\n",agent,jprint(json,0),datalen,data!=0?data:"");
|
|
if ( data == 0 )
|
|
return(iguana_JSON(0,jprint(json,0),remoteaddr));
|
|
else return(iguana_JSON(0,data,remoteaddr));
|
|
}
|
|
|
|
void iguana_urldecode(char *str)
|
|
{
|
|
int32_t a,b,c; char *dest = str;
|
|
while ( (c= *str) != 0 )
|
|
{
|
|
if ( c == '%' && (a= str[1]) != 0 && (b= str[2]) != 0 )
|
|
*dest++ = (unhex(a)<<4) | unhex(b);
|
|
else *dest++ = c;
|
|
}
|
|
*dest = 0;
|
|
}
|
|
|
|
char *iguana_parsebidask(char *base,char *rel,char *exchange,double *pricep,double *volumep,char *line)
|
|
{
|
|
int32_t i;
|
|
for (i=0; i<16&&line[i]!='/'&&line[i]!=0; i++)
|
|
base[i] = line[i];
|
|
base[i] = 0;
|
|
touppercase(base);
|
|
line += (i + 1);
|
|
for (i=0; i<16&&line[i]!='/'&&line[i]!=0; i++)
|
|
rel[i] = line[i];
|
|
rel[i] = 0;
|
|
touppercase(rel);
|
|
line += (i + 1);
|
|
for (i=0; i<16&&line[i]!='/'&&line[i]!=0; i++)
|
|
exchange[i] = line[i];
|
|
exchange[i] = 0;
|
|
line += (i + 1);
|
|
if ( strncmp(line,"price/",strlen("price/")) == 0 )
|
|
{
|
|
line += strlen("price/");
|
|
*pricep = atof(line);
|
|
if ( (line= strstr(line,"volume/")) != 0 )
|
|
{
|
|
line += strlen("volume/");
|
|
*volumep = atof(line);
|
|
for (i=0; i<16&&line[i]!=0; i++)
|
|
if ( line[i] == '/' )
|
|
{
|
|
i++;
|
|
break;
|
|
}
|
|
return(line+i);
|
|
}
|
|
}
|
|
return(0);
|
|
}
|
|
|
|
char *iguana_InstantDEX(char *jsonstr,char *path,char *method)
|
|
{
|
|
char *str,base[64],rel[64],exchange[64]; double price,volume;
|
|
if ( (str= iguana_parsebidask(base,rel,exchange,&price,&volume,path)) != 0 )
|
|
{
|
|
if ( price > 0. && volume > 0. )
|
|
{
|
|
sprintf(jsonstr,"{\"agent\":\"InstantDEX\",\"method\":\"%s\",\"base\":\"%s\",\"rel\":\"%s\",\"exchange\":\"%s\",\"price\":\%0.8f,\"volume\":%0.8f}",method,base,rel,exchange,price,volume);
|
|
return(jsonstr);
|
|
}
|
|
else return(0);
|
|
}
|
|
return(0);
|
|
}
|
|
|
|
void iguana_coinset(char *buf,char *path)
|
|
{
|
|
int32_t i;
|
|
if ( path[0] == '/' )
|
|
path++;
|
|
for (i=0; i<8&&path[i]!=0&&path[i]!=' '&&path[i]!='/'; i++)
|
|
buf[i] = path[i];
|
|
buf[i] = 0;
|
|
touppercase(buf);
|
|
}
|
|
|
|
char *iguana_ramchain_glue(struct iguana_info *coin,char *method,char *jsonstr)
|
|
{
|
|
char *ramchain_parser(struct iguana_agent *agent,struct iguana_info *coin,char *method,cJSON *json);
|
|
cJSON *json; char *retstr;
|
|
json = cJSON_Parse(jsonstr);
|
|
retstr = ramchain_parser(0,coin,method,json);
|
|
free_json(json);
|
|
return(retstr);
|
|
}
|
|
|
|
char *iguana_hashparse(char *path)
|
|
{
|
|
int32_t i,j,len,iter,n; uint8_t databuf[512];
|
|
char hexstr[1025],password[512],hashname[512],*name,*msg; cJSON *json;
|
|
typedef void (*hashfunc)(char *hexstr,uint8_t *buf,uint8_t *msg,int32_t len);
|
|
typedef char *(*hmacfunc)(char *dest,char *key,int32_t key_size,char *message);
|
|
struct hashfunc_entry { char *name; hashfunc hashfunc; };
|
|
struct hmacfunc_entry { char *name; hmacfunc hmacfunc; };
|
|
struct hashfunc_entry hashes[] = { {"NXT",calc_NXTaddr}, {"curve25519",calc_curve25519_str }, {"base64_encode",calc_base64_encodestr}, {"base64_decode",calc_base64_decodestr}, {"crc32",calc_crc32str}, {"rmd160_sha256",rmd160ofsha256}, {"sha256_sha256",sha256_sha256}, {"sha256",vcalc_sha256}, {"sha512",calc_sha512}, {"sha384",calc_sha384}, {"sha224",calc_sha224}, {"rmd160",calc_rmd160}, {"rmd256",calc_rmd256}, {"rmd320",calc_rmd320}, {"rmd128",calc_rmd128}, {"sha1",calc_sha1}, {"md5",calc_md5str}, {"tiger",calc_tiger}, {"whirlpool",calc_whirlpool} };
|
|
struct hmacfunc_entry hmacs[] = { {"hmac_sha256",hmac_sha256_str}, {"hmac_sha512",hmac_sha512_str}, {"hmac_sha384",hmac_sha384_str}, {"hmac_sha224",hmac_sha224_str}, {"hmac_rmd160",hmac_rmd160_str}, {"hmac_rmd256",hmac_rmd256_str}, {"hmac_rmd320",hmac_rmd320_str}, {"hmac_rmd128",hmac_rmd128_str}, {"hmac_sha1",hmac_sha1_str}, {"hmac_md5",hmac_md5_str}, {"hmac_tiger",hmac_tiger_str}, {"hmac_whirlpool",hmac_whirlpool_str} };
|
|
n = (int32_t)sizeof(hashes)/sizeof(*hashes);
|
|
for (j=0; j<sizeof(hashname)&&path[j]!=0&&path[j]!='/'; j++)
|
|
hashname[j] = path[j];
|
|
hashname[j] = 0;
|
|
printf("ITER0 set hashname.(%s)\n",hashname);
|
|
path += j;
|
|
path++;
|
|
msg = path;
|
|
for (j=0; path[j]!='/'&&path[j]!=0&&path[j]!=' '; j++)
|
|
;
|
|
path[j] = 0;
|
|
if ( path[j] != 0 )
|
|
j++;
|
|
for (j=0; j<sizeof(password)&&path[j]!=0&&path[j]!='/'; j++)
|
|
password[j] = path[j];
|
|
password[j] = 0;
|
|
printf("msg.(%s) password.(%s)\n",msg,password);
|
|
for (iter=0; iter<2; iter++)
|
|
{
|
|
for (i=0; i<n; i++)
|
|
{
|
|
name = (iter == 0) ? hashes[i].name : hmacs[i].name;
|
|
printf("iter.%d i.%d (%s) vs (%s) %d\n",iter,i,name,hashname,strcmp(hashname,name) == 0);
|
|
if ( strcmp(hashname,name) == 0 )
|
|
{
|
|
json = cJSON_CreateObject();
|
|
len = (int32_t)strlen(path);
|
|
if ( iter == 0 )
|
|
(*hashes[i].hashfunc)(hexstr,databuf,(uint8_t *)msg,len);
|
|
else (*hmacs[i].hmacfunc)(hexstr,password,j,msg);
|
|
jaddstr(json,"result","hash calculated");
|
|
jaddstr(json,"message",msg);
|
|
jaddstr(json,name,hexstr);
|
|
return(jprint(json,1));
|
|
}
|
|
}
|
|
n = (int32_t)sizeof(hmacs)/sizeof(*hmacs);
|
|
}
|
|
return(clonestr("{\"error\":\"cant find hash function\"}"));
|
|
}
|
|
|
|
char *iguana_htmlget(char *space,int32_t max,int32_t *jsonflagp,char *path,char *remoteaddr,int32_t localaccess)
|
|
{
|
|
char *iguana_coinjson(struct iguana_info *coin,char *method,cJSON *json);
|
|
struct iguana_info *coin = 0; cJSON *json; bits256 hash2; int32_t height,i;
|
|
char buf[64],jsonstr[1024],coinstr[64],*retstr;
|
|
for (i=0; path[i]!=0; i++)
|
|
if ( path[i] == ' ' )
|
|
break;
|
|
path[i] = 0;
|
|
if ( path[strlen(path)-1] == '/' )
|
|
path[strlen(path)-1] = 0;
|
|
if ( strncmp(path,"/api",strlen("/api")) == 0 )
|
|
{
|
|
*jsonflagp = 1;
|
|
path += strlen("/api");
|
|
} else *jsonflagp = 0;
|
|
iguana_coinset(coinstr,path);
|
|
if ( coinstr[0] != 0 )
|
|
coin = iguana_coinfind(coinstr);
|
|
else coin = 0;
|
|
if ( strncmp(path,"/bitmap",strlen("/bitmap")) == 0 )
|
|
{
|
|
path += strlen("/bitmap");
|
|
*jsonflagp = 2;
|
|
iguana_bitmap(space,max,path);
|
|
return(space);
|
|
}
|
|
//printf("GETCHECK.(%s)\n",path);
|
|
if ( strncmp(path,"/ramchain/",strlen("/ramchain/")) == 0 )
|
|
{
|
|
path += strlen("/ramchain/");
|
|
if ( strncmp(path,"block/",strlen("block/")) == 0 )
|
|
{
|
|
path += strlen("block/");
|
|
if ( strncmp(path,"height/",strlen("height/")) == 0 )
|
|
{
|
|
height = atoi(path + strlen("height/"));
|
|
sprintf(Currentjsonstr,"{\"agent\":\"ramchain\",\"method\":\"block\",\"coin\":\"%s\",\"height\":%d,\"txids\":1}",coinstr,height);
|
|
return(iguana_ramchain_glue(coin,"block",Currentjsonstr));
|
|
}
|
|
else if ( strncmp(path,"hash/",strlen("hash/")) == 0 )
|
|
{
|
|
decode_hex(hash2.bytes,sizeof(hash2),path + strlen("hash/"));
|
|
char str[65]; printf("ramchain blockhash.%s\n",bits256_str(str,hash2));
|
|
sprintf(Currentjsonstr,"{\"agent\":\"ramchain\",\"method\":\"block\",\"coin\":\"%s\",\"hash\":\"%s\",\"txids\":1}",coinstr,str);
|
|
return(iguana_ramchain_glue(coin,"block",Currentjsonstr));
|
|
}
|
|
}
|
|
else if ( strncmp(path,"txid/",strlen("txid/")) == 0 )
|
|
{
|
|
decode_hex(hash2.bytes,sizeof(hash2),path + strlen("txid/"));
|
|
char str[65]; bits256_str(str,hash2);
|
|
sprintf(Currentjsonstr,"{\"agent\":\"ramchain\",\"method\":\"tx\",\"coin\":\"%s\",\"txid\":\"%s\"}",coinstr,str);
|
|
return(iguana_ramchain_glue(coin,"tx",Currentjsonstr));
|
|
}
|
|
else if ( strncmp(path,"explore/",strlen("explore/")) == 0 )
|
|
{
|
|
path += strlen("explore/");
|
|
if ( coin != 0 )
|
|
{
|
|
sprintf(Currentjsonstr,"{\"agent\":\"iguana\",\"method\":\"explore\",\"coin\":\"%s\",\"search\":\"%s\"}",coinstr,path);
|
|
} else sprintf(Currentjsonstr,"{\"agent\":\"iguana\",\"method\":\"explore\",\"search\":\"%s\"}",path);
|
|
return(iguana_ramchain_glue(coin,"explore",Currentjsonstr));
|
|
}
|
|
else if ( strncmp(path,"bundleinfo/",strlen("bundleinfo/")) == 0 )
|
|
{
|
|
path += strlen("bundleinfo/");
|
|
sprintf(Currentjsonstr,"{\"agent\":\"iguana\",\"method\":\"bundleinfo\",\"coin\":\"%s\",\"height\":%d}",coinstr,atoi(path));
|
|
|
|
}
|
|
else
|
|
{
|
|
sprintf(Currentjsonstr,"{\"agent\":\"iguana\",\"method\":\"%s\",\"coin\":\"%s\"}",path,coinstr);
|
|
return(iguana_ramchain_glue(coin,path,Currentjsonstr));
|
|
}
|
|
}
|
|
else if ( strncmp(path,"/hash/",strlen("/hash/")) == 0 )
|
|
{
|
|
path += strlen("/hash/");
|
|
return(iguana_hashparse(path));
|
|
}
|
|
else if ( strncmp(path,"/iguana/",strlen("/iguana/")) == 0 )
|
|
{
|
|
strcpy(Currentjsonstr,path);
|
|
path += strlen("/iguana/");
|
|
if ( strncmp(path,"setagent/",strlen("setagent/")) == 0 )
|
|
{
|
|
path += strlen("setagent/");
|
|
if ( strncmp(path,"ramchain",strlen("ramchain")) == 0 || strncmp(path,"iguana",strlen("iguana")) == 0 || strncmp(path,"InstantDEX",strlen("InstantDEX")) == 0 || strncmp(path,"pangea",strlen("pangea")) == 0 || strncmp(path,"PAX",strlen("PAX")) == 0 || strncmp(path,"ALL",strlen("ALL")) == 0 || strncmp(path,"jumblr",strlen("jumblr")) == 0 )
|
|
{
|
|
if ( strncmp(Default_agent,path,strlen(path)) == 0 )
|
|
{
|
|
strcpy(Default_agent,"ALL");
|
|
return(clonestr("{\"result\":\"ALL agents selected\"}"));
|
|
}
|
|
strcpy(Default_agent,path);
|
|
if ( Default_agent[strlen(Default_agent)-1] == '/' )
|
|
Default_agent[strlen(Default_agent)-1] = 0;
|
|
sprintf(buf,"{\"result\":\"agent selected\",\"name\":\"%s\"}",path);
|
|
return(clonestr(buf));
|
|
}
|
|
return(clonestr("{\"error\":\"invalid agent specified\"}"));
|
|
}
|
|
else
|
|
{
|
|
if ( strncmp(path,"peers/",strlen("peers/")) == 0 )
|
|
{
|
|
path += strlen("peers/");
|
|
if ( coin != 0 )
|
|
{
|
|
sprintf(Currentjsonstr,"{\"agent\":\"iguana\",\"method\":\"peers\",\"coin\":\"%s\"}",coinstr);
|
|
} else sprintf(Currentjsonstr,"{\"agent\":\"iguana\",\"method\":\"peers\"}");
|
|
json = cJSON_Parse(Currentjsonstr);
|
|
retstr = iguana_coinjson(coin,"peers",json);
|
|
free_json(json);
|
|
return(retstr);
|
|
}
|
|
else if ( coin != 0 )
|
|
{
|
|
if ( strncmp(path,"addnode/",strlen("addnode/")) == 0 )
|
|
{
|
|
path += strlen("addnode/");
|
|
sprintf(Currentjsonstr,"{\"agent\":\"iguana\",\"method\":\"addnode\",\"coin\":\"%s\",\"ipaddr\":\"%s\"}",coinstr,path);
|
|
json = cJSON_Parse(Currentjsonstr);
|
|
retstr = iguana_coinjson(coin,"addnode",json);
|
|
free_json(json);
|
|
return(retstr);
|
|
}
|
|
else if ( strncmp(path,"nodestatus/",strlen("nodestatus/")) == 0 )
|
|
{
|
|
path += strlen("nodestatus/");
|
|
sprintf(Currentjsonstr,"{\"agent\":\"iguana\",\"method\":\"nodestatus\",\"coin\":\"%s\",\"ipaddr\":\"%s\"}",coinstr,path);
|
|
json = cJSON_Parse(Currentjsonstr);
|
|
retstr = iguana_coinjson(coin,"nodestatus",json);
|
|
free_json(json);
|
|
return(retstr);
|
|
}
|
|
else if ( strncmp(path,"addcoin",strlen("addcoin")) == 0 )
|
|
{
|
|
path += strlen("addcoin");
|
|
iguana_coinset(buf,path);
|
|
if ( (coin= iguana_coinadd(buf)) != 0 )
|
|
{
|
|
sprintf(Currentjsonstr,"{\"agent\":\"iguana\",\"method\":\"addcoin\",\"coin\":\"%s\"}",buf);
|
|
json = cJSON_Parse(Currentjsonstr);
|
|
retstr = iguana_coinjson(coin,"addcoin",json);
|
|
free_json(json);
|
|
}
|
|
else retstr = clonestr("{\"error\":\"cant create coin\"}");
|
|
return(retstr);
|
|
}
|
|
else if ( strncmp(path,"startcoin",strlen("startcoin")) == 0 )
|
|
{
|
|
path += strlen("startcoin");
|
|
iguana_coinset(buf,path);
|
|
if ( (coin= iguana_coinfind(buf)) != 0 )
|
|
{
|
|
sprintf(Currentjsonstr,"{\"agent\":\"iguana\",\"method\":\"startcoin\",\"coin\":\"%s\"}",buf);
|
|
json = cJSON_Parse(Currentjsonstr);
|
|
retstr = iguana_coinjson(coin,"startcoin",json);
|
|
free_json(json);
|
|
}
|
|
else retstr = clonestr("{\"error\":\"cant create coin\"}");
|
|
return(retstr);
|
|
}
|
|
else if ( strncmp(path,"pausecoin",strlen("pausecoin")) == 0 )
|
|
{
|
|
path += strlen("pausecoin");
|
|
iguana_coinset(buf,path);
|
|
if ( (coin= iguana_coinfind(buf)) != 0 )
|
|
{
|
|
sprintf(Currentjsonstr,"{\"agent\":\"iguana\",\"method\":\"pausecoin\",\"coin\":\"%s\"}",buf);
|
|
json = cJSON_Parse(Currentjsonstr);
|
|
retstr = iguana_coinjson(coin,"pausecoin",json);
|
|
free_json(json);
|
|
}
|
|
else retstr = clonestr("{\"error\":\"cant create coin\"}");
|
|
return(retstr);
|
|
}
|
|
else if ( strncmp(path,"maxpeers/",strlen("maxpeers/")) == 0 )
|
|
{
|
|
path += strlen("maxpeers/");
|
|
sprintf(Currentjsonstr,"{\"agent\":\"iguana\",\"method\":\"maxpeers\",\"coin\":\"%s\",\"max\":%d}",coinstr,atoi(path));
|
|
json = cJSON_Parse(Currentjsonstr);
|
|
retstr = iguana_coinjson(coin,"maxpeers",json);
|
|
free_json(json);
|
|
return(retstr);
|
|
}
|
|
return(clonestr("{\"result\":\"iguana method not found\"}"));
|
|
}
|
|
return(clonestr("{\"result\":\"iguana method needs coin\"}"));
|
|
}
|
|
}
|
|
else if ( strncmp(path,"/InstantDEX/",strlen("/InstantDEX/")) == 0 )
|
|
{
|
|
double price,volume; char base[16],rel[16],exchange[16];
|
|
path += strlen("/InstantDEX/");
|
|
jsonstr[0] = 0;
|
|
if ( strncmp(path,"placebid/",strlen("placebid/")) == 0 )
|
|
{
|
|
path += strlen("placebid/");
|
|
if ( iguana_InstantDEX(jsonstr,path,"placebid") == 0 )
|
|
return(clonestr("{\"error\":\"error with placebid parameters\"}"));
|
|
}
|
|
else if ( strncmp(path,"placeask/",strlen("placeask/")) == 0 )
|
|
{
|
|
path += strlen("placeask/");
|
|
if ( iguana_InstantDEX(jsonstr,path,"placeask") == 0 )
|
|
return(clonestr("{\"error\":\"error with placeask parameters\"}"));
|
|
}
|
|
else if ( strncmp(path,"orderbook/",strlen("orderbook/")) == 0 )
|
|
{
|
|
path += strlen("orderbook/");
|
|
iguana_parsebidask(base,rel,exchange,&price,&volume,path);
|
|
if ( exchange[0] == 0 )
|
|
strcpy(exchange,"active");
|
|
sprintf(jsonstr,"{\"agent\":\"InstantDEX\",\"method\":\"orderbook\",\"base\":\"%s\",\"rel\":\"%s\",\"exchange\":\"%s\",\"allfields\":1}",base,rel,exchange);
|
|
}
|
|
else if ( strncmp(path,"orderstatus/",strlen("orderstatus/")) == 0 )
|
|
{
|
|
path += strlen("orderstatus/");
|
|
sprintf(jsonstr,"{\"agent\":\"InstantDEX\",\"method\":\"orderstatus\",\"orderid\":\"%s\"}",path);
|
|
}
|
|
else if ( strncmp(path,"cancelorder/",strlen("cancelorder/")) == 0 )
|
|
{
|
|
path += strlen("cancelorder/");
|
|
sprintf(jsonstr,"{\"agent\":\"InstantDEX\",\"method\":\"cancelorder\",\"orderid\":\"%s\"}",path);
|
|
}
|
|
else if ( strncmp(path,"balance/",strlen("balance/")) == 0 )
|
|
{
|
|
path += strlen("balance/");
|
|
iguana_parsebidask(base,rel,exchange,&price,&volume,path);
|
|
if ( path[0] != ' ' && path[0] != '/' )
|
|
sprintf(jsonstr,"{\"agent\":\"InstantDEX\",\"method\":\"balance\",\"exchange\":\"%s\"}",path);
|
|
else sprintf(jsonstr,"{\"agent\":\"InstantDEX\",\"method\":\"balance\"}");
|
|
}
|
|
else if ( strncmp(path,"openorders",strlen("openorders")) == 0 )
|
|
{
|
|
path += strlen("openorders");
|
|
sprintf(jsonstr,"{\"agent\":\"InstantDEX\",\"method\":\"openorders\"}");
|
|
}
|
|
else if ( strncmp(path,"tradehistory",strlen("tradehistory")) == 0 )
|
|
{
|
|
path += strlen("tradehistory");
|
|
sprintf(jsonstr,"{\"agent\":\"InstantDEX\",\"method\":\"tradehistory\"}");
|
|
}
|
|
else if ( strncmp(path,"allorderbooks",strlen("allorderbooks")) == 0 )
|
|
{
|
|
path += strlen("allorderbooks");
|
|
sprintf(jsonstr,"{\"agent\":\"InstantDEX\",\"method\":\"allorderbooks\"}");
|
|
}
|
|
else if ( strncmp(path,"allexchanges",strlen("allexchanges")) == 0 )
|
|
{
|
|
path += strlen("allexchanges");
|
|
sprintf(jsonstr,"{\"agent\":\"InstantDEX\",\"method\":\"allexchanges\"}");
|
|
}
|
|
if ( jsonstr[0] != 0 )
|
|
{
|
|
strcpy(Currentjsonstr,jsonstr);
|
|
return(clonestr(jsonstr));
|
|
//return(InstantDEX(jsonstr,remoteaddr,localaccess));
|
|
}
|
|
return(clonestr("{\"error\":\"unrecognized InstantDEX API call\"}"));
|
|
}
|
|
else if ( strncmp(path,"/pangea/",strlen("/pangea/")) == 0 )
|
|
{
|
|
path += strlen("/pangea/");
|
|
}
|
|
else if ( strncmp(path,"/jumblr/",strlen("/jumblr/")) == 0 )
|
|
{
|
|
path += strlen("/jumblr/");
|
|
}
|
|
else printf("no match to (%s)\n",path);
|
|
return(0);
|
|
}
|
|
|
|
char *iguana_rpcparse(char *retbuf,int32_t bufsize,int32_t *postflagp,char *jsonstr)
|
|
{
|
|
cJSON *json = 0; int32_t i,n,localaccess,datalen,postflag = 0;
|
|
char *key,*reststr,*str,*retstr,remoteaddr[65],porturl[65],*data = 0,*value,*agent = "SuperNET";
|
|
//printf("rpcparse.(%s)\n",jsonstr);
|
|
localaccess = 1;
|
|
if ( (str= strstr("Referer: ",jsonstr)) != 0 )
|
|
{
|
|
for (i=0; str[i]!=' '&&str[i]!=0&&str[i]!='\n'&&str[i]!='\r'; i++)
|
|
remoteaddr[i] = str[i];
|
|
remoteaddr[i] = 0;
|
|
} else strcpy(remoteaddr,"127.0.0.1"); // need to verify this
|
|
*postflagp = 0;
|
|
if ( strncmp("POST",jsonstr,4) == 0 )
|
|
jsonstr += 6, *postflagp = postflag = 1;
|
|
else if ( strncmp("GET",jsonstr,3) == 0 )
|
|
{
|
|
jsonstr += 4;
|
|
str = 0;
|
|
sprintf(porturl,"Referer: http://127.0.0.1:%u",IGUANA_RPCPORT);
|
|
if ( (str= iguana_htmlget(retbuf,bufsize,postflagp,jsonstr,remoteaddr,localaccess)) == 0 && (reststr= strstr(jsonstr,porturl)) != 0 )
|
|
{
|
|
reststr += strlen(porturl);
|
|
str = iguana_htmlget(retbuf,bufsize,postflagp,reststr,remoteaddr,localaccess);
|
|
}
|
|
if ( str != 0 )
|
|
{
|
|
if ( *postflagp == 0 )
|
|
{
|
|
json = cJSON_CreateObject();
|
|
jaddstr(json,"result",str);
|
|
if ( str != retbuf )
|
|
free(str);
|
|
str = cJSON_Print(json);
|
|
free_json(json);
|
|
}
|
|
return(str);
|
|
}
|
|
jsonstr++;
|
|
}
|
|
else return(0);
|
|
n = (int32_t)strlen(jsonstr);
|
|
for (i=0; i<n; i++)
|
|
if ( jsonstr[i] == '?' )
|
|
break;
|
|
if ( i == n )
|
|
{
|
|
//printf("no url\n");
|
|
return(0);
|
|
}
|
|
if ( i > 0 )
|
|
{
|
|
jsonstr[i] = 0;
|
|
agent = jsonstr;
|
|
jsonstr += i;
|
|
}
|
|
jsonstr++;
|
|
json = cJSON_CreateObject();
|
|
jaddstr(json,"agent",agent);
|
|
while ( 1 )
|
|
{
|
|
n = (int32_t)strlen(jsonstr);
|
|
key = jsonstr;
|
|
value = 0;
|
|
for (i=0; i<n; i++)
|
|
{
|
|
if ( jsonstr[i] == ' ' || jsonstr[i] == '&' )
|
|
break;
|
|
else if ( jsonstr[i] == '=' )
|
|
{
|
|
if ( value != 0 )
|
|
{
|
|
printf("parse error.(%s)\n",jsonstr);
|
|
free_json(json);
|
|
return(0);
|
|
}
|
|
jsonstr[i] = 0;
|
|
value = &jsonstr[++i];
|
|
}
|
|
}
|
|
if ( value == 0 )
|
|
value = "";
|
|
jsonstr += i;
|
|
if ( jsonstr[0] == ' ' )
|
|
{
|
|
jsonstr[0] = 0;
|
|
jsonstr++;
|
|
if ( key != 0 && key[0] != 0 )
|
|
jaddstr(json,key,value);
|
|
//printf("{%s:%s}\n",key,value);
|
|
break;
|
|
}
|
|
jsonstr[0] = 0;
|
|
jsonstr++;
|
|
if ( key != 0 && key[0] != 0 )
|
|
jaddstr(json,key,value);
|
|
//printf("{%s:%s}\n",key,value);
|
|
if ( i == 0 )
|
|
break;
|
|
}
|
|
n = (int32_t)strlen(jsonstr);
|
|
datalen = 0;
|
|
if ( postflag != 0 )
|
|
{
|
|
for (i=0; i<n; i++)
|
|
{
|
|
//printf("(%d) ",jsonstr[i]);
|
|
if ( jsonstr[i] == '\n' || jsonstr[i] == '\r' )
|
|
{
|
|
//printf("[%s] cmp.%d\n",jsonstr+i+1,strncmp(jsonstr+i+1,"Content-Length:",strlen("Content-Length:")));
|
|
if ( strncmp(jsonstr+i+1,"Content-Length:",strlen("Content-Length:")) == 0 )
|
|
{
|
|
datalen = (int32_t)atoi(jsonstr + i + 1 + strlen("Content-Length:") + 1);
|
|
data = &jsonstr[n - datalen];
|
|
//printf("post.(%s) (%c)\n",data,data[0]);
|
|
//iguana_urldecode(data);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
retstr = iguana_rpc(agent,json,data,datalen,remoteaddr);
|
|
free_json(json);
|
|
return(retstr);
|
|
//printf("post.%d json.(%s) data[%d] %s\n",postflag,jprint(json,0),datalen,data!=0?data:"");
|
|
//return(json);
|
|
}
|
|
|
|
int32_t iguana_htmlgen(char *retbuf,int32_t bufsize,char *result,char *error,cJSON *json,char *tabname,char *origjsonstr)
|
|
{
|
|
char *url = "http://127.0.0.1:7778";
|
|
int i,j,m,size = 0,n,rows,cols; cJSON *array,*obj,*array2,*item,*tmp;
|
|
char formheader[512],formfooter[512],clickname[512],buf[512],fieldbuf[512],fieldindex[2],postjson[8192];
|
|
char *disp,*fieldname,*button,*agent,*method,*str;
|
|
bufsize--;
|
|
HTML_EMIT("<html> <head></head> <body> <p id=\"RTstats\"></p> ");
|
|
sprintf(buf,"<canvas id=\"canvas\" width=\"%d\" height=\"%d\"></canvas><script>var Width = %d; var Height = %d;",IGUANA_WIDTH,IGUANA_HEIGHT,IGUANA_WIDTH,IGUANA_HEIGHT);
|
|
HTML_EMIT(buf);
|
|
HTML_EMIT("var RTparsed = 0; var RTcount = 0; var RTpending = 0; var RTwidth; var RTheight; var RTamplitude; var RTname; var RTjson;");
|
|
sprintf(buf,"setInterval(iguana_poll,%d);",IGUANS_JSMILLIS);
|
|
HTML_EMIT(buf);
|
|
HTML_EMIT("\
|
|
\
|
|
function process_bitmap(bitmapjson) \
|
|
{\
|
|
var red,green,blue,n,m; var bitmap = JSON.parse(bitmapjson); \
|
|
var canvas = document.getElementById(\"canvas\"); \
|
|
var ctx = canvas.getContext(\"2d\"); \
|
|
var image = ctx.getImageData(0,0,Width,Height); \
|
|
RTamplitude = bitmap.amplitude / 255; \
|
|
RTname = bitmap.status; \
|
|
RTjson = bitmapjson; RTwidth = bitmap.width; RTheight = bitmap.height; \
|
|
red = 0; blue = 0; green = 0; n = 0; m = 0;\
|
|
for (y=0; y<Height; y++)\
|
|
{\
|
|
for (x=0; x<Width; x++)\
|
|
{\
|
|
image.data[m++] = bitmap.pixels[n++]; image.data[m++] = bitmap.pixels[n++]; image.data[m++] = bitmap.pixels[n++]; image.data[m++] = 255; \
|
|
}\
|
|
}\
|
|
ctx.putImageData(image,0,0);\
|
|
RTcount++;\
|
|
RTparsed = 1;\
|
|
}\
|
|
\
|
|
function bitmap_handler() \
|
|
{ \
|
|
if ( this.status == 200 && this.responseText != null ) { \
|
|
process_bitmap(this.responseText); \
|
|
if ( RTpending > 0 ) RTpending--; \
|
|
} \
|
|
} \
|
|
\
|
|
function httpGet()\
|
|
{\
|
|
var client;\
|
|
if (window.XMLHttpRequest)\
|
|
client = new XMLHttpRequest();\
|
|
else\
|
|
client = new ActiveXObject(\"Microsoft.XMLHTTP\");\
|
|
client.onload = bitmap_handler;\
|
|
client.open(\"GET\",\"http://127.0.0.1:7778/api/bitmap\");\
|
|
client.send();\
|
|
}\
|
|
\
|
|
function iguana_poll( )\
|
|
{ \
|
|
var y,x,m,red,green,blue; \
|
|
document.getElementById(\"RTstats\").innerHTML = RTcount + ' ' + RTname;\
|
|
if ( RTpending == 0 )\
|
|
{\
|
|
httpGet();\
|
|
RTpending++;\
|
|
}\
|
|
} </script><br>");
|
|
//sprintf(buf,"<br> COIN: <textarea cols=\"8\" rows=\"1\" name=\"COIN_NAME\"/>name</textarea>");
|
|
//HTML_EMIT(buf);
|
|
if ( 0 )
|
|
{
|
|
sprintf(formfooter,"\t<input type=\"button\" value=\"%s\" onclick=\"click_%s()\" /></form>","InstantDEX","iguana49_setagent"); HTML_EMIT(formfooter);
|
|
sprintf(formfooter,"\t<input type=\"button\" value=\"%s\" onclick=\"click_%s()\" /></form>","PAX","iguana50_setagent"); HTML_EMIT(formfooter);
|
|
sprintf(formfooter,"\t<input type=\"button\" value=\"%s\" onclick=\"click_%s()\" /></form>","pangea","iguana51_setagent"); HTML_EMIT(formfooter);
|
|
sprintf(formfooter,"\t<input type=\"button\" value=\"%s\" onclick=\"click_%s()\" /></form>","jumblr","iguana52_setagent"); HTML_EMIT(formfooter);
|
|
sprintf(formfooter,"\t<input type=\"button\" value=\"%s\" onclick=\"click_%s()\" /></form>","ramchain","iguana53_setagent"); HTML_EMIT(formfooter);
|
|
sprintf(formfooter,"\t<input type=\"button\" value=\"%s\" onclick=\"click_%s()\" /></form>","iguana","iguana54_setagent"); HTML_EMIT(formfooter);
|
|
}
|
|
HTML_EMIT(" Agent: "); HTML_EMIT(Default_agent);
|
|
|
|
HTML_EMIT("<br><br/>");
|
|
HTML_EMIT(origjsonstr); HTML_EMIT(" -> ");
|
|
HTML_EMIT("<textarea cols=\"150\" rows=\"10\" name=\"jsonresult\"/>");
|
|
tmp = cJSON_Parse(result), str = cJSON_Print(tmp), free_json(tmp);
|
|
HTML_EMIT(str); free(str);
|
|
HTML_EMIT(error);
|
|
HTML_EMIT("</textarea>");
|
|
formheader[0] = formfooter[0] = 0;
|
|
if ( (array= jarray(&n,json,"forms")) != 0 )
|
|
{
|
|
for (i=0; i<n; i++)
|
|
{
|
|
item = jitem(array,i);
|
|
//printf("FORM[%d] of %d %s\n",i,n,jprint(item,0));
|
|
// {"forms":[{"name":"block","agent":"ramchain","fields":[{"disp":"height of block","field":"height","cols":10,"rows":1},{"disp":"blockhash","field":"hash","cols":65,"rows":1}]}]}
|
|
if ( (method= jstr(item,"method")) == 0 )
|
|
method = "missing";
|
|
sprintf(clickname,"%s%d_%s",tabname,i,method);
|
|
if ( (button= jstr(item,"button")) == 0 )
|
|
button = method;
|
|
if ( (agent= jstr(item,"agent")) == 0 )
|
|
agent = "iguana";
|
|
if ( strncmp(Default_agent,"ALL",3) != 0 && strcmp(method,"setagent") != 0 && strncmp(Default_agent,agent,strlen(agent)) != 0 )
|
|
{
|
|
//printf("Default_agent.%s vs agent.(%s)\n",Default_agent,agent);
|
|
continue;
|
|
}
|
|
sprintf(buf,"<script> function click_%s()\n{\n",clickname);
|
|
HTML_EMIT(buf);
|
|
sprintf(postjson,"%s/%s",agent,method);
|
|
//printf("form.%s button.%s [%s]\n",formname,button,postjson);
|
|
if ( (array2= jarray(&m,item,"fields")) != 0 )
|
|
{
|
|
//sprintf(buf,"COIN = document.COIN_NAME.value;\n");
|
|
//sprintf(postjson+strlen(postjson),"/%s/' + %s + '","coin","COIN");
|
|
for (j=0; j<m; j++)
|
|
{
|
|
obj = jitem(array2,j);
|
|
//printf("item[%d] -> (%s)\n",j,jprint(obj,0));
|
|
sprintf(fieldindex,"%c",'A'+j);
|
|
if ( (fieldname= jstr(obj,"field")) != 0 )
|
|
{
|
|
sprintf(buf,"%s = document.%s.%s.value;\n",fieldindex,clickname,fieldname);
|
|
HTML_EMIT(buf);
|
|
//sprintf(postjson+strlen(postjson),",\"%s\":\"' + %s + '\"",fieldname,fieldindex);
|
|
if ( juint(obj,"skip") == 0 )
|
|
sprintf(postjson+strlen(postjson),"/%s/' + %s + '",fieldname,fieldindex);
|
|
else sprintf(postjson+strlen(postjson),"/' + %s + '",fieldindex);
|
|
}
|
|
}
|
|
//strcat(postjson,"}");
|
|
sprintf(&retbuf[size],"location.href = '%s/%s';\n}</script>\r\n",url,postjson), size += strlen(&retbuf[size]);
|
|
sprintf(formheader,"<form name=\"%s\" action=\"%s\" method=\"POST\" onsubmit=\"return submitForm(this);\"><table>",clickname,url);
|
|
HTML_EMIT(formheader);
|
|
disp = jstr(item,"disp");
|
|
for (j=0; j<m; j++)
|
|
{
|
|
obj = jitem(array2,j);
|
|
rows = juint(obj,"rows");
|
|
cols = juint(obj,"cols");
|
|
if ( (fieldname= jstr(obj,"field")) == 0 )
|
|
sprintf(fieldbuf,"%s_%c",clickname,'A'+j), fieldname = fieldbuf;
|
|
if ( rows == 0 && cols == 0 )
|
|
sprintf(buf,"<input type=\"text\" name=\"%s\"/>",fieldname);
|
|
else sprintf(buf,"<textarea cols=\"%d\" rows=\"%d\" name=\"%s\"/ %s></textarea>",cols,rows,fieldname,cols == 1 ? "hidden" : "");
|
|
str = disp==0?jstr(obj,"disp"):disp;
|
|
sprintf(&retbuf[size],"<td>%s</td> <td> %s </td>\r\n",str!=0?str:fieldname,buf), size += strlen(&retbuf[size]);
|
|
}
|
|
sprintf(formfooter,"<td colspan=\"2\"> <input type=\"button\" value=\"%s\" onclick=\"click_%s()\" /></td> </tr>\n</table></form>",button,clickname);
|
|
HTML_EMIT(formfooter);
|
|
}
|
|
}
|
|
}
|
|
HTML_EMIT("<br><br/>"); HTML_EMIT("</body></html>"); HTML_EMIT("<br><br/>");
|
|
return((int32_t)strlen(retbuf));
|
|
}
|
|
#undef HTML_EMIT
|
|
|
|
char *iguana_htmlresponse(char *retbuf,int32_t bufsize,int32_t *remainsp,int32_t localaccess,char *retstr,int32_t freeflag)
|
|
{
|
|
static char *html = "<html> <head></head> <body> %s </body> </html>";
|
|
char *result=0,*error=0; int32_t n; cJSON *json,*formsjson;
|
|
retbuf[0] = 0;
|
|
/*if ( localaccess == 0 )
|
|
sprintf(retbuf+strlen(retbuf),"Access-Control-Allow-Origin: *\r\n");
|
|
else sprintf(retbuf+strlen(retbuf),"Access-Control-Allow-Origin: null\r\n");
|
|
sprintf(retbuf+strlen(retbuf),"Access-Control-Allow-Credentials: true\r\n");
|
|
sprintf(retbuf+strlen(retbuf),"Access-Control-Allow-Headers: Authorization, Content-Type\r\n");
|
|
sprintf(retbuf+strlen(retbuf),"Access-Control-Allow-Methods: GET, POST\r\n");
|
|
sprintf(retbuf+strlen(retbuf),"Cache-Control: no-cache, no-store, must-revalidate\r\n");
|
|
sprintf(retbuf+strlen(retbuf),"Content-type: text/html\r\n");
|
|
sprintf(retbuf+strlen(retbuf),"Content-Length: %8d\r\n\r\n",n);*/
|
|
sprintf(retbuf+strlen(retbuf),"<!DOCTYPE HTML>\n\r");
|
|
n = (int32_t)strlen(retbuf);
|
|
formsjson = cJSON_Parse(IGUANA_FORMS);
|
|
if ( (json= cJSON_Parse(retstr)) == 0 )
|
|
json = cJSON_CreateObject();
|
|
jadd(json,"forms",formsjson);
|
|
error = jstr(json,"error");
|
|
result = jstr(json,"result");
|
|
//printf("process.(%s)\n",jprint(formsjson,0));
|
|
n = iguana_htmlgen(&retbuf[n],bufsize-n,result,error,json,"iguana",Currentjsonstr);
|
|
free_json(json);
|
|
if ( n == 0 )
|
|
{
|
|
n = (int32_t)(strlen(html) + strlen(retstr) + 1);
|
|
sprintf(retbuf+strlen(retbuf),html,retstr);
|
|
}
|
|
if ( freeflag != 0 )
|
|
free(retstr);
|
|
if ( n > bufsize )
|
|
{
|
|
printf("htmlresponse overflowed buffer[%d] with %d\n",bufsize,n);
|
|
exit(-1);
|
|
}
|
|
*remainsp = n;
|
|
return(retbuf);
|
|
}
|
|
|
|
void iguana_rpcloop(void *args)
|
|
{
|
|
int32_t recvlen,bindsock,postflag,sock,remains,numsent,len; socklen_t clilen;
|
|
char ipaddr[64],jsonbuf[8192],*buf,*retstr,*space;//,*retbuf; ,n,i,m
|
|
struct sockaddr_in cli_addr; uint32_t ipbits,i,size = IGUANA_WIDTH*IGUANA_HEIGHT*16 + 512; uint16_t port;
|
|
port = IGUANA_RPCPORT;
|
|
bindsock = iguana_socket(1,"127.0.0.1",port);
|
|
printf("iguana_rpcloop 127.0.0.1:%d bind sock.%d\n",port,bindsock);
|
|
space = calloc(1,size);
|
|
while ( bindsock >= 0 )
|
|
{
|
|
clilen = sizeof(cli_addr);
|
|
//printf("ACCEPT (%s:%d) on sock.%d\n","127.0.0.1",port,bindsock);
|
|
sock = accept(bindsock,(struct sockaddr *)&cli_addr,&clilen);
|
|
if ( sock < 0 )
|
|
{
|
|
//printf("iguana_rpcloop ERROR on accept usock.%d\n",sock);
|
|
continue;
|
|
}
|
|
memcpy(&ipbits,&cli_addr.sin_addr.s_addr,sizeof(ipbits));
|
|
expand_ipbits(ipaddr,ipbits);
|
|
//printf("RPC.%d for %x (%s)\n",sock,ipbits,ipaddr);
|
|
//printf("%p got.(%s) from %s | usock.%d ready.%u dead.%u\n",addr,H.command,addr->ipaddr,addr->usock,addr->ready,addr->dead);
|
|
memset(jsonbuf,0,sizeof(jsonbuf));
|
|
remains = (int32_t)(sizeof(jsonbuf) - 1);
|
|
buf = jsonbuf;
|
|
recvlen = 0;
|
|
retstr = 0;
|
|
while ( remains > 0 )
|
|
{
|
|
if ( (len= (int32_t)recv(sock,buf,remains,0)) < 0 )
|
|
{
|
|
if ( errno == EAGAIN )
|
|
{
|
|
printf("EAGAIN for len %d, remains.%d\n",len,remains);
|
|
usleep(10000);
|
|
}
|
|
break;
|
|
}
|
|
else
|
|
{
|
|
if ( len > 0 )
|
|
{
|
|
remains -= len;
|
|
recvlen += len;
|
|
buf = &buf[len];
|
|
} else usleep(10000);
|
|
//printf("got.(%s) %d remains.%d of total.%d\n",jsonbuf,recvlen,remains,len);
|
|
retstr = iguana_rpcparse(space,size,&postflag,jsonbuf);
|
|
break;
|
|
}
|
|
}
|
|
if ( retstr != 0 )
|
|
{
|
|
i = 0;
|
|
if ( postflag == 0 )
|
|
retstr = iguana_htmlresponse(space,size,&remains,1,retstr,1);
|
|
else remains = (int32_t)strlen(retstr);
|
|
//printf("RETBUF.(%s)\n",retstr);
|
|
while ( remains > 0 )
|
|
{
|
|
if ( (numsent= (int32_t)send(sock,&retstr[i],remains,MSG_NOSIGNAL)) < 0 )
|
|
{
|
|
if ( errno != EAGAIN && errno != EWOULDBLOCK )
|
|
{
|
|
//printf("%s: %s numsent.%d vs remains.%d len.%d errno.%d (%s) usock.%d\n",retstr,ipaddr,numsent,remains,recvlen,errno,strerror(errno),sock);
|
|
break;
|
|
}
|
|
}
|
|
else if ( remains > 0 )
|
|
{
|
|
remains -= numsent;
|
|
i += numsent;
|
|
if ( remains > 0 )
|
|
printf("iguana sent.%d remains.%d of len.%d\n",numsent,remains,recvlen);
|
|
}
|
|
}
|
|
if ( retstr != space)
|
|
free(retstr);
|
|
}
|
|
if ( Currentjsonstr[0] != 0 )
|
|
strcpy(Prevjsonstr,Currentjsonstr);
|
|
Currentjsonstr[0] = 0;
|
|
//printf("done response sock.%d\n",sock);
|
|
close(sock);
|
|
}
|
|
}
|