Subversion Repositories wimsdev

Rev

Rev 17894 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
10 reyssat 1
/*    Copyright (C) 1998-2003 XIAO, Gang of Universite de Nice - Sophia Antipolis
2
 *
3
 *  This program is free software; you can redistribute it and/or modify
4
 *  it under the terms of the GNU General Public License as published by
5
 *  the Free Software Foundation; either version 2 of the License, or
6
 *  (at your option) any later version.
7
 *
8
 *  This program is distributed in the hope that it will be useful,
9
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
10
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11
 *  GNU General Public License for more details.
12
 *
13
 *  You should have received a copy of the GNU General Public License
14
 *  along with this program; if not, write to the Free Software
15
 *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
16
 */
17
 
8185 bpr 18
/* This file contains various configuration routines for wims. */
10 reyssat 19
 
8185 bpr 20
/* Limitations are essentially for security reasons:
21
 * to curb attacks by resource exhaustion of the server.
22
 */
10 reyssat 23
 
8185 bpr 24
#include "wims.h"
15519 bpr 25
/* variables shared with wimslog.c */
26
#include "commun.h"
8185 bpr 27
 
28
/* maximal length of any module's variable definition file. */
10 reyssat 29
int VAR_DEF_LENGTH_LIMIT=50000;
7673 bpr 30
/* Limit for frames in an animation. */
10 reyssat 31
int ANIM_LIMIT=400;
15519 bpr 32
 
33
 
7673 bpr 34
/* Resource limits */
13730 obado 35
int threshold1=150; /* First load threshold */
36
int threshold2=300; /* Second load threshold */
7673 bpr 37
int ispriority=0; /* whether the connection is from priority sites */
10 reyssat 38
 
7673 bpr 39
int rafalvl=10; /* anti-rapidfire severity */
10 reyssat 40
 
13730 obado 41
/* Explanation: two real numbers a,b such as * |a+b|>|a-b|*compare_precision
7673 bpr 42
 * will be considered equal in !ifvalue comparisons. */
10 reyssat 43
int DEFAULT_COMPARE_PRECISION=10000;
7673 bpr 44
/* Precision of printing (hence of all evaluations). */
10 reyssat 45
int DEFAULT_PRINT_PRECISION=8;
7673 bpr 46
/* Defaults for instex, insplot, etc. */
10 reyssat 47
char *DEFAULT_INS_FORMAT="gif";
48
char *DEFAULT_ANIM_FORMAT="gif";
49
char *DEFAULT_INS_DENSITY="100x100";
50
char *DEFAULT_INSPLOT_FONT="small";
51
 
7673 bpr 52
/* gnuplot intermediate graphics format */
10 reyssat 53
char *gnuplot_format="gif";
54
 
8185 bpr 55
/* electronic address of site manager. */
10 reyssat 56
char *site_manager="wims@$httpd_HTTP_HOST";
8185 bpr 57
/* Main configure file, this name cannot be configured! */
10 reyssat 58
char *config_file="../log/wims.conf";
59
char PATH[512];  /* directory settings */
8191 bpr 60
char *commonpath="/usr/local/bin:/usr/bin:/usr/games:/bin:/usr/bin/X11:/usr/X11R6/bin:/usr/texbin:/usr/local/texbin";
4331 bpr 61
char *gap_command="gap.sh -T -m 64M";
9336 bpr 62
char *maxima_command="maxima -X '--dynamic-space-size 512'";
10 reyssat 63
char *pari_command="gp -f -q -p 150000";
17482 bpr 64
char *octave_command="octave -Hq --no-line-editing --no-window-system --silent";
4417 bpr 65
char *scilab_command="scilab -nwni";
6717 guerimand 66
char *QRencode_command="qrencode -o";
10 reyssat 67
 
8284 bpr 68
/* default languages */
16373 bpr 69
char site_langbuf[]="en fr es it nl ca si de cn";
10 reyssat 70
char *site_languages=site_langbuf;
8284 bpr 71
/* Statistics shows up? */
16507 guerimand 72
char *show_stat="yes";
8284 bpr 73
/* Author names show up in search result? */
10 reyssat 74
char *show_author="no";
13730 obado 75
/* Show user IP address to supervisor */
7079 bpr 76
char *show_ip="yes";
8284 bpr 77
/* busy hours definition */
10 reyssat 78
char *busyhours="";
8284 bpr 79
/* Presentation theme */
3048 bpr 80
char *theme="standard";
8284 bpr 81
/* directory of session files */
10 reyssat 82
char session_dir[MAX_FNAME+1], s2_dir[MAX_FNAME+1];
8284 bpr 83
/* standardised header model for modules' output. Will be stored
84
 * into the variable $wims_html_header. If the theme contains
85
 * a file 'head.phtml', html_header will be defined by the address
86
 * of this file  in subroutine define_html_header
87
 */
10 reyssat 88
char *html_header="html/header.phtml";
8284 bpr 89
/* standardised about table for modules */
10 reyssat 90
char *module_about_file="html/module_about";
8284 bpr 91
/* title definition page */
10 reyssat 92
char *title_page="title.phtml";
13730 obado 93
/* standardised header menu bar, to be included in module pages
8284 bpr 94
 * via command !headmenu */
10 reyssat 95
char *header_menu="headmenu.phtml";
96
char *header_menu_user="headmenu_user.phtml";
97
char *header_menu_supervisor="headmenu_supervisor.phtml";
8284 bpr 98
/* standardised referer to wims home, to be included in
99
 * module pages via command !homeref */
10 reyssat 100
char *home_referer="homeref.phtml";
101
char *home_referer_user="homeref_user.phtml";
102
char *home_referer_supervisor="homeref_supervisor.phtml";
8284 bpr 103
/* background color in standard reference tables */
16285 obado 104
char *ref_bgcolor="#676767";
12357 obado 105
/* standard link color */
14734 obado 106
char *link_color="#1468A0";
12357 obado 107
/* visited link color */
14734 obado 108
char *vlink_color="#1779BA";
12357 obado 109
/* hover link color */
110
char *hlink_color="#004077";
8284 bpr 111
/* link color in standard reference tables */
8696 obado 112
char *ref_menucolor="#FFFFFF";
8284 bpr 113
/* background help button color */
8696 obado 114
char *ref_button_help_bgcolor="#008f00";
8284 bpr 115
/* background help button color */
8696 obado 116
char *ref_button_help_color="#FFFFFF";
3064 bpr 117
  /* button background color */
3078 bpr 118
char *ref_button_bgcolor="#666666";
3064 bpr 119
  /* button color */
8696 obado 120
char *ref_button_color="#FFFFFF";
12884 obado 121
  /* Default colors for activity types */
14838 obado 122
char *actcolor="#000000,#CCCCFF,#99CCFF,#9999FF,#6666FF,#FFFFFF,#99CCDD,#AFB31E,#E6A493";
8185 bpr 123
/* module log disabled by default */
10 reyssat 124
int modlog=0;
8185 bpr 125
/* name of the variable definition file for every module.
126
 * It is this file which defines the presence of the module.
127
* Better do not make it configurable.
128
*/
10 reyssat 129
char var_def_file[256];
8185 bpr 130
/* name of variable init file. Processed only when cmd=new or renew. */
10 reyssat 131
char *var_init_file="var.init";
8185 bpr 132
/* name of variable calculation file. Parsed at each call. */
10 reyssat 133
char *main_var_proc_file="var.proc";
8185 bpr 134
/* name of the main (programmable) html file. */
10 reyssat 135
char *html_file="main.phtml";
8185 bpr 136
/* Introduction page name */
10 reyssat 137
char *intro_file="intro.phtml";
8185 bpr 138
/* Reference page */
10 reyssat 139
char *ref_file="wims_ref.phtml";
8185 bpr 140
/* script to process different inserts.
141
 * The two consecutive points in the name prohibits ordinary
142
 * user execution of the script.
143
 */
10 reyssat 144
char *insdraw_processor="insdraw..processor";
145
char *insplot_processor="insplot..processor";
146
char *tex2gif="bin/tex..gif";
7673 bpr 147
char *priority=""; /* IPs of priority sites */
10 reyssat 148
char *texgif_fontdir="w/texgif";
149
char *texgif_texheader="mathfonts/header";
14734 obado 150
char *bgcolor="#F6F6F6"; /* page background color */
7673 bpr 151
char *bgimg="";  /* page background image file */
152
char *pagecss="-theme-";  /* style sheet file */
153
char *theme_icon="default";  /* icon */
154
char *usecookie="no";  /* whether to send cookies to anon requests */
18098 reyssat 155
char *mail_addrsep=","; /* separator for multiple mail addresses */
7673 bpr 156
char *mail_opt="";  /* !mailto options */
16516 guerimand 157
char *mail_hidden="no"; /* option to hide or not user mail in server */
7673 bpr 158
char nodeip[256]="";  /* ip of cluster node if relevant */
159
char temp_log[MAX_FNAME+1]; /* temp log file name */
160
 /* 0: low; 1: high; 2: MathML */
161
int mathalign_base=0;  /* Not use <sup> for middle alignment */
162
char *disable_zoom="no";  /* yes/no:  default zooming allowed (if enabled via "useropts")  */
15297 bpr 163
 
6178 bpr 164
int spec_font=0; /* choose of some fonts*/
165
 /* special font can be configured in log/wims.conf with variable special_font*/
8909 bpr 166
char *special_font="letter-spacing:0.1em;line-height:2.7em;word-spacing:0.8em;font-family:OpenDyslexic3,OpenDyslexic,sans-serif !important;";
7673 bpr 167
int backup_hour=-1; /* Hour for daily backup; -1 means no backup. */
16507 guerimand 168
int site_accounting=1; /* whether accounting should be activated */
7673 bpr 169
int examlog_limit=7; /* number of logged exam sessions for each student */
15331 obado 170
char *site_hostname="";
10 reyssat 171
 
8284 bpr 172
/* Automatic module update */
10 reyssat 173
char *mu_auto="none";
174
char *mu_cat="all";
6533 bpr 175
char *mu_delay="3";
15331 obado 176
char *mu_site="https://wims.univ-cotedazur.fr/download/modules";
10 reyssat 177
char *mu_zone="all";
3121 bpr 178
char *mu_download_site="unice,wimsedu";
3046 bpr 179
char *mu_publish_site="unice";
10 reyssat 180
 
13730 obado 181
/* keywords destined to robots */
10 reyssat 182
char *site_keywords="interactive mathematics, interactive math, server side interactivity";
183
char *site_description="interactive exercises, online calculators and plotters, mathematical recreation and games";
184
 
8284 bpr 185
/* class and document authorization */
13730 obado 186
int class_quota=150;
187
int superclass_quota=150;
10 reyssat 188
int doc_quota=32;
189
char *class_regpass="email,email,deny";
190
char *doc_regpass="";
191
 
8284 bpr 192
/* Where to find programs; if your httpd sets /bin:/usr/bin in PATH,
193
 * this should be OK.
194
 */
10 reyssat 195
char *sed_prog="sed";
196
char *tr_prog="tr";
197
char *awk_prog="awk";
198
 
199
  /* myname */
200
char *cgi_name="wims.cgi";
201
char *aliased_cgi="no";
202
char *aliased_getfile="yes";
203
 
204
  /* Limits for classes and participants */
205
int class_limit=200; /* limit of number of classes */
206
int user_limit=5000; /* limit of total number of registered users */
207
int class_user_limit=300; /* limit of users in one class */
208
int forum_limit=100;  /* Limit of message boards */
15743 guerimand 209
int max_techvar=5; /* default limit number of technical variable */
10 reyssat 210
 
