From 8ff2afb39ee8aa4d794246877eb1a3678368c11f Mon Sep 17 00:00:00 2001 From: deuce <> Date: Sun, 17 Jun 2012 19:16:50 +0000 Subject: [PATCH] Add support for [+-][A-?] for flags?, exemption, and restriction fields of user.security and move a general function to support it into str_util.c --- src/sbbs3/js_console.cpp | 29 +----------------- src/sbbs3/js_user.c | 66 +++++++++++++++++++++++++++++----------- src/sbbs3/sbbs.h | 1 + src/sbbs3/str_util.c | 30 ++++++++++++++++++ 4 files changed, 80 insertions(+), 46 deletions(-) diff --git a/src/sbbs3/js_console.cpp b/src/sbbs3/js_console.cpp index ea0bd023f2..3610ff8fd5 100644 --- a/src/sbbs3/js_console.cpp +++ b/src/sbbs3/js_console.cpp @@ -271,37 +271,10 @@ static JSBool js_console_set(JSContext *cx, JSObject *obj, jsid id, JSBool stric break; case CON_PROP_CTRLKEY_PASSTHRU: if(JSVAL_IS_STRING(*vp)) { - /* op can be 0 for replace, + for add, or - for remove */ - int op=0; char *s; - char ctrl; - if((str=JS_ValueToString(cx, *vp))==NULL) - break; - val=sbbs->cfg.ctrlkey_passthru; JSSTRING_TO_STRING(cx, str, s, NULL); - for(; *s; s++) { - if(*s=='+') - op=1; - else if(*s=='-') - op=2; - else { - if(!op) { - val=0; - op=1; - } - ctrl=toupper(*s); - ctrl&=0x1f; /* Ensure it fits */ - switch(op) { - case 1: /* Add to the set */ - val |= 1<<ctrl; - break; - case 2: /* Remove from the set */ - val &= ~(1<<ctrl); - break; - } - } - } + val=str_to_bits(sbbs->cfg.ctrlkey_passthru, s); } sbbs->cfg.ctrlkey_passthru=val; break; diff --git a/src/sbbs3/js_user.c b/src/sbbs3/js_user.c index 9fddde0ca3..f88fa30294 100644 --- a/src/sbbs3/js_user.c +++ b/src/sbbs3/js_user.c @@ -583,43 +583,73 @@ static JSBool js_user_set(JSContext *cx, JSObject *obj, jsid id, JSBool strict, break; case USER_PROP_FLAGS1: JS_RESUMEREQUEST(cx, rc); - if(!JS_ValueToInt32(cx,*vp,&val)) - return JS_FALSE; + if(JSVAL_IS_STRING(*vp)) { + val=str_to_bits(p->user->flags1, str); + } + else { + if(!JS_ValueToInt32(cx,*vp,&val)) + return JS_FALSE; + } putuserrec(p->cfg,p->user->number,U_FLAGS1,0,ultoa(p->user->flags1=val,tmp,16)); rc=JS_SUSPENDREQUEST(cx); break; case USER_PROP_FLAGS2: JS_RESUMEREQUEST(cx, rc); - if(!JS_ValueToInt32(cx,*vp,&val)) - return JS_FALSE; + if(JSVAL_IS_STRING(*vp)) { + val=str_to_bits(p->user->flags1, str); + } + else { + if(!JS_ValueToInt32(cx,*vp,&val)) + return JS_FALSE; + } putuserrec(p->cfg,p->user->number,U_FLAGS2,0,ultoa(p->user->flags2=val,tmp,16)); rc=JS_SUSPENDREQUEST(cx); break; case USER_PROP_FLAGS3: JS_RESUMEREQUEST(cx, rc); - if(!JS_ValueToInt32(cx,*vp,&val)) - return JS_FALSE; + if(JSVAL_IS_STRING(*vp)) { + val=str_to_bits(p->user->flags1, str); + } + else { + if(!JS_ValueToInt32(cx,*vp,&val)) + return JS_FALSE; + } putuserrec(p->cfg,p->user->number,U_FLAGS3,0,ultoa(p->user->flags3=val,tmp,16)); rc=JS_SUSPENDREQUEST(cx); break; case USER_PROP_FLAGS4: JS_RESUMEREQUEST(cx, rc); - if(!JS_ValueToInt32(cx,*vp,&val)) - return JS_FALSE; + if(JSVAL_IS_STRING(*vp)) { + val=str_to_bits(p->user->flags1, str); + } + else { + if(!JS_ValueToInt32(cx,*vp,&val)) + return JS_FALSE; + } putuserrec(p->cfg,p->user->number,U_FLAGS4,0,ultoa(p->user->flags4=val,tmp,16)); rc=JS_SUSPENDREQUEST(cx); break; case USER_PROP_EXEMPT: JS_RESUMEREQUEST(cx, rc); - if(!JS_ValueToInt32(cx,*vp,&val)) - return JS_FALSE; + if(JSVAL_IS_STRING(*vp)) { + val=str_to_bits(p->user->flags1, str); + } + else { + if(!JS_ValueToInt32(cx,*vp,&val)) + return JS_FALSE; + } putuserrec(p->cfg,p->user->number,U_EXEMPT,0,ultoa(p->user->exempt=val,tmp,16)); rc=JS_SUSPENDREQUEST(cx); break; case USER_PROP_REST: JS_RESUMEREQUEST(cx, rc); - if(!JS_ValueToInt32(cx,*vp,&val)) - return JS_FALSE; + if(JSVAL_IS_STRING(*vp)) { + val=str_to_bits(p->user->flags1, str); + } + else { + if(!JS_ValueToInt32(cx,*vp,&val)) + return JS_FALSE; + } putuserrec(p->cfg,p->user->number,U_REST,0,ultoa(p->user->rest=val,tmp,16)); rc=JS_SUSPENDREQUEST(cx); break; @@ -774,12 +804,12 @@ static char* user_security_prop_desc[] = { "password" ,"date password last modified (time_t format)" ,"security level (0-99)" - ,"flag set #1 (bitfield)" - ,"flag set #2 (bitfield)" - ,"flag set #3 (bitfield)" - ,"flag set #4 (bitfield)" - ,"exemption flags (bitfield)" - ,"restriction flags (bitfield)" + ,"flag set #1 (bitfield) can use +/-[A-?] notation" + ,"flag set #2 (bitfield) can use +/-[A-?] notation" + ,"flag set #3 (bitfield) can use +/-[A-?] notation" + ,"flag set #4 (bitfield) can use +/-[A-?] notation" + ,"exemption flags (bitfield) can use +/-[A-?] notation" + ,"restriction flags (bitfield) can use +/-[A-?] notation" ,"credits" ,"free credits (for today only)" ,"extra minutes (time bank)" diff --git a/src/sbbs3/sbbs.h b/src/sbbs3/sbbs.h index f3a36af41c..1c6e28b6db 100644 --- a/src/sbbs3/sbbs.h +++ b/src/sbbs3/sbbs.h @@ -921,6 +921,7 @@ extern "C" { DLLEXPORT size_t DLLCALL strip_invalid_attr(char *str); DLLEXPORT char * DLLCALL ultoac(ulong l,char *str); DLLEXPORT char * DLLCALL rot13(char* str); + DLLEXPORT uint32_t DLLCALL str_to_bits(uint32_t currval, const char *str); /* msg_id.c */ DLLEXPORT char * DLLCALL ftn_msgid(sub_t* sub, smbmsg_t* msg, char* msgid, size_t); diff --git a/src/sbbs3/str_util.c b/src/sbbs3/str_util.c index 7e7de6bf0c..4e922c44d0 100644 --- a/src/sbbs3/str_util.c +++ b/src/sbbs3/str_util.c @@ -699,6 +699,36 @@ char* replace_keyed_values(const char* src return(buf); } +uint32_t DLLCALL str_to_bits(uint32_t val, const char *str) +{ + /* op can be 0 for replace, + for add, or - for remove */ + int op=0; + char *s; + char ctrl; + + for(s=str; *s; s++) { + if(*s=='+') + op=1; + else if(*s=='-') + op=2; + else { + if(!op) { + val=0; + op=1; + } + ctrl=toupper(*s); + ctrl&=0x1f; /* Ensure it fits */ + switch(op) { + case 1: /* Add to the set */ + val |= 1<<ctrl; + break; + case 2: /* Remove from the set */ + val &= ~(1<<ctrl); + break; + } + } + } +} #if 0 /* replace_*_values test */ -- GitLab