|
|
1.1 root 1: /* js_system.c */
2:
3: /* Synchronet JavaScript "system" Object */
4:
5: /* $Id: js_system.c,v 1.96 2004/12/31 02:39:19 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 2004 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: /* System Object Properites */
43: enum {
44: SYS_PROP_NAME
45: ,SYS_PROP_OP
46: ,SYS_PROP_ID
47: ,SYS_PROP_MISC
48: ,SYS_PROP_PSNAME
49: ,SYS_PROP_PSNUM
50: ,SYS_PROP_INETADDR
51: ,SYS_PROP_LOCATION
52: ,SYS_PROP_TIMEZONE
53: ,SYS_PROP_PWDAYS
54: ,SYS_PROP_DELDAYS
55:
56: ,SYS_PROP_LASTUSER
57: ,SYS_PROP_LASTUSERON
58: ,SYS_PROP_FREEDISKSPACE
59: ,SYS_PROP_FREEDISKSPACEK
60:
61: ,SYS_PROP_NODES
62: ,SYS_PROP_LASTNODE
63:
64: ,SYS_PROP_NEW_PASS
65: ,SYS_PROP_NEW_MAGIC
66: ,SYS_PROP_NEW_LEVEL
67: ,SYS_PROP_NEW_FLAGS1
68: ,SYS_PROP_NEW_FLAGS2
69: ,SYS_PROP_NEW_FLAGS3
70: ,SYS_PROP_NEW_FLAGS4
71: ,SYS_PROP_NEW_REST
72: ,SYS_PROP_NEW_EXEMPT
73: ,SYS_PROP_NEW_CDT
74: ,SYS_PROP_NEW_MIN
75: ,SYS_PROP_NEW_SHELL
76: ,SYS_PROP_NEW_XEDIT
77: ,SYS_PROP_NEW_MISC
78: ,SYS_PROP_NEW_PROT
79: ,SYS_PROP_NEW_EXPIRE
80: ,SYS_PROP_NEW_UQ
81:
82: ,SYS_PROP_EXPIRED_LEVEL
83: ,SYS_PROP_EXPIRED_FLAGS1
84: ,SYS_PROP_EXPIRED_FLAGS2
85: ,SYS_PROP_EXPIRED_FLAGS3
86: ,SYS_PROP_EXPIRED_FLAGS4
87: ,SYS_PROP_EXPIRED_REST
88: ,SYS_PROP_EXPIRED_EXEMPT
89:
90: /* directories */
91: ,SYS_PROP_NODE_DIR
92: ,SYS_PROP_CTRL_DIR
93: ,SYS_PROP_DATA_DIR
94: ,SYS_PROP_TEXT_DIR
95: ,SYS_PROP_TEMP_DIR
96: ,SYS_PROP_EXEC_DIR
97: ,SYS_PROP_MODS_DIR
98: ,SYS_PROP_LOGS_DIR
99:
100: /* msclock() access */
101: ,SYS_PROP_CLOCK
102: ,SYS_PROP_CLOCK_PER_SEC
103:
104: /* filenames */
105: ,SYS_PROP_DEVNULL
106: ,SYS_PROP_TEMP_PATH
107:
108: /* last */
109: ,SYS_PROP_LOCAL_HOSTNAME
110: };
111:
112: static JSBool js_system_get(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
113: {
114: char str[128];
115: char* p=NULL;
116: jsint tiny;
117: JSString* js_str;
118: ulong val;
119: scfg_t* cfg;
120:
121: if((cfg=(scfg_t*)JS_GetPrivate(cx,obj))==NULL)
122: return(JS_FALSE);
123:
124: tiny = JSVAL_TO_INT(id);
125:
126: switch(tiny) {
127: case SYS_PROP_NAME:
128: p=cfg->sys_name;
129: break;
130: case SYS_PROP_OP:
131: p=cfg->sys_op;
132: break;
133: case SYS_PROP_ID:
134: p=cfg->sys_id;
135: break;
136: case SYS_PROP_MISC:
137: JS_NewNumberValue(cx,cfg->sys_misc,vp);
138: break;
139: case SYS_PROP_PSNAME:
140: p=cfg->sys_psname;
141: break;
142: case SYS_PROP_PSNUM:
143: *vp = INT_TO_JSVAL(cfg->sys_psnum);
144: break;
145: case SYS_PROP_INETADDR:
146: p=cfg->sys_inetaddr;
147: break;
148: case SYS_PROP_LOCATION:
149: p=cfg->sys_location;
150: break;
151: case SYS_PROP_TIMEZONE:
152: sys_timezone(cfg);
153: *vp = INT_TO_JSVAL(cfg->sys_timezone);
154: break;
155: case SYS_PROP_NODES:
156: *vp = INT_TO_JSVAL(cfg->sys_nodes);
157: break;
158: case SYS_PROP_LASTNODE:
159: *vp = INT_TO_JSVAL(cfg->sys_lastnode);
160: break;
161: case SYS_PROP_PWDAYS:
162: *vp = INT_TO_JSVAL(cfg->sys_pwdays);
163: break;
164: case SYS_PROP_DELDAYS:
165: *vp = INT_TO_JSVAL(cfg->sys_deldays);
166: break;
167: case SYS_PROP_LASTUSER:
168: *vp = INT_TO_JSVAL(lastuser(cfg));
169: break;
170: case SYS_PROP_LASTUSERON:
171: p=lastuseron;
172: break;
173: case SYS_PROP_FREEDISKSPACE:
174: case SYS_PROP_FREEDISKSPACEK:
175: if(tiny==SYS_PROP_FREEDISKSPACE)
176: val = getfreediskspace(cfg->temp_dir,0);
177: else
178: val = getfreediskspace(cfg->temp_dir,1024);
179: JS_NewNumberValue(cx,val,vp);
180: break;
181:
182: case SYS_PROP_NEW_PASS:
183: p=cfg->new_magic;
184: break;
185: case SYS_PROP_NEW_MAGIC:
186: p=cfg->new_pass;
187: break;
188: case SYS_PROP_NEW_LEVEL:
189: *vp = INT_TO_JSVAL(cfg->new_level);
190: break;
191: case SYS_PROP_NEW_FLAGS1:
192: *vp = INT_TO_JSVAL(cfg->new_flags1);
193: break;
194: case SYS_PROP_NEW_FLAGS2:
195: *vp = INT_TO_JSVAL(cfg->new_flags2);
196: break;
197: case SYS_PROP_NEW_FLAGS3:
198: *vp = INT_TO_JSVAL(cfg->new_flags3);
199: break;
200: case SYS_PROP_NEW_FLAGS4:
201: *vp = INT_TO_JSVAL(cfg->new_flags4);
202: break;
203: case SYS_PROP_NEW_REST:
204: *vp = INT_TO_JSVAL(cfg->new_rest);
205: break;
206: case SYS_PROP_NEW_EXEMPT:
207: *vp = INT_TO_JSVAL(cfg->new_exempt);
208: break;
209: case SYS_PROP_NEW_CDT:
210: JS_NewNumberValue(cx,cfg->new_cdt,vp);
211: break;
212: case SYS_PROP_NEW_MIN:
213: JS_NewNumberValue(cx,cfg->new_min,vp);
214: break;
215: case SYS_PROP_NEW_SHELL:
216: *vp = INT_TO_JSVAL(cfg->new_shell);
217: break;
218: case SYS_PROP_NEW_XEDIT:
219: p=cfg->new_xedit;
220: break;
221: case SYS_PROP_NEW_MISC:
222: JS_NewNumberValue(cx,cfg->new_misc,vp);
223: break;
224: case SYS_PROP_NEW_PROT:
225: sprintf(str,"%c",cfg->new_prot);
226: p=str;
227: break;
228: case SYS_PROP_NEW_EXPIRE:
229: JS_NewNumberValue(cx,cfg->new_expire,vp);
230: break;
231: case SYS_PROP_NEW_UQ:
232: JS_NewNumberValue(cx,cfg->uq,vp);
233: break;
234:
235: case SYS_PROP_EXPIRED_LEVEL:
236: *vp = INT_TO_JSVAL(cfg->expired_level);
237: break;
238: case SYS_PROP_EXPIRED_FLAGS1:
239: *vp = INT_TO_JSVAL(cfg->expired_flags1);
240: break;
241: case SYS_PROP_EXPIRED_FLAGS2:
242: *vp = INT_TO_JSVAL(cfg->expired_flags2);
243: break;
244: case SYS_PROP_EXPIRED_FLAGS3:
245: *vp = INT_TO_JSVAL(cfg->expired_flags3);
246: break;
247: case SYS_PROP_EXPIRED_FLAGS4:
248: *vp = INT_TO_JSVAL(cfg->expired_flags4);
249: break;
250: case SYS_PROP_EXPIRED_REST:
251: *vp = INT_TO_JSVAL(cfg->expired_rest);
252: break;
253: case SYS_PROP_EXPIRED_EXEMPT:
254: *vp = INT_TO_JSVAL(cfg->expired_exempt);
255: break;
256: case SYS_PROP_NODE_DIR:
257: p=cfg->node_dir;
258: break;
259: case SYS_PROP_CTRL_DIR:
260: p=cfg->ctrl_dir;
261: break;
262: case SYS_PROP_DATA_DIR:
263: p=cfg->data_dir;
264: break;
265: case SYS_PROP_TEXT_DIR:
266: p=cfg->text_dir;
267: break;
268: case SYS_PROP_TEMP_DIR:
269: p=cfg->temp_dir;
270: break;
271: case SYS_PROP_EXEC_DIR:
272: p=cfg->exec_dir;
273: break;
274: case SYS_PROP_MODS_DIR:
275: p=cfg->mods_dir;
276: break;
277: case SYS_PROP_LOGS_DIR:
278: p=cfg->logs_dir;
279: break;
280:
281: case SYS_PROP_DEVNULL:
282: p=_PATH_DEVNULL;
283: break;
284: case SYS_PROP_TEMP_PATH:
285: p=_PATH_TMP;
286: break;
287:
288: case SYS_PROP_CLOCK:
289: JS_NewNumberValue(cx,msclock(),vp);
290: break;
291: case SYS_PROP_CLOCK_PER_SEC:
292: JS_NewNumberValue(cx,MSCLOCKS_PER_SEC,vp);
293: break;
294:
295: case SYS_PROP_LOCAL_HOSTNAME:
296: gethostname(str,sizeof(str));
297: p=str;
298: break;
299: }
300:
301: if(p!=NULL) { /* string property */
302: if((js_str=JS_NewStringCopyZ(cx, p))==NULL)
303: return(JS_FALSE);
304: *vp = STRING_TO_JSVAL(js_str);
305: }
306:
307: return(JS_TRUE);
308: }
309:
310: static JSBool js_system_set(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
311: {
312: jsint tiny;
313: scfg_t* cfg;
314:
315: if((cfg=(scfg_t*)JS_GetPrivate(cx,obj))==NULL)
316: return(JS_FALSE);
317:
318: tiny = JSVAL_TO_INT(id);
319:
320: switch(tiny) {
321: case SYS_PROP_MISC:
322: JS_ValueToInt32(cx, *vp, (int32*)&cfg->sys_misc);
323: break;
324: }
325:
326: return(TRUE);
327: }
328:
329:
330: #define SYSOBJ_FLAGS JSPROP_ENUMERATE|JSPROP_READONLY
331:
332: static jsSyncPropertySpec js_system_properties[] = {
333: /* name, tinyid, flags, ver */
334:
335: { "name", SYS_PROP_NAME, SYSOBJ_FLAGS, 310 },
336: { "operator", SYS_PROP_OP, SYSOBJ_FLAGS, 310 },
337: { "qwk_id", SYS_PROP_ID, SYSOBJ_FLAGS, 310 },
338: { "settings", SYS_PROP_MISC, JSPROP_ENUMERATE, 310 },
339: { "psname", SYS_PROP_PSNAME, SYSOBJ_FLAGS, 310 },
340: { "psnum", SYS_PROP_PSNUM, SYSOBJ_FLAGS, 310 },
341: { "inetaddr", SYS_PROP_INETADDR, JSPROP_READONLY, 310 }, /* alias */
342: { "inet_addr", SYS_PROP_INETADDR, SYSOBJ_FLAGS, 311 },
343: { "location", SYS_PROP_LOCATION, SYSOBJ_FLAGS, 310 },
344: { "timezone", SYS_PROP_TIMEZONE, SYSOBJ_FLAGS, 310 },
345: { "pwdays", SYS_PROP_PWDAYS, SYSOBJ_FLAGS, 310 },
346: { "deldays", SYS_PROP_DELDAYS, SYSOBJ_FLAGS, 310 },
347:
348: { "lastuser", SYS_PROP_LASTUSER ,SYSOBJ_FLAGS, 311 },
349: { "lastuseron", SYS_PROP_LASTUSERON ,SYSOBJ_FLAGS, 310 },
350: { "freediskspace", SYS_PROP_FREEDISKSPACE ,SYSOBJ_FLAGS, 310 },
351: { "freediskspacek", SYS_PROP_FREEDISKSPACEK ,SYSOBJ_FLAGS, 310 },
352:
353: { "nodes", SYS_PROP_NODES, SYSOBJ_FLAGS, 310 },
354: { "lastnode", SYS_PROP_LASTNODE, SYSOBJ_FLAGS, 310 },
355:
356: { "newuser_password", SYS_PROP_NEW_PASS ,SYSOBJ_FLAGS, 310 },
357: { "newuser_magic_word", SYS_PROP_NEW_MAGIC ,SYSOBJ_FLAGS, 310 },
358: { "newuser_level", SYS_PROP_NEW_LEVEL ,SYSOBJ_FLAGS, 310 },
359: { "newuser_flags1", SYS_PROP_NEW_FLAGS1 ,SYSOBJ_FLAGS, 310 },
360: { "newuser_flags2", SYS_PROP_NEW_FLAGS2 ,SYSOBJ_FLAGS, 310 },
361: { "newuser_flags3", SYS_PROP_NEW_FLAGS3 ,SYSOBJ_FLAGS, 310 },
362: { "newuser_flags4", SYS_PROP_NEW_FLAGS4 ,SYSOBJ_FLAGS, 310 },
363: { "newuser_restrictions", SYS_PROP_NEW_REST ,SYSOBJ_FLAGS, 310 },
364: { "newuser_exemptions", SYS_PROP_NEW_EXEMPT ,SYSOBJ_FLAGS, 310 },
365: { "newuser_credits", SYS_PROP_NEW_CDT ,SYSOBJ_FLAGS, 310 },
366: { "newuser_minutes", SYS_PROP_NEW_MIN ,SYSOBJ_FLAGS, 310 },
367: { "newuser_command_shell", SYS_PROP_NEW_SHELL ,SYSOBJ_FLAGS, 310 },
368: { "newuser_editor", SYS_PROP_NEW_XEDIT ,SYSOBJ_FLAGS, 310 },
369: { "newuser_settings", SYS_PROP_NEW_MISC ,SYSOBJ_FLAGS, 310 },
370: { "newuser_download_protocol",SYS_PROP_NEW_PROT ,SYSOBJ_FLAGS, 310 },
371: { "newuser_expiration_days", SYS_PROP_NEW_EXPIRE ,SYSOBJ_FLAGS, 310 },
372: { "newuser_questions", SYS_PROP_NEW_UQ ,SYSOBJ_FLAGS, 310 },
373:
374: { "expired_level", SYS_PROP_EXPIRED_LEVEL ,SYSOBJ_FLAGS, 310 },
375: { "expired_flags1", SYS_PROP_EXPIRED_FLAGS1 ,SYSOBJ_FLAGS, 310 },
376: { "expired_flags2", SYS_PROP_EXPIRED_FLAGS2 ,SYSOBJ_FLAGS, 310 },
377: { "expired_flags3", SYS_PROP_EXPIRED_FLAGS3 ,SYSOBJ_FLAGS, 310 },
378: { "expired_flags4", SYS_PROP_EXPIRED_FLAGS4 ,SYSOBJ_FLAGS, 310 },
379: { "expired_restrictions", SYS_PROP_EXPIRED_REST ,SYSOBJ_FLAGS, 310 },
380: { "expired_exemptions", SYS_PROP_EXPIRED_EXEMPT ,SYSOBJ_FLAGS, 310 },
381:
382: /* directories */
383: { "node_dir", SYS_PROP_NODE_DIR ,SYSOBJ_FLAGS, 310 },
384: { "ctrl_dir", SYS_PROP_CTRL_DIR ,SYSOBJ_FLAGS, 310 },
385: { "data_dir", SYS_PROP_DATA_DIR ,SYSOBJ_FLAGS, 310 },
386: { "text_dir", SYS_PROP_TEXT_DIR ,SYSOBJ_FLAGS, 310 },
387: { "temp_dir", SYS_PROP_TEMP_DIR ,SYSOBJ_FLAGS, 310 },
388: { "exec_dir", SYS_PROP_EXEC_DIR ,SYSOBJ_FLAGS, 310 },
389: { "mods_dir", SYS_PROP_MODS_DIR ,SYSOBJ_FLAGS, 310 },
390: { "logs_dir", SYS_PROP_LOGS_DIR ,SYSOBJ_FLAGS, 310 },
391:
392: /* filenames */
393: { "devnull", SYS_PROP_DEVNULL ,SYSOBJ_FLAGS, 311 },
394: { "temp_path", SYS_PROP_TEMP_PATH ,SYSOBJ_FLAGS, 312 },
395:
396: /* clock access */
397: { "clock_ticks", SYS_PROP_CLOCK ,SYSOBJ_FLAGS, 311 },
398: { "clock_ticks_per_second", SYS_PROP_CLOCK_PER_SEC ,SYSOBJ_FLAGS, 311 },
399:
400: /* last */
401: { "local_host_name", SYS_PROP_LOCAL_HOSTNAME ,SYSOBJ_FLAGS, 311 },
402: {0}
403: };
404:
405: #ifdef _DEBUG
406: static char* sys_prop_desc[] = {
407: "BBS name"
408: ,"operator name"
409: ,"system QWK-ID (for QWK packets)"
410: ,"settings bitfield (see <tt>SS_*</tt> in <tt>sbbsdefs.js</tt> for bit definitions)"
411: ,"PostLink name"
412: ,"PostLink system number"
413: ,"Internet address (host or domain name)"
414: ,"location (city, state)"
415: ,"timezone (use <i>system.zonestr()</i> to get string representation)"
416: ,"days between forced password changes"
417: ,"days to preserve deleted user records"
418:
419: ,"last user record number in user database (includes deleted and inactive user records)"
420: ,"name of last user to logoff"
421: ,"amount of free disk space (in bytes)"
422: ,"amount of free disk space (in kilobytes)"
423:
424: ,"total number of BBS nodes"
425: ,"last displayable node number"
426:
427: ,"new user password"
428: ,"new user magic word"
429: ,"new user level"
430: ,"new user flag set #1"
431: ,"new user flag set #2"
432: ,"new user flag set #3"
433: ,"new user flag set #4"
434: ,"new user restriction flags"
435: ,"new user exemption flags"
436: ,"new user credits"
437: ,"new user extra minutes"
438: ,"new user command shell"
439: ,"new user external editor"
440: ,"new user settings"
441: ,"new user file transfer protocol (command key)"
442: ,"new user expiration days"
443: ,"new user questions bitfield (see <tt>UQ_*</tt> in <tt>sbbsdefs.js</tt> for bit definitions)"
444:
445: ,"expired user level"
446: ,"expired user flag set #1"
447: ,"expired user flag set #2"
448: ,"expired user flag set #3"
449: ,"expired user flag set #4"
450: ,"expired user restriction flags"
451: ,"expired user exemption flags"
452:
453: /* directories */
454: ,"node directory"
455: ,"control file directory"
456: ,"data file directory"
457: ,"text file directory"
458: ,"temporary file directory"
459: ,"executable file directory"
460: ,"modified modules directory (optional)"
461: ,"log file directory"
462:
463: /* filenames */
464: ,"platform-specific \"null\" device filename"
465: ,"platform-specific temporary file directory"
466:
467: /* clock */
468: ,"amount of elapsed processor time in clock 'ticks'"
469: ,"number of clock ticks per second"
470:
471: /* INSERT new tabled properties here */
472: ,"private host name that uniquely identifies this system on the local network"
473:
474: /* Manually created (non-tabled) properties */
475: ,"public host name that uniquely identifies this system on the Internet (usually the same as <i>system.inetaddr</i>)"
476: ,"Synchronet version number (e.g. '3.10')"
477: ,"Synchronet revision letter (e.g. 'k')"
478: ,"Synchronet alpha/beta designation (e.g. ' beta')"
479: ,"Synchronet full version information (e.g. '3.10k Beta Debug')"
480: ,"Synchronet version notice (includes version and platform)"
481: ,"platform description (e.g. 'Win32', 'Linux', 'FreeBSD')"
482: ,"socket library version information"
483: ,"message base library version information"
484: ,"compiler used to build Synchronet"
485: ,"date and time compiled"
486: ,"Synchronet copyright display"
487: ,"JavaScript engine version information"
488: ,"operating system version information"
489: ,"time/date system was brought online (in time_t format)"
490:
491: ,"array of FidoNet Technology Network (FTN) addresses associated with this system"
492: ,NULL
493: };
494: #endif
495:
496:
497: static JSClass js_system_class = {
498: "System" /* name */
499: ,JSCLASS_HAS_PRIVATE /* flags */
500: ,JS_PropertyStub /* addProperty */
501: ,JS_PropertyStub /* delProperty */
502: ,js_system_get /* getProperty */
503: ,js_system_set /* setProperty */
504: ,JS_EnumerateStub /* enumerate */
505: ,JS_ResolveStub /* resolve */
506: ,JS_ConvertStub /* convert */
507: ,JS_FinalizeStub /* finalize */
508: };
509:
510: /* System Stats Propertiess */
511: enum {
512: SYSSTAT_PROP_LOGONS
513: ,SYSSTAT_PROP_LTODAY
514: ,SYSSTAT_PROP_TIMEON
515: ,SYSSTAT_PROP_TTODAY
516: ,SYSSTAT_PROP_ULS
517: ,SYSSTAT_PROP_ULB
518: ,SYSSTAT_PROP_DLS
519: ,SYSSTAT_PROP_DLB
520: ,SYSSTAT_PROP_PTODAY
521: ,SYSSTAT_PROP_ETODAY
522: ,SYSSTAT_PROP_FTODAY
523: ,SYSSTAT_PROP_NUSERS
524:
525: ,SYSSTAT_PROP_TOTALUSERS
526: ,SYSSTAT_PROP_TOTALFILES
527: ,SYSSTAT_PROP_TOTALMSGS
528: ,SYSSTAT_PROP_TOTALMAIL
529: ,SYSSTAT_PROP_FEEDBACK
530: };
531:
532: static JSBool js_sysstats_get(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
533: {
534: jsint tiny;
535: scfg_t* cfg;
536: stats_t stats;
537: uint i;
538: ulong l;
539:
540: if((cfg=(scfg_t*)JS_GetPrivate(cx,obj))==NULL)
541: return(JS_FALSE);
542:
543: tiny = JSVAL_TO_INT(id);
544:
545: if(!getstats(cfg, 0, &stats))
546: return(FALSE);
547:
548: switch(tiny) {
549: case SYSSTAT_PROP_LOGONS:
550: JS_NewNumberValue(cx,stats.logons,vp);
551: break;
552: case SYSSTAT_PROP_LTODAY:
553: JS_NewNumberValue(cx,stats.ltoday,vp);
554: break;
555: case SYSSTAT_PROP_TIMEON:
556: JS_NewNumberValue(cx,stats.timeon,vp);
557: break;
558: case SYSSTAT_PROP_TTODAY:
559: JS_NewNumberValue(cx,stats.ttoday,vp);
560: break;
561: case SYSSTAT_PROP_ULS:
562: JS_NewNumberValue(cx,stats.uls,vp);
563: break;
564: case SYSSTAT_PROP_ULB:
565: JS_NewNumberValue(cx,stats.ulb,vp);
566: break;
567: case SYSSTAT_PROP_DLS:
568: JS_NewNumberValue(cx,stats.dls,vp);
569: break;
570: case SYSSTAT_PROP_DLB:
571: JS_NewNumberValue(cx,stats.dlb,vp);
572: break;
573: case SYSSTAT_PROP_PTODAY:
574: JS_NewNumberValue(cx,stats.ptoday,vp);
575: break;
576: case SYSSTAT_PROP_ETODAY:
577: JS_NewNumberValue(cx,stats.etoday,vp);
578: break;
579: case SYSSTAT_PROP_FTODAY:
580: JS_NewNumberValue(cx,stats.ftoday,vp);
581: break;
582: case SYSSTAT_PROP_NUSERS:
583: JS_NewNumberValue(cx,stats.nusers,vp);
584: break;
585:
586: case SYSSTAT_PROP_TOTALUSERS:
587: *vp = INT_TO_JSVAL(total_users(cfg));
588: break;
589: case SYSSTAT_PROP_TOTALMSGS:
590: l=0;
591: for(i=0;i<cfg->total_subs;i++)
592: l+=getposts(cfg,i);
593: JS_NewNumberValue(cx,l,vp);
594: break;
595: case SYSSTAT_PROP_TOTALFILES:
596: l=0;
597: for(i=0;i<cfg->total_dirs;i++)
598: l+=getfiles(cfg,i);
599: JS_NewNumberValue(cx,l,vp);
600: break;
601: case SYSSTAT_PROP_TOTALMAIL:
602: *vp = INT_TO_JSVAL(getmail(cfg, 0,0));
603: break;
604: case SYSSTAT_PROP_FEEDBACK:
605: *vp = INT_TO_JSVAL(getmail(cfg, 1,0));
606: break;
607: }
608:
609: return(TRUE);
610: }
611:
612: #define SYSSTAT_FLAGS JSPROP_ENUMERATE|JSPROP_READONLY
613:
614: static jsSyncPropertySpec js_sysstats_properties[] = {
615: /* name, tinyid, flags, ver */
616:
617: { "total_logons", SYSSTAT_PROP_LOGONS, SYSSTAT_FLAGS, 310 },
618: { "logons_today", SYSSTAT_PROP_LTODAY, SYSSTAT_FLAGS, 310 },
619: { "total_timeon", SYSSTAT_PROP_TIMEON, SYSSTAT_FLAGS, 310 },
620: { "timeon_today", SYSSTAT_PROP_TTODAY, SYSSTAT_FLAGS, 310 },
621: { "total_files", SYSSTAT_PROP_TOTALFILES, SYSSTAT_FLAGS, 310 },
622: { "files_uploaded_today", SYSSTAT_PROP_ULS, SYSSTAT_FLAGS, 310 },
623: { "bytes_uploaded_today", SYSSTAT_PROP_ULB, SYSSTAT_FLAGS, 310 },
624: { "files_downloaded_today", SYSSTAT_PROP_DLS, SYSSTAT_FLAGS, 310 },
625: { "bytes_downloaded_today", SYSSTAT_PROP_DLB, SYSSTAT_FLAGS, 310 },
626: { "total_messages", SYSSTAT_PROP_TOTALMSGS, SYSSTAT_FLAGS, 310 },
627: { "messages_posted_today", SYSSTAT_PROP_PTODAY, SYSSTAT_FLAGS, 310 },
628: { "total_email", SYSSTAT_PROP_TOTALMAIL, SYSSTAT_FLAGS, 310 },
629: { "email_sent_today", SYSSTAT_PROP_ETODAY, SYSSTAT_FLAGS, 310 },
630: { "total_feedback", SYSSTAT_PROP_FEEDBACK, SYSSTAT_FLAGS, 310 },
631: { "feedback_sent_today", SYSSTAT_PROP_FTODAY, SYSSTAT_FLAGS, 310 },
632: { "total_users", SYSSTAT_PROP_TOTALUSERS, SYSSTAT_FLAGS, 310 },
633: { "new_users_today", SYSSTAT_PROP_NUSERS, SYSSTAT_FLAGS, 310 },
634: {0}
635: };
636:
637: #ifdef _DEBUG
638: static char* sysstat_prop_desc[] = {
639: "total logons"
640: ,"logons today"
641: ,"total time used"
642: ,"time used today"
643: ,"total files in file bases"
644: ,"files uploaded today"
645: ,"bytes uploaded today"
646: ,"files downloaded today"
647: ,"bytes downloaded today"
648: ,"total messages in message bases"
649: ,"messages posted today"
650: ,"total messages in mail base"
651: ,"email sent today"
652: ,"total feedback messages waiting"
653: ,"feedback sent today"
654: ,"total user records (does not include deleted or inactive user records)"
655: ,"new users today"
656: ,NULL
657: };
658: #endif
659:
660:
661: static JSClass js_sysstats_class = {
662: "Stats" /* name */
663: ,JSCLASS_HAS_PRIVATE /* flags */
664: ,JS_PropertyStub /* addProperty */
665: ,JS_PropertyStub /* delProperty */
666: ,js_sysstats_get /* getProperty */
667: ,JS_PropertyStub /* setProperty */
668: ,JS_EnumerateStub /* enumerate */
669: ,JS_ResolveStub /* resolve */
670: ,JS_ConvertStub /* convert */
671: ,JS_FinalizeStub /* finalize */
672: };
673:
674: static JSBool
675: js_alias(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
676: {
677: char* p;
678: char buf[128];
679: JSString* js_str;
680: scfg_t* cfg;
681:
682: if((cfg=(scfg_t*)JS_GetPrivate(cx,obj))==NULL)
683: return(JS_FALSE);
684:
685: if((js_str=JS_ValueToString(cx, argv[0]))==NULL) {
686: *rval = INT_TO_JSVAL(0);
687: return(JS_TRUE);
688: }
689:
690: if((p=JS_GetStringBytes(js_str))==NULL) {
691: *rval = INT_TO_JSVAL(0);
692: return(JS_TRUE);
693: }
694:
695: p=alias(cfg,p,buf);
696:
697: if((js_str = JS_NewStringCopyZ(cx, p))==NULL)
698: return(JS_FALSE);
699:
700: *rval = STRING_TO_JSVAL(js_str);
701: return(JS_TRUE);
702: }
703:
704: static JSBool
705: js_username(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
706: {
707: int32 val;
708: char buf[128];
709: JSString* js_str;
710: scfg_t* cfg;
711:
712: if((cfg=(scfg_t*)JS_GetPrivate(cx,obj))==NULL)
713: return(JS_FALSE);
714:
715: val=0;
716: JS_ValueToInt32(cx,argv[0],&val);
717:
718: if((js_str = JS_NewStringCopyZ(cx, username(cfg,val,buf)))==NULL)
719: return(JS_FALSE);
720:
721: *rval = STRING_TO_JSVAL(js_str);
722: return(JS_TRUE);
723: }
724:
725:
726: static JSBool
727: js_matchuser(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
728: {
729: char* p;
730: JSString* js_str;
731: scfg_t* cfg;
732: BOOL sysop_alias=TRUE;
733:
734: if((cfg=(scfg_t*)JS_GetPrivate(cx,obj))==NULL)
735: return(JS_FALSE);
736:
737: if((js_str=JS_ValueToString(cx, argv[0]))==NULL) {
738: *rval = INT_TO_JSVAL(0);
739: return(JS_TRUE);
740: }
741:
742: if(argc>1)
743: JS_ValueToBoolean(cx,argv[1],&sysop_alias);
744:
745: if((p=JS_GetStringBytes(js_str))==NULL) {
746: *rval = INT_TO_JSVAL(0);
747: return(JS_TRUE);
748: }
749:
750: *rval = INT_TO_JSVAL(matchuser(cfg,p,sysop_alias));
751: return(JS_TRUE);
752: }
753:
754: static JSBool
755: js_matchuserdata(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
756: {
757: char* p;
758: JSString* js_str;
759: int32 offset=0;
760: int32 usernumber=0;
761: int len;
762: scfg_t* cfg;
763:
764: if((cfg=(scfg_t*)JS_GetPrivate(cx,obj))==NULL)
765: return(JS_FALSE);
766:
767: JS_ValueToInt32(cx,argv[0],&offset);
768: if((len=user_rec_len(offset))<0)
769: return(JS_FALSE);
770:
771: if((js_str=JS_ValueToString(cx, argv[1]))==NULL) {
772: *rval = INT_TO_JSVAL(0);
773: return(JS_TRUE);
774: }
775:
776: if(argc>2)
777: JS_ValueToInt32(cx,argv[2],&usernumber);
778:
779: if((p=JS_GetStringBytes(js_str))==NULL) {
780: *rval = INT_TO_JSVAL(0);
781: return(JS_TRUE);
782: }
783:
784: *rval = INT_TO_JSVAL(userdatdupe(cfg,usernumber,offset,len,p,FALSE /* deleted users */));
785: return(JS_TRUE);
786: }
787:
788: static JSBool
789: js_trashcan(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
790: {
791: char* str;
792: char* can;
793: JSString* js_str;
794: JSString* js_can;
795: scfg_t* cfg;
796:
797: if((cfg=(scfg_t*)JS_GetPrivate(cx,obj))==NULL)
798: return(JS_FALSE);
799:
800: if((js_can=JS_ValueToString(cx, argv[0]))==NULL) {
801: *rval = BOOLEAN_TO_JSVAL(JS_FALSE);
802: return(JS_TRUE);
803: }
804:
805: if((js_str=JS_ValueToString(cx, argv[1]))==NULL) {
806: *rval = BOOLEAN_TO_JSVAL(JS_FALSE);
807: return(JS_TRUE);
808: }
809:
810: if((can=JS_GetStringBytes(js_can))==NULL) {
811: *rval = BOOLEAN_TO_JSVAL(JS_FALSE);
812: return(JS_TRUE);
813: }
814:
815: if((str=JS_GetStringBytes(js_str))==NULL) {
816: *rval = BOOLEAN_TO_JSVAL(JS_FALSE);
817: return(JS_TRUE);
818: }
819:
820: *rval = BOOLEAN_TO_JSVAL(trashcan(cfg,str,can)); // user args are reversed
821: return(JS_TRUE);
822: }
823:
824: static JSBool
825: js_findstr(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
826: {
827: char* str;
828: char* fname;
829: JSString* js_str;
830: JSString* js_fname;
831:
832: if((js_fname=JS_ValueToString(cx, argv[0]))==NULL) {
833: *rval = BOOLEAN_TO_JSVAL(JS_FALSE);
834: return(JS_TRUE);
835: }
836:
837: if((js_str=JS_ValueToString(cx, argv[1]))==NULL) {
838: *rval = BOOLEAN_TO_JSVAL(JS_FALSE);
839: return(JS_TRUE);
840: }
841:
842: if((fname=JS_GetStringBytes(js_fname))==NULL) {
843: *rval = BOOLEAN_TO_JSVAL(JS_FALSE);
844: return(JS_TRUE);
845: }
846:
847: if((str=JS_GetStringBytes(js_str))==NULL) {
848: *rval = BOOLEAN_TO_JSVAL(JS_FALSE);
849: return(JS_TRUE);
850: }
851:
852: *rval = BOOLEAN_TO_JSVAL(findstr(str,fname)); // user args are reversed
853: return(JS_TRUE);
854: }
855:
856:
857: static JSBool
858: js_zonestr(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
859: {
860: JSString* js_str;
861: short zone;
862: int32 val=0;
863: scfg_t* cfg;
864:
865: if((cfg=(scfg_t*)JS_GetPrivate(cx,obj))==NULL)
866: return(JS_FALSE);
867:
868: if(argc<1)
869: zone=sys_timezone(cfg);
870: else {
871: JS_ValueToInt32(cx,argv[0],&val);
872: zone=(short)val;
873: }
874:
875: if((js_str = JS_NewStringCopyZ(cx, smb_zonestr(zone,NULL)))==NULL)
876: return(JS_FALSE);
877:
878: *rval = STRING_TO_JSVAL(js_str);
879: return(JS_TRUE);
880: }
881:
882: // Returns a ctime()-like string in the system-preferred time format
883: static JSBool
884: js_timestr(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
885: {
886: char str[128];
887: int32 i=0;
888: time_t t;
889: JSString* js_str;
890: scfg_t* cfg;
891:
892: if((cfg=(scfg_t*)JS_GetPrivate(cx,obj))==NULL)
893: return(JS_FALSE);
894:
895: if(argc<1)
896: i=time(NULL); /* use current time */
897: else
898: JS_ValueToInt32(cx,argv[0],&i);
899: t=i;
900: timestr(cfg,&t,str);
901: if((js_str = JS_NewStringCopyZ(cx, str))==NULL)
902: return(JS_FALSE);
903:
904: *rval = STRING_TO_JSVAL(js_str);
905: return(JS_TRUE);
906: }
907:
908:
909: // Returns a mm/dd/yy or dd/mm/yy formated string
910: static JSBool
911: js_datestr(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
912: {
913: char str[128];
914: time_t t;
915: JSString* js_str;
916: scfg_t* cfg;
917:
918: if((cfg=(scfg_t*)JS_GetPrivate(cx,obj))==NULL)
919: return(JS_FALSE);
920:
921: if(argc<1)
922: t=time(NULL); /* use current time */
923: else {
924: if(JSVAL_IS_STRING(argv[0])) { /* convert from string to time_t? */
925: *rval = INT_TO_JSVAL(
926: dstrtounix(cfg,JS_GetStringBytes(JS_ValueToString(cx, argv[0]))));
927: return(JS_TRUE);
928: }
929: JS_ValueToInt32(cx,argv[0],(int32*)&t);
930: }
931: unixtodstr(cfg,t,str);
932: if((js_str = JS_NewStringCopyZ(cx, str))==NULL)
933: return(JS_FALSE);
934:
935: *rval = STRING_TO_JSVAL(js_str);
936: return(JS_TRUE);
937: }
938:
939: static JSBool
940: js_secondstr(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
941: {
942: char str[128];
943: int32 t=0;
944: JSString* js_str;
945:
946: *rval = JSVAL_NULL;
947:
948: if(argc<1)
949: return(JS_TRUE);
950:
951: JS_ValueToInt32(cx,argv[0],&t);
952: sectostr(t,str);
953: if((js_str = JS_NewStringCopyZ(cx, str))==NULL)
954: return(JS_FALSE);
955:
956: *rval = STRING_TO_JSVAL(js_str);
957: return(JS_TRUE);
958: }
959:
960: static JSBool
961: js_spamlog(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
962: {
963: uintN i;
964: char* p;
965: char* prot=NULL;
966: char* action=NULL;
967: char* reason=NULL;
968: char* host=NULL;
969: char* ip_addr=NULL;
970: char* to=NULL;
971: char* from=NULL;
972: scfg_t* cfg;
973:
974: if((cfg=(scfg_t*)JS_GetPrivate(cx,obj))==NULL)
975: return(JS_FALSE);
976:
977: for(i=0;i<argc;i++) {
978: if(!JSVAL_IS_STRING(argv[i]))
979: continue;
980: p=JS_GetStringBytes(JS_ValueToString(cx, argv[i]));
981: if(p==NULL)
982: continue;
983: if(prot==NULL)
984: prot=p;
985: else if(action==NULL)
986: action=p;
987: else if(reason==NULL)
988: reason=p;
989: else if(host==NULL)
990: host=p;
991: else if(ip_addr==NULL)
992: ip_addr=p;
993: else if(to==NULL)
994: to=p;
995: else if(from==NULL)
996: from=p;
997: }
998: *rval = BOOLEAN_TO_JSVAL(spamlog(cfg,prot,action,reason,host,ip_addr,to,from));
999: return(JS_TRUE);
1000: }
1001:
1002: static JSBool
1003: js_hacklog(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
1004: {
1005: uintN i;
1006: int32 i32=0;
1007: char* p;
1008: char* prot=NULL;
1009: char* user=NULL;
1010: char* text=NULL;
1011: char* host=NULL;
1012: SOCKADDR_IN addr;
1013: scfg_t* cfg;
1014:
1015: if((cfg=(scfg_t*)JS_GetPrivate(cx,obj))==NULL)
1016: return(JS_FALSE);
1017:
1018: memset(&addr,0,sizeof(addr));
1019: for(i=0;i<argc;i++) {
1020: if(JSVAL_IS_NUMBER(argv[i])) {
1021: JS_ValueToInt32(cx,argv[i],&i32);
1022: if(addr.sin_addr.s_addr==0)
1023: addr.sin_addr.s_addr=i32;
1024: else
1025: addr.sin_port=(ushort)i32;
1026: continue;
1027: }
1028: if(!JSVAL_IS_STRING(argv[i]))
1029: continue;
1030: p=JS_GetStringBytes(JS_ValueToString(cx, argv[i]));
1031: if(p==NULL)
1032: continue;
1033: if(prot==NULL)
1034: prot=p;
1035: else if(user==NULL)
1036: user=p;
1037: else if(text==NULL)
1038: text=p;
1039: else if(host==NULL)
1040: host=p;
1041: }
1042: *rval = BOOLEAN_TO_JSVAL(hacklog(cfg,prot,user,text,host,&addr));
1043: return(JS_TRUE);
1044: }
1045:
1046: static JSBool
1047: js_filter_ip(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
1048: {
1049: uintN i;
1050: char* p;
1051: char* prot=NULL;
1052: char* reason=NULL;
1053: char* host=NULL;
1054: char* ip_addr=NULL;
1055: char* from=NULL;
1056: char* fname=NULL;
1057: scfg_t* cfg;
1058:
1059: if((cfg=(scfg_t*)JS_GetPrivate(cx,obj))==NULL)
1060: return(JS_FALSE);
1061:
1062: for(i=0;i<argc;i++) {
1063: if(!JSVAL_IS_STRING(argv[i]))
1064: continue;
1065: p=JS_GetStringBytes(JS_ValueToString(cx, argv[i]));
1066: if(p==NULL)
1067: continue;
1068: if(prot==NULL)
1069: prot=p;
1070: else if(reason==NULL)
1071: reason=p;
1072: else if(host==NULL)
1073: host=p;
1074: else if(ip_addr==NULL)
1075: ip_addr=p;
1076: else if(from==NULL)
1077: from=p;
1078: else if(fname==NULL)
1079: fname=p;
1080: }
1081: *rval = BOOLEAN_TO_JSVAL(filter_ip(cfg,prot,reason,host,ip_addr,from,fname));
1082: return(JS_TRUE);
1083: }
1084:
1085: static JSBool
1086: js_get_node_message(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
1087: {
1088: char* buf;
1089: int32 node_num;
1090: JSString* js_str;
1091: scfg_t* cfg;
1092:
1093: *rval = JSVAL_NULL;
1094:
1095: if((cfg=(scfg_t*)JS_GetPrivate(cx,obj))==NULL)
1096: return(JS_FALSE);
1097:
1098: node_num=cfg->node_num;
1099: if(argc)
1100: JS_ValueToInt32(cx,argv[0],&node_num);
1101: if(node_num<1)
1102: node_num=1;
1103:
1104: if((buf=getnmsg(cfg,node_num))==NULL)
1105: return(JS_TRUE);
1106:
1107: js_str=JS_NewStringCopyZ(cx, buf);
1108: free(buf);
1109:
1110: if(js_str==NULL)
1111: return(JS_FALSE);
1112: *rval = STRING_TO_JSVAL(js_str);
1113: return(JS_TRUE);
1114: }
1115:
1116:
1117: static JSBool
1118: js_put_node_message(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
1119: {
1120: int32 node=1;
1121: JSString* js_msg;
1122: char* msg;
1123: scfg_t* cfg;
1124:
1125: if((cfg=(scfg_t*)JS_GetPrivate(cx,obj))==NULL)
1126: return(JS_FALSE);
1127:
1128: JS_ValueToInt32(cx,argv[0],&node);
1129: if(node<1)
1130: node=1;
1131:
1132: if((js_msg=JS_ValueToString(cx, argv[1]))==NULL)
1133: return(JS_FALSE);
1134:
1135: if((msg=JS_GetStringBytes(js_msg))==NULL)
1136: return(JS_FALSE);
1137:
1138: *rval = BOOLEAN_TO_JSVAL(putnmsg(cfg,node,msg)==0);
1139:
1140: return(JS_TRUE);
1141: }
1142:
1143: static JSBool
1144: js_get_telegram(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
1145: {
1146: char* buf;
1147: int32 usernumber=1;
1148: JSString* js_str;
1149: scfg_t* cfg;
1150:
1151: *rval = JSVAL_NULL;
1152:
1153: if((cfg=(scfg_t*)JS_GetPrivate(cx,obj))==NULL)
1154: return(JS_FALSE);
1155:
1156: JS_ValueToInt32(cx,argv[0],&usernumber);
1157: if(usernumber<1)
1158: usernumber=1;
1159:
1160: if((buf=getsmsg(cfg,usernumber))==NULL)
1161: return(JS_TRUE);
1162:
1163: js_str=JS_NewStringCopyZ(cx, buf);
1164: free(buf);
1165:
1166: if(js_str==NULL)
1167: return(JS_FALSE);
1168: *rval = STRING_TO_JSVAL(js_str);
1169: return(JS_TRUE);
1170: }
1171:
1172: static JSBool
1173: js_put_telegram(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
1174: {
1175: int32 usernumber=1;
1176: JSString* js_msg;
1177: char* msg;
1178: scfg_t* cfg;
1179:
1180: if((cfg=(scfg_t*)JS_GetPrivate(cx,obj))==NULL)
1181: return(JS_FALSE);
1182:
1183: JS_ValueToInt32(cx,argv[0],&usernumber);
1184: if(usernumber<1)
1185: usernumber=1;
1186:
1187: if((js_msg=JS_ValueToString(cx, argv[1]))==NULL)
1188: return(JS_FALSE);
1189:
1190: if((msg=JS_GetStringBytes(js_msg))==NULL)
1191: return(JS_FALSE);
1192:
1193: *rval = BOOLEAN_TO_JSVAL(putsmsg(cfg,usernumber,msg)==0);
1194:
1195: return(JS_TRUE);
1196: }
1197:
1198: static JSBool
1199: js_new_user(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
1200: {
1201: char* alias;
1202: int i;
1203: scfg_t* cfg;
1204: user_t user;
1205: JSObject* userobj;
1206:
1207: if((cfg=(scfg_t*)JS_GetPrivate(cx,obj))==NULL)
1208: return(JS_FALSE);
1209:
1210: alias=JS_GetStringBytes(JS_ValueToString(cx,argv[0]));
1211:
1212: memset(&user,0,sizeof(user));
1213:
1214: user.sex=' ';
1215: SAFECOPY(user.alias,alias);
1216:
1217: /* statistics */
1218: user.firston=user.laston=user.pwmod=time(NULL);
1219:
1220: /* security */
1221: user.level=cfg->new_level;
1222: user.flags1=cfg->new_flags1;
1223: user.flags2=cfg->new_flags2;
1224: user.flags3=cfg->new_flags3;
1225: user.flags4=cfg->new_flags4;
1226: user.rest=cfg->new_rest;
1227: user.exempt=cfg->new_exempt;
1228:
1229: user.cdt=cfg->new_cdt;
1230: user.min=cfg->new_min;
1231: user.freecdt=cfg->level_freecdtperday[user.level];
1232: if(cfg->new_expire)
1233: user.expire=user.firston+((long)cfg->new_expire*24L*60L*60L);
1234: else
1235: user.expire=0;
1236:
1237: /* settings */
1238: if(cfg->total_fcomps)
1239: strcpy(user.tmpext,cfg->fcomp[0]->ext);
1240: else
1241: strcpy(user.tmpext,"ZIP");
1242:
1243: user.shell=cfg->new_shell;
1244: user.misc=cfg->new_misc|(AUTOTERM|COLOR);
1245: user.prot=cfg->new_prot;
1246: user.qwk=QWK_DEFAULT;
1247:
1248: for(i=0;i<cfg->total_xedits;i++)
1249: if(!stricmp(cfg->xedit[i]->code,cfg->new_xedit) && chk_ar(cfg,cfg->xedit[i]->ar,&user))
1250: break;
1251: if(i<cfg->total_xedits)
1252: user.xedit=i+1;
1253:
1254: i=newuserdat(cfg,&user);
1255:
1256: if(i==0) {
1257: userobj=js_CreateUserObject(cx, obj, cfg, NULL, user.number);
1258: *rval = OBJECT_TO_JSVAL(userobj);
1259: } else
1260: *rval = INT_TO_JSVAL(i);
1261:
1262: return(JS_TRUE);
1263: }
1264:
1265: static JSBool
1266: js_exec(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
1267: {
1268: *rval = INT_TO_JSVAL(system(JS_GetStringBytes(JS_ValueToString(cx, argv[0]))));
1269:
1270: return(JS_TRUE);
1271: }
1272:
1273: static JSBool
1274: js_popen(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
1275: {
1276: char str[1024];
1277: char* cmd;
1278: FILE* fp;
1279: jsint line=0;
1280: jsval val;
1281: JSObject* array;
1282: JSString* js_str;
1283:
1284: *rval = JSVAL_VOID;
1285:
1286: if(argc<1)
1287: return(JS_TRUE);
1288:
1289: if((array=JS_NewArrayObject(cx,0,NULL))==NULL)
1290: return(JS_FALSE);
1291:
1292: cmd=JS_GetStringBytes(JS_ValueToString(cx, argv[0]));
1293: if((fp=popen(cmd,"r"))==NULL)
1294: return(JS_TRUE);
1295: while(!feof(fp)) {
1296: if(fgets(str,sizeof(str),fp)==NULL)
1297: break;
1298: if((js_str=JS_NewStringCopyZ(cx,str))==NULL)
1299: break;
1300: val=STRING_TO_JSVAL(js_str);
1301: if(!JS_SetElement(cx, array, line++, &val))
1302: break;
1303: }
1304: pclose(fp);
1305:
1306: *rval = OBJECT_TO_JSVAL(array);
1307:
1308: return(JS_TRUE);
1309: }
1310:
1311: static JSBool
1312: js_chksyspass(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
1313: {
1314: scfg_t* cfg;
1315:
1316: if((cfg=(scfg_t*)JS_GetPrivate(cx,obj))==NULL)
1317: return(JS_FALSE);
1318:
1319: *rval = BOOLEAN_TO_JSVAL(stricmp(JS_GetStringBytes(JS_ValueToString(cx, argv[0]))
1320: ,cfg->sys_pass)==0);
1321:
1322: return(JS_TRUE);
1323: }
1324:
1325:
1326:
1327: static jsSyncMethodSpec js_system_functions[] = {
1328: {"username", js_username, 1, JSTYPE_STRING, JSDOCSTR("number")
1329: ,JSDOCSTR("returns name of user in specified user record <i>number</i>, or empty string if not found")
1330: ,311
1331: },
1332: {"alias", js_alias, 1, JSTYPE_STRING, JSDOCSTR("string alias")
1333: ,JSDOCSTR("returns name of user that matches alias (if found in <tt>ctrl/alias.cfg</tt>)")
1334: ,310
1335: },
1336: {"matchuser", js_matchuser, 1, JSTYPE_NUMBER, JSDOCSTR("string username [,bool sysop_alias]")
1337: ,JSDOCSTR("exact user name matching, returns number of user whose name/alias matches <i>username</i> "
1338: " or 0 if not found, matches well-known sysop aliases by default")
1339: ,310
1340: },
1341: {"matchuserdata", js_matchuserdata, 2, JSTYPE_NUMBER, JSDOCSTR("field, data [,usernumber]")
1342: ,JSDOCSTR("search user database for data in a specific field (specified by offset), "
1343: "returns first matching user record number, optional <i>usernumber</i> specifies user record to skip")
1344: ,310
1345: },
1346: {"trashcan", js_trashcan, 2, JSTYPE_BOOLEAN, JSDOCSTR("string filename, search")
1347: ,JSDOCSTR("search text/filename.can for pseudo-regexp")
1348: ,310
1349: },
1350: {"findstr", js_findstr, 2, JSTYPE_BOOLEAN, JSDOCSTR("string filename, search")
1351: ,JSDOCSTR("search any file for pseudo-regexp")
1352: ,310
1353: },
1354: {"zonestr", js_zonestr, 0, JSTYPE_STRING, JSDOCSTR("[timezone]")
1355: ,JSDOCSTR("convert time zone integer to string, defaults to system timezone if <i>timezone</i> not specified")
1356: ,310
1357: },
1358: {"timestr", js_timestr, 0, JSTYPE_STRING, JSDOCSTR("[time]")
1359: ,JSDOCSTR("convert time_t integer into a time string, "
1360: "defaults to current time if <i>time</i> not specified")
1361: ,310
1362: },
1363: {"datestr", js_datestr, 0, JSTYPE_STRING, JSDOCSTR("[time]")
1364: ,JSDOCSTR("convert time_t integer into a date string (in either <tt>MM/DD/YY</tt> or <tt>DD/MM/YY</tt> format), "
1365: "defaults to current date if <i>time</i> not specified")
1366: ,310
1367: },
1368: {"secondstr", js_secondstr, 0, JSTYPE_STRING, JSDOCSTR("seconds")
1369: ,JSDOCSTR("convert elapsed time in seconds into a string in <tt>hh:mm:ss</tt> format")
1370: ,310
1371: },
1372: {"spamlog", js_spamlog, 6, JSTYPE_BOOLEAN, JSDOCSTR("[protocol, action, reason, host, ip, to, from]")
1373: ,JSDOCSTR("log a suspected SPAM attempt")
1374: ,310
1375: },
1376: {"hacklog", js_hacklog, 5, JSTYPE_BOOLEAN, JSDOCSTR("[protocol, user, text, host, ip, port]")
1377: ,JSDOCSTR("log a suspected hack attempt")
1378: ,310
1379: },
1380: {"filter_ip", js_filter_ip, 4, JSTYPE_BOOLEAN, JSDOCSTR("[protocol, reason, host, ip, username]")
1381: ,JSDOCSTR("add an IP address (with comment) to the system's IP filter file")
1382: ,311
1383: },
1384: {"get_node_message",js_get_node_message,0, JSTYPE_STRING, JSDOCSTR("number node")
1385: ,JSDOCSTR("read any messages waiting for the specified node and return in a single string")
1386: ,311
1387: },
1388: {"put_node_message",js_put_node_message,2, JSTYPE_BOOLEAN, JSDOCSTR("number node, string message")
1389: ,JSDOCSTR("send a node a short text message, delivered immediately")
1390: ,310
1391: },
1392: {"get_telegram", js_get_telegram, 1, JSTYPE_STRING, JSDOCSTR("number user")
1393: ,JSDOCSTR("returns any short text messages waiting for the specified user")
1394: ,311
1395: },
1396: {"put_telegram", js_put_telegram, 2, JSTYPE_BOOLEAN, JSDOCSTR("number user, string message")
1397: ,JSDOCSTR("sends a user a short text message, delivered immediately or during next logon")
1398: ,310
1399: },
1400: {"newuser", js_new_user, 1, JSTYPE_ALIAS },
1401: {"new_user", js_new_user, 1, JSTYPE_OBJECT, JSDOCSTR("name/alias")
1402: ,JSDOCSTR("creates a new user record, returns a new <a href=#User>User</a> object representing the new user account")
1403: ,310
1404: },
1405: {"exec", js_exec, 1, JSTYPE_NUMBER, JSDOCSTR("command-line")
1406: ,JSDOCSTR("executes a native system/shell command-line, returns <i>0</i> on success")
1407: ,311
1408: },
1409: {"popen", js_popen, 0, JSTYPE_ARRAY, JSDOCSTR("command-line")
1410: ,JSDOCSTR("executes a native system/shell command-line, returns array of captured output lines on success "
1411: "(<b>only functional on UNIX systems</b>)")
1412: ,311
1413: },
1414: {"check_syspass", js_chksyspass, 1, JSTYPE_BOOLEAN, JSDOCSTR("string password")
1415: ,JSDOCSTR("compares the supplied <i>password</i> against the system password and return's <i>true</i> if it matches")
1416: ,311
1417: },
1418: {0}
1419: };
1420:
1421:
1422: /* node properties */
1423: enum {
1424: /* raw node_t fields */
1425: NODE_PROP_STATUS
1426: ,NODE_PROP_ERRORS
1427: ,NODE_PROP_ACTION
1428: ,NODE_PROP_USERON
1429: ,NODE_PROP_CONNECTION
1430: ,NODE_PROP_MISC
1431: ,NODE_PROP_AUX
1432: ,NODE_PROP_EXTAUX
1433: };
1434:
1435: #ifdef _DEBUG
1436: static char* node_prop_desc[] = {
1437: "status (see <tt>nodedefs.js</tt> for valid values)"
1438: ,"error counter"
1439: ,"current user action (see <tt>nodedefs.js</tt>)"
1440: ,"current user number"
1441: ,"connection speed (<tt>0xffff</tt> = Telnet or RLogin)"
1442: ,"miscellaneous bitfield (see <tt>nodedefs.js</tt>)"
1443: ,"auxillary value"
1444: ,"extended auxillary value"
1445: ,NULL
1446: };
1447: #endif
1448:
1449:
1450: static JSBool js_node_get(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
1451: {
1452: uint node_num;
1453: jsint tiny;
1454: node_t node;
1455: scfg_t* cfg;
1456: JSObject* sysobj;
1457: JSObject* node_list;
1458:
1459: tiny = JSVAL_TO_INT(id);
1460:
1461: if((node_list=JS_GetParent(cx, obj))==NULL)
1462: return(JS_FALSE);
1463:
1464: if((sysobj=JS_GetParent(cx, node_list))==NULL)
1465: return(JS_FALSE);
1466:
1467: if((cfg=(scfg_t*)JS_GetPrivate(cx,sysobj))==NULL)
1468: return(JS_FALSE);
1469:
1470: node_num=(uint)JS_GetPrivate(cx,obj)>>1;
1471:
1472: memset(&node,0,sizeof(node));
1473: if(getnodedat(cfg, node_num, &node, NULL))
1474: return(JS_TRUE);
1475:
1476: switch(tiny) {
1477: case NODE_PROP_STATUS:
1478: *vp = INT_TO_JSVAL((int)node.status);
1479: break;
1480: case NODE_PROP_ERRORS:
1481: *vp = INT_TO_JSVAL((int)node.errors);
1482: break;
1483: case NODE_PROP_ACTION:
1484: *vp = INT_TO_JSVAL((int)node.action);
1485: break;
1486: case NODE_PROP_USERON:
1487: *vp = INT_TO_JSVAL((int)node.useron);
1488: break;
1489: case NODE_PROP_CONNECTION:
1490: *vp = INT_TO_JSVAL((int)node.connection);
1491: break;
1492: case NODE_PROP_MISC:
1493: *vp = INT_TO_JSVAL((int)node.misc);
1494: break;
1495: case NODE_PROP_AUX:
1496: *vp = INT_TO_JSVAL((int)node.aux);
1497: break;
1498: case NODE_PROP_EXTAUX:
1499: JS_NewNumberValue(cx,node.extaux,vp);
1500: break;
1501: }
1502: return(JS_TRUE);
1503: }
1504:
1505: static JSBool js_node_set(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
1506: {
1507: uint node_num;
1508: int file;
1509: jsint val=0;
1510: jsint tiny;
1511: node_t node;
1512: scfg_t* cfg;
1513: JSObject* sysobj;
1514: JSObject* node_list;
1515:
1516: if((node_list=JS_GetParent(cx, obj))==NULL)
1517: return(JS_FALSE);
1518:
1519: if((sysobj=JS_GetParent(cx, node_list))==NULL)
1520: return(JS_FALSE);
1521:
1522: if((cfg=(scfg_t*)JS_GetPrivate(cx,sysobj))==NULL)
1523: return(JS_FALSE);
1524:
1525: node_num=(uint)JS_GetPrivate(cx,obj)>>1;
1526:
1527: memset(&node,0,sizeof(node));
1528: if(getnodedat(cfg, node_num, &node, &file))
1529: return(JS_TRUE);
1530:
1531: if(JSVAL_IS_NUMBER(*vp))
1532: JS_ValueToInt32(cx, *vp, &val);
1533:
1534: tiny = JSVAL_TO_INT(id);
1535:
1536: switch(tiny) {
1537: case NODE_PROP_STATUS:
1538: node.status=(BYTE)val;
1539: break;
1540: case NODE_PROP_ERRORS:
1541: node.errors=(BYTE)val;
1542: break;
1543: case NODE_PROP_ACTION:
1544: node.action=(BYTE)val;
1545: break;
1546: case NODE_PROP_USERON:
1547: node.useron=(WORD)val;
1548: break;
1549: case NODE_PROP_CONNECTION:
1550: node.connection=(WORD)val;
1551: break;
1552: case NODE_PROP_MISC:
1553: node.misc=(WORD)val;
1554: break;
1555: case NODE_PROP_AUX:
1556: node.aux=(WORD)val;
1557: break;
1558: case NODE_PROP_EXTAUX:
1559: node.extaux=val;
1560: break;
1561: }
1562: putnodedat(cfg,node_num,&node,file);
1563:
1564: return(JS_TRUE);
1565: }
1566:
1567: static jsSyncPropertySpec js_node_properties[] = {
1568: /* name, tinyid, flags, ver */
1569:
1570: /* raw node_t fields */
1571: { "status", NODE_PROP_STATUS, JSPROP_ENUMERATE, 310 },
1572: { "errors", NODE_PROP_ERRORS, JSPROP_ENUMERATE, 310 },
1573: { "action", NODE_PROP_ACTION, JSPROP_ENUMERATE, 310 },
1574: { "useron", NODE_PROP_USERON, JSPROP_ENUMERATE, 310 },
1575: { "connection", NODE_PROP_CONNECTION, JSPROP_ENUMERATE, 310 },
1576: { "misc", NODE_PROP_MISC, JSPROP_ENUMERATE, 310 },
1577: { "aux", NODE_PROP_AUX, JSPROP_ENUMERATE, 310 },
1578: { "extaux", NODE_PROP_EXTAUX, JSPROP_ENUMERATE, 310 },
1579: {0}
1580: };
1581:
1582: static JSClass js_node_class = {
1583: "Node" /* name */
1584: ,JSCLASS_HAS_PRIVATE /* flags */
1585: ,JS_PropertyStub /* addProperty */
1586: ,JS_PropertyStub /* delProperty */
1587: ,js_node_get /* getProperty */
1588: ,js_node_set /* setProperty */
1589: ,JS_EnumerateStub /* enumerate */
1590: ,JS_ResolveStub /* resolve */
1591: ,JS_ConvertStub /* convert */
1592: ,JS_FinalizeStub /* finalize */
1593: };
1594:
1595: JSObject* DLLCALL js_CreateSystemObject(JSContext* cx, JSObject* parent
1596: ,scfg_t* cfg, time_t uptime, char* host_name, char* socklib_desc)
1597: {
1598: char str[256];
1599: uint i;
1600: jsval val;
1601: JSObject* sysobj;
1602: JSObject* statsobj;
1603: JSObject* nodeobj;
1604: JSObject* node_list;
1605: JSObject* fido_addr_list;
1606: JSString* js_str;
1607:
1608: sysobj = JS_DefineObject(cx, parent, "system", &js_system_class, NULL
1609: ,JSPROP_ENUMERATE|JSPROP_READONLY);
1610:
1611: if(sysobj==NULL)
1612: return(NULL);
1613:
1614: if(!JS_SetPrivate(cx, sysobj, cfg)) /* Store a pointer to scfg_t */
1615: return(NULL);
1616:
1617: if(!js_DefineSyncProperties(cx, sysobj, js_system_properties))
1618: return(NULL);
1619:
1620: if (!js_DefineSyncMethods(cx, sysobj, js_system_functions, FALSE))
1621: return(NULL);
1622:
1623: #ifdef _DEBUG
1624: js_DescribeSyncObject(cx,sysobj,"Global system-related properties and methods",310);
1625: js_CreateArrayOfStrings(cx, sysobj, "_property_desc_list", sys_prop_desc, JSPROP_READONLY);
1626: #endif
1627:
1628: /****************************/
1629: /* static string properties */
1630: if((js_str=JS_NewStringCopyZ(cx, host_name))==NULL)
1631: return(NULL);
1632: val = STRING_TO_JSVAL(js_str);
1633: if(!JS_SetProperty(cx, sysobj, "host_name", &val))
1634: return(NULL);
1635:
1636: if((js_str=JS_NewStringCopyZ(cx, VERSION))==NULL)
1637: return(NULL);
1638: val = STRING_TO_JSVAL(js_str);
1639: if(!JS_SetProperty(cx, sysobj, "version", &val))
1640: return(NULL);
1641:
1642: sprintf(str,"%c",REVISION);
1643: if((js_str=JS_NewStringCopyZ(cx, str))==NULL)
1644: return(NULL);
1645: val = STRING_TO_JSVAL(js_str);
1646: if(!JS_SetProperty(cx, sysobj, "revision", &val))
1647: return(NULL);
1648:
1649: SAFECOPY(str,beta_version);
1650: truncsp(str);
1651: if((js_str=JS_NewStringCopyZ(cx, str))==NULL)
1652: return(NULL);
1653: val = STRING_TO_JSVAL(js_str);
1654: if(!JS_SetProperty(cx, sysobj, "beta_version", &val))
1655: return(NULL);
1656:
1657:
1658: sprintf(str,"%s%c%s",VERSION,REVISION,beta_version);
1659: truncsp(str);
1660: #if defined(_DEBUG)
1661: strcat(str," Debug");
1662: #endif
1663: if((js_str=JS_NewStringCopyZ(cx, str))==NULL)
1664: return(NULL);
1665: val = STRING_TO_JSVAL(js_str);
1666: if(!JS_SetProperty(cx, sysobj, "full_version", &val))
1667: return(NULL);
1668:
1669: if((js_str=JS_NewStringCopyZ(cx, VERSION_NOTICE))==NULL)
1670: return(NULL);
1671: val = STRING_TO_JSVAL(js_str);
1672: if(!JS_SetProperty(cx, sysobj, "version_notice", &val))
1673: return(NULL);
1674:
1675: if((js_str=JS_NewStringCopyZ(cx, PLATFORM_DESC))==NULL)
1676: return(NULL);
1677: val = STRING_TO_JSVAL(js_str);
1678: if(!JS_SetProperty(cx, sysobj, "platform", &val))
1679: return(NULL);
1680:
1681: if((js_str=JS_NewStringCopyZ(cx, socklib_version(str, socklib_desc)))==NULL)
1682: return(NULL);
1683: val = STRING_TO_JSVAL(js_str);
1684: if(!JS_SetProperty(cx, sysobj, "socket_lib", &val))
1685: return(NULL);
1686:
1687: sprintf(str,"SMBLIB %s",smb_lib_ver());
1688: if((js_str=JS_NewStringCopyZ(cx, str))==NULL)
1689: return(NULL);
1690: val = STRING_TO_JSVAL(js_str);
1691: if(!JS_SetProperty(cx, sysobj, "msgbase_lib", &val))
1692: return(NULL);
1693:
1694: DESCRIBE_COMPILER(str);
1695: if((js_str=JS_NewStringCopyZ(cx, str))==NULL)
1696: return(NULL);
1697: val = STRING_TO_JSVAL(js_str);
1698: if(!JS_SetProperty(cx, sysobj, "compiled_with", &val))
1699: return(NULL);
1700:
1701: sprintf(str,"%s %.5s",__DATE__,__TIME__);
1702: if((js_str=JS_NewStringCopyZ(cx, str))==NULL)
1703: return(NULL);
1704: val = STRING_TO_JSVAL(js_str);
1705: if(!JS_SetProperty(cx, sysobj, "compiled_when", &val))
1706: return(NULL);
1707:
1708: if((js_str=JS_NewStringCopyZ(cx, COPYRIGHT_NOTICE))==NULL)
1709: return(NULL);
1710: val = STRING_TO_JSVAL(js_str);
1711: if(!JS_SetProperty(cx, sysobj, "copyright", &val))
1712: return(NULL);
1713:
1714: if((js_str=JS_NewStringCopyZ(cx
1715: ,(char *)JS_GetImplementationVersion()))==NULL)
1716: return(NULL);
1717: val = STRING_TO_JSVAL(js_str);
1718: if(!JS_SetProperty(cx, sysobj, "js_version", &val))
1719: return(NULL);
1720:
1721: if((js_str=JS_NewStringCopyZ(cx,os_version(str)))==NULL)
1722: return(NULL);
1723: val = STRING_TO_JSVAL(js_str);
1724: if(!JS_SetProperty(cx, sysobj, "os_version", &val))
1725: return(NULL);
1726:
1727: /***********************/
1728:
1729: JS_NewNumberValue(cx,uptime,&val);
1730: if(!JS_SetProperty(cx, sysobj, "uptime", &val))
1731: return(NULL);
1732:
1733: /* fido_addr_list property */
1734:
1735: if((fido_addr_list=JS_NewArrayObject(cx, 0, NULL))==NULL)
1736: return(NULL);
1737:
1738: if(!JS_DefineProperty(cx, sysobj, "fido_addr_list", OBJECT_TO_JSVAL(fido_addr_list)
1739: , NULL, NULL, JSPROP_ENUMERATE))
1740: return(NULL);
1741:
1742: for(i=0;i<cfg->total_faddrs;i++) {
1743: val=STRING_TO_JSVAL(JS_NewStringCopyZ(cx,smb_faddrtoa(&cfg->faddr[i],str)));
1744: JS_SetElement(cx, fido_addr_list, i, &val);
1745: }
1746:
1747: statsobj = JS_DefineObject(cx, sysobj, "stats", &js_sysstats_class, NULL
1748: ,JSPROP_ENUMERATE|JSPROP_READONLY);
1749:
1750: if(statsobj==NULL)
1751: return(NULL);
1752:
1753: JS_SetPrivate(cx, statsobj, cfg); /* Store a pointer to scfg_t */
1754:
1755: if(!js_DefineSyncProperties(cx, statsobj, js_sysstats_properties))
1756: return(NULL);
1757:
1758: #ifdef _DEBUG
1759: js_DescribeSyncObject(cx,statsobj,"System statistics",310);
1760: js_CreateArrayOfStrings(cx, statsobj, "_property_desc_list", sysstat_prop_desc, JSPROP_READONLY);
1761: #endif
1762:
1763: /* node_list property */
1764:
1765: if((node_list=JS_NewArrayObject(cx, 0, NULL))==NULL)
1766: return(NULL);
1767:
1768: if(!JS_DefineProperty(cx, sysobj, "node_list", OBJECT_TO_JSVAL(node_list)
1769: , NULL, NULL, JSPROP_ENUMERATE))
1770: return(NULL);
1771:
1772: for(i=0;i<cfg->sys_nodes && i<cfg->sys_lastnode;i++) {
1773:
1774: nodeobj = JS_NewObject(cx, &js_node_class, NULL, node_list);
1775:
1776: if(nodeobj==NULL)
1777: return(NULL);
1778:
1779: /* Store node number */
1780: /* We have to shift it to make it look like a pointer to JS. :-( */
1781: if(!JS_SetPrivate(cx, nodeobj, (char*)((i+1)<<1)))
1782: return(NULL);
1783:
1784: if(!js_DefineSyncProperties(cx, nodeobj, js_node_properties))
1785: return(NULL);
1786:
1787: #ifdef _DEBUG
1788: if(i==0) {
1789: js_DescribeSyncObject(cx,nodeobj,"BBS node listing",310);
1790: js_CreateArrayOfStrings(cx, nodeobj, "_property_desc_list", node_prop_desc, JSPROP_READONLY);
1791: }
1792: #endif
1793:
1794: val=OBJECT_TO_JSVAL(nodeobj);
1795: if(!JS_SetElement(cx, node_list, i, &val))
1796: return(NULL);
1797: }
1798:
1799: return(sysobj);
1800: }
1801:
1802: #endif /* JAVSCRIPT */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.