211
CONFIG_DATA main_config[]={
12270 bpr 212
  {"PATH",0, &commonpath},
213
  {"QRencode_command",2, &QRencode_command},
12884 obado 214
  {"actcolor",0, &actcolor},
12270 bpr 215
  {"aliased_cgi",0, &aliased_cgi},
216
  {"aliased_getfile",0, &aliased_getfile},
217
  {"backup_hour",1, &backup_hour},
218
  {"busyhours",0, &busyhours},
219
  {"cgi_name",0, &cgi_name},
220
  {"class_limit",1, &class_limit},
221
  {"class_quota",1, &class_quota},
222
  {"class_regpass",0, &class_regpass},
223
  {"class_user_limit",1, &class_user_limit},
224
  {"css",0, &pagecss},
225
  {"default_anim_format",0, &DEFAULT_ANIM_FORMAT},
226
  {"default_ins_format",0, &DEFAULT_INS_FORMAT},
227
  {"default_insplot_font",0, &DEFAULT_INSPLOT_FONT},
228
  {"default_texposition",1, &mathalign_base},
229
  {"devel_modules",0, &devel_modules},
230
  {"doc_quota",1, &doc_quota},
231
  {"doc_regpass",0, &doc_regpass},
232
  {"examlog_limit",1, &examlog_limit},
233
  {"forum_limit",1, &forum_limit},
234
  {"gap_command",2, &gap_command},
235
  {"general_log_limit",1, &GEN_LOG_LIMIT},
236
  {"gnuplot_format",0, &gnuplot_format},
12357 obado 237
  {"hlink_color",0, &hlink_color},
12270 bpr 238
  {"home_module",0, &home_module},
239
  {"idle_time",1, &idle_time},
240
  {"idle_time2",1, &idle_time2},
241
  {"idle_time3",1, &idle_time3},
242
  {"insdraw_processor",0, &insdraw_processor},
243
  {"link_color",0, &link_color},
15509 bpr 244
  {"log_delete",1,&LOG_DELETE},
18098 reyssat 245
  {"mail_addrsep",0, &mail_addrsep},
16516 guerimand 246
  {"mail_hidden",0, &mail_hidden},
12270 bpr 247
  {"mail_opt",0, &mail_opt},
248
  {"manager_https",1, &manager_https},
249
  {"manager_site",0, &manager_site},
15743 guerimand 250
  {"max_techvar",1,&max_techvar},
12270 bpr 251
  {"maxima_command",2, &maxima_command},
252
  {"module_log",1, &modlog},
253
  {"module_log_limit",1, &MODULE_LOG_LIMIT},
254
  {"mu_auto",0, &mu_auto},
255
  {"mu_cat",0, &mu_cat},
256
  {"mu_delay",0, &mu_delay},
257
  {"mu_download_site",0, &mu_download_site},
258
  {"mu_publish_site",0, &mu_publish_site},
259
  {"mu_site",0, &mu_site},
260
  {"mu_zone",0, &mu_zone},
261
  {"octave_command",2, &octave_command},
262
  {"old_log_files",1, &OLD_LOG_FILES},
263
  {"page_bgcolor",0, &bgcolor},
264
  {"page_bgimg",0, &bgimg},
265
  {"pari_command",2, &pari_command},
266
  {"priority",0, &priority},
267
  {"rafale_level",1, &rafalvl},
268
  {"ref_bgcolor",0, &ref_bgcolor},
269
  {"ref_button_bgcolor",0, &ref_button_bgcolor},
270
  {"ref_button_color",0, &ref_button_color},
271
  {"ref_button_help_bgcolor",0, &ref_button_help_bgcolor},
272
  {"ref_button_help_color",0, &ref_button_help_color},
273
  {"ref_menucolor",0, &ref_menucolor},
274
  {"rlimit_cpu",1, &rlimit_cpu},
275
  {"scilab_command",2, &scilab_command},
276
  {"show_author",0, &show_author},
277
  {"show_ip",0, &show_ip},
278
  {"show_stat",0, &show_stat},
279
  {"site_accounting",1, &site_accounting},
280
  {"site_description",0, &site_description},
15331 obado 281
  {"site_hostname",0, &site_hostname},
12270 bpr 282
  {"site_keywords",0, &site_keywords},
283
  {"site_languages",0, &site_languages},
284
  {"site_manager",0, &site_manager},
285
  {"superclass_quota",1, &superclass_quota},
286
  {"texbasesize",1, &texbasesize},
287
  {"theme",0, &theme},
288
  {"theme_icon",0, &theme_icon},
289
  {"threshold1",1, &threshold1},
290
  {"threshold2",1, &threshold2},
291
  {"tmp_debug",0, &tmp_debug},
15573 bpr 292
  {"tmp_debug_use_var",0, &tmp_debug_use_var},
12270 bpr 293
  {"tmp_debug_var",0, &tmp_debug_var},
294
  {"trusted_modules",0, &trusted_modules},
295
  {"usecookie",0, &usecookie},
296
  {"user_limit",1, &user_limit},
297
  {"var_def_length_limit",1, &VAR_DEF_LENGTH_LIMIT},
298
  {"vlink_color",0, &vlink_color},
299
  {"workfile_limit",1, &WORKFILE_LIMIT}
10 reyssat 300
};
8185 bpr 301
int MAIN_CONFIG_NO=(sizeof(main_config)/sizeof(main_config[0]));
10 reyssat 302
 
8851 bpr 303
/* processes the list of languages supported on the site */
10 reyssat 304
void language_list(void)
305
{
12239 bpr 306
  int i,k;
307
  char *lbuf[MAX_LANGUAGES];
308
  calc_tolower(site_languages); items2words(site_languages);
309
  setvar("wims_site_languages",site_languages);
310
  i=cutwords(site_languages,lbuf,MAX_LANGUAGES);
311
  available_lang_no=i;
312
  for(i=k=0;i<available_lang_no;i++) {
313
    if(strlen(lbuf[i])==2) memmove(available_lang[k++],lbuf[i],3);
314
  }
315
  if(k>0) memmove(lang,available_lang[0],3);
10 reyssat 316
}
317
 
