|
|
1.1 root 1: /* js_user.c */
2:
3: /* Synchronet JavaScript "User" Object */
4:
5: /* $Id: js_user.c,v 1.62 2006/06/06 17:17:18 rswindell Exp $ */
6:
7: /****************************************************************************
8: * @format.tab-size 4 (Plain Text/Source Code File Header) *
9: * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) *
10: * *
11: * Copyright 2006 Rob Swindell - http://www.synchro.net/copyright.html *
12: * *
13: * This program is free software; you can redistribute it and/or *
14: * modify it under the terms of the GNU General Public License *
15: * as published by the Free Software Foundation; either version 2 *
16: * of the License, or (at your option) any later version. *
17: * See the GNU General Public License for more details: gpl.txt or *
18: * http://www.fsf.org/copyleft/gpl.html *
19: * *
20: * Anonymous FTP access to the most recent released source is available at *
21: * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net *
22: * *
23: * Anonymous CVS access to the development source and modification history *
24: * is available at cvs.synchro.net:/cvsroot/sbbs, example: *
25: * cvs -d :pserver:[email protected]:/cvsroot/sbbs login *
26: * (just hit return, no password is necessary) *
27: * cvs -d :pserver:[email protected]:/cvsroot/sbbs checkout src *
28: * *
29: * For Synchronet coding style and modification guidelines, see *
30: * http://www.synchro.net/source.html *
31: * *
32: * You are encouraged to submit any modifications (preferably in Unix diff *
33: * format) via e-mail to [email protected] *
34: * *
35: * Note: If this box doesn't appear square, then you need to fix your tabs. *
36: ****************************************************************************/
37:
38: #include "sbbs.h"
39:
40: #ifdef JAVASCRIPT
41:
42: static scfg_t* scfg=NULL;
43:
44: static const char* getprivate_failure = "line %d %s JS_GetPrivate failed";
45:
46: typedef struct
47: {
48: user_t user;
49: BOOL cached;
50: scfg_t* cfg;
51:
52: } private_t;
53:
54: /* User Object Properites */
55: enum {
56: USER_PROP_NUMBER
57: ,USER_PROP_ALIAS
58: ,USER_PROP_NAME
59: ,USER_PROP_HANDLE
60: ,USER_PROP_NOTE
61: ,USER_PROP_COMP
62: ,USER_PROP_COMMENT
63: ,USER_PROP_NETMAIL
64: ,USER_PROP_EMAIL /* READ ONLY */
65: ,USER_PROP_ADDRESS
66: ,USER_PROP_LOCATION
67: ,USER_PROP_ZIPCODE
68: ,USER_PROP_PASS
69: ,USER_PROP_PHONE
70: ,USER_PROP_BIRTH
71: ,USER_PROP_AGE /* READ ONLY */
72: ,USER_PROP_MODEM
73: ,USER_PROP_LASTON
74: ,USER_PROP_FIRSTON
75: ,USER_PROP_EXPIRE
76: ,USER_PROP_PWMOD
77: ,USER_PROP_LOGONS
78: ,USER_PROP_LTODAY
79: ,USER_PROP_TIMEON
80: ,USER_PROP_TEXTRA
81: ,USER_PROP_TTODAY
82: ,USER_PROP_TLAST
83: ,USER_PROP_POSTS
84: ,USER_PROP_EMAILS
85: ,USER_PROP_FBACKS
86: ,USER_PROP_ETODAY
87: ,USER_PROP_PTODAY
88: ,USER_PROP_MAIL_WAITING
89: ,USER_PROP_MAIL_PENDING
90: ,USER_PROP_ULB
91: ,USER_PROP_ULS
92: ,USER_PROP_DLB
93: ,USER_PROP_DLS
94: ,USER_PROP_CDT
95: ,USER_PROP_MIN
96: ,USER_PROP_LEVEL
97: ,USER_PROP_FLAGS1
98: ,USER_PROP_FLAGS2
99: ,USER_PROP_FLAGS3
100: ,USER_PROP_FLAGS4
101: ,USER_PROP_EXEMPT
102: ,USER_PROP_REST
103: ,USER_PROP_ROWS
104: ,USER_PROP_SEX
105: ,USER_PROP_MISC
106: ,USER_PROP_LEECH
107: ,USER_PROP_CURSUB
108: ,USER_PROP_CURDIR
109: ,USER_PROP_CURXTRN
110: ,USER_PROP_FREECDT
111: ,USER_PROP_XEDIT
112: ,USER_PROP_SHELL
113: ,USER_PROP_QWK
114: ,USER_PROP_TMPEXT
115: ,USER_PROP_CHAT
116: ,USER_PROP_NS_TIME
117: ,USER_PROP_PROT
118: ,USER_PROP_LOGONTIME
119: ,USER_PROP_TIMEPERCALL
120: ,USER_PROP_TIMEPERDAY
121: ,USER_PROP_CALLSPERDAY
122: ,USER_PROP_LINESPERMSG
123: ,USER_PROP_EMAILPERDAY
124: ,USER_PROP_POSTSPERDAY
125: ,USER_PROP_FREECDTPERDAY
126: ,USER_PROP_CACHED
127: };
128:
129: static void js_getuserdat(private_t* p)
130: {
131: if(!p->cached) {
132: if(getuserdat(p->cfg,&p->user)==0)
133: p->cached=TRUE;
134: }
135: }
136:
137:
138: static JSBool js_user_get(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
139: {
140: char* s=NULL;
141: char tmp[128];
142: ulong val=0;
143: jsint tiny;
144: JSString* js_str;
145: private_t* p;
146:
147: if((p=(private_t*)JS_GetPrivate(cx,obj))==NULL) {
148: JS_ReportError(cx,getprivate_failure,WHERE);
149: return(JS_FALSE);
150: }
151:
152: js_getuserdat(p);
153:
154: tiny = JSVAL_TO_INT(id);
155:
156: switch(tiny) {
157: case USER_PROP_NUMBER:
158: val=p->user.number;
159: break;
160: case USER_PROP_ALIAS:
161: s=p->user.alias;
162: break;
163: case USER_PROP_NAME:
164: s=p->user.name;
165: break;
166: case USER_PROP_HANDLE:
167: s=p->user.handle;
168: break;
169: case USER_PROP_NOTE:
170: s=p->user.note;
171: break;
172: case USER_PROP_COMP:
173: s=p->user.comp;
174: break;
175: case USER_PROP_COMMENT:
176: s=p->user.comment;
177: break;
178: case USER_PROP_NETMAIL:
179: s=p->user.netmail;
180: break;
181: case USER_PROP_EMAIL:
182: s=usermailaddr(p->cfg, tmp
183: ,p->cfg->inetmail_misc&NMAIL_ALIAS ? p->user.alias : p->user.name);
184: break;
185: case USER_PROP_ADDRESS:
186: s=p->user.address;
187: break;
188: case USER_PROP_LOCATION:
189: s=p->user.location;
190: break;
191: case USER_PROP_ZIPCODE:
192: s=p->user.zipcode;
193: break;
194: case USER_PROP_PASS:
195: s=p->user.pass;
196: break;
197: case USER_PROP_PHONE:
198: s=p->user.phone;
199: break;
200: case USER_PROP_BIRTH:
201: s=p->user.birth;
202: break;
203: case USER_PROP_AGE:
204: val=getage(p->cfg,p->user.birth);
205: break;
206: case USER_PROP_MODEM:
207: s=p->user.modem;
208: break;
209: case USER_PROP_LASTON:
210: val=p->user.laston;
211: break;
212: case USER_PROP_FIRSTON:
213: val=p->user.firston;
214: break;
215: case USER_PROP_EXPIRE:
216: val=p->user.expire;
217: break;
218: case USER_PROP_PWMOD:
219: val=p->user.pwmod;
220: break;
221: case USER_PROP_LOGONS:
222: val=p->user.logons;
223: break;
224: case USER_PROP_LTODAY:
225: val=p->user.ltoday;
226: break;
227: case USER_PROP_TIMEON:
228: val=p->user.timeon;
229: break;
230: case USER_PROP_TEXTRA:
231: val=p->user.textra;
232: break;
233: case USER_PROP_TTODAY:
234: val=p->user.ttoday;
235: break;
236: case USER_PROP_TLAST:
237: val=p->user.tlast;
238: break;
239: case USER_PROP_POSTS:
240: val=p->user.posts;
241: break;
242: case USER_PROP_EMAILS:
243: val=p->user.emails;
244: break;
245: case USER_PROP_FBACKS:
246: val=p->user.fbacks;
247: break;
248: case USER_PROP_ETODAY:
249: val=p->user.etoday;
250: break;
251: case USER_PROP_PTODAY:
252: val=p->user.ptoday;
253: break;
254: case USER_PROP_ULB:
255: val=p->user.ulb;
256: break;
257: case USER_PROP_ULS:
258: val=p->user.uls;
259: break;
260: case USER_PROP_DLB:
261: val=p->user.dlb;
262: break;
263: case USER_PROP_DLS:
264: val=p->user.dls;
265: break;
266: case USER_PROP_CDT:
267: val=p->user.cdt;
268: break;
269: case USER_PROP_MIN:
270: val=p->user.min;
271: break;
272: case USER_PROP_LEVEL:
273: val=p->user.level;
274: break;
275: case USER_PROP_FLAGS1:
276: val=p->user.flags1;
277: break;
278: case USER_PROP_FLAGS2:
279: val=p->user.flags2;
280: break;
281: case USER_PROP_FLAGS3:
282: val=p->user.flags3;
283: break;
284: case USER_PROP_FLAGS4:
285: val=p->user.flags4;
286: break;
287: case USER_PROP_EXEMPT:
288: val=p->user.exempt;
289: break;
290: case USER_PROP_REST:
291: val=p->user.rest;
292: break;
293: case USER_PROP_ROWS:
294: val=p->user.rows;
295: break;
296: case USER_PROP_SEX:
297: sprintf(tmp,"%c",p->user.sex);
298: s=tmp;
299: break;
300: case USER_PROP_MISC:
301: val=p->user.misc;
302: break;
303: case USER_PROP_LEECH:
304: val=p->user.leech;
305: break;
306: case USER_PROP_CURSUB:
307: s=p->user.cursub;
308: break;
309: case USER_PROP_CURDIR:
310: s=p->user.curdir;
311: break;
312: case USER_PROP_CURXTRN:
313: s=p->user.curxtrn;
314: break;
315:
316: case USER_PROP_FREECDT:
317: val=p->user.freecdt;
318: break;
319: case USER_PROP_XEDIT:
320: if(p->user.xedit>0 && p->user.xedit<=p->cfg->total_xedits)
321: s=p->cfg->xedit[p->user.xedit-1]->code;
322: else
323: s=""; /* internal editor */
324: break;
325: case USER_PROP_SHELL:
326: s=p->cfg->shell[p->user.shell]->code;
327: break;
328: case USER_PROP_QWK:
329: val=p->user.qwk;
330: break;
331: case USER_PROP_TMPEXT:
332: s=p->user.tmpext;
333: break;
334: case USER_PROP_CHAT:
335: val=p->user.chat;
336: break;
337: case USER_PROP_NS_TIME:
338: val=p->user.ns_time;
339: break;
340: case USER_PROP_PROT:
341: sprintf(tmp,"%c",p->user.prot);
342: s=tmp;
343: break;
344: case USER_PROP_LOGONTIME:
345: val=p->user.logontime;
346: break;
347: case USER_PROP_TIMEPERCALL:
348: val=p->cfg->level_timepercall[p->user.level];
349: break;
350: case USER_PROP_TIMEPERDAY:
351: val=p->cfg->level_timeperday[p->user.level];
352: break;
353: case USER_PROP_CALLSPERDAY:
354: val=p->cfg->level_callsperday[p->user.level];
355: break;
356: case USER_PROP_LINESPERMSG:
357: val=p->cfg->level_linespermsg[p->user.level];
358: break;
359: case USER_PROP_POSTSPERDAY:
360: val=p->cfg->level_postsperday[p->user.level];
361: break;
362: case USER_PROP_EMAILPERDAY:
363: val=p->cfg->level_emailperday[p->user.level];
364: break;
365: case USER_PROP_FREECDTPERDAY:
366: val=p->cfg->level_freecdtperday[p->user.level];
367: break;
368: case USER_PROP_MAIL_WAITING:
369: val=getmail(p->cfg,p->user.number,/* sent? */FALSE);
370: break;
371: case USER_PROP_MAIL_PENDING:
372: val=getmail(p->cfg,p->user.number,/* sent? */TRUE);
373: break;
374:
375: case USER_PROP_CACHED:
376: *vp = BOOLEAN_TO_JSVAL(p->cached);
377: return(JS_TRUE); /* intentional early return */
378:
379: default:
380: /* This must not set vp in order for child objects to work (stats and security) */
381: return(JS_TRUE);
382: }
383: if(s!=NULL) {
384: if((js_str=JS_NewStringCopyZ(cx, s))==NULL)
385: return(JS_FALSE);
386: *vp = STRING_TO_JSVAL(js_str);
387: } else
388: JS_NewNumberValue(cx,val,vp);
389:
390: return(JS_TRUE);
391: }
392:
393: static JSBool js_user_set(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
394: {
395: char* str;
396: char tmp[64];
397: jsint val;
398: ulong usermisc;
399: jsint tiny;
400: JSString* js_str;
401: private_t* p;
402: int32 usernumber;
403:
404: if((p=(private_t*)JS_GetPrivate(cx,obj))==NULL) {
405: JS_ReportError(cx,getprivate_failure,WHERE);
406: return(JS_FALSE);
407: }
408:
409: if((js_str=JS_ValueToString(cx,*vp))==NULL)
410: return(JS_FALSE);
411:
412: if((str=JS_GetStringBytes(js_str))==NULL)
413: return(JS_FALSE);
414:
415: tiny = JSVAL_TO_INT(id);
416:
417: switch(tiny) {
418: case USER_PROP_NUMBER:
419: JS_ValueToInt32(cx, *vp, &usernumber);
420: if(usernumber!=p->user.number)
421: p->user.number=(ushort)usernumber;
422: break;
423: case USER_PROP_ALIAS:
424: /* update USER.DAT */
425: putuserrec(p->cfg,p->user.number,U_ALIAS,LEN_ALIAS,str);
426:
427: /* update NAME.DAT */
428: getuserrec(p->cfg,p->user.number,U_MISC,8,tmp);
429: usermisc=ahtoul(tmp);
430: if(!(usermisc&DELETED))
431: putusername(p->cfg,p->user.number,str);
432: break;
433: case USER_PROP_NAME:
434: putuserrec(p->cfg,p->user.number,U_NAME,LEN_NAME,str);
435: break;
436: case USER_PROP_HANDLE:
437: putuserrec(p->cfg,p->user.number,U_HANDLE,LEN_HANDLE,str);
438: break;
439: case USER_PROP_NOTE:
440: putuserrec(p->cfg,p->user.number,U_NOTE,LEN_NOTE,str);
441: break;
442: case USER_PROP_COMP:
443: putuserrec(p->cfg,p->user.number,U_COMP,LEN_COMP,str);
444: break;
445: case USER_PROP_COMMENT:
446: putuserrec(p->cfg,p->user.number,U_COMMENT,LEN_COMMENT,str);
447: break;
448: case USER_PROP_NETMAIL:
449: putuserrec(p->cfg,p->user.number,U_NETMAIL,LEN_NETMAIL,str);
450: break;
451: case USER_PROP_ADDRESS:
452: putuserrec(p->cfg,p->user.number,U_ADDRESS,LEN_ADDRESS,str);
453: break;
454: case USER_PROP_LOCATION:
455: putuserrec(p->cfg,p->user.number,U_LOCATION,LEN_LOCATION,str);
456: break;
457: case USER_PROP_ZIPCODE:
458: putuserrec(p->cfg,p->user.number,U_ZIPCODE,LEN_ZIPCODE,str);
459: break;
460: case USER_PROP_PHONE:
461: putuserrec(p->cfg,p->user.number,U_PHONE,LEN_PHONE,str);
462: break;
463: case USER_PROP_BIRTH:
464: putuserrec(p->cfg,p->user.number,U_BIRTH,LEN_BIRTH,str);
465: break;
466: case USER_PROP_MODEM:
467: putuserrec(p->cfg,p->user.number,U_MODEM,LEN_MODEM,str);
468: break;
469: case USER_PROP_ROWS:
470: putuserrec(p->cfg,p->user.number,U_ROWS,0,str); /* base 10 */
471: break;
472: case USER_PROP_SEX:
473: putuserrec(p->cfg,p->user.number,U_SEX,0,strupr(str)); /* single char */
474: break;
475: case USER_PROP_CURSUB:
476: putuserrec(p->cfg,p->user.number,U_CURSUB,0,strupr(str));
477: break;
478: case USER_PROP_CURDIR:
479: putuserrec(p->cfg,p->user.number,U_CURDIR,0,strupr(str));
480: break;
481: case USER_PROP_CURXTRN:
482: putuserrec(p->cfg,p->user.number,U_CURXTRN,0,strupr(str));
483: break;
484: case USER_PROP_XEDIT:
485: putuserrec(p->cfg,p->user.number,U_XEDIT,0,strupr(str));
486: break;
487: case USER_PROP_SHELL:
488: putuserrec(p->cfg,p->user.number,U_COMP,0,strupr(str));
489: break;
490: case USER_PROP_MISC:
491: if(JS_ValueToInt32(cx,*vp,&val))
492: putuserrec(p->cfg,p->user.number,U_MISC,0,ultoa(val,tmp,16));
493: break;
494: case USER_PROP_QWK:
495: if(JS_ValueToInt32(cx,*vp,&val))
496: putuserrec(p->cfg,p->user.number,U_QWK,0,ultoa(val,tmp,16));
497: break;
498: case USER_PROP_CHAT:
499: if(JS_ValueToInt32(cx,*vp,&val))
500: putuserrec(p->cfg,p->user.number,U_CHAT,0,ultoa(val,tmp,16));
501: break;
502: case USER_PROP_TMPEXT:
503: putuserrec(p->cfg,p->user.number,U_TMPEXT,0,str);
504: break;
505: case USER_PROP_NS_TIME:
506: if(JS_ValueToInt32(cx,*vp,&val))
507: putuserrec(p->cfg,p->user.number,U_NS_TIME,0,ultoa(val,tmp,16));
508: break;
509: case USER_PROP_PROT:
510: putuserrec(p->cfg,p->user.number,U_PROT,0,strupr(str)); /* single char */
511: break;
512: case USER_PROP_LOGONTIME:
513: if(JS_ValueToInt32(cx,*vp,&val))
514: putuserrec(p->cfg,p->user.number,U_LOGONTIME,0,ultoa(val,tmp,16));
515: break;
516:
517: /* security properties*/
518: case USER_PROP_PASS:
519: putuserrec(p->cfg,p->user.number,U_PASS,LEN_PASS,strupr(str));
520: break;
521: case USER_PROP_PWMOD:
522: if(JS_ValueToInt32(cx,*vp,&val))
523: putuserrec(p->cfg,p->user.number,U_PWMOD,0,ultoa(val,tmp,16));
524: break;
525: case USER_PROP_LEVEL:
526: putuserrec(p->cfg,p->user.number,U_LEVEL,0,str);
527: break;
528: case USER_PROP_FLAGS1:
529: if(JS_ValueToInt32(cx,*vp,&val))
530: putuserrec(p->cfg,p->user.number,U_FLAGS1,0,ultoa(val,tmp,16));
531: break;
532: case USER_PROP_FLAGS2:
533: if(JS_ValueToInt32(cx,*vp,&val))
534: putuserrec(p->cfg,p->user.number,U_FLAGS2,0,ultoa(val,tmp,16));
535: break;
536: case USER_PROP_FLAGS3:
537: if(JS_ValueToInt32(cx,*vp,&val))
538: putuserrec(p->cfg,p->user.number,U_FLAGS3,0,ultoa(val,tmp,16));
539: break;
540: case USER_PROP_FLAGS4:
541: if(JS_ValueToInt32(cx,*vp,&val))
542: putuserrec(p->cfg,p->user.number,U_FLAGS4,0,ultoa(val,tmp,16));
543: break;
544: case USER_PROP_EXEMPT:
545: if(JS_ValueToInt32(cx,*vp,&val))
546: putuserrec(p->cfg,p->user.number,U_EXEMPT,0,ultoa(val,tmp,16));
547: break;
548: case USER_PROP_REST:
549: if(JS_ValueToInt32(cx,*vp,&val))
550: putuserrec(p->cfg,p->user.number,U_REST,0,ultoa(val,tmp,16));
551: break;
552: case USER_PROP_CDT:
553: putuserrec(p->cfg,p->user.number,U_CDT,0,str);
554: break;
555: case USER_PROP_FREECDT:
556: putuserrec(p->cfg,p->user.number,U_FREECDT,0,str);
557: break;
558: case USER_PROP_MIN:
559: putuserrec(p->cfg,p->user.number,U_MIN,0,str);
560: break;
561: case USER_PROP_TEXTRA:
562: putuserrec(p->cfg,p->user.number,U_TEXTRA,0,str);
563: break;
564: case USER_PROP_EXPIRE:
565: if(JS_ValueToInt32(cx,*vp,&val))
566: putuserrec(p->cfg,p->user.number,U_EXPIRE,0,ultoa(val,tmp,16));
567: break;
568:
569: case USER_PROP_CACHED:
570: JS_ValueToBoolean(cx, *vp, &p->cached);
571: return(JS_TRUE); /* intentional early return */
572:
573: }
574: p->cached=FALSE;
575:
576:
577: return(JS_TRUE);
578: }
579:
580: #define USER_PROP_FLAGS JSPROP_ENUMERATE
581:
582: static jsSyncPropertySpec js_user_properties[] = {
583: /* name ,tinyid ,flags, ver */
584:
585: { "number" ,USER_PROP_NUMBER ,USER_PROP_FLAGS, 310},
586: { "alias" ,USER_PROP_ALIAS ,USER_PROP_FLAGS, 310},
587: { "name" ,USER_PROP_NAME ,USER_PROP_FLAGS, 310},
588: { "handle" ,USER_PROP_HANDLE ,USER_PROP_FLAGS, 310},
589: { "ip_address" ,USER_PROP_NOTE ,USER_PROP_FLAGS, 310},
590: { "note" ,USER_PROP_NOTE ,USER_PROP_FLAGS, 310},
591: { "host_name" ,USER_PROP_COMP ,USER_PROP_FLAGS, 310},
592: { "computer" ,USER_PROP_COMP ,USER_PROP_FLAGS, 310},
593: { "comment" ,USER_PROP_COMMENT ,USER_PROP_FLAGS, 310},
594: { "netmail" ,USER_PROP_NETMAIL ,USER_PROP_FLAGS, 310},
595: { "email" ,USER_PROP_EMAIL ,USER_PROP_FLAGS|JSPROP_READONLY, 310},
596: { "address" ,USER_PROP_ADDRESS ,USER_PROP_FLAGS, 310},
597: { "location" ,USER_PROP_LOCATION ,USER_PROP_FLAGS, 310},
598: { "zipcode" ,USER_PROP_ZIPCODE ,USER_PROP_FLAGS, 310},
599: { "phone" ,USER_PROP_PHONE ,USER_PROP_FLAGS, 310},
600: { "birthdate" ,USER_PROP_BIRTH ,USER_PROP_FLAGS, 310},
601: { "age" ,USER_PROP_AGE ,USER_PROP_FLAGS|JSPROP_READONLY, 310},
602: { "connection" ,USER_PROP_MODEM ,USER_PROP_FLAGS, 310},
603: { "modem" ,USER_PROP_MODEM ,USER_PROP_FLAGS, 310},
604: { "screen_rows" ,USER_PROP_ROWS ,USER_PROP_FLAGS, 310},
605: { "gender" ,USER_PROP_SEX ,USER_PROP_FLAGS, 310},
606: { "cursub" ,USER_PROP_CURSUB ,USER_PROP_FLAGS, 310},
607: { "curdir" ,USER_PROP_CURDIR ,USER_PROP_FLAGS, 310},
608: { "curxtrn" ,USER_PROP_CURXTRN ,USER_PROP_FLAGS, 310},
609: { "editor" ,USER_PROP_XEDIT ,USER_PROP_FLAGS, 310},
610: { "command_shell" ,USER_PROP_SHELL ,USER_PROP_FLAGS, 310},
611: { "settings" ,USER_PROP_MISC ,USER_PROP_FLAGS, 310},
612: { "qwk_settings" ,USER_PROP_QWK ,USER_PROP_FLAGS, 310},
613: { "chat_settings" ,USER_PROP_CHAT ,USER_PROP_FLAGS, 310},
614: { "temp_file_ext" ,USER_PROP_TMPEXT ,USER_PROP_FLAGS, 310},
615: { "new_file_time" ,USER_PROP_NS_TIME ,USER_PROP_FLAGS, 311},
616: { "newscan_date" ,USER_PROP_NS_TIME ,0, /* Alias */ 310},
617: { "download_protocol" ,USER_PROP_PROT ,USER_PROP_FLAGS, 310},
618: { "logontime" ,USER_PROP_LOGONTIME ,USER_PROP_FLAGS, 310},
619: { "cached" ,USER_PROP_CACHED ,USER_PROP_FLAGS, 314},
620: {0}
621: };
622:
623: #ifdef BUILD_JSDOCS
624: static char* user_prop_desc[] = {
625:
626: "record number (1-based)"
627: ,"alias/name"
628: ,"real name"
629: ,"chat handle"
630: ,"IP address last logged on from"
631: ,"AKA ip_address"
632: ,"host name last logged on from"
633: ,"AKA host_name"
634: ,"sysop's comment"
635: ,"external e-mail address"
636: ,"local Internet e-mail address - <small>READ ONLY</small>"
637: ,"street address"
638: ,"location (city, state)"
639: ,"zip/postal code"
640: ,"phone number"
641: ,"birth date"
642: ,"calculated age in years - <small>READ ONLY</small>"
643: ,"connection type"
644: ,"AKA connection"
645: ,"terminal rows (lines)"
646: ,"gender type"
647: ,"current message sub-board"
648: ,"current file directory"
649: ,"current external program being run"
650: ,"external message editor"
651: ,"command shell"
652: ,"settings bitfield - see <tt>USER_*</tt> in <tt>sbbsdefs.js</tt> for bit definitions"
653: ,"QWK packet settings bitfield - see <tt>QWK_*</tt> in <tt>sbbsdefs.js</tt> for bit definitions"
654: ,"chat settings bitfield - see <tt>CHAT_*</tt> in <tt>sbbsdefs.js</tt> for bit definitions"
655: ,"temporary file type (extension)"
656: ,"new file scan date/time (time_t format)"
657: ,"file transfer protocol (command key)"
658: ,"logon time (time_t format)"
659: ,"record is currently cached in memory"
660: ,NULL
661: };
662: #endif
663:
664:
665: /* user.security */
666: static jsSyncPropertySpec js_user_security_properties[] = {
667: /* name ,tinyid ,flags, ver */
668:
669: { "password" ,USER_PROP_PASS ,USER_PROP_FLAGS, 310 },
670: { "password_date" ,USER_PROP_PWMOD ,USER_PROP_FLAGS, 310 },
671: { "level" ,USER_PROP_LEVEL ,USER_PROP_FLAGS, 310 },
672: { "flags1" ,USER_PROP_FLAGS1 ,USER_PROP_FLAGS, 310 },
673: { "flags2" ,USER_PROP_FLAGS2 ,USER_PROP_FLAGS, 310 },
674: { "flags3" ,USER_PROP_FLAGS3 ,USER_PROP_FLAGS, 310 },
675: { "flags4" ,USER_PROP_FLAGS4 ,USER_PROP_FLAGS, 310 },
676: { "exemptions" ,USER_PROP_EXEMPT ,USER_PROP_FLAGS, 310 },
677: { "restrictions" ,USER_PROP_REST ,USER_PROP_FLAGS, 310 },
678: { "credits" ,USER_PROP_CDT ,USER_PROP_FLAGS, 310 },
679: { "free_credits" ,USER_PROP_FREECDT ,USER_PROP_FLAGS, 310 },
680: { "minutes" ,USER_PROP_MIN ,USER_PROP_FLAGS, 310 },
681: { "extra_time" ,USER_PROP_TEXTRA ,USER_PROP_FLAGS, 310 },
682: { "expiration_date" ,USER_PROP_EXPIRE ,USER_PROP_FLAGS, 310 },
683: {0}
684: };
685:
686: #ifdef BUILD_JSDOCS
687: static char* user_security_prop_desc[] = {
688:
689: "password"
690: ,"date password last modified (time_t format)"
691: ,"security level (0-99)"
692: ,"flag set #1 (bitfield)"
693: ,"flag set #2 (bitfield)"
694: ,"flag set #3 (bitfield)"
695: ,"flag set #4 (bitfield)"
696: ,"exemption flags (bitfield)"
697: ,"restriction flags (bitfield)"
698: ,"credits"
699: ,"free credits (for today only)"
700: ,"extra minutes (time bank)"
701: ,"extra minutes (for today only)"
702: ,"expiration date/time (time_t format)"
703: ,NULL
704: };
705: #endif
706:
707: #undef USER_PROP_FLAGS
708: #define USER_PROP_FLAGS JSPROP_ENUMERATE|JSPROP_READONLY
709:
710: /* user.limits: These should be READ ONLY by nature */
711: static jsSyncPropertySpec js_user_limits_properties[] = {
712: /* name ,tinyid ,flags, ver */
713:
714: { "time_per_logon" ,USER_PROP_TIMEPERCALL ,USER_PROP_FLAGS, 311 },
715: { "time_per_day" ,USER_PROP_TIMEPERDAY ,USER_PROP_FLAGS, 311 },
716: { "logons_per_day" ,USER_PROP_CALLSPERDAY ,USER_PROP_FLAGS, 311 },
717: { "lines_per_message" ,USER_PROP_LINESPERMSG ,USER_PROP_FLAGS, 311 },
718: { "email_per_day" ,USER_PROP_EMAILPERDAY ,USER_PROP_FLAGS, 311 },
719: { "posts_per_day" ,USER_PROP_POSTSPERDAY ,USER_PROP_FLAGS, 311 },
720: { "free_credits_per_day" ,USER_PROP_FREECDTPERDAY,USER_PROP_FLAGS, 311 },
721: {0}
722: };
723:
724:
725: #ifdef BUILD_JSDOCS
726: static char* user_limits_prop_desc[] = {
727:
728: "time (in minutes) per logon"
729: ,"time (in minutes) per day"
730: ,"logons per day"
731: ,"lines per message (post or email)"
732: ,"email sent per day"
733: ,"messages posted per day"
734: ,"free credits given per day"
735: ,NULL
736: };
737: #endif
738:
739:
740: #undef USER_PROP_FLAGS
741: #define USER_PROP_FLAGS JSPROP_ENUMERATE|JSPROP_READONLY
742:
743: /* user.stats: These should be READ ONLY by nature */
744: static jsSyncPropertySpec js_user_stats_properties[] = {
745: /* name ,tinyid ,flags, ver */
746:
747: { "laston_date" ,USER_PROP_LASTON ,USER_PROP_FLAGS, 310 },
748: { "firston_date" ,USER_PROP_FIRSTON ,USER_PROP_FLAGS, 310 },
749: { "total_logons" ,USER_PROP_LOGONS ,USER_PROP_FLAGS, 310 },
750: { "logons_today" ,USER_PROP_LTODAY ,USER_PROP_FLAGS, 310 },
751: { "total_timeon" ,USER_PROP_TIMEON ,USER_PROP_FLAGS, 310 },
752: { "timeon_today" ,USER_PROP_TTODAY ,USER_PROP_FLAGS, 310 },
753: { "timeon_last_logon" ,USER_PROP_TLAST ,USER_PROP_FLAGS, 310 },
754: { "total_posts" ,USER_PROP_POSTS ,USER_PROP_FLAGS, 310 },
755: { "total_emails" ,USER_PROP_EMAILS ,USER_PROP_FLAGS, 310 },
756: { "total_feedbacks" ,USER_PROP_FBACKS ,USER_PROP_FLAGS, 310 },
757: { "email_today" ,USER_PROP_ETODAY ,USER_PROP_FLAGS, 310 },
758: { "posts_today" ,USER_PROP_PTODAY ,USER_PROP_FLAGS, 310 },
759: { "bytes_uploaded" ,USER_PROP_ULB ,USER_PROP_FLAGS, 310 },
760: { "files_uploaded" ,USER_PROP_ULS ,USER_PROP_FLAGS, 310 },
761: { "bytes_downloaded" ,USER_PROP_DLB ,USER_PROP_FLAGS, 310 },
762: { "files_downloaded" ,USER_PROP_DLS ,USER_PROP_FLAGS, 310 },
763: { "leech_attempts" ,USER_PROP_LEECH ,USER_PROP_FLAGS, 310 },
764: { "mail_waiting" ,USER_PROP_MAIL_WAITING ,USER_PROP_FLAGS, 312 },
765: { "mail_pending" ,USER_PROP_MAIL_PENDING ,USER_PROP_FLAGS, 312 },
766: {0}
767: };
768:
769: #ifdef BUILD_JSDOCS
770: static char* user_stats_prop_desc[] = {
771:
772: "date of previous logon"
773: ,"date of first logon"
774: ,"total number of logons"
775: ,"total logons today"
776: ,"total time used (in minutes)"
777: ,"time used today"
778: ,"time used last session"
779: ,"total messages posted"
780: ,"total e-mails sent"
781: ,"total feedback messages sent"
782: ,"e-mail sent today"
783: ,"messages posted today"
784: ,"total bytes uploaded"
785: ,"total files uploaded"
786: ,"total bytes downloaded"
787: ,"total files downloaded"
788: ,"suspected leech downloads"
789: ,"number of e-mail messages currently waiting"
790: ,"number of e-mail messages sent, currently pending deletion"
791: ,NULL
792: };
793: #endif
794:
795:
796: static void js_user_finalize(JSContext *cx, JSObject *obj)
797: {
798: private_t* p;
799:
800: p=(private_t*)JS_GetPrivate(cx,obj);
801:
802: if(p!=NULL && (scfg_t*)p!=scfg)
803: free(p);
804:
805: p=NULL;
806: JS_SetPrivate(cx,obj,p);
807: }
808:
809: static JSBool
810: js_chk_ar(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
811: {
812: uchar* ar;
813: JSString* js_str;
814: private_t* p;
815:
816: if((p=(private_t*)JS_GetPrivate(cx,obj))==NULL)
817: return JS_FALSE;
818:
819: if((js_str=JS_ValueToString(cx, argv[0]))==NULL)
820: return JS_FALSE;
821:
822: ar = arstr(NULL,JS_GetStringBytes(js_str),p->cfg);
823:
824: js_getuserdat(p);
825:
826: *rval = BOOLEAN_TO_JSVAL(chk_ar(p->cfg,ar,&p->user));
827:
828: if(ar!=NULL && ar!=nular)
829: free(ar);
830:
831: return JS_TRUE;
832: }
833:
834: static JSBool
835: js_posted_msg(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
836: {
837: private_t* p;
838: int32 count=1;
839:
840: if((p=(private_t*)JS_GetPrivate(cx,obj))==NULL)
841: return JS_FALSE;
842:
843: if(argc)
844: JS_ValueToInt32(cx, argv[0], &count);
845:
846: js_getuserdat(p);
847:
848: *rval = BOOLEAN_TO_JSVAL(user_posted_msg(p->cfg, &p->user, count));
849:
850: return JS_TRUE;
851: }
852:
853: static JSBool
854: js_sent_email(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
855: {
856: private_t* p;
857: int32 count=1;
858: BOOL feedback=FALSE;
859:
860: if((p=(private_t*)JS_GetPrivate(cx,obj))==NULL)
861: return JS_FALSE;
862:
863: if(argc)
864: JS_ValueToInt32(cx, argv[0], &count);
865: if(argc>1)
866: JS_ValueToBoolean(cx, argv[1], &feedback);
867:
868: js_getuserdat(p);
869:
870: *rval = BOOLEAN_TO_JSVAL(user_sent_email(p->cfg, &p->user, count, feedback));
871:
872: return JS_TRUE;
873: }
874:
875: static JSBool
876: js_downloaded_file(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
877: {
878: private_t* p;
879: int32 files=1;
880: int32 bytes=0;
881:
882: if((p=(private_t*)JS_GetPrivate(cx,obj))==NULL)
883: return JS_FALSE;
884:
885: if(argc)
886: JS_ValueToInt32(cx, argv[0], &bytes);
887: if(argc>1)
888: JS_ValueToInt32(cx, argv[1], &files);
889:
890: js_getuserdat(p);
891:
892: *rval = BOOLEAN_TO_JSVAL(user_downloaded(p->cfg, &p->user, files, bytes));
893:
894: return JS_TRUE;
895: }
896:
897: static JSBool
898: js_uploaded_file(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
899: {
900: private_t* p;
901: int32 files=1;
902: int32 bytes=0;
903:
904: if((p=(private_t*)JS_GetPrivate(cx,obj))==NULL)
905: return JS_FALSE;
906:
907: if(argc)
908: JS_ValueToInt32(cx, argv[0], &bytes);
909: if(argc>1)
910: JS_ValueToInt32(cx, argv[1], &files);
911:
912: js_getuserdat(p);
913:
914: *rval = BOOLEAN_TO_JSVAL(user_uploaded(p->cfg, &p->user, files, bytes));
915:
916: return JS_TRUE;
917: }
918:
919: static JSBool
920: js_adjust_credits(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
921: {
922: private_t* p;
923: int32 count=0;
924:
925: if((p=(private_t*)JS_GetPrivate(cx,obj))==NULL)
926: return JS_FALSE;
927:
928: if(argc)
929: JS_ValueToInt32(cx, argv[0], &count);
930:
931: js_getuserdat(p);
932:
933: *rval = BOOLEAN_TO_JSVAL(user_adjust_credits(p->cfg, &p->user, count));
934:
935: return JS_TRUE;
936: }
937:
938: static JSBool
939: js_adjust_minutes(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
940: {
941: private_t* p;
942: int32 count=0;
943:
944: if((p=(private_t*)JS_GetPrivate(cx,obj))==NULL)
945: return JS_FALSE;
946:
947: if(argc)
948: JS_ValueToInt32(cx, argv[0], &count);
949:
950: js_getuserdat(p);
951:
952: *rval = BOOLEAN_TO_JSVAL(user_adjust_minutes(p->cfg, &p->user, count));
953:
954: return JS_TRUE;
955: }
956:
957: static jsSyncMethodSpec js_user_functions[] = {
958: {"compare_ars", js_chk_ar, 1, JSTYPE_BOOLEAN, JSDOCSTR("string ars")
959: ,JSDOCSTR("Verify user meets access requirements string")
960: ,310
961: },
962: {"adjust_credits", js_adjust_credits, 1, JSTYPE_BOOLEAN, JSDOCSTR("count")
963: ,JSDOCSTR("Adjust user's credits by <i>count</i> (negative to subtract)")
964: ,314
965: },
966: {"adjust_minutes", js_adjust_minutes, 1, JSTYPE_BOOLEAN, JSDOCSTR("count")
967: ,JSDOCSTR("Adjust user's extra minutes <i>count</i> (negative to subtract)")
968: ,314
969: },
970: {"posted_message", js_posted_msg, 1, JSTYPE_BOOLEAN, JSDOCSTR("[count]")
971: ,JSDOCSTR("Adjust user's posted-messages statistics by <i>count</i> (default: 1) (negative to subtract)")
972: ,314
973: },
974: {"sent_email", js_sent_email, 1, JSTYPE_BOOLEAN, JSDOCSTR("[count] [,bool feedback]")
975: ,JSDOCSTR("Adjust user's email/feedback-sent statistics by <i>count</i> (default: 1) (negative to subtract)")
976: ,314
977: },
978: {"uploaded_file", js_uploaded_file, 1, JSTYPE_BOOLEAN, JSDOCSTR("[bytes] [,files]")
979: ,JSDOCSTR("Adjust user's files/bytes-uploaded statistics")
980: ,314
981: },
982: {"downloaded_file", js_downloaded_file, 1, JSTYPE_BOOLEAN, JSDOCSTR("[bytes] [,files]")
983: ,JSDOCSTR("Adjust user's files/bytes-downloaded statistics")
984: ,314
985: },
986: {0}
987: };
988:
989: static JSClass js_user_class = {
990: "User" /* name */
991: ,JSCLASS_HAS_PRIVATE /* flags */
992: ,JS_PropertyStub /* addProperty */
993: ,JS_PropertyStub /* delProperty */
994: ,js_user_get /* getProperty */
995: ,js_user_set /* setProperty */
996: ,JS_EnumerateStub /* enumerate */
997: ,JS_ResolveStub /* resolve */
998: ,JS_ConvertStub /* convert */
999: ,js_user_finalize /* finalize */
1000: };
1001:
1002: static JSClass js_user_stats_class = {
1003: "UserStats" /* name */
1004: ,JSCLASS_HAS_PRIVATE /* flags */
1005: ,JS_PropertyStub /* addProperty */
1006: ,JS_PropertyStub /* delProperty */
1007: ,js_user_get /* getProperty */
1008: ,js_user_set /* setProperty */
1009: ,JS_EnumerateStub /* enumerate */
1010: ,JS_ResolveStub /* resolve */
1011: ,JS_ConvertStub /* convert */
1012: ,JS_FinalizeStub /* finalize */
1013: };
1014:
1015: static JSClass js_user_security_class = {
1016: "UserSecurity" /* name */
1017: ,JSCLASS_HAS_PRIVATE /* flags */
1018: ,JS_PropertyStub /* addProperty */
1019: ,JS_PropertyStub /* delProperty */
1020: ,js_user_get /* getProperty */
1021: ,js_user_set /* setProperty */
1022: ,JS_EnumerateStub /* enumerate */
1023: ,JS_ResolveStub /* resolve */
1024: ,JS_ConvertStub /* convert */
1025: ,JS_FinalizeStub /* finalize */
1026: };
1027:
1028: static JSClass js_user_limits_class = {
1029: "UserLimits" /* name */
1030: ,JSCLASS_HAS_PRIVATE /* flags */
1031: ,JS_PropertyStub /* addProperty */
1032: ,JS_PropertyStub /* delProperty */
1033: ,js_user_get /* getProperty */
1034: ,js_user_set /* setProperty */
1035: ,JS_EnumerateStub /* enumerate */
1036: ,JS_ResolveStub /* resolve */
1037: ,JS_ConvertStub /* convert */
1038: ,JS_FinalizeStub /* finalize */
1039: };
1040:
1041: /* User Constructor (creates instance of user class) */
1042:
1043: static JSBool
1044: js_user_constructor(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
1045: {
1046: int i;
1047: int32 val=0;
1048: user_t user;
1049: private_t* p;
1050: JSObject* statsobj;
1051: JSObject* securityobj;
1052: JSObject* limitsobj;
1053:
1054: JS_ValueToInt32(cx,argv[0],&val);
1055: user.number=(ushort)val;
1056: if(user.number!=0 && (i=getuserdat(scfg,&user))!=0) {
1057: JS_ReportError(cx,"Error %d reading user number %d",i,val);
1058: return(JS_FALSE);
1059: }
1060:
1061: /* user.stats */
1062: if((statsobj=JS_DefineObject(cx, obj, "stats"
1063: ,&js_user_stats_class, NULL, JSPROP_ENUMERATE|JSPROP_READONLY))==NULL)
1064: return(JS_FALSE);
1065:
1066: if(!js_DefineSyncProperties(cx, statsobj, js_user_stats_properties))
1067: return(JS_FALSE);
1068:
1069: /* user.security */
1070: if((securityobj=JS_DefineObject(cx, obj, "security"
1071: ,&js_user_security_class, NULL, JSPROP_ENUMERATE|JSPROP_READONLY))==NULL)
1072: return(JS_FALSE);
1073:
1074: if(!js_DefineSyncProperties(cx, securityobj, js_user_security_properties))
1075: return(JS_FALSE);
1076:
1077: /* user.limits */
1078: if((limitsobj=JS_DefineObject(cx, obj, "limits"
1079: ,&js_user_limits_class, NULL, JSPROP_ENUMERATE|JSPROP_READONLY))==NULL)
1080: return(JS_FALSE);
1081:
1082: if(!js_DefineSyncProperties(cx, limitsobj, js_user_limits_properties))
1083: return(JS_FALSE);
1084:
1085: /* other user properties */
1086: if(!js_DefineSyncProperties(cx, obj, js_user_properties))
1087: return(JS_FALSE);
1088:
1089: if((p=(private_t*)malloc(sizeof(private_t)))==NULL)
1090: return(JS_FALSE);
1091:
1092: p->cfg = scfg;
1093: p->user = user;
1094: p->cached = (user.number==0 ? FALSE : TRUE);
1095:
1096: JS_SetPrivate(cx, obj, p); /* Must do this before calling js_DefineSyncMethods() */
1097:
1098: if(!js_DefineSyncMethods(cx, obj, js_user_functions, FALSE)) {
1099: JS_SetPrivate(cx, obj, NULL);
1100: free(p);
1101: return(JS_FALSE);
1102: }
1103:
1104: JS_SetPrivate(cx, statsobj, p);
1105: JS_SetPrivate(cx, securityobj, p);
1106: JS_SetPrivate(cx, limitsobj, p);
1107:
1108: return(JS_TRUE);
1109: }
1110:
1111: JSObject* DLLCALL js_CreateUserClass(JSContext* cx, JSObject* parent, scfg_t* cfg)
1112: {
1113: JSObject* userclass;
1114:
1115: scfg = cfg;
1116: userclass = JS_InitClass(cx, parent, NULL
1117: ,&js_user_class
1118: ,js_user_constructor
1119: ,1 /* number of constructor args */
1120: ,NULL /* props, defined in constructor */
1121: ,NULL /* funcs, defined in constructor */
1122: ,NULL,NULL);
1123:
1124: return(userclass);
1125: }
1126:
1127: JSObject* DLLCALL js_CreateUserObject(JSContext* cx, JSObject* parent, scfg_t* cfg, char* name
1128: , uint usernumber)
1129: {
1130: JSObject* userobj;
1131: JSObject* statsobj;
1132: JSObject* limitsobj;
1133: JSObject* securityobj;
1134: private_t* p;
1135: jsval val;
1136:
1137: if(name==NULL)
1138: userobj = JS_NewObject(cx, &js_user_class, NULL, parent);
1139: else if(JS_GetProperty(cx,parent,name,&val) && val!=JSVAL_VOID)
1140: userobj = JSVAL_TO_OBJECT(val); /* Return existing user object */
1141: else
1142: userobj = JS_DefineObject(cx, parent, name, &js_user_class
1143: , NULL, JSPROP_ENUMERATE|JSPROP_READONLY);
1144: if(userobj==NULL)
1145: return(NULL);
1146:
1147: if((p=JS_GetPrivate(cx, userobj)) == NULL) /* Uses existing private pointer: Fix memory leak? */
1148: if((p=(private_t*)malloc(sizeof(private_t)))==NULL)
1149: return(NULL);
1150:
1151: p->cfg = cfg;
1152: p->user.number = usernumber;
1153: p->cached = FALSE;
1154:
1155: JS_SetPrivate(cx, userobj, p);
1156:
1157: if(!js_DefineSyncProperties(cx, userobj, js_user_properties)) {
1158: free(p);
1159: return(NULL);
1160: }
1161:
1162: #ifdef BUILD_JSDOCS
1163: js_DescribeSyncObject(cx,userobj
1164: ,"Instance of <i>User</i> class, representing current user online"
1165: ,310);
1166: js_DescribeSyncConstructor(cx,userobj
1167: ,"To create a new user object: <tt>var u = new User(<i>number</i>)</tt>");
1168: js_CreateArrayOfStrings(cx, userobj
1169: ,"_property_desc_list", user_prop_desc, JSPROP_READONLY);
1170: #endif
1171:
1172: js_DefineSyncMethods(cx, userobj, js_user_functions, FALSE);
1173:
1174: /* user.stats */
1175: statsobj = JS_DefineObject(cx, userobj, "stats"
1176: ,&js_user_stats_class, NULL, JSPROP_ENUMERATE|JSPROP_READONLY);
1177:
1178: if(statsobj==NULL) {
1179: free(p);
1180: return(NULL);
1181: }
1182:
1183: JS_SetPrivate(cx, statsobj, p);
1184:
1185: if(!js_DefineSyncProperties(cx, statsobj, js_user_stats_properties)) {
1186: free(p);
1187: return(NULL);
1188: }
1189:
1190: #ifdef BUILD_JSDOCS
1191: js_DescribeSyncObject(cx,statsobj,"User statistics (all <small>READ ONLY</small>)",310);
1192: js_CreateArrayOfStrings(cx, statsobj, "_property_desc_list", user_stats_prop_desc, JSPROP_READONLY);
1193: #endif
1194:
1195: /* user.limits */
1196: limitsobj = JS_DefineObject(cx, userobj, "limits"
1197: ,&js_user_limits_class, NULL, JSPROP_ENUMERATE|JSPROP_READONLY);
1198:
1199: if(limitsobj==NULL) {
1200: free(p);
1201: return(NULL);
1202: }
1203:
1204: JS_SetPrivate(cx, limitsobj, p);
1205:
1206: if(!js_DefineSyncProperties(cx, limitsobj, js_user_limits_properties)) {
1207: free(p);
1208: return(NULL);
1209: }
1210:
1211: #ifdef BUILD_JSDOCS
1212: js_DescribeSyncObject(cx,limitsobj,"User limitations based on security level (all <small>READ ONLY</small>)",311);
1213: js_CreateArrayOfStrings(cx, limitsobj, "_property_desc_list", user_limits_prop_desc, JSPROP_READONLY);
1214: #endif
1215:
1216:
1217: /* user.security */
1218: securityobj = JS_DefineObject(cx, userobj, "security"
1219: ,&js_user_security_class, NULL, JSPROP_ENUMERATE|JSPROP_READONLY);
1220:
1221: if(securityobj==NULL) {
1222: free(p);
1223: return(NULL);
1224: }
1225:
1226: JS_SetPrivate(cx, securityobj, p);
1227:
1228: if(!js_DefineSyncProperties(cx, securityobj, js_user_security_properties)) {
1229: free(p);
1230: return(NULL);
1231: }
1232:
1233: #ifdef BUILD_JSDOCS
1234: js_DescribeSyncObject(cx,securityobj,"User security settings",310);
1235: js_CreateArrayOfStrings(cx, securityobj, "_property_desc_list", user_security_prop_desc, JSPROP_READONLY);
1236: #endif
1237:
1238: return(userobj);
1239: }
1240:
1241: /****************************************************************************/
1242: /* Creates all the user-specific objects: user, msg_area, file_area */
1243: /****************************************************************************/
1244: JSBool DLLCALL
1245: js_CreateUserObjects(JSContext* cx, JSObject* parent, scfg_t* cfg, user_t* user
1246: ,char* html_index_file, subscan_t* subscan)
1247: {
1248: if(js_CreateUserObject(cx,parent,cfg,"user",user==NULL ? 0 : user->number)==NULL)
1249: return(JS_FALSE);
1250: if(js_CreateFileAreaObject(cx,parent,cfg,user,html_index_file)==NULL)
1251: return(JS_FALSE);
1252: if(js_CreateMsgAreaObject(cx,parent,cfg,user,subscan)==NULL)
1253: return(JS_FALSE);
1254: if(js_CreateXtrnAreaObject(cx,parent,cfg,user)==NULL)
1255: return(JS_FALSE);
1256:
1257: return(JS_TRUE);
1258: }
1259:
1260: #endif /* JAVSCRIPT */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.