Browse Source

ckdb - change username fields and all relevant fields in paymentaddresses and payments to intransient

master
kanoi 8 years ago
parent
commit
08a937768c
  1. 5
      src/ckdb.c
  2. 32
      src/ckdb.h
  3. 223
      src/ckdb_cmd.c
  4. 12
      src/ckdb_crypt.c
  5. 66
      src/ckdb_data.c
  6. 66
      src/ckdb_dbio.c

5
src/ckdb.c

@ -459,6 +459,9 @@ K_TREE *intransient_root;
K_LIST *intransient_free; K_LIST *intransient_free;
K_STORE *intransient_store; K_STORE *intransient_store;
/* *** WARNING *** all incoming field names processed by breakdown(),
* that are used as intransient anywhere, MUST be here
* TODO: this should be a hash table */
char *intransient_fields[] = { char *intransient_fields[] = {
"workername", "workername",
"blockhash", "blockhash",
@ -466,6 +469,7 @@ char *intransient_fields[] = {
CODETRF, CODETRF,
INETTRF, INETTRF,
"username", "username",
"admin",
"agent", "agent",
"useragent", "useragent",
"address", "address",
@ -474,6 +478,7 @@ char *intransient_fields[] = {
"version", "version",
"poolinstance", "poolinstance",
"payaddress", "payaddress",
"subname",
"originaltxn", "originaltxn",
"committxn", "committxn",
"commitblockhash", "commitblockhash",

32
src/ckdb.h

@ -58,7 +58,7 @@
#define DB_VLOCK "1" #define DB_VLOCK "1"
#define DB_VERSION "1.0.7" #define DB_VERSION "1.0.7"
#define CKDB_VERSION DB_VERSION"-2.500" #define CKDB_VERSION DB_VERSION"-2.501"
#define WHERE_FFL " - from %s %s() line %d" #define WHERE_FFL " - from %s %s() line %d"
#define WHERE_FFL_HERE __FILE__, __func__, __LINE__ #define WHERE_FFL_HERE __FILE__, __func__, __LINE__
@ -1790,7 +1790,7 @@ extern K_LIST *seqtrans_free;
// USERS // USERS
typedef struct users { typedef struct users {
int64_t userid; int64_t userid;
char username[TXT_BIG+1]; char *in_username;
char usertrim[TXT_BIG+1]; // non-DB field char usertrim[TXT_BIG+1]; // non-DB field
// Anything in 'status' fails mining authentication // Anything in 'status' fails mining authentication
char status[TXT_BIG+1]; char status[TXT_BIG+1];
@ -1942,10 +1942,10 @@ extern K_LIST *workers_db_free;
typedef struct paymentaddresses { typedef struct paymentaddresses {
int64_t paymentaddressid; int64_t paymentaddressid;
int64_t userid; int64_t userid;
char payaddress[TXT_BIG+1]; char *in_payaddress;
int32_t payratio; int32_t payratio;
char payname[TXT_SML+1]; char payname[TXT_SML+1];
HISTORYDATECONTROLFIELDS; HISTORYDATECONTROLIN;
bool match; // non-DB field bool match; // non-DB field
} PAYMENTADDRESSES; } PAYMENTADDRESSES;
@ -1967,14 +1967,14 @@ typedef struct payments {
int64_t paymentid; int64_t paymentid;
int64_t payoutid; int64_t payoutid;
int64_t userid; int64_t userid;
char subname[TXT_BIG+1]; char *in_subname;
tv_t paydate; tv_t paydate;
char payaddress[TXT_BIG+1]; char *in_payaddress;
char originaltxn[TXT_BIG+1]; char *in_originaltxn;
int64_t amount; int64_t amount;
double diffacc; double diffacc;
char committxn[TXT_BIG+1]; char *in_committxn;
char commitblockhash[TXT_BIG+1]; char *in_commitblockhash;
HISTORYDATECONTROLIN; HISTORYDATECONTROLIN;
K_ITEM *old_item; // non-DB field K_ITEM *old_item; // non-DB field
} PAYMENTS; } PAYMENTS;
@ -3152,7 +3152,7 @@ enum info_type {
// USERINFO from various incoming data // USERINFO from various incoming data
typedef struct userinfo { typedef struct userinfo {
int64_t userid; int64_t userid;
char username[TXT_BIG+1]; char *in_username;
int blocks; int blocks;
int orphans; // How many blocks are orphans int orphans; // How many blocks are orphans
int rejects; // How many blocks are rejects int rejects; // How many blocks are rejects
@ -3643,14 +3643,16 @@ extern bool users_update(PGconn *conn, K_ITEM *u_item, char *oldhash,
char *newhash, char *email, char *by, char *code, char *newhash, char *email, char *by, char *code,
char *inet, tv_t *cd, K_TREE *trf_root, char *status, char *inet, tv_t *cd, K_TREE *trf_root, char *status,
int *event); int *event);
extern K_ITEM *users_add(PGconn *conn, char *username, char *emailaddress, extern K_ITEM *users_add(PGconn *conn, INTRANSIENT *in_username,
char *passwordhash, int64_t userbits, char *by, char *emailaddress, char *passwordhash,
char *code, char *inet, tv_t *cd, K_TREE *trf_root); int64_t userbits, char *by, char *code, char *inet,
tv_t *cd, K_TREE *trf_root);
extern bool users_replace(PGconn *conn, K_ITEM *u_item, K_ITEM *old_u_item, extern bool users_replace(PGconn *conn, K_ITEM *u_item, K_ITEM *old_u_item,
char *by, char *code, char *inet, tv_t *cd, char *by, char *code, char *inet, tv_t *cd,
K_TREE *trf_root); K_TREE *trf_root);
extern bool users_fill(PGconn *conn); extern bool users_fill(PGconn *conn);
extern bool useratts_item_add(PGconn *conn, K_ITEM *ua_item, tv_t *cd, bool begun); extern bool useratts_item_add(PGconn *conn, K_ITEM *ua_item, tv_t *cd,
bool begun);
extern K_ITEM *useratts_add(PGconn *conn, char *username, char *attname, extern K_ITEM *useratts_add(PGconn *conn, char *username, char *attname,
char *status, char *attstr, char *attstr2, char *status, char *attstr, char *attstr2,
char *attnum, char *attnum2, char *attdate, char *attnum, char *attnum2, char *attdate,
@ -3753,7 +3755,7 @@ extern int _events_add(int id, char *by, char *inet, tv_t *cd, K_TREE *trf_root)
#define events_add(_id, _trf_root) _events_add(_id, NULL, NULL, NULL, _trf_root) #define events_add(_id, _trf_root) _events_add(_id, NULL, NULL, NULL, _trf_root)
extern int _ovents_add(int id, char *by, char *inet, tv_t *cd, K_TREE *trf_root); extern int _ovents_add(int id, char *by, char *inet, tv_t *cd, K_TREE *trf_root);
#define ovents_add(_id, _trf_root) _ovents_add(_id, NULL, NULL, NULL, _trf_root) #define ovents_add(_id, _trf_root) _ovents_add(_id, NULL, NULL, NULL, _trf_root)
extern bool auths_add(PGconn *conn, char *poolinstance, char *username, extern bool auths_add(PGconn *conn, char *poolinstance, INTRANSIENT *in_username,
INTRANSIENT *in_workername, char *clientid, INTRANSIENT *in_workername, char *clientid,
char *enonce1, char *useragent, char *preauth, char *by, char *enonce1, char *useragent, char *preauth, char *by,
char *code, char *inet, tv_t *cd, K_TREE *trf_root, char *code, char *inet, tv_t *cd, K_TREE *trf_root,

223
src/ckdb_cmd.c

@ -14,22 +14,22 @@
* This should ONLY be used for web reporting cmds i.e. read only * This should ONLY be used for web reporting cmds i.e. read only
* Current PHP allows this for a hard coded user * Current PHP allows this for a hard coded user
*/ */
static K_ITEM *adminuser(K_TREE *trf_root, char *reply, size_t siz) static INTRANSIENT *adminuser(K_TREE *trf_root, char *reply, size_t siz)
{ {
K_ITEM *i_username, *i_admin; INTRANSIENT *in_username, *in_admin;
char reply2[1024] = ""; char reply2[1024] = "";
i_username = require_name(trf_root, "username", MIN_USERNAME, in_username = require_in(trf_root, "username", MIN_USERNAME,
(char *)userpatt, reply, siz); (char *)userpatt, reply, siz);
if (!i_username) if (!in_username)
return NULL; return NULL;
i_admin = optional_name(trf_root, "admin", MIN_USERNAME, in_admin = optional_in(trf_root, "admin", MIN_USERNAME,
(char *)userpatt, reply2, sizeof(reply2)); (char *)userpatt, reply2, sizeof(reply2));
if (i_admin) if (in_admin)
return i_admin; return in_admin;
return i_username; return in_username;
} }
static char *cmd_adduser(PGconn *conn, char *cmd, char *id, tv_t *now, char *by, static char *cmd_adduser(PGconn *conn, char *cmd, char *id, tv_t *now, char *by,
@ -38,14 +38,15 @@ static char *cmd_adduser(PGconn *conn, char *cmd, char *id, tv_t *now, char *by,
{ {
char reply[1024] = ""; char reply[1024] = "";
size_t siz = sizeof(reply); size_t siz = sizeof(reply);
K_ITEM *i_username, *i_emailaddress, *i_passwordhash, *u_item = NULL; K_ITEM *i_emailaddress, *i_passwordhash, *u_item = NULL;
INTRANSIENT *in_username;
int event = EVENT_OK; int event = EVENT_OK;
LOGDEBUG("%s(): cmd '%s'", __func__, cmd); LOGDEBUG("%s(): cmd '%s'", __func__, cmd);
i_username = require_name(trf_root, "username", MIN_USERNAME, in_username = require_in(trf_root, "username", MIN_USERNAME,
(char *)userpatt, reply, siz); (char *)userpatt, reply, siz);
if (!i_username) if (!in_username)
return strdup(reply); return strdup(reply);
/* If a username added from the web site looks like an address /* If a username added from the web site looks like an address
@ -56,7 +57,7 @@ static char *cmd_adduser(PGconn *conn, char *cmd, char *id, tv_t *now, char *by,
* ... and the person who owns the payout address can't check that * ... and the person who owns the payout address can't check that
* in advance, they'll just find out with their first payout not * in advance, they'll just find out with their first payout not
* arriving at their payout address */ * arriving at their payout address */
if (!like_address(transfer_data(i_username))) { if (!like_address(in_username->str)) {
i_emailaddress = require_name(trf_root, "emailaddress", 7, i_emailaddress = require_name(trf_root, "emailaddress", 7,
(char *)mailpatt, reply, siz); (char *)mailpatt, reply, siz);
if (!i_emailaddress) if (!i_emailaddress)
@ -69,7 +70,7 @@ static char *cmd_adduser(PGconn *conn, char *cmd, char *id, tv_t *now, char *by,
event = events_add(EVENTID_CREACC, trf_root); event = events_add(EVENTID_CREACC, trf_root);
if (event == EVENT_OK) { if (event == EVENT_OK) {
u_item = users_add(conn, transfer_data(i_username), u_item = users_add(conn, in_username,
transfer_data(i_emailaddress), transfer_data(i_emailaddress),
transfer_data(i_passwordhash), 0, transfer_data(i_passwordhash), 0,
by, code, inet, now, trf_root); by, code, inet, now, trf_root);
@ -80,8 +81,8 @@ static char *cmd_adduser(PGconn *conn, char *cmd, char *id, tv_t *now, char *by,
LOGERR("%s() %s.failed.DBE", __func__, id); LOGERR("%s() %s.failed.DBE", __func__, id);
return reply_event(event, "failed.DBE"); return reply_event(event, "failed.DBE");
} }
LOGDEBUG("%s.ok.added %s", id, transfer_data(i_username)); LOGDEBUG("%s.ok.added %s", id, in_username->str);
snprintf(reply, siz, "ok.added %s", transfer_data(i_username)); snprintf(reply, siz, "ok.added %s", in_username->str);
return strdup(reply); return strdup(reply);
} }
@ -292,7 +293,7 @@ static char *cmd_2fa(__maybe_unused PGconn *conn, char *cmd, char *id,
LOGERR("%s() users databits invalid for " LOGERR("%s() users databits invalid for "
"'%s/%"PRId64, "'%s/%"PRId64,
__func__, __func__,
st = safe_text_nonull(users->username), st = safe_text_nonull(users->in_username),
users->databits); users->databits);
FREENULL(st); FREENULL(st);
goto dame; goto dame;
@ -406,7 +407,7 @@ static char *cmd_2fa(__maybe_unused PGconn *conn, char *cmd, char *id,
LOGERR("%s() invalid key for '%s/%s " LOGERR("%s() invalid key for '%s/%s "
"len(%d) != %d", "len(%d) != %d",
__func__, __func__,
st = safe_text_nonull(users->username), st = safe_text_nonull(users->in_username),
USER_TOTPAUTH_NAME, (int)binlen, USER_TOTPAUTH_NAME, (int)binlen,
TOTPAUTH_KEYSIZE); TOTPAUTH_KEYSIZE);
FREENULL(st); FREENULL(st);
@ -470,11 +471,12 @@ static char *cmd_userset(PGconn *conn, char *cmd, char *id,
__maybe_unused tv_t *notcd, K_TREE *trf_root, __maybe_unused tv_t *notcd, K_TREE *trf_root,
__maybe_unused bool reload_data) __maybe_unused bool reload_data)
{ {
K_ITEM *i_username, *i_passwordhash, *i_2fa, *i_rows, *i_address; INTRANSIENT *in_username, *in_address;
K_ITEM *i_passwordhash, *i_2fa, *i_rows;
K_ITEM *i_ratio, *i_payname, *i_email, *u_item, *pa_item, *old_pa_item; K_ITEM *i_ratio, *i_payname, *i_email, *u_item, *pa_item, *old_pa_item;
K_ITEM *ua_item = NULL; K_ITEM *ua_item = NULL;
USERATTS *useratts = NULL; USERATTS *useratts = NULL;
char *email, *address, *payname; char *email, *payname;
char reply[1024] = ""; char reply[1024] = "";
size_t siz = sizeof(reply); size_t siz = sizeof(reply);
int event = EVENT_OK; int event = EVENT_OK;
@ -493,16 +495,16 @@ static char *cmd_userset(PGconn *conn, char *cmd, char *id,
LOGDEBUG("%s(): cmd '%s'", __func__, cmd); LOGDEBUG("%s(): cmd '%s'", __func__, cmd);
i_username = require_name(trf_root, "username", MIN_USERNAME, in_username = require_in(trf_root, "username", MIN_USERNAME,
(char *)userpatt, reply, siz); (char *)userpatt, reply, siz);
if (!i_username) { if (!in_username) {
// For web this message is detailed enough // For web this message is detailed enough
reason = "System error"; reason = "System error";
goto struckout; goto struckout;
} }
K_RLOCK(users_free); K_RLOCK(users_free);
u_item = find_users(transfer_data(i_username)); u_item = find_users(in_username->str);
K_RUNLOCK(users_free); K_RUNLOCK(users_free);
if (!u_item) { if (!u_item) {
@ -549,7 +551,7 @@ static char *cmd_userset(PGconn *conn, char *cmd, char *id,
while (pa_item && CURRENT(&(row->expirydate)) && while (pa_item && CURRENT(&(row->expirydate)) &&
row->userid == users->userid) { row->userid == users->userid) {
snprintf(tmp, sizeof(tmp), "addr:%d=%s%c", snprintf(tmp, sizeof(tmp), "addr:%d=%s%c",
rows, row->payaddress, FLDSEP); rows, row->in_payaddress, FLDSEP);
APPEND_REALLOC(answer, off, len, tmp); APPEND_REALLOC(answer, off, len, tmp);
snprintf(tmp, sizeof(tmp), "ratio:%d=%d%c", snprintf(tmp, sizeof(tmp), "ratio:%d=%d%c",
rows, row->payratio, FLDSEP); rows, row->payratio, FLDSEP);
@ -649,22 +651,21 @@ static char *cmd_userset(PGconn *conn, char *cmd, char *id,
continue; continue;
snprintf(tmp, sizeof(tmp), "address:%d", i); snprintf(tmp, sizeof(tmp), "address:%d", i);
i_address = require_name(trf_root, tmp, in_address = require_in(trf_root, tmp,
ADDR_MIN_LEN, ADDR_MIN_LEN,
(char *)addrpatt, (char *)addrpatt,
reply, siz); reply, siz);
if (!i_address) { if (!in_address) {
K_WUNLOCK(paymentaddresses_free); K_WUNLOCK(paymentaddresses_free);
event = events_add(EVENTID_INCBTC, event = events_add(EVENTID_INCBTC,
trf_root); trf_root);
reason = "Invalid address"; reason = "Invalid address";
goto struckout; goto struckout;
} }
address = transfer_data(i_address);
pa_item = STORE_HEAD_NOLOCK(pa_store); pa_item = STORE_HEAD_NOLOCK(pa_store);
while (pa_item) { while (pa_item) {
DATA_PAYMENTADDRESSES(row, pa_item); DATA_PAYMENTADDRESSES(row, pa_item);
if (strcmp(row->payaddress, address) == 0) { if (INTREQ(row->in_payaddress, in_address->str)) {
K_WUNLOCK(paymentaddresses_free); K_WUNLOCK(paymentaddresses_free);
reason = "Duplicate address"; reason = "Duplicate address";
goto struckout; goto struckout;
@ -682,7 +683,7 @@ static char *cmd_userset(PGconn *conn, char *cmd, char *id,
pa_item = k_unlink_head(paymentaddresses_free); pa_item = k_unlink_head(paymentaddresses_free);
DATA_PAYMENTADDRESSES(row, pa_item); DATA_PAYMENTADDRESSES(row, pa_item);
bzero(row, sizeof(*row)); bzero(row, sizeof(*row));
STRNCPY(row->payaddress, address); row->in_payaddress = in_address->str;
row->payratio = ratio; row->payratio = ratio;
STRNCPY(row->payname, payname); STRNCPY(row->payname, payname);
k_add_head(pa_store, pa_item); k_add_head(pa_store, pa_item);
@ -704,7 +705,7 @@ static char *cmd_userset(PGconn *conn, char *cmd, char *id,
DATA_PAYMENTADDRESSES(row, pa_item); DATA_PAYMENTADDRESSES(row, pa_item);
// Only EVER validate addresses once ... for now // Only EVER validate addresses once ... for now
K_RLOCK(paymentaddresses_free); K_RLOCK(paymentaddresses_free);
old_pa_item = find_any_payaddress(row->payaddress); old_pa_item = find_any_payaddress(row->in_payaddress);
K_RUNLOCK(paymentaddresses_free); K_RUNLOCK(paymentaddresses_free);
if (old_pa_item) { if (old_pa_item) {
/* This test effectively means that /* This test effectively means that
@ -717,7 +718,7 @@ static char *cmd_userset(PGconn *conn, char *cmd, char *id,
reason = "Unavailable BTC address"; reason = "Unavailable BTC address";
goto struckout; goto struckout;
} }
} else if (!btc_valid_address(row->payaddress)) { } else if (!btc_valid_address(row->in_payaddress)) {
event = events_add(EVENTID_INVBTC, event = events_add(EVENTID_INVBTC,
trf_root); trf_root);
reason = "Invalid BTC address"; reason = "Invalid BTC address";
@ -767,8 +768,8 @@ struckout:
if (reason) { if (reason) {
char *user, *st = NULL; char *user, *st = NULL;
snprintf(reply, siz, "ERR.%s", reason); snprintf(reply, siz, "ERR.%s", reason);
if (i_username) if (in_username)
user = st = safe_text(transfer_data(i_username)); user = st = safe_text(in_username->str);
else else
user = EMPTY; user = EMPTY;
LOGERR("%s.%s.%s (%s)", cmd, id, reply, user); LOGERR("%s.%s.%s (%s)", cmd, id, reply, user);
@ -852,7 +853,7 @@ static char *cmd_workerset(PGconn *conn, char *cmd, char *id, tv_t *now,
update = true; update = true;
} }
if (update) { if (update) {
ua_item = useratts_add(conn, users->username, ua_item = useratts_add(conn, users->in_username,
USER_OLD_WORKERS, EMPTY, USER_OLD_WORKERS, EMPTY,
EMPTY, EMPTY, EMPTY, EMPTY,
transfer_data(i_oldworkers), transfer_data(i_oldworkers),
@ -1736,7 +1737,8 @@ static char *cmd_payments(__maybe_unused PGconn *conn, char *cmd, char *id,
__maybe_unused K_TREE *trf_root, __maybe_unused K_TREE *trf_root,
__maybe_unused bool reload_data) __maybe_unused bool reload_data)
{ {
K_ITEM *i_username, *u_item, *p_item, *p2_item, *po_item; K_ITEM *u_item, *p_item, *p2_item, *po_item;
INTRANSIENT *in_username;
K_TREE_CTX ctx[1]; K_TREE_CTX ctx[1];
K_STORE *pay_store; K_STORE *pay_store;
PAYMENTS *payments, *last_payments = NULL; PAYMENTS *payments, *last_payments = NULL;
@ -1752,12 +1754,12 @@ static char *cmd_payments(__maybe_unused PGconn *conn, char *cmd, char *id,
LOGDEBUG("%s(): cmd '%s'", __func__, cmd); LOGDEBUG("%s(): cmd '%s'", __func__, cmd);
i_username = adminuser(trf_root, reply, siz); in_username = adminuser(trf_root, reply, siz);
if (!i_username) if (!in_username)
return strdup(reply); return strdup(reply);
K_RLOCK(users_free); K_RLOCK(users_free);
u_item = find_users(transfer_data(i_username)); u_item = find_users(in_username->str);
K_RUNLOCK(users_free); K_RUNLOCK(users_free);
if (!u_item) if (!u_item)
return strdup("bad"); return strdup("bad");
@ -1774,13 +1776,17 @@ static char *cmd_payments(__maybe_unused PGconn *conn, char *cmd, char *id,
* if it has multiple items (percent payout user) */ * if it has multiple items (percent payout user) */
while (p_item && payments->userid == users->userid) { while (p_item && payments->userid == users->userid) {
if (CURRENT(&(payments->expirydate))) { if (CURRENT(&(payments->expirydate))) {
if (!last_payments || payments->payoutid != last_payments->payoutid) { if (!last_payments ||
payments->payoutid != last_payments->payoutid) {
p2_item = k_unlink_head(payments_free); p2_item = k_unlink_head(payments_free);
DATA_PAYMENTS_NULL(last_payments, p2_item); DATA_PAYMENTS_NULL(last_payments, p2_item);
memcpy(last_payments, payments, sizeof(*last_payments)); memcpy(last_payments, payments,
sizeof(*last_payments));
k_add_tail(pay_store, p2_item); k_add_tail(pay_store, p2_item);
} else { } else {
STRNCPY(last_payments->payaddress, "*Multiple"); /* This is OK since it's a local store and
* we don't use INTREQ() on it */
last_payments->in_payaddress = "*Multiple";
last_payments->amount += payments->amount; last_payments->amount += payments->amount;
} }
} }
@ -1808,7 +1814,7 @@ static char *cmd_payments(__maybe_unused PGconn *conn, char *cmd, char *id,
snprintf(tmp, sizeof(tmp), "height:%d=%s%c", rows, reply, FLDSEP); snprintf(tmp, sizeof(tmp), "height:%d=%s%c", rows, reply, FLDSEP);
APPEND_REALLOC(buf, off, len, tmp); APPEND_REALLOC(buf, off, len, tmp);
str_to_buf(payments->payaddress, reply, sizeof(reply)); str_to_buf(payments->in_payaddress, reply, sizeof(reply));
snprintf(tmp, sizeof(tmp), "payaddress:%d=%s%c", rows, reply, FLDSEP); snprintf(tmp, sizeof(tmp), "payaddress:%d=%s%c", rows, reply, FLDSEP);
APPEND_REALLOC(buf, off, len, tmp); APPEND_REALLOC(buf, off, len, tmp);
@ -1824,6 +1830,9 @@ static char *cmd_payments(__maybe_unused PGconn *conn, char *cmd, char *id,
} }
p_item = p_item->next; p_item = p_item->next;
} }
K_WLOCK(payments_free);
k_list_transfer_to_head(pay_store, payments_free);
K_WUNLOCK(payments_free);
snprintf(tmp, sizeof(tmp), "rows=%d%cflds=%s%c", snprintf(tmp, sizeof(tmp), "rows=%d%cflds=%s%c",
rows, FLDSEP, rows, FLDSEP,
@ -1833,7 +1842,7 @@ static char *cmd_payments(__maybe_unused PGconn *conn, char *cmd, char *id,
snprintf(tmp, sizeof(tmp), "arn=%s%carp=%s", "Payments", FLDSEP, ""); snprintf(tmp, sizeof(tmp), "arn=%s%carp=%s", "Payments", FLDSEP, "");
APPEND_REALLOC(buf, off, len, tmp); APPEND_REALLOC(buf, off, len, tmp);
LOGDEBUG("%s.ok.%s", id, transfer_data(i_username)); LOGDEBUG("%s.ok.%s", id, in_username->str);
return buf; return buf;
} }
@ -1953,7 +1962,7 @@ static char *cmd_percent(char *cmd, char *id, tv_t *now, USERS *users)
ratio = (double)(pa->payratio) / (double)paytotal; ratio = (double)(pa->payratio) / (double)paytotal;
snprintf(tmp, sizeof(tmp), "payaddress:%d=%s%c", snprintf(tmp, sizeof(tmp), "payaddress:%d=%s%c",
rows, pa->payaddress, FLDSEP); rows, pa->in_payaddress, FLDSEP);
APPEND_REALLOC(buf, off, len, tmp); APPEND_REALLOC(buf, off, len, tmp);
snprintf(tmp, sizeof(tmp), "payratio:%d=%"PRId32"%c", snprintf(tmp, sizeof(tmp), "payratio:%d=%"PRId32"%c",
@ -2065,7 +2074,7 @@ static char *cmd_percent(char *cmd, char *id, tv_t *now, USERS *users)
snprintf(tmp, sizeof(tmp), "arn=%s%carp=%s", "Percents", FLDSEP, ""); snprintf(tmp, sizeof(tmp), "arn=%s%carp=%s", "Percents", FLDSEP, "");
APPEND_REALLOC(buf, off, len, tmp); APPEND_REALLOC(buf, off, len, tmp);
LOGDEBUG("%s.ok.%s", id, users->username); LOGDEBUG("%s.ok.%s", id, users->in_username);
return buf; return buf;
} }
@ -2075,8 +2084,9 @@ static char *cmd_workers(__maybe_unused PGconn *conn, char *cmd, char *id,
__maybe_unused tv_t *notcd, K_TREE *trf_root, __maybe_unused tv_t *notcd, K_TREE *trf_root,
__maybe_unused bool reload_data) __maybe_unused bool reload_data)
{ {
K_ITEM *i_username, *i_stats, *i_percent, w_look, *u_item, *w_item; K_ITEM *i_stats, *i_percent, w_look, *u_item, *w_item;
K_ITEM *ua_item, *us_item, *ws_item; K_ITEM *ua_item, *us_item, *ws_item;
INTRANSIENT *in_username;
K_TREE_CTX w_ctx[1]; K_TREE_CTX w_ctx[1];
WORKERS lookworkers, *workers; WORKERS lookworkers, *workers;
WORKERSTATUS *workerstatus; WORKERSTATUS *workerstatus;
@ -2102,12 +2112,12 @@ static char *cmd_workers(__maybe_unused PGconn *conn, char *cmd, char *id,
return reply_ovent(ovent, reply); return reply_ovent(ovent, reply);
} }
i_username = adminuser(trf_root, reply, siz); in_username = adminuser(trf_root, reply, siz);
if (!i_username) if (!in_username)
return strdup(reply); return strdup(reply);
K_RLOCK(users_free); K_RLOCK(users_free);
u_item = find_users(transfer_data(i_username)); u_item = find_users(in_username->str);
K_RUNLOCK(users_free); K_RUNLOCK(users_free);
if (!u_item) if (!u_item)
return strdup("bad"); return strdup("bad");
@ -2391,7 +2401,7 @@ static char *cmd_workers(__maybe_unused PGconn *conn, char *cmd, char *id,
snprintf(tmp, sizeof(tmp), "arn=%s%carp=%s", "Workers", FLDSEP, ""); snprintf(tmp, sizeof(tmp), "arn=%s%carp=%s", "Workers", FLDSEP, "");
APPEND_REALLOC(buf, off, len, tmp); APPEND_REALLOC(buf, off, len, tmp);
LOGDEBUG("%s.ok.%s", id, transfer_data(i_username)); LOGDEBUG("%s.ok.%s", id, in_username->str);
return buf; return buf;
} }
@ -2465,7 +2475,7 @@ static char *cmd_allusers(__maybe_unused PGconn *conn, char *cmd, char *id,
userstats_u->in_workername); userstats_u->in_workername);
} else { } else {
DATA_USERS(users, u_item); DATA_USERS(users, u_item);
str_to_buf(users->username, reply, sizeof(reply)); str_to_buf(users->in_username, reply, sizeof(reply));
snprintf(tmp, sizeof(tmp), "username:%d=%s%c", rows, reply, FLDSEP); snprintf(tmp, sizeof(tmp), "username:%d=%s%c", rows, reply, FLDSEP);
APPEND_REALLOC(buf, off, len, tmp); APPEND_REALLOC(buf, off, len, tmp);
@ -3041,11 +3051,10 @@ static char *cmd_auth_do(PGconn *conn, char *cmd, char *id, char *by,
char reply[1024] = ""; char reply[1024] = "";
size_t siz = sizeof(reply); size_t siz = sizeof(reply);
int event = EVENT_OK; int event = EVENT_OK;
K_ITEM *i_poolinstance, *i_username, *i_clientid; K_ITEM *i_poolinstance, *i_clientid;
K_ITEM *i_enonce1, *i_useragent, *i_preauth, *u_item, *oc_item, *w_item; K_ITEM *i_enonce1, *i_useragent, *i_preauth, *u_item, *oc_item, *w_item;
INTRANSIENT *in_workername; INTRANSIENT *in_username, *in_workername;
USERS *users = NULL; USERS *users = NULL;
char *username;
WORKERS *workers = NULL; WORKERS *workers = NULL;
OPTIONCONTROL *optioncontrol; OPTIONCONTROL *optioncontrol;
size_t len, off; size_t len, off;
@ -3075,10 +3084,9 @@ static char *cmd_auth_do(PGconn *conn, char *cmd, char *id, char *by,
} }
} }
i_username = require_name(trf_root, "username", 1, NULL, reply, siz); in_username = require_in(trf_root, "username", 1, NULL, reply, siz);
if (!i_username) if (!in_username)
return strdup(reply); return strdup(reply);
username = transfer_data(i_username);
in_workername = require_in(trf_root, "workername", 1, NULL, reply, siz); in_workername = require_in(trf_root, "workername", 1, NULL, reply, siz);
if (!in_workername) if (!in_workername)
@ -3103,14 +3111,14 @@ static char *cmd_auth_do(PGconn *conn, char *cmd, char *id, char *by,
oc_item = find_optioncontrol(OPTIONCONTROL_AUTOADDUSER, cd, pool.height); oc_item = find_optioncontrol(OPTIONCONTROL_AUTOADDUSER, cd, pool.height);
if (oc_item) { if (oc_item) {
K_RLOCK(users_free); K_RLOCK(users_free);
u_item = find_users(username); u_item = find_users(in_username->str);
K_RUNLOCK(users_free); K_RUNLOCK(users_free);
if (!u_item) { if (!u_item) {
if (!reload_data) if (!reload_data)
event = events_add(EVENTID_AUTOACC, trf_root); event = events_add(EVENTID_AUTOACC, trf_root);
if (event == EVENT_OK) { if (event == EVENT_OK) {
DATA_OPTIONCONTROL(optioncontrol, oc_item); DATA_OPTIONCONTROL(optioncontrol, oc_item);
u_item = users_add(conn, username, EMPTY, u_item = users_add(conn, in_username, EMPTY,
optioncontrol->optionvalue, optioncontrol->optionvalue,
0, by, code, inet, cd, 0, by, code, inet, cd,
trf_root); trf_root);
@ -3121,8 +3129,7 @@ static char *cmd_auth_do(PGconn *conn, char *cmd, char *id, char *by,
if (ok) { if (ok) {
ok = auths_add(conn, transfer_data(i_poolinstance), ok = auths_add(conn, transfer_data(i_poolinstance),
username, in_username, in_workername,
in_workername,
transfer_data(i_clientid), transfer_data(i_clientid),
transfer_data(i_enonce1), transfer_data(i_enonce1),
transfer_data(i_useragent), transfer_data(i_useragent),
@ -3200,9 +3207,9 @@ static char *cmd_addrauth_do(PGconn *conn, char *cmd, char *id, char *by,
char reply[1024] = ""; char reply[1024] = "";
size_t siz = sizeof(reply); size_t siz = sizeof(reply);
int event = EVENT_OK; int event = EVENT_OK;
K_ITEM *i_poolinstance, *i_username, *i_clientid; K_ITEM *i_poolinstance, *i_clientid;
K_ITEM *i_enonce1, *i_useragent, *i_preauth, *w_item; K_ITEM *i_enonce1, *i_useragent, *i_preauth, *w_item;
INTRANSIENT *in_workername; INTRANSIENT *in_username, *in_workername;
USERS *users = NULL; USERS *users = NULL;
WORKERS *workers = NULL; WORKERS *workers = NULL;
size_t len, off; size_t len, off;
@ -3232,8 +3239,8 @@ static char *cmd_addrauth_do(PGconn *conn, char *cmd, char *id, char *by,
} }
} }
i_username = require_name(trf_root, "username", 1, NULL, reply, siz); in_username = require_in(trf_root, "username", 1, NULL, reply, siz);
if (!i_username) if (!in_username)
return strdup(reply); return strdup(reply);
in_workername = require_in(trf_root, "workername", 1, NULL, reply, siz); in_workername = require_in(trf_root, "workername", 1, NULL, reply, siz);
@ -3257,8 +3264,7 @@ static char *cmd_addrauth_do(PGconn *conn, char *cmd, char *id, char *by,
return strdup(reply); return strdup(reply);
ok = auths_add(conn, transfer_data(i_poolinstance), ok = auths_add(conn, transfer_data(i_poolinstance),
transfer_data(i_username), in_username, in_workername,
in_workername,
transfer_data(i_clientid), transfer_data(i_clientid),
transfer_data(i_enonce1), transfer_data(i_enonce1),
transfer_data(i_useragent), transfer_data(i_useragent),
@ -3700,7 +3706,8 @@ static char *cmd_getatts(__maybe_unused PGconn *conn, char *cmd, char *id,
__maybe_unused tv_t *notcd, K_TREE *trf_root, __maybe_unused tv_t *notcd, K_TREE *trf_root,
__maybe_unused bool reload_data) __maybe_unused bool reload_data)
{ {
K_ITEM *i_username, *i_attlist, *u_item, *ua_item; K_ITEM *i_attlist, *u_item, *ua_item;
INTRANSIENT *in_username;
char reply[1024] = ""; char reply[1024] = "";
size_t siz = sizeof(reply); size_t siz = sizeof(reply);
int event = EVENT_OK; int event = EVENT_OK;
@ -3715,16 +3722,16 @@ static char *cmd_getatts(__maybe_unused PGconn *conn, char *cmd, char *id,
LOGDEBUG("%s(): cmd '%s'", __func__, cmd); LOGDEBUG("%s(): cmd '%s'", __func__, cmd);
i_username = require_name(trf_root, "username", MIN_USERNAME, in_username = require_in(trf_root, "username", MIN_USERNAME,
(char *)userpatt, reply, siz); (char *)userpatt, reply, siz);
if (!i_username) { if (!in_username) {
// Shouldn't happen except with a code problem no event required // Shouldn't happen except with a code problem no event required
reason = "Missing username"; reason = "Missing username";
goto nuts; goto nuts;
} }
K_RLOCK(users_free); K_RLOCK(users_free);
u_item = find_users(transfer_data(i_username)); u_item = find_users(in_username->str);
K_RUNLOCK(users_free); K_RUNLOCK(users_free);
if (!u_item) { if (!u_item) {
@ -3880,7 +3887,8 @@ static char *cmd_setatts(PGconn *conn, char *cmd, char *id,
ExecStatusType rescode; ExecStatusType rescode;
PGresult *res; PGresult *res;
bool conned = false; bool conned = false;
K_ITEM *i_username, *t_item, *u_item, *ua_item = NULL; K_ITEM *t_item, *u_item, *ua_item = NULL;
INTRANSIENT *in_username;
K_TREE_CTX ctx[1]; K_TREE_CTX ctx[1];
char reply[1024] = ""; char reply[1024] = "";
size_t siz = sizeof(reply); size_t siz = sizeof(reply);
@ -3895,15 +3903,15 @@ static char *cmd_setatts(PGconn *conn, char *cmd, char *id,
LOGDEBUG("%s(): cmd '%s'", __func__, cmd); LOGDEBUG("%s(): cmd '%s'", __func__, cmd);
i_username = require_name(trf_root, "username", MIN_USERNAME, in_username = require_in(trf_root, "username", MIN_USERNAME,
(char *)userpatt, reply, siz); (char *)userpatt, reply, siz);
if (!i_username) { if (!in_username) {
reason = "Missing user"; reason = "Missing user";
goto bats; goto bats;
} }
K_RLOCK(users_free); K_RLOCK(users_free);
u_item = find_users(transfer_data(i_username)); u_item = find_users(in_username->str);
K_RUNLOCK(users_free); K_RUNLOCK(users_free);
if (!u_item) { if (!u_item) {
@ -4047,7 +4055,8 @@ static char *cmd_expatts(__maybe_unused PGconn *conn, char *cmd, char *id,
__maybe_unused tv_t *notcd, K_TREE *trf_root, __maybe_unused tv_t *notcd, K_TREE *trf_root,
__maybe_unused bool reload_data) __maybe_unused bool reload_data)
{ {
K_ITEM *i_username, *i_attlist, *u_item, *ua_item; K_ITEM *i_attlist, *u_item, *ua_item;
INTRANSIENT *in_username;
char reply[1024] = ""; char reply[1024] = "";
size_t siz = sizeof(reply); size_t siz = sizeof(reply);
USERATTS *useratts; USERATTS *useratts;
@ -4058,15 +4067,15 @@ static char *cmd_expatts(__maybe_unused PGconn *conn, char *cmd, char *id,
LOGDEBUG("%s(): cmd '%s'", __func__, cmd); LOGDEBUG("%s(): cmd '%s'", __func__, cmd);
i_username = require_name(trf_root, "username", MIN_USERNAME, in_username = require_in(trf_root, "username", MIN_USERNAME,
(char *)userpatt, reply, siz); (char *)userpatt, reply, siz);
if (!i_username) { if (!in_username) {
reason = "Missing username"; reason = "Missing username";
goto rats; goto rats;
} }
K_RLOCK(users_free); K_RLOCK(users_free);
u_item = find_users(transfer_data(i_username)); u_item = find_users(in_username->str);
K_RUNLOCK(users_free); K_RUNLOCK(users_free);
if (!u_item) { if (!u_item) {
@ -4733,8 +4742,8 @@ static char *cmd_pplns(__maybe_unused PGconn *conn, char *cmd, char *id,
snprintf(tmp, sizeof(tmp), snprintf(tmp, sizeof(tmp),
"user:%d=%s.%d%cpayaddress:%d=%s%c", "user:%d=%s.%d%cpayaddress:%d=%s%c",
rows, users->username, ++count, FLDSEP, rows, users->in_username, ++count,
rows, pa->payaddress, FLDSEP); FLDSEP, rows, pa->in_payaddress, FLDSEP);
APPEND_REALLOC(buf, off, len, tmp); APPEND_REALLOC(buf, off, len, tmp);
snprintf(tmp, sizeof(tmp), snprintf(tmp, sizeof(tmp),
"diffacc_user:%d=%.1f%c", "diffacc_user:%d=%.1f%c",
@ -4750,7 +4759,7 @@ static char *cmd_pplns(__maybe_unused PGconn *conn, char *cmd, char *id,
K_RUNLOCK(paymentaddresses_free); K_RUNLOCK(paymentaddresses_free);
snprintf(tmp, sizeof(tmp), snprintf(tmp, sizeof(tmp),
"user:%d=%s.0%cpayaddress:%d=%s%c", "user:%d=%s.0%cpayaddress:%d=%s%c",
rows, users->username, FLDSEP, rows, users->in_username, FLDSEP,
rows, "none", FLDSEP); rows, "none", FLDSEP);
APPEND_REALLOC(buf, off, len, tmp); APPEND_REALLOC(buf, off, len, tmp);
snprintf(tmp, sizeof(tmp), snprintf(tmp, sizeof(tmp),
@ -5020,11 +5029,13 @@ static char *cmd_pplns2(__maybe_unused PGconn *conn, char *cmd, char *id,
"payaddress:%d=%s%c" "payaddress:%d=%s%c"
"amount:%d=%"PRId64"%c" "amount:%d=%"PRId64"%c"
"diffacc:%d=%.1f%c", "diffacc:%d=%.1f%c",
rows, payments->subname, FLDSEP, rows, payments->in_subname,
rows, ua_item ? HOLD_ADDRESS : FLDSEP, rows,
payments->payaddress, FLDSEP, ua_item ? HOLD_ADDRESS :
rows, payments->amount, FLDSEP, payments->in_payaddress,
rows, payments->diffacc, FLDSEP); FLDSEP, rows, payments->amount,
FLDSEP, rows,
payments->diffacc, FLDSEP);
APPEND_REALLOC(buf, off, len, tmp); APPEND_REALLOC(buf, off, len, tmp);
rows++; rows++;
out++; out++;
@ -5039,7 +5050,7 @@ static char *cmd_pplns2(__maybe_unused PGconn *conn, char *cmd, char *id,
"payaddress:%d=%s%c" "payaddress:%d=%s%c"
"amount:%d=%"PRId64"%c" "amount:%d=%"PRId64"%c"
"diffacc:%d=%.1f%c", "diffacc:%d=%.1f%c",
rows, users->username, FLDSEP, rows, users->in_username, FLDSEP,
rows, NONE_ADDRESS, FLDSEP, rows, NONE_ADDRESS, FLDSEP,
rows, miningpayouts->amount, FLDSEP, rows, miningpayouts->amount, FLDSEP,
rows, miningpayouts->diffacc, FLDSEP); rows, miningpayouts->diffacc, FLDSEP);
@ -5360,7 +5371,8 @@ static char *cmd_mpayouts(__maybe_unused PGconn *conn, char *cmd, char *id,
__maybe_unused K_TREE *trf_root, __maybe_unused K_TREE *trf_root,
__maybe_unused bool reload_data) __maybe_unused bool reload_data)
{ {
K_ITEM *i_username, *u_item, *mp_item, *po_item; K_ITEM *u_item, *mp_item, *po_item;
INTRANSIENT *in_username;
K_TREE_CTX ctx[1]; K_TREE_CTX ctx[1];
MININGPAYOUTS *mp; MININGPAYOUTS *mp;
PAYOUTS *payouts; PAYOUTS *payouts;
@ -5374,12 +5386,12 @@ static char *cmd_mpayouts(__maybe_unused PGconn *conn, char *cmd, char *id,
LOGDEBUG("%s(): cmd '%s'", __func__, cmd); LOGDEBUG("%s(): cmd '%s'", __func__, cmd);
i_username = adminuser(trf_root, reply, siz); in_username = adminuser(trf_root, reply, siz);
if (!i_username) if (!in_username)
return strdup(reply); return strdup(reply);
K_RLOCK(users_free); K_RLOCK(users_free);
u_item = find_users(transfer_data(i_username)); u_item = find_users(in_username->str);
K_RUNLOCK(users_free); K_RUNLOCK(users_free);
if (!u_item) if (!u_item)
return strdup("bad"); return strdup("bad");
@ -5471,7 +5483,7 @@ static char *cmd_mpayouts(__maybe_unused PGconn *conn, char *cmd, char *id,
snprintf(tmp, sizeof(tmp), "arn=%s%carp=%s", "MiningPayouts", FLDSEP, ""); snprintf(tmp, sizeof(tmp), "arn=%s%carp=%s", "MiningPayouts", FLDSEP, "");
APPEND_REALLOC(buf, off, len, tmp); APPEND_REALLOC(buf, off, len, tmp);
LOGDEBUG("%s.ok.%s", id, transfer_data(i_username)); LOGDEBUG("%s.ok.%s", id, in_username->str);
return buf; return buf;
} }
@ -5553,7 +5565,8 @@ static char *cmd_shifts(__maybe_unused PGconn *conn, char *cmd, char *id,
__maybe_unused tv_t *notcd, K_TREE *trf_root, __maybe_unused tv_t *notcd, K_TREE *trf_root,
__maybe_unused bool reload_data) __maybe_unused bool reload_data)
{ {
K_ITEM *i_username, *i_select; INTRANSIENT *in_username;
K_ITEM *i_select;
K_ITEM *u_item, *p_item, *m_item, ms_look, *wm_item, *ms_item, *wi_item; K_ITEM *u_item, *p_item, *m_item, ms_look, *wm_item, *ms_item, *wi_item;
K_TREE_CTX wm_ctx[1], ms_ctx[1]; K_TREE_CTX wm_ctx[1], ms_ctx[1];
WORKMARKERS *wm; WORKMARKERS *wm;
@ -5577,12 +5590,12 @@ static char *cmd_shifts(__maybe_unused PGconn *conn, char *cmd, char *id,
LOGDEBUG("%s(): cmd '%s'", __func__, cmd); LOGDEBUG("%s(): cmd '%s'", __func__, cmd);
i_username = adminuser(trf_root, reply, siz); in_username = adminuser(trf_root, reply, siz);
if (!i_username) if (!in_username)
return strdup(reply); return strdup(reply);
K_RLOCK(users_free); K_RLOCK(users_free);
u_item = find_users(transfer_data(i_username)); u_item = find_users(in_username->str);
K_RUNLOCK(users_free); K_RUNLOCK(users_free);
if (!u_item) if (!u_item)
return strdup("bad"); return strdup("bad");
@ -5645,7 +5658,7 @@ static char *cmd_shifts(__maybe_unused PGconn *conn, char *cmd, char *id,
snprintf(tmp, sizeof(tmp), " where_all=%d", where_all); snprintf(tmp, sizeof(tmp), " where_all=%d", where_all);
APPEND_REALLOC(buf, off, len, tmp); APPEND_REALLOC(buf, off, len, tmp);
LOGDEBUG("%s() user=%"PRId64"/%s' %s", LOGDEBUG("%s() user=%"PRId64"/%s' %s",
__func__, users->userid, users->username, buf+1); __func__, users->userid, users->in_username, buf+1);
FREENULL(buf); FREENULL(buf);
APPEND_REALLOC_INIT(buf, off, len); APPEND_REALLOC_INIT(buf, off, len);
@ -5892,7 +5905,7 @@ static char *cmd_shifts(__maybe_unused PGconn *conn, char *cmd, char *id,
} }
} }
LOGDEBUG("%s.ok.%s", id, transfer_data(i_username)); LOGDEBUG("%s.ok.%s", id, in_username->str);
return(buf); return(buf);
} }
@ -6092,7 +6105,7 @@ static char *cmd_userstatus(PGconn *conn, char *cmd, char *id, tv_t *now, char *
DATA_USERS(users, u_item); DATA_USERS(users, u_item);
snprintf(reply, siz, "ok.updated %"PRId64" %s status %s", snprintf(reply, siz, "ok.updated %"PRId64" %s status %s",
users->userid, users->userid,
users->username, users->in_username,
status[0] ? "disabled" : "enabled"); status[0] ? "disabled" : "enabled");
LOGWARNING("%s.%s", id, reply); LOGWARNING("%s.%s", id, reply);
return strdup(reply); return strdup(reply);
@ -6626,7 +6639,7 @@ static char *cmd_pshift(__maybe_unused PGconn *conn, char *cmd, char *id,
__maybe_unused tv_t *notcd, K_TREE *trf_root, __maybe_unused tv_t *notcd, K_TREE *trf_root,
__maybe_unused bool reload_data) __maybe_unused bool reload_data)
{ {
K_ITEM *i_username; INTRANSIENT *in_username;
K_ITEM *u_item, *p_item, *m_item, *wm_item, *ms_item, *wi_item; K_ITEM *u_item, *p_item, *m_item, *wm_item, *ms_item, *wi_item;
K_TREE_CTX wm_ctx[1]; K_TREE_CTX wm_ctx[1];
WORKMARKERS *wm; WORKMARKERS *wm;
@ -6647,12 +6660,12 @@ static char *cmd_pshift(__maybe_unused PGconn *conn, char *cmd, char *id,
LOGDEBUG("%s(): cmd '%s'", __func__, cmd); LOGDEBUG("%s(): cmd '%s'", __func__, cmd);
i_username = adminuser(trf_root, reply, siz); in_username = adminuser(trf_root, reply, siz);
if (!i_username) if (!in_username)
return strdup(reply); return strdup(reply);
K_RLOCK(users_free); K_RLOCK(users_free);
u_item = find_users(transfer_data(i_username)); u_item = find_users(in_username->str);
K_RUNLOCK(users_free); K_RUNLOCK(users_free);
if (!u_item) if (!u_item)
return strdup("bad"); return strdup("bad");
@ -6824,7 +6837,7 @@ static char *cmd_pshift(__maybe_unused PGconn *conn, char *cmd, char *id,
snprintf(tmp, sizeof(tmp), ",%d_", 0); snprintf(tmp, sizeof(tmp), ",%d_", 0);
APPEND_REALLOC(buf, off, len, tmp); APPEND_REALLOC(buf, off, len, tmp);
LOGDEBUG("%s.ok.%s", id, transfer_data(i_username)); LOGDEBUG("%s.ok.%s", id, in_username->str);
return(buf); return(buf);
} }
@ -6872,7 +6885,7 @@ static char *cmd_userinfo(__maybe_unused PGconn *conn, char *cmd, char *id,
while (ui_item) { while (ui_item) {
DATA_USERINFO(userinfo, ui_item); DATA_USERINFO(userinfo, ui_item);
str_to_buf(userinfo->username, reply, sizeof(reply)); str_to_buf(userinfo->in_username, reply, sizeof(reply));
snprintf(tmp, sizeof(tmp), "username:%d=%s%c", snprintf(tmp, sizeof(tmp), "username:%d=%s%c",
rows, reply, FLDSEP); rows, reply, FLDSEP);
APPEND_REALLOC(buf, off, len, tmp); APPEND_REALLOC(buf, off, len, tmp);

12
src/ckdb_crypt.c

@ -36,7 +36,7 @@ char *_tob32(USERS *users, unsigned char *bin, size_t len, char *name,
if (osiz != olen) { if (osiz != olen) {
LOGEMERG("%s() of '%s' data for '%s' invalid olen=%d != osiz=%d" LOGEMERG("%s() of '%s' data for '%s' invalid olen=%d != osiz=%d"
WHERE_FFL, WHERE_FFL,
__func__, name, st = safe_text_nonull(users->username), __func__, name, st = safe_text_nonull(users->in_username),
(int)olen, (int)osiz, WHERE_FFL_PASS); (int)olen, (int)osiz, WHERE_FFL_PASS);
FREENULL(st); FREENULL(st);
olen = osiz; olen = osiz;
@ -59,7 +59,7 @@ char *_tob32(USERS *users, unsigned char *bin, size_t len, char *name,
"ch=%d, i=%d j=%d bits=%d bin=0x%s len=%d " "ch=%d, i=%d j=%d bits=%d bin=0x%s len=%d "
"olen=%d" WHERE_FFL, "olen=%d" WHERE_FFL,
__func__, name, __func__, name,
st = safe_text_nonull(users->username), st = safe_text_nonull(users->in_username),
ch, i, j, bits, binstr, (int)len, (int)olen, ch, i, j, bits, binstr, (int)len, (int)olen,
WHERE_FFL_PASS); WHERE_FFL_PASS);
FREENULL(st); FREENULL(st);
@ -150,7 +150,7 @@ bool check_2fa(USERS *users, int32_t value)
LOGERR("%s() invalid key for '%s/%s " LOGERR("%s() invalid key for '%s/%s "
"len(%d) != %d", "len(%d) != %d",
__func__, __func__,
st = safe_text_nonull(users->username), st = safe_text_nonull(users->in_username),
USER_TOTPAUTH_NAME, (int)binlen, USER_TOTPAUTH_NAME, (int)binlen,
TOTPAUTH_KEYSIZE); TOTPAUTH_KEYSIZE);
FREENULL(st); FREENULL(st);
@ -160,7 +160,7 @@ bool check_2fa(USERS *users, int32_t value)
tim[i] = (now >> 8 * ((sizeof(int64_t) - 1) - i)) & 0xff; tim[i] = (now >> 8 * ((sizeof(int64_t) - 1) - i)) & 0xff;
LOGDEBUG("%s() '%s/%s tim=%"PRId64"=%s key=%s=%s", __func__, LOGDEBUG("%s() '%s/%s tim=%"PRId64"=%s key=%s=%s", __func__,
st = safe_text_nonull(users->username), st = safe_text_nonull(users->in_username),
USER_TOTPAUTH_NAME, now, USER_TOTPAUTH_NAME, now,
tmp1 = (char *)bin2hex(&tim, sizeof(tim)), tmp1 = (char *)bin2hex(&tim, sizeof(tim)),
tmp2 = (char *)bin2hex(bin, TOTPAUTH_KEYSIZE), tmp2 = (char *)bin2hex(bin, TOTPAUTH_KEYSIZE),
@ -180,7 +180,7 @@ bool check_2fa(USERS *users, int32_t value)
HMAC_Final(&ctx, hash, &reslen); HMAC_Final(&ctx, hash, &reslen);
LOGDEBUG("%s() '%s/%s hash=%s", __func__, LOGDEBUG("%s() '%s/%s hash=%s", __func__,
st = safe_text_nonull(users->username), st = safe_text_nonull(users->in_username),
USER_TOTPAUTH_NAME, USER_TOTPAUTH_NAME,
tmp1 = (char *)bin2hex(hash, SHA256_DIGEST_LENGTH)); tmp1 = (char *)bin2hex(hash, SHA256_DIGEST_LENGTH));
FREENULL(tmp1); FREENULL(tmp1);
@ -195,7 +195,7 @@ bool check_2fa(USERS *users, int32_t value)
LOGDEBUG("%s() '%s/%s offset=%d otp=%"PRId32" value=%"PRId32 LOGDEBUG("%s() '%s/%s offset=%d otp=%"PRId32" value=%"PRId32
" lastvalue=%"PRId32, " lastvalue=%"PRId32,
__func__, st = safe_text_nonull(users->username), __func__, st = safe_text_nonull(users->in_username),
USER_TOTPAUTH_NAME, offset, otp, value, users->lastvalue); USER_TOTPAUTH_NAME, offset, otp, value, users->lastvalue);
FREENULL(st); FREENULL(st);
FREENULL(hash); FREENULL(hash);

66
src/ckdb_data.c

@ -255,7 +255,7 @@ void username_trim(USERS *users)
{ {
char *front, *trail; char *front, *trail;
front = users->username; front = users->in_username;
while (*front && TRIM_IGNORE(*front)) while (*front && TRIM_IGNORE(*front))
front++; front++;
@ -1460,7 +1460,7 @@ cmp_t cmp_users(K_ITEM *a, K_ITEM *b)
USERS *ua, *ub; USERS *ua, *ub;
DATA_USERS(ua, a); DATA_USERS(ua, a);
DATA_USERS(ub, b); DATA_USERS(ub, b);
cmp_t c = CMP_STR(ua->username, ub->username); cmp_t c = CMP_STR(ua->in_username, ub->in_username);
if (c == 0) if (c == 0)
c = CMP_TV(ub->expirydate, ua->expirydate); c = CMP_TV(ub->expirydate, ua->expirydate);
return c; return c;
@ -1485,7 +1485,7 @@ K_ITEM *find_users(char *username)
K_TREE_CTX ctx[1]; K_TREE_CTX ctx[1];
K_ITEM look; K_ITEM look;
STRNCPY(users.username, username); users.in_username = username;
users.expirydate.tv_sec = default_expiry.tv_sec; users.expirydate.tv_sec = default_expiry.tv_sec;
users.expirydate.tv_usec = default_expiry.tv_usec; users.expirydate.tv_usec = default_expiry.tv_usec;
@ -1596,7 +1596,7 @@ bool check_hash(USERS *users, char *passwordhash)
char hex[SHA256SIZHEX+1]; char hex[SHA256SIZHEX+1];
if (*(users->salt)) { if (*(users->salt)) {
password_hash(users->username, passwordhash, users->salt, hex, sizeof(hex)); password_hash(users->in_username, passwordhash, users->salt, hex, sizeof(hex));
return (strcasecmp(hex, users->passwordhash) == 0); return (strcasecmp(hex, users->passwordhash) == 0);
} else } else
return (strcasecmp(passwordhash, users->passwordhash) == 0); return (strcasecmp(passwordhash, users->passwordhash) == 0);
@ -1640,7 +1640,7 @@ char *_users_userdata_get_hex(USERS *users, char *name, int64_t bit,
LOGEMERG("%s() users userdata/databits mismatch for " LOGEMERG("%s() users userdata/databits mismatch for "
"%s/%"PRId64 WHERE_FFL, "%s/%"PRId64 WHERE_FFL,
__func__, __func__,
st = safe_text_nonull(users->username), st = safe_text_nonull(users->in_username),
users->databits, WHERE_FFL_PASS); users->databits, WHERE_FFL_PASS);
FREENULL(st); FREENULL(st);
} else { } else {
@ -1699,7 +1699,7 @@ void _users_userdata_del(USERS *users, char *name, int64_t bit, WHERE_FFL_ARGS)
LOGEMERG("%s() users userdata/databits mismatch for " LOGEMERG("%s() users userdata/databits mismatch for "
"%s/%"PRId64 WHERE_FFL, "%s/%"PRId64 WHERE_FFL,
__func__, __func__,
st = safe_text_nonull(users->username), st = safe_text_nonull(users->in_username),
users->databits, WHERE_FFL_PASS); users->databits, WHERE_FFL_PASS);
FREENULL(st); FREENULL(st);
} else { } else {
@ -1917,7 +1917,7 @@ void dsp_paymentaddresses(K_ITEM *item, FILE *stream)
fprintf(stream, " id=%"PRId64" userid=%"PRId64" addr='%s' " fprintf(stream, " id=%"PRId64" userid=%"PRId64" addr='%s' "
"ratio=%"PRId32" exp=%s cd=%s\n", "ratio=%"PRId32" exp=%s cd=%s\n",
pa->paymentaddressid, pa->userid, pa->paymentaddressid, pa->userid,
pa->payaddress, pa->payratio, pa->in_payaddress, pa->payratio,
expirydate_buf, createdate_buf); expirydate_buf, createdate_buf);
} }
} }
@ -1932,7 +1932,7 @@ cmp_t cmp_paymentaddresses(K_ITEM *a, K_ITEM *b)
if (c == 0) { if (c == 0) {
c = CMP_BIGINT(pa->userid, pb->userid); c = CMP_BIGINT(pa->userid, pb->userid);
if (c == 0) if (c == 0)
c = CMP_STR(pa->payaddress, pb->payaddress); c = CMP_STR(pa->in_payaddress, pb->in_payaddress);
} }
return c; return c;
} }
@ -1947,7 +1947,7 @@ cmp_t cmp_payaddr_create(K_ITEM *a, K_ITEM *b)
if (c == 0) { if (c == 0) {
c = CMP_TV(pa->createdate, pb->createdate); c = CMP_TV(pa->createdate, pb->createdate);
if (c == 0) if (c == 0)
c = CMP_STR(pa->payaddress, pb->payaddress); c = CMP_STR(pa->in_payaddress, pb->in_payaddress);
} }
return c; return c;
} }
@ -1963,7 +1963,7 @@ K_ITEM *find_paymentaddresses(int64_t userid, K_TREE_CTX *ctx)
paymentaddresses.expirydate.tv_sec = default_expiry.tv_sec; paymentaddresses.expirydate.tv_sec = default_expiry.tv_sec;
paymentaddresses.expirydate.tv_usec = default_expiry.tv_usec; paymentaddresses.expirydate.tv_usec = default_expiry.tv_usec;
paymentaddresses.userid = userid+1; paymentaddresses.userid = userid+1;
paymentaddresses.payaddress[0] = '\0'; paymentaddresses.in_payaddress = EMPTY;
INIT_PAYMENTADDRESSES(&look); INIT_PAYMENTADDRESSES(&look);
look.data = (void *)(&paymentaddresses); look.data = (void *)(&paymentaddresses);
@ -1987,7 +1987,7 @@ K_ITEM *find_paymentaddresses_create(int64_t userid, K_TREE_CTX *ctx)
paymentaddresses.userid = userid; paymentaddresses.userid = userid;
DATE_ZERO(&(paymentaddresses.createdate)); DATE_ZERO(&(paymentaddresses.createdate));
paymentaddresses.payaddress[0] = '\0'; paymentaddresses.in_payaddress = EMPTY;
INIT_PAYMENTADDRESSES(&look); INIT_PAYMENTADDRESSES(&look);
look.data = (void *)(&paymentaddresses); look.data = (void *)(&paymentaddresses);
@ -2010,14 +2010,14 @@ K_ITEM *find_one_payaddress(int64_t userid, char *payaddress, K_TREE_CTX *ctx)
paymentaddresses.expirydate.tv_sec = default_expiry.tv_sec; paymentaddresses.expirydate.tv_sec = default_expiry.tv_sec;
paymentaddresses.expirydate.tv_usec = default_expiry.tv_usec; paymentaddresses.expirydate.tv_usec = default_expiry.tv_usec;
paymentaddresses.userid = userid; paymentaddresses.userid = userid;
STRNCPY(paymentaddresses.payaddress, payaddress); paymentaddresses.in_payaddress = payaddress;
INIT_PAYMENTADDRESSES(&look); INIT_PAYMENTADDRESSES(&look);
look.data = (void *)(&paymentaddresses); look.data = (void *)(&paymentaddresses);
return find_in_ktree(paymentaddresses_root, &look, ctx); return find_in_ktree(paymentaddresses_root, &look, ctx);
} }
/* This will match any user that has the payaddress /* This will match any user that has the intransient payaddress
* This avoids the bitcoind delay of rechecking an address * This avoids the bitcoind delay of rechecking an address
* that has EVER been seen before * that has EVER been seen before
* However, also, cmd_userset() that uses it, effectively ensures * However, also, cmd_userset() that uses it, effectively ensures
@ -2026,7 +2026,7 @@ K_ITEM *find_one_payaddress(int64_t userid, char *payaddress, K_TREE_CTX *ctx)
* N.B. this is faster than a bitcoind check, but still slow * N.B. this is faster than a bitcoind check, but still slow
* It needs a tree based on payaddress to speed it up * It needs a tree based on payaddress to speed it up
* N.B.2 paymentadresses_root doesn't contain addrauth usernames */ * N.B.2 paymentadresses_root doesn't contain addrauth usernames */
K_ITEM *find_any_payaddress(char *payaddress) K_ITEM *find_any_payaddress(char *in_payaddress)
{ {
PAYMENTADDRESSES *pa; PAYMENTADDRESSES *pa;
K_TREE_CTX ctx[1]; K_TREE_CTX ctx[1];
@ -2035,7 +2035,7 @@ K_ITEM *find_any_payaddress(char *payaddress)
item = first_in_ktree(paymentaddresses_root, ctx); item = first_in_ktree(paymentaddresses_root, ctx);
while (item) { while (item) {
DATA_PAYMENTADDRESSES(pa, item); DATA_PAYMENTADDRESSES(pa, item);
if (strcmp(pa->payaddress, payaddress) == 0) if (INTREQ(pa->in_payaddress, in_payaddress))
return item; return item;
item = next_in_ktree(ctx); item = next_in_ktree(ctx);
} }
@ -2052,7 +2052,7 @@ cmp_t cmp_payments(K_ITEM *a, K_ITEM *b)
if (c == 0) { if (c == 0) {
c = CMP_BIGINT(pa->payoutid, pb->payoutid); c = CMP_BIGINT(pa->payoutid, pb->payoutid);
if (c == 0) { if (c == 0) {
c = CMP_STR(pa->subname, pb->subname); c = CMP_STR(pa->in_subname, pb->in_subname);
if (c == 0) if (c == 0)
c = CMP_TV(pb->expirydate, pa->expirydate); c = CMP_TV(pb->expirydate, pa->expirydate);
} }
@ -2068,7 +2068,7 @@ K_ITEM *find_payments(int64_t payoutid, int64_t userid, char *subname)
payments.payoutid = payoutid; payments.payoutid = payoutid;
payments.userid = userid; payments.userid = userid;
STRNCPY(payments.subname, subname); payments.in_subname = subname;
payments.expirydate.tv_sec = default_expiry.tv_sec; payments.expirydate.tv_sec = default_expiry.tv_sec;
payments.expirydate.tv_usec = default_expiry.tv_usec; payments.expirydate.tv_usec = default_expiry.tv_usec;
@ -2107,7 +2107,7 @@ K_ITEM *find_first_paypayid(int64_t userid, int64_t payoutid, K_TREE_CTX *ctx)
payments.userid = userid; payments.userid = userid;
payments.payoutid = payoutid; payments.payoutid = payoutid;
payments.subname[0] = '\0'; payments.in_subname = EMPTY;
INIT_PAYMENTS(&look); INIT_PAYMENTS(&look);
look.data = (void *)(&payments); look.data = (void *)(&payments);
@ -4484,7 +4484,7 @@ bool process_pplns(int32_t height, char *blockhash, tv_t *addr_cd)
K_TREE *mu_root = NULL; K_TREE *mu_root = NULL;
int usercount; int usercount;
double ndiff, total_diff, diff_want, elapsed; double ndiff, total_diff, diff_want, elapsed;
char rewardbuf[32]; char rewardbuf[32], subnamebuf[TXT_BIG+1];
double diff_times, diff_add; double diff_times, diff_add;
char cd_buf[CDATE_BUFSIZ]; char cd_buf[CDATE_BUFSIZ];
tv_t end_tv = { 0L, 0L }; tv_t end_tv = { 0L, 0L };
@ -4949,7 +4949,7 @@ bool process_pplns(int32_t height, char *blockhash, tv_t *addr_cd)
pa_item2 = k_unlink_head(paymentaddresses_free); pa_item2 = k_unlink_head(paymentaddresses_free);
DATA_PAYMENTADDRESSES(pa2, pa_item2); DATA_PAYMENTADDRESSES(pa2, pa_item2);
pa2->userid = pa->userid; pa2->userid = pa->userid;
STRNCPY(pa2->payaddress, pa->payaddress); pa2->in_payaddress = pa->in_payaddress;
pa2->payratio = pa->payratio; pa2->payratio = pa->payratio;
k_add_tail(addr_store, pa_item2); k_add_tail(addr_store, pa_item2);
} }
@ -4971,10 +4971,10 @@ bool process_pplns(int32_t height, char *blockhash, tv_t *addr_cd)
bzero(payments, sizeof(*payments)); bzero(payments, sizeof(*payments));
payments->payoutid = payouts->payoutid; payments->payoutid = payouts->payoutid;
payments->userid = miningpayouts->userid; payments->userid = miningpayouts->userid;
snprintf(payments->subname, snprintf(subnamebuf, sizeof(subnamebuf),
sizeof(payments->subname), "%s.%d", users->in_username, ++count);
"%s.%d", users->username, ++count); payments->in_subname = intransient_str("subname", subnamebuf);
STRNCPY(payments->payaddress, pa->payaddress); payments->in_payaddress = pa->in_payaddress;
d64 = floor((double)amount * d64 = floor((double)amount *
(double)(pa->payratio) / (double)(pa->payratio) /
(double)paytotal); (double)paytotal);
@ -5005,10 +5005,10 @@ bool process_pplns(int32_t height, char *blockhash, tv_t *addr_cd)
bzero(payments, sizeof(*payments)); bzero(payments, sizeof(*payments));
payments->payoutid = payouts->payoutid; payments->payoutid = payouts->payoutid;
payments->userid = miningpayouts->userid; payments->userid = miningpayouts->userid;
snprintf(payments->subname, snprintf(subnamebuf, sizeof(subnamebuf),
sizeof(payments->subname), "%s.0", users->in_username);
"%s.0", users->username); payments->in_subname = intransient_str("subname", subnamebuf);
STRNCPY(payments->payaddress, users->username); payments->in_payaddress = users->in_username;
payments->amount = amount; payments->amount = amount;
payments->diffacc = miningpayouts->diffacc; payments->diffacc = miningpayouts->diffacc;
used = amount; used = amount;
@ -7136,6 +7136,7 @@ K_ITEM *_find_create_userinfo(int64_t userid, WHERE_FFL_ARGS)
K_ITEM *ui_item, *u_item; K_ITEM *ui_item, *u_item;
USERS *users = NULL; USERS *users = NULL;
USERINFO *row; USERINFO *row;
char usernamebuf[TXT_BIG+1];
ui_item = get_userinfo(userid); ui_item = get_userinfo(userid);
if (!ui_item) { if (!ui_item) {
@ -7150,9 +7151,12 @@ K_ITEM *_find_create_userinfo(int64_t userid, WHERE_FFL_ARGS)
bzero(row, sizeof(*row)); bzero(row, sizeof(*row));
row->userid = userid; row->userid = userid;
if (u_item) if (u_item)
STRNCPY(row->username, users->username); row->in_username = users->in_username;
else else {
bigint_to_buf(userid, row->username, sizeof(row->username)); bigint_to_buf(userid, usernamebuf, sizeof(usernamebuf));
row->in_username = intransient_str("username",
usernamebuf);
}
add_to_ktree(userinfo_root, ui_item); add_to_ktree(userinfo_root, ui_item);
k_add_head(userinfo_store, ui_item); k_add_head(userinfo_store, ui_item);

66
src/ckdb_dbio.c

@ -599,7 +599,7 @@ bool users_update(PGconn *conn, K_ITEM *u_item, char *oldhash,
if (hash) { if (hash) {
// New salt each password change // New salt each password change
make_salt(row); make_salt(row);
password_hash(row->username, newhash, row->salt, password_hash(row->in_username, newhash, row->salt,
row->passwordhash, sizeof(row->passwordhash)); row->passwordhash, sizeof(row->passwordhash));
} }
if (email) if (email)
@ -705,7 +705,7 @@ unparam:
return ok; return ok;
} }
K_ITEM *users_add(PGconn *conn, char *username, char *emailaddress, K_ITEM *users_add(PGconn *conn, INTRANSIENT *in_username, char *emailaddress,
char *passwordhash, int64_t userbits, char *by, char *passwordhash, int64_t userbits, char *by,
char *code, char *inet, tv_t *cd, K_TREE *trf_root) char *code, char *inet, tv_t *cd, K_TREE *trf_root)
{ {
@ -730,7 +730,7 @@ K_ITEM *users_add(PGconn *conn, char *username, char *emailaddress,
K_WLOCK(users_db_free); K_WLOCK(users_db_free);
K_RLOCK(users_free); K_RLOCK(users_free);
item = find_users(username); item = find_users(in_username->str);
K_RUNLOCK(users_free); K_RUNLOCK(users_free);
if (item) { if (item) {
ok = true; ok = true;
@ -744,7 +744,7 @@ K_ITEM *users_add(PGconn *conn, char *username, char *emailaddress,
DATA_USERS(row, item); DATA_USERS(row, item);
bzero(row, sizeof(*row)); bzero(row, sizeof(*row));
STRNCPY(row->username, username); row->in_username = in_username->str;
username_trim(row); username_trim(row);
dup = false; dup = false;
@ -771,7 +771,7 @@ K_ITEM *users_add(PGconn *conn, char *username, char *emailaddress,
row->status[0] = '\0'; row->status[0] = '\0';
STRNCPY(row->emailaddress, emailaddress); STRNCPY(row->emailaddress, emailaddress);
snprintf(tohash, sizeof(tohash), "%s&#%s", username, emailaddress); snprintf(tohash, sizeof(tohash), "%s&#%s", in_username->str, emailaddress);
HASH_BER(tohash, strlen(tohash), 1, hash, tmp); HASH_BER(tohash, strlen(tohash), 1, hash, tmp);
__bin2hex(row->secondaryuserid, (void *)(&hash), sizeof(hash)); __bin2hex(row->secondaryuserid, (void *)(&hash), sizeof(hash));
@ -780,7 +780,7 @@ K_ITEM *users_add(PGconn *conn, char *username, char *emailaddress,
// Make it impossible to login for a BTC Address username // Make it impossible to login for a BTC Address username
row->passwordhash[0] = '\0'; row->passwordhash[0] = '\0';
} else { } else {
password_hash(row->username, passwordhash, row->salt, password_hash(row->in_username, passwordhash, row->salt,
row->passwordhash, sizeof(row->passwordhash)); row->passwordhash, sizeof(row->passwordhash));
} }
@ -796,7 +796,7 @@ K_ITEM *users_add(PGconn *conn, char *username, char *emailaddress,
par = 0; par = 0;
params[par++] = bigint_to_buf(row->userid, NULL, 0); params[par++] = bigint_to_buf(row->userid, NULL, 0);
params[par++] = str_to_buf(row->username, NULL, 0); params[par++] = str_to_buf(row->in_username, NULL, 0);
params[par++] = str_to_buf(row->status, NULL, 0); params[par++] = str_to_buf(row->status, NULL, 0);
params[par++] = str_to_buf(row->emailaddress, NULL, 0); params[par++] = str_to_buf(row->emailaddress, NULL, 0);
params[par++] = tv_to_buf(&(row->joineddate), NULL, 0); params[par++] = tv_to_buf(&(row->joineddate), NULL, 0);
@ -909,7 +909,7 @@ bool users_replace(PGconn *conn, K_ITEM *u_item, K_ITEM *old_u_item, char *by,
par = 0; par = 0;
params[par++] = bigint_to_buf(users->userid, NULL, 0); params[par++] = bigint_to_buf(users->userid, NULL, 0);
params[par++] = str_to_buf(users->username, NULL, 0); params[par++] = str_to_buf(users->in_username, NULL, 0);
params[par++] = str_to_buf(users->status, NULL, 0); params[par++] = str_to_buf(users->status, NULL, 0);
params[par++] = str_to_buf(users->emailaddress, NULL, 0); params[par++] = str_to_buf(users->emailaddress, NULL, 0);
params[par++] = tv_to_buf(&(users->joineddate), NULL, 0); params[par++] = tv_to_buf(&(users->joineddate), NULL, 0);
@ -1026,7 +1026,7 @@ bool users_fill(PGconn *conn)
PQ_GET_FLD(res, i, "username", field, ok); PQ_GET_FLD(res, i, "username", field, ok);
if (!ok) if (!ok)
break; break;
TXT_TO_STR("username", field, row->username); row->in_username = intransient_str("username", field);
PQ_GET_FLD(res, i, "status", field, ok); PQ_GET_FLD(res, i, "status", field, ok);
if (!ok) if (!ok)
@ -2004,7 +2004,7 @@ bool paymentaddresses_set(PGconn *conn, int64_t userid, K_STORE *pa_store,
match = STORE_HEAD_NOLOCK(pa_store); match = STORE_HEAD_NOLOCK(pa_store);
while (match) { while (match) {
DATA_PAYMENTADDRESSES(pa, match); DATA_PAYMENTADDRESSES(pa, match);
if (strcmp(pa->payaddress, row->payaddress) == 0 && if (INTREQ(pa->in_payaddress, row->in_payaddress) &&
pa->payratio == row->payratio && pa->payratio == row->payratio &&
strcmp(pa->payname, row->payname) == 0) { strcmp(pa->payname, row->payname) == 0) {
pa->match = true; // Don't store it pa->match = true; // Don't store it
@ -2015,7 +2015,7 @@ bool paymentaddresses_set(PGconn *conn, int64_t userid, K_STORE *pa_store,
} }
if (!match) { if (!match) {
// No matching replacement, so expire 'row' // No matching replacement, so expire 'row'
params[par++] = str_to_buf(row->payaddress, NULL, 0); params[par++] = str_to_buf(row->in_payaddress, NULL, 0);
if (!first) if (!first)
APPEND_REALLOC(upd, off, len, ","); APPEND_REALLOC(upd, off, len, ",");
first = false; first = false;
@ -2071,16 +2071,16 @@ bool paymentaddresses_set(PGconn *conn, int64_t userid, K_STORE *pa_store,
row->userid = userid; row->userid = userid;
HISTORYDATEINIT(row, cd, by, code, inet); HISTORYDATEINTRANS(row, cd, by, code, inet);
HISTORYDATETRANSFER(trf_root, row); HISTORYDATETRANSFERIN(trf_root, row);
par = 0; par = 0;
params[par++] = bigint_to_buf(row->paymentaddressid, NULL, 0); params[par++] = bigint_to_buf(row->paymentaddressid, NULL, 0);
params[par++] = bigint_to_buf(row->userid, NULL, 0); params[par++] = bigint_to_buf(row->userid, NULL, 0);
params[par++] = str_to_buf(row->payaddress, NULL, 0); params[par++] = str_to_buf(row->in_payaddress, NULL, 0);
params[par++] = int_to_buf(row->payratio, NULL, 0); params[par++] = int_to_buf(row->payratio, NULL, 0);
params[par++] = str_to_buf(row->payname, NULL, 0); params[par++] = str_to_buf(row->payname, NULL, 0);
HISTORYDATEPARAMS(params, par, row); HISTORYDATEPARAMSIN(params, par, row);
PARCHKVAL(par, 10, params); // As per PQPARAM10 above PARCHKVAL(par, 10, params); // As per PQPARAM10 above
res = PQexecParams(conn, ins, par, NULL, (const char **)params, res = PQexecParams(conn, ins, par, NULL, (const char **)params,
@ -2129,7 +2129,7 @@ unparam:
match = STORE_HEAD_NOLOCK(pa_store); match = STORE_HEAD_NOLOCK(pa_store);
while (match) { while (match) {
DATA_PAYMENTADDRESSES(pa, match); DATA_PAYMENTADDRESSES(pa, match);
if (strcmp(pa->payaddress, row->payaddress) == 0 && if (INTREQ(pa->in_payaddress, row->in_payaddress) &&
pa->payratio == row->payratio && pa->payratio == row->payratio &&
strcmp(pa->payname, row->payname) == 0) { strcmp(pa->payname, row->payname) == 0) {
break; break;
@ -2236,7 +2236,7 @@ bool paymentaddresses_fill(PGconn *conn)
PQ_GET_FLD(res, i, "payaddress", field, ok); PQ_GET_FLD(res, i, "payaddress", field, ok);
if (!ok) if (!ok)
break; break;
TXT_TO_STR("payaddress", field, row->payaddress); row->in_payaddress = intransient_str("payaddress", field);
PQ_GET_FLD(res, i, "payratio", field, ok); PQ_GET_FLD(res, i, "payratio", field, ok);
if (!ok) if (!ok)
@ -2248,7 +2248,7 @@ bool paymentaddresses_fill(PGconn *conn)
break; break;
TXT_TO_STR("payname", field, row->payname); TXT_TO_STR("payname", field, row->payname);
HISTORYDATEFLDS(res, i, row, ok); HISTORYDATEIN(res, i, row, ok);
if (!ok) if (!ok)
break; break;
@ -2317,7 +2317,7 @@ bool payments_add(PGconn *conn, bool add, K_ITEM *p_item, K_ITEM **old_p_item,
DATA_PAYMENTS(row, p_item); DATA_PAYMENTS(row, p_item);
K_RLOCK(payments_free); K_RLOCK(payments_free);
*old_p_item = find_payments(row->payoutid, row->userid, row->subname); *old_p_item = find_payments(row->payoutid, row->userid, row->in_subname);
K_RUNLOCK(payments_free); K_RUNLOCK(payments_free);
conned = CKPQConn(&conn); conned = CKPQConn(&conn);
@ -2373,14 +2373,14 @@ bool payments_add(PGconn *conn, bool add, K_ITEM *p_item, K_ITEM **old_p_item,
params[par++] = bigint_to_buf(row->paymentid, NULL, 0); params[par++] = bigint_to_buf(row->paymentid, NULL, 0);
params[par++] = bigint_to_buf(row->payoutid, NULL, 0); params[par++] = bigint_to_buf(row->payoutid, NULL, 0);
params[par++] = bigint_to_buf(row->userid, NULL, 0); params[par++] = bigint_to_buf(row->userid, NULL, 0);
params[par++] = str_to_buf(row->subname, NULL, 0); params[par++] = str_to_buf(row->in_subname, NULL, 0);
params[par++] = tv_to_buf(&(row->paydate), NULL, 0); params[par++] = tv_to_buf(&(row->paydate), NULL, 0);
params[par++] = str_to_buf(row->payaddress, NULL, 0); params[par++] = str_to_buf(row->in_payaddress, NULL, 0);
params[par++] = str_to_buf(row->originaltxn, NULL, 0); params[par++] = str_to_buf(row->in_originaltxn, NULL, 0);
params[par++] = bigint_to_buf(row->amount, NULL, 0); params[par++] = bigint_to_buf(row->amount, NULL, 0);
params[par++] = double_to_buf(row->diffacc, NULL, 0); params[par++] = double_to_buf(row->diffacc, NULL, 0);
params[par++] = str_to_buf(row->committxn, NULL, 0); params[par++] = str_to_buf(row->in_committxn, NULL, 0);
params[par++] = str_to_buf(row->commitblockhash, NULL, 0); params[par++] = str_to_buf(row->in_commitblockhash, NULL, 0);
HISTORYDATEPARAMSIN(params, par, row); HISTORYDATEPARAMSIN(params, par, row);
PARCHK(par, params); PARCHK(par, params);
@ -2502,7 +2502,7 @@ bool payments_fill(PGconn *conn)
PQ_GET_FLD(res, i, "subname", field, ok); PQ_GET_FLD(res, i, "subname", field, ok);
if (!ok) if (!ok)
break; break;
TXT_TO_STR("subname", field, row->subname); row->in_subname = intransient_str("subname", field);
PQ_GET_FLD(res, i, "paydate", field, ok); PQ_GET_FLD(res, i, "paydate", field, ok);
if (!ok) if (!ok)
@ -2512,12 +2512,12 @@ bool payments_fill(PGconn *conn)
PQ_GET_FLD(res, i, "payaddress", field, ok); PQ_GET_FLD(res, i, "payaddress", field, ok);
if (!ok) if (!ok)
break; break;
TXT_TO_STR("payaddress", field, row->payaddress); row->in_payaddress = intransient_str("payaddress", field);
PQ_GET_FLD(res, i, "originaltxn", field, ok); PQ_GET_FLD(res, i, "originaltxn", field, ok);
if (!ok) if (!ok)
break; break;
TXT_TO_STR("originaltxn", field, row->originaltxn); row->in_originaltxn = intransient_str("originaltxn", field);
PQ_GET_FLD(res, i, "amount", field, ok); PQ_GET_FLD(res, i, "amount", field, ok);
if (!ok) if (!ok)
@ -2532,12 +2532,12 @@ bool payments_fill(PGconn *conn)
PQ_GET_FLD(res, i, "committxn", field, ok); PQ_GET_FLD(res, i, "committxn", field, ok);
if (!ok) if (!ok)
break; break;
TXT_TO_STR("committxn", field, row->committxn); row->in_committxn = intransient_str("committxn", field);
PQ_GET_FLD(res, i, "commitblockhash", field, ok); PQ_GET_FLD(res, i, "commitblockhash", field, ok);
if (!ok) if (!ok)
break; break;
TXT_TO_STR("commitblockhash", field, row->commitblockhash); row->in_commitblockhash = intransient_str("commitblockhash", field);
HISTORYDATEIN(res, i, row, ok); HISTORYDATEIN(res, i, row, ok);
if (!ok) if (!ok)
@ -7783,7 +7783,7 @@ void ips_add(char *group, char *ip, char *eventname, bool is_event, char *des,
} }
// TODO: discard them from RAM // TODO: discard them from RAM
bool auths_add(PGconn *conn, char *poolinstance, char *username, bool auths_add(PGconn *conn, char *poolinstance, INTRANSIENT *in_username,
INTRANSIENT *in_workername, char *clientid, char *enonce1, INTRANSIENT *in_workername, char *clientid, char *enonce1,
char *useragent, char *preauth, char *by, char *code, char *useragent, char *preauth, char *by, char *code,
char *inet, tv_t *cd, K_TREE *trf_root, char *inet, tv_t *cd, K_TREE *trf_root,
@ -7807,17 +7807,17 @@ bool auths_add(PGconn *conn, char *poolinstance, char *username,
bzero(row, sizeof(*row)); bzero(row, sizeof(*row));
K_RLOCK(users_free); K_RLOCK(users_free);
u_item = find_users(username); u_item = find_users(in_username->str);
K_RUNLOCK(users_free); K_RUNLOCK(users_free);
if (!u_item) { if (!u_item) {
if (addressuser) { if (addressuser) {
u_item = users_add(conn, username, EMPTY, EMPTY, u_item = users_add(conn, in_username, EMPTY, EMPTY,
USER_ADDRESS, by, code, inet, cd, USER_ADDRESS, by, code, inet, cd,
trf_root); trf_root);
} else { } else {
LOGDEBUG("%s(): unknown user '%s'", LOGDEBUG("%s(): unknown user '%s'",
__func__, __func__,
st = safe_text_nonull(username)); st = safe_text_nonull(in_username->str));
FREENULL(st); FREENULL(st);
if (!reload_data) if (!reload_data)
*event = events_add(EVENTID_INVAUTH, trf_root); *event = events_add(EVENTID_INVAUTH, trf_root);

Loading…
Cancel
Save