318
char hostname[256];
319
int html_call=0;
320
 
8851 bpr 321
/* determine the http reference name of the server */
10 reyssat 322
void determine_ref_name(void)
323
{
12239 bpr 324
  char *s1, *s2, *p, *pl;
325
  char buf[MAX_LINELEN+1];
326
  int len;
10 reyssat 327
 
12239 bpr 328
  hostname[0]=0;
329
  s1=getvar("httpd_HTTP_HOST");s2=getvar("httpd_SCRIPT_NAME");
330
  gethostname(hostname,sizeof(hostname));
331
  if(hostname[0]==0 && s1 && *s1!=0) mystrncpy(hostname,s1,sizeof(hostname));
332
  if(s1==NULL || *s1==0) s1=hostname;
333
  setvar("wims_myhostname",hostname);
334
  ref_base[0]=0;
335
  if(s2!=NULL) mystrncpy(buf,s2,sizeof(buf));
336
  else buf[0]=0;
337
  if(s1!=NULL && *buf=='/') {
338
    p=strrchr(buf,'/'); if(p==NULL) p=buf; else *p++=0;
12357 obado 339
    /* address of type /wims/fr_H2~algebra~oeffraction.fr.html */
12239 bpr 340
    if(strcmp(p,cgi_name)!=0 && strlen(p)>4 &&
341
       p[2]=='_' && islower(p[0]) && islower(p[1])) {
342
      pre_language[0]=p[0];pre_language[1]=p[1];pre_language[2]=0;
343
      p[2]=0; setenv("HTTP_ACCEPT_LANGUAGE",p,1); pl=p; p+=3;
12270 bpr 344
      s2=strrchr(p,'.');
345
      if(s2!=NULL) {
346
        *s2=0;
347
        if(strcasecmp(s2+1,"cgi")!=0) html_call=1;
8851 bpr 348
      }
12239 bpr 349
      s2=p; while((s2=strpbrk(s2,"@~"))!=NULL) *s2='/';
350
      if(strncmp(p,"doc/",4)==0) {
351
        char *pd, *pb;
352
        pd=p+4;
353
        if(*pd) {
354
          pb=strchr(pd,'/');
355
          if(pb) *pb++=0; else pb="main";
356
          setvar("doc",pd); setvar("block",pb); setvar("job","read");
357
        }
358
        setvar(ro_name[ro_module],mkfname(NULL,"adm/doc.%s",pl));
8851 bpr 359
      }
12239 bpr 360
      else setvar(ro_name[ro_module],p);
361
      module_defined=1;
10 reyssat 362
    }
12239 bpr 363
    p=strchr(buf,'_');
364
    if(p!=NULL && p>buf+3 && myislower(*(p-1)) && myislower(*(p-2))
365
         && *(p-3)=='/' && myisalpha(*(p+1))) {
366
      char *pp;
367
      for(pp=p+1; myisalnum(*pp); pp++){};
368
      if(*pp=='/') *(p-3)=0;
369
    }
13395 bpr 370
    p=getenv("HTTPS");
371
    if(p!=NULL && strcmp(p,"on")==0)
372
      snprintf(ref_name,sizeof(ref_name)-2,"https://%s%s/%s",s1,buf,cgi_name);
373
    else
374
      snprintf(ref_name,sizeof(ref_name)-2,"http://%s%s/%s",s1,buf,cgi_name);
12239 bpr 375
    mystrncpy(ref_base,ref_name,sizeof(ref_base)-2);
376
    p=strrchr(ref_base,'/');
377
    if(p!=NULL) *(p+1)=0;
378
  }
379
  else mystrncpy(ref_name,cgi_name,sizeof(ref_name)-1);
11689 obado 380
 
381
    // XSS PROTECTION (remove unwanted chars to avoid a possible XSS hack)
12270 bpr 382
    // Search for a first occurence of forbidden chars
383
  len = strcspn(ref_name, "<>'\"\\");
11689 obado 384
    // Give only the ref_name before forbidden chars
12270 bpr 385
  ref_name[len]=0;
11689 obado 386
 
12239 bpr 387
  setvar("wims_ref_name",ref_name);
10 reyssat 388
}
389
 
13730 obado 390
      /* Read and interpret wims configuration file. */
10 reyssat 391
void main_configure(void)
392
{
12239 bpr 393
  int i;
394
  char *conf_buf,*e,*p,*p2,*p3;
395
  char buf[MAX_LINELEN+1];
7079 bpr 396
 
12239 bpr 397
  conf_buf=readfile(config_file,NULL,WORKFILE_LIMIT);
398
  if(conf_buf==NULL) goto fileend;
399
  e=conf_buf-1; while(e) {
400
    p=e+1; e=strchr(p,'\n'); if(e) *e=0;
401
    p=find_word_start(p);
402
    if(*p==0 || *p==comment_prefix_char) continue; /* empty or comment line */
403
    p2=strchr(p,'=');
404
    if(p2==NULL) continue; /* syntax error */
405
    *p2=0; *find_word_end(p)=0; p2=find_word_start(p2+1);
406
    p3=p2+strlen(p2); while(myislspace(p3[-1])) p3--;
407
    while(p3[-1]=='\\') p3--;
408
    *p3=0;
409
    i=search_list(main_config,MAIN_CONFIG_NO,sizeof(main_config[0]),p);
410
    if(i<0) continue; /* name non-defined */
411
    if(main_config[i].is_integer==1) {
412
      int *ip;
413
      ip=main_config[i].address;
414
      *ip=atoi(p2); if(*ip<0) *ip=0;
10 reyssat 415
    }
416
    else {
12239 bpr 417
      char **cp;
418
      cp=main_config[i].address;
419
      *cp=p2;
10 reyssat 420
    }
12239 bpr 421
  }
422
  fileend:
423
  setenv("session_base_dir",session_dir,1);
424
  determine_ref_name();
425
  language_list();
426
  for(i=0;i<MAIN_CONFIG_NO;i++) {
427
    char **pp;
428
    if(main_config[i].is_integer==2) {
429
      pp=main_config[i].address;
430
      setenv(main_config[i].name,*pp,1);
10 reyssat 431
    }
12239 bpr 432
  }
433
        /* check priority */
434
  if(priority[0] && checkhost(priority)>0) ispriority=1;
435
  (void)getcwd(cwdbuf,sizeof(cwdbuf)); setvar("httpd_PWD",cwdbuf);
436
  setenv("wims_server_base",cwdbuf,1);
437
  p=strrchr(cwdbuf,'/');
438
  if(p!=NULL && strcmp(p,"/public_html")==0) {
439
    *p=0; snprintf(PATH,sizeof(PATH),"%s/other/bin:%s",cwdbuf,commonpath);
440
    force_setvar("wims_home",cwdbuf);
441
    *p='/';
442
  }
443
  else {
444
    snprintf(PATH,sizeof(PATH),"%s/../other/bin:%s",cwdbuf,commonpath);
445
    force_setvar("wims_home",cwdbuf);
446
  }
447
  setenv("PATH",PATH,1);
448
  p=getvar("httpd_SERVER_SOFTWARE");
449
  if(p && (strstr(p,"Apache"))!=NULL && strstr(aliased_getfile,"yes")!=NULL)
450
    good_httpd=1;
451
  accessfile(buf,"r","../tmp/log/myip");
452
  *find_word_end(buf)=0;
453
  if(buf[0]) {
454
    snprintf(nodeip,sizeof(nodeip),"%s",buf);
455
    snprintf(temp_log,sizeof(temp_log),"%s.%s",TEMP_LOG_FILE,nodeip);
456
    force_setvar("wims_priv_nodeip",nodeip);
457
  }
458
  else {
459
    nodeip[0]=0;
460
    snprintf(temp_log,sizeof(temp_log),"%s",TEMP_LOG_FILE);
461
  }
10 reyssat 462
}
463
 
464
struct {
12239 bpr 465
  int rname;
466
  int *rval;
10 reyssat 467
} resource_table[]={
468
#ifdef RLIMIT_CPU
12270 bpr 469
  {RLIMIT_CPU, &rlimit_cpu},
10 reyssat 470
#endif
471
#ifdef RLIMIT_FSIZE
12270 bpr 472
  {RLIMIT_FSIZE, &rlimit_fsize},
10 reyssat 473
#endif
474
#ifdef RLIMIT_AS
12270 bpr 475
  {RLIMIT_AS, &rlimit_as},
10 reyssat 476
#endif
477
#ifdef RLIMIT_DATA
12270 bpr 478
  {RLIMIT_DATA, &rlimit_data},
10 reyssat 479
#endif
480
#ifdef RLIMIT_STACK
12270 bpr 481
  {RLIMIT_STACK, &rlimit_stack},
10 reyssat 482
#endif
483
#ifdef RLIMIT_CORE
12270 bpr 484
  {RLIMIT_CORE, &rlimit_core},
10 reyssat 485
#endif
486
#ifdef RLIMIT_RSS
12270 bpr 487
  {RLIMIT_RSS, &rlimit_rss},
10 reyssat 488
#endif
489
#ifdef RLIMIT_NPROC
12270 bpr 490
  {RLIMIT_NPROC, &rlimit_nproc},
10 reyssat 491
#endif
492
#ifdef RLIMIT_NOFILE
12270 bpr 493
  {RLIMIT_NOFILE, &rlimit_nofile},
10 reyssat 494
#endif
495
#ifdef RLIMIT_MEMLOCK
12270 bpr 496
  {RLIMIT_MEMLOCK, &rlimit_memlock}
10 reyssat 497
#endif
498
};
499
#define RESOURCE_NO (sizeof(resource_table)/sizeof(resource_table[0]))
500
 
7673 bpr 501
/* set system resource limits */
10 reyssat 502
void set_rlimits(void)
503
{
12239 bpr 504
  int i;
505
  struct rlimit rlim;
7079 bpr 506
 
12239 bpr 507
  for(i=0;i<RESOURCE_NO;i++) {
508
    rlim.rlim_cur=rlim.rlim_max=*(resource_table[i].rval);
509
    setrlimit(resource_table[i].rname,&rlim);
510
    if(resource_table[i].rname==RLIMIT_CPU) {
511
      setvar("wims_cpu_limit",int2str(rlim.rlim_max));
512
      initalarm();
10 reyssat 513
    }
12239 bpr 514
  }
10 reyssat 515
}
516
 
517
struct {
12239 bpr 518
  char *name;
519
  int is_integer;
520
  void *default_value;
10 reyssat 521
} module_default[]={
12239 bpr 522
  {"anim_format",0, &DEFAULT_ANIM_FORMAT},
523
  {"gnuplot_format",0, &gnuplot_format},
524
  {"ins_anim_limit",1, &ANIM_LIMIT},
525
  {"ins_density",0, &DEFAULT_INS_DENSITY},
526
  {"ins_format",0, &DEFAULT_INS_FORMAT},
527
  {"insplot_font",0, &DEFAULT_INSPLOT_FONT},
528
  {"wims_busyhours",0, &busyhours},
529
  {"wims_class_limit",1, &class_limit},
530
  {"wims_class_quota",1, &class_quota},
531
  {"wims_class_regpass",0, &class_regpass},
532
  {"wims_class_user_limit",1, &class_user_limit},
533
  {"wims_compare_precision",1, &DEFAULT_COMPARE_PRECISION},
534
  {"wims_devel_modules",0, &devel_modules},
535
  {"wims_doc_quota",1, &doc_quota},
536
  {"wims_doc_regpass",0, &doc_regpass},
537
  {"wims_examlog_limit",1, &examlog_limit},
538
  {"wims_forum_limit",1, &forum_limit},
539
  {"wims_bgcolor",0, &bgcolor},
540
  {"wims_bgimg",0, &bgimg},
541
  {"wims_css",0, &pagecss},
542
  {"wims_link_color",0, &link_color},
543
  {"wims_print_precision", 1, &DEFAULT_PRINT_PRECISION},
544
  {"wims_ref_bgcolor",0, &ref_bgcolor},
545
  {"wims_ref_button_bgcolor",0, &ref_button_bgcolor},
546
  {"wims_ref_button_color",0, &ref_button_color},
547
  {"wims_ref_button_help_bgcolor",0, &ref_button_help_bgcolor},
548
  {"wims_ref_button_help_color",0, &ref_button_help_color},
549
  {"wims_ref_menucolor",0, &ref_menucolor},
550
  {"wims_show_author",0, &show_author},
551
  {"wims_show_ip",0, &show_ip},
552
  {"wims_show_stat",0, &show_stat},
553
  {"wims_site_description",0, &site_description},
554
  {"wims_site_keywords",0, &site_keywords},
555
  {"wims_site_manager",0, &site_manager},
556
  {"wims_texalign",1, &mathalign_base},
557
  {"wims_texbasesize",1, &texbasesize},
558
  {"wims_theme",0, &theme},
559
  {"wims_theme_icon",0, &theme_icon},
560
  {"wims_tmp_debug",0, &tmp_debug},
561
  {"wims_usecookie",0, &usecookie},
562
  {"wims_user_limit",1, &user_limit},
563
  {"wims_vlink_color",0, &vlink_color},
12357 obado 564
  {"wims_hlink_color",0, &hlink_color},
16516 guerimand 565
  {"wims_superclass_quota", 1, &superclass_quota},
18098 reyssat 566
  {"wims_mail_addrsep", 0, &mail_addrsep},
16516 guerimand 567
  {"wims_mail_hidden", 0, &mail_hidden}
10 reyssat 568
};
569
#define MODULE_DEFAULT_NO (sizeof(module_default)/sizeof(module_default[0]))
570
 
8851 bpr 571
/* Set defaults for module, and set corresponding variables. */
10 reyssat 572
void module_configure(void)
573
{
12239 bpr 574
  int i;
575
  confset=1;
576
  for(i=0;i<MODULE_DEFAULT_NO;i++) {
577
    if(module_default[i].is_integer) {
578
      int j, *jp;
579
      jp=module_default[i].default_value;
580
      j=*jp; if(j<0) j=0;
581
      setvar(module_default[i].name,int2str(j));
10 reyssat 582
    }
12239 bpr 583
    else {
584
      char **cp;
585
      cp=module_default[i].default_value;
586
      setvar(module_default[i].name,*cp);
587
    }
588
  }
589
  setenv("texgif_fontdir",texgif_fontdir,1);
590
  setenv("texgif_texheader",texgif_texheader,1);
591
  setvar("wims_texsize","0");
592
  setvar("disable_zoom","0");
593
  setvar("disable_mathml","0");
594
  setvar("force_mathml","0");
595
  /* if 'force_mathml=yes' , a check should be done on the value of 'disable_mathml'.
596
     so it's not fool-proof.
597
  */
598
  confset=0;
10 reyssat 599
}
600
 
601
char *modindex[]={
12239 bpr 602
  "address",
603
  "author",
604
  "category",
605
  "copyright",
606
  "data",
16952 bpr 607
  "deprecated",
12239 bpr 608
  "description",
609
  "description_ca",
610
  "description_cn",
611
  "description_de",
612
  "description_en",
613
  "description_es",
614
  "description_fr",
615
  "description_it",
616
  "description_nl",
617
  "description_si",
618
  "description_tw",
619
  "domain",
620
  "help",
621
  "keywords",
622
  "keywords_ca",
623
  "keywords_cn",
624
  "keywords_de",
625
  "keywords_en",
626
  "keywords_es",
627
  "keywords_fr",
628
  "keywords_it",
629
  "keywords_nl",
630
  "keywords_si",
631
  "keywords_tw",
632
  "language",
633
  "level",
634
  "maintainer",
635
  "maintainer_address",
636
  "mode",
637
  "require",
638
  "scoring",
639
  "title",
640
  "title_ca",
641
  "title_cn",
642
  "title_de",
643
  "title_en",
644
  "title_es",
645
  "title_fr",
646
  "title_it",
647
  "title_nl",
648
  "title_si",
649
  "title_tw",
16952 bpr 650
  "translation_language",
12239 bpr 651
  "translator",
652
  "translator_address",
653
  "translator_address_ca",
654
  "translator_address_cn",
655
  "translator_address_de",
656
  "translator_address_en",
657
  "translator_address_es",
658
  "translator_address_fr",
659
  "translator_address_it",
660
  "translator_address_nl",
661
  "translator_address_si",
662
  "translator_address_tw",
663
  "translator_ca",
664
  "translator_cn",
665
  "translator_de",
666
  "translator_en",
667
  "translator_es",
668
  "translator_fr",
669
  "translator_it",
670
  "translator_nl",
671
  "translator_si",
672
  "translator_tw",
673
  "vardef",
674
  "version",
675
  "wims_version",
10 reyssat 676
};
8185 bpr 677
int MODINDEX_NO=(sizeof(modindex)/sizeof(modindex[0]));
678
 
10 reyssat 679
char *module_special_file[]={
12239 bpr 680
  "intro","help"
10 reyssat 681
};
682
#define MODSPEC_NO (sizeof(module_special_file)/sizeof(module_special_file[0]))
683
 
8185 bpr 684
/* read and treat module's INDEX file */
10 reyssat 685
void module_index(void)
686
{
12239 bpr 687
  char buf[MAX_NAMELEN+1], ind_buf[MAX_LINELEN+1];
688
  char *e, *p, *p2, *ft;
689
  double v1, v2;
17894 bpr 690
  int i;
12239 bpr 691
  long indf_len;
7079 bpr 692
 
12239 bpr 693
  memmove(var_def_file,default_var_def,strlen(default_var_def)+1);
694
  ft=readfile(mkfname(NULL,"%s/INDEX",module_prefix),
695
          ind_buf,sizeof(ind_buf));
696
  if(ft==NULL) ft=readfile(mkfname(NULL,"%s/index",module_prefix),
697
                     ind_buf,sizeof(ind_buf));
698
  if(ft==NULL) return;
699
  e=ind_buf-1; indf_len=strlen(ind_buf);
17894 bpr 700
  for( ; e<ind_buf+indf_len && e!=NULL;){
12239 bpr 701
    p=e+1; e=strchr(p,'\n'); if(e!=NULL) *e=0;
702
    strip_trailing_spaces(p); p=find_word_start(p);
703
    if(*p==0 || *p==comment_prefix_char) continue; /* empty or comment line */
704
    p2=strchr(p,'=');
705
    if(p2==NULL) continue; /* syntax error */
706
    *p2=0; *find_word_end(p)=0; p2=find_word_start(p2+1);
707
    i=search_list(modindex,MODINDEX_NO,sizeof(modindex[0]),p);
708
    if(i<0) continue; /* name not in list */
709
    snprintf(buf,sizeof(buf),"module_%s",p);
710
    setvar(buf,p2);
711
  }
712
  if(mode!=mode_default) {
713
    char *s;
714
    s=getvar("module_mode");
715
    if(s==NULL) {
716
      nomode: mode=mode_default; force_setvar("wims_mode","");
10 reyssat 717
    }
12239 bpr 718
    else switch(mode) {
719
      case mode_popup: {
720
        if(strstr(s,"popup")==NULL) goto nomode;
721
        else break;
8851 bpr 722
      }
12239 bpr 723
      case mode_raw: {
724
        if(strstr(s,"raw")==NULL) goto nomode;
725
        else break;
726
      }
727
      default: break;
10 reyssat 728
    }
12239 bpr 729
  }
7673 bpr 730
/* test for existence of some special files in module's directory */
12239 bpr 731
  for(i=0;i<MODSPEC_NO;i++) {
732
    if(ftest(mkfname(NULL,"%s/%s.phtml",module_prefix,module_special_file[i]))
733
      ==is_file) {
734
      snprintf(buf,sizeof(buf),"module_has_%s",module_special_file[i]);
735
      setvar(buf,"yes");
10 reyssat 736
    }
12239 bpr 737
  }
738
  p=getvar("module_language"); if(p==NULL || *p==0) setvar("module_language","en");
739
  setvar("module_has_about","yes"); /* now we have default about.phtml */
7673 bpr 740
/* Set var_def */
12239 bpr 741
  p=getvar("module_vardef");
742
  if(p!=NULL && *p!=0) mystrncpy(var_def_file,p,sizeof(var_def_file));
743
  p=getvar("module_wims_version"); if(p!=NULL && *p!=0) {
744
    v1=atof(p); v2=atof(wims_version);
745
    if(isfinite(v1) && isfinite(v2) &&
7673 bpr 746
        (v1>v2 || (v1==v2 && strcmp(find_word_start(p),wims_version)>0))) {
12239 bpr 747
      setvar("module_wims_version",p);
748
      setvar("wims_version",wims_version);
749
      module_error("antidated_version");
10 reyssat 750
    }
12239 bpr 751
  }
752
  if(isdevelmodule) {
753
    p=getvar("module_scoring");
754
    if(p==NULL || strcasecmp(p,"yes")!=0) isdevelmodule=0;
755
  }
10 reyssat 756
}
757
 
7673 bpr 758
/* Set up a unique job identity as a 4-bytes integer */
10 reyssat 759
unsigned long create_job_ident(void)
760
{
2348 czzmrn 761
/* unsigned long it; // 64-bit compatibility: take away _long_ */
12239 bpr 762
  unsigned long it;
763
  int i;
7673 bpr 764
/* Is this enough to guarantee uniqueness? */
7079 bpr 765
 
12239 bpr 766
  it=(nowtime<<16)+(getpid()&0xffff);
7673 bpr 767
/* The encryption is very simple. */
12239 bpr 768
  it=it^0x5a3c9671;
769
  for(i=0;i<MAX_SESRANDOM;i++) sesrandomtab[i]=random();
1679 bpr 770
    /* ensure that the result will be a 4-bytes integer gives random problem on 32 bits
2607 bpr 771
    return it;*/
12239 bpr 772
  return it & 0xffffffff;
10 reyssat 773
}
774
 
7673 bpr 775
/* Setup a job identifier */
10 reyssat 776
void set_job_ident(void)
777
{
12239 bpr 778
  unsigned long l,r;
7079 bpr 779
 
12239 bpr 780
  l=create_job_ident();
781
  /* the last 4 bits always make 0xA. A bug of glibc random()? */
782
  r=random()>>4;
783
  snprintf(job_identifier,sizeof(job_identifier),"%lX%08lX",r,l);
784
  var_noexport=1;
785
  setvar("job_identifier",job_identifier);
786
  var_noexport=0;
10 reyssat 787
}
788
 
7673 bpr 789
/* define the variable $wims_html_header */
10 reyssat 790
void define_html_header(void)
791
{
15518 obado 792
  char *sp, *cp, *ladirection, *mp, *s2, *wversion;
12239 bpr 793
  char buf[MAX_LINELEN+1];
12442 obado 794
  int buf_length = 0;
12239 bpr 795
  int noc;
796
  noc=0;
797
  cp=getvar("wims_expire"); if(cp!=NULL) goto css;
798
  if(!robot_access && cmd_type==cmd_intro && isclassmodule) {
799
    sp=getvar("special_parm"); if(sp==NULL) sp="";
800
    if(strcmp(sp,".nocache.")==0) {
801
      force_setvar("special_parm",""); noc=1;
10 reyssat 802
    }
12239 bpr 803
    if(!noc) {
804
      mp=getvar(ro_name[ro_module]);
805
      if(mp!=NULL && strncmp(mp,"devel/",strlen("devel/"))==0) noc=1;
806
    }
807
  }
13359 obado 808
  if(noc==1){
809
    _output_("Cache-Control: no-cache, no-store, must-revalidate\r\n");
810
  }
12417 obado 811
  css:
812
  setvar("wims_CSS","");
813
  /* wims_css peut avoir pour valeur "---" ou "-theme-" au niveau du site
814
    + la valeur "class" si une classe décide d'utiliser son propre css à la place du theme
815
  */
12239 bpr 816
  cp=getvar("wims_css");
817
  ladirection=getvar("wims_main_dirn");
818
  if (strcmp(ladirection,"ltr")==0) ladirection="";
12417 obado 819
 
12239 bpr 820
  if(!robot_access && cp!=NULL && *cp!=0 && strstr(cp,"---")==NULL) {
821
    char *nbuf;
822
    cp=find_word_start(cp);
15518 obado 823
 
12239 bpr 824
    if(strchr(cp,'/')==NULL) {
12417 obado 825
      char *pc, *th, *ti; int class_style=0;
12239 bpr 826
      pc=getvar("wims_class");
15518 obado 827
      wversion=getvar("wims_version");
828
      if(wversion==NULL || *wversion==0) wversion="0.0";
12425 obado 829
 
830
      /* When a class choose its own css instead of theme css */
12239 bpr 831
      if(pc!=NULL && *pc!=0 && strcmp(cp,"class")==0) {
832
        nbuf=mkfname(NULL,"%s/%s/css",class_base,pc);
833
        th=getvar("class_theme");ti=getvar("class_theme_icon") ;
834
        if(th==NULL || *th==0) th=getvar("wims_theme");
835
        if(ti==NULL || *ti==0) ti=getvar("wims_theme_icon");
12417 obado 836
 
837
        // Check content of "nbuf" file. (if file is too heavy (>45Ko), it will raise a user_error)
12425 obado 838
        if( readfile(nbuf,tmplbuf,sizeof(tmplbuf)) ){
839
          // file exist
840
          //snprintf(buf,sizeof(buf),"<style>%s</style>",tmplbuf);
841
          // The content will be added by scripts/adm/css.phtml
842
          class_style = 1;
12417 obado 843
        }
12239 bpr 844
      }
12425 obado 845
 
846
      if (!class_style) {
12239 bpr 847
        th=getvar("wims_theme");
12425 obado 848
        /* when wims_css is everything but '---' */
849
        if(strcmp(cp,"---")!=0 && strchr(th,'.')==NULL) {
850
          if(th==NULL || *th==0) th="standard";
851
          nbuf=mkfname(NULL,"html/themes/%s/css.css",th);
12417 obado 852
 
12425 obado 853
          // Check if theme css file exists (use access from unistd.h)
854
          if( access( nbuf, F_OK ) != -1 ) {
17170 bpr 855
            buf_length = snprintf(buf,sizeof(buf),"<link href=\"%s?ver=%s\" rel=\"stylesheet\">", nbuf, wversion);
12425 obado 856
          }
12239 bpr 857
        }
858
      }
12425 obado 859
      /* icon theme */
860
      ti=getvar("wims_theme_icon");
861
      if(ti==NULL || *ti==0) ti="default";
17170 bpr 862
      snprintf(buf+buf_length,sizeof(buf)-buf_length,"<link href=\"gifs/themes/%s/icon-min.css?ver=%s\" rel=\"stylesheet\">", ti, wversion);
7673 bpr 863
 
12425 obado 864
      setvar("wims_CSS",buf);
865
 
866
      /* case of theme */
12239 bpr 867
      if (th) {
868
        s2=getvar("module_title");
869
        if(s2!=NULL && *s2!=0) {
15503 bpr 870
          char nbuf[MAX_LINELEN+1];
871
          mystrncpy(nbuf,s2,sizeof(nbuf)); calc_detag(nbuf); setvar("module_title2",nbuf);
12239 bpr 872
        };
873
        nbuf=mkfname(NULL,"html/themes/%s/htmlheader.phtml",th) ;
874
        if (readfile(nbuf,tmplbuf,sizeof(tmplbuf))) html_header=nbuf ;
875
      }
10 reyssat 876
    }
12239 bpr 877
  }
12417 obado 878
  if(readfile(html_header,buf,sizeof(buf)))
879
  setvar("wims_html_header",buf);
10 reyssat 880
}
881
 
10875 obado 882
/* Set Session Dir */
10 reyssat 883
void setsesdir(char *d)
884
{
12239 bpr 885
  char buf[MAX_FNAME+1];
886
  if(strstr(d,parent_dir_string)!=NULL) {
887
    force_setvar("wims_session",robot_session);
888
    mystrncpy(buf,robot_session,sizeof(buf));
889
    mkfname(session_dir,"../tmp");
890
    mkfname(s2_dir,"../tmp");
891
  }
892
  else {
893
    force_setvar("wims_session",d);
894
    snprintf(buf,sizeof(buf),"%s/%s",SESSION_BASE,d);
895
    mkfname(session_dir,"../%s",SESSION_BASE);
7673 bpr 896
/* mkfname(s2_dir,"../%s",S2_BASE); */
12239 bpr 897
  }
898
  force_setvar("wims_sesdir",buf);
10 reyssat 899
}