ezs.c File Reference

#include "cgi.h"

Include dependency graph for ezs.c:

Go to the source code of this file.

Defines

#define USE_MUTEX

Functions

int ODBCRunScript (char *argv0, EZSSTREAM *result, char *dbname, CGINameValue *config, CGINameValue *Params, char *search)
char * itos (unsigned int value, char *p)
void GenerateSessionID (char *session, unsigned int i)
void GenerateUniqueID (char *newsession, char *hash)
int CheckFileName (char *Name, char *AllowedEndings)
int DeleteOldRecords (FILE *database, CGINameValue *header, CGINameValue *Params)
int FindUserRecordASC (char *idfields, FILE *database, CGINameValue *header, CGINameValue *Params)
CGINameValueLoadUserDataASC (CGINameValue *config, char *argv0, char *dbname, CGINameValue *Params, int *err)
CGINameValueLoadUserDataSQL (CGINameValue *config, char *argv0, char *dbname, CGINameValue *Params, int *err)
CGINameValueLoadUserData (CGINameValue *config, char *argv0, char *dbname, CGINameValue *Params, int *err)
static char * JSShowPage (ScriptEnvironment *Env, char *cmd, int argc, char **argv, CGINameValue *Params)
static char * JSUniqueId (ScriptEnvironment *Env, char *cmd, int argc, char **argv, CGINameValue *Params)
static char * JSTimeDate (ScriptEnvironment *Env, char *cmd, int argc, char **argv, CGINameValue *Params)
static char * JSTimeTime (ScriptEnvironment *Env, char *cmd, int argc, char **argv, CGINameValue *Params)
static char * JSSendMail (ScriptEnvironment *Env, char *cmd, int argc, char **argv, CGINameValue *Params)
static int SortFunction (const void *a0, const void *b0)
void SortNVP (CGINameValue *list)
static char * JSRankSort (ScriptEnvironment *Env, char *cmd, int argc, char **argv, CGINameValue *Params)
static char * JSRankIndex (ScriptEnvironment *Env, char *cmd, int argc, char **argv, CGINameValue *Params)
static char * JSSQLEscape (ScriptEnvironment *Env, char *cmd, int argc, char **argv, CGINameValue *Params)
int ValidatePage (char *argv0, EZSSTREAM *htmlout, char *dbname, CGINameValue *Config, CGINameValue *Params, char *page)
int ValidateBack (char *argv0, EZSSTREAM *htmlout, char *dbname, CGINameValue *Config, CGINameValue *Params, char *page)
int ShowForm (char *argv0, EZSSTREAM *htmlout, char *formname, CGINameValue *Params)
int ShowFormPage (char *argv0, EZSSTREAM *htmlout, char *dbname, CGINameValue *Params, char *history, char *curpage)
int CalcCountSummary (CGINameValue *Params, char *fieldname)
int TryODBC (SQLDB *db, char *argv0, char *dbname, CGINameValue *config, CGINameValue *Params, char *script)
int GetRespcount (char *argv0, char *dbname)
int SetRespcount (char *argv0, char *dbname, int i)
int SaveData (char *argv0, char *dbname, CGINameValue *Params, CGINameValue *config, int SubtractOldStats)
int PrintFinish (char *argv0, EZSSTREAM *htmlout, char *dbname, CGINameValue *config, CGINameValue *Params, int ret)
void ShowProgramStatus (EZSSTREAM *htmlout, int Security)
int SecurityError (EZSSTREAM *htmlout, CGINameValue *Params, char *dbname, char *action, int error)
int Login (EZSSTREAM *htmlout, int Security, char *dbname, CGINameValue *Params, char *argv0, CGINameValue *config)
int PrintInstructions (EZSSTREAM *htmlout)
int CGImain (char *argv0, CGINameValue *Params, EZSSTREAM *htmlout)


Define Documentation

#define USE_MUTEX
 


Function Documentation

int CalcCountSummary CGINameValue Params,
char *  fieldname
 

Definition at line 1082 of file ezs.c.

References CGIFREE, GetField(), HasToken(), CGINameValue::name, strdup(), and CGINameValue::value.

Referenced by SaveData(), and UpdateStatistics().

01083 {
01084      CGINameValue* start;
01085      start = GetField(Params,fieldname);
01086 
01087      /* Q1 or Q1_A */
01088      if (start)
01089       if (start->value)
01090        return *start->value ? 1 : 0;
01091 
01092      if (strchr(fieldname,'_')) /* is that specific answer set? Q1_1 or Q1=1&Q1=2 */
01093       {
01094        char* name = strdup(fieldname);
01095        char* code = strchr(name,'_');
01096        size_t l;
01097        *code=0;
01098        l = strlen(name);
01099        start = GetField(Params,name);
01100        if (!start) {CGIFREE(name); return 0; } /* no answers to this question */
01101        while (start->name) /* related field values are adjacent */
01102         {
01103          if (strncmp(start->name,name,l))
01104           break;
01105 
01106          if (start->value)
01107           if ((start->name[l] == '_' || start->name[l] == 0) && *start->value)
01108            if (HasToken(start->value,code+1,0))
01109             {CGIFREE(name); return 1;}
01110 
01111          start++;
01112         }
01113        CGIFREE(name);
01114       }
01115      else /* is any Q1 or Q1_1 set? */
01116       {
01117        start = GetField(Params,fieldname);
01118        if (!start)
01119        {
01120         size_t l = strlen(fieldname);
01121         start = Params;
01122         while (start->name)
01123         {
01124          if (!strncmp(start->name,fieldname,l))
01125           if (start->value)
01126            if ((start->name[l] == '_' || start->name[l] == 0) && *start->value)
01127             return 1;
01128 
01129          start++;
01130         }
01131        }
01132       }
01133 
01134  return 0;
01135 }

int CGImain char *  argv0,
CGINameValue Params,
EZSSTREAM htmlout
 

  • _PAGE stores the page currently being viewed
  • _PAGENEXT is a FIFO of the pages to go to. New pages are appended
  • _PAGEBACK is a LIFO for the "Previous" button. New pages are prepended

For both of these lists, the "current" value is taken from the beginning of the comma-delimited values.

Definition at line 2041 of file ezs.c.

References BufferWrite(), CGI_ALLOW_APPEND, CGI_ALLOW_NONE, CGI_ALLOW_REPORT, CGI_ALLOW_UPDATE, CGIFCLOSE, CGIFOPEN, CGIFREE, CGIMALLOC, ClearToken(), CopyBuffer(), DebugShowNVP(), DeleteBuffer(), DeleteNVP(), ExpandLocalPath(), FileOpen(), GenerateUniqueID(), GetField(), GetFieldValue, GetSecurityFlags(), GetSetting(), GetTime(), HasToken(), HTMLEscape(), HTMLWrite(), LoadUserData(), LogError(), Login(), MAXPATH, NewBuffer(), NULL, NULLSTR, PopList(), PopList2(), PrintFinish(), PrintInstructions(), ReadINIFileSection(), ReadUntilChar(), RenameField(), RunReport(), SaveData(), SecurityError(), SendCGIHeader(), SendMail(), SetFieldValue(), ShowForm(), ShowFormPage(), ShowProgramStatus(), strdup(), strdup3(), stricmp(), strnicmp(), ValidateBack(), and ValidatePage().

02043 {/* CGIMain */
02044  char * dbname = GetFieldValue(Params,"DATABASE");
02045  char * password = GetFieldValue(Params,"_PASSWORD");
02046  char * action = GetFieldValue(Params,"_ACTION");
02047  char * page = GetFieldValue(Params,"_PAGE");
02048  char * session = GetFieldValue(Params,"_SESSION");
02049  char * ErrorMessage = "";
02050  char firstPW[64];
02051 
02052  CGINameValue* config = NULL;
02053 
02054  int ret = 0;
02055  int hasuid;
02056  int needslogin;
02057  int multipage;
02058  int hasSession;
02059 
02060  /* the security level depends on what you're trying to do */
02061  int Security = GetSecurityFlags(argv0,GetFieldValue(Params,"HOST"),dbname,password);
02062 
02063  if (Security == CGI_ALLOW_NONE || !Params || !*dbname)
02064   {
02065    SendCGIHeader(htmlout,NULL);
02066    return PrintInstructions(htmlout);
02067   }
02068 
02069 /*    an error here could be a security warning or a buffer overrun attempt
02070  *    we don't want to pipe it through the mail, since long values could
02071  *    be used to cause a buffer overrun in sendmail. We also don't want to
02072  *    send email that would flood the administrator's mailbox.
02073  */
02074 
02075  if (*page) if (strlen(page) < 5)
02076  {
02077    SendCGIHeader(htmlout,NULL);
02078    HTMLWrite(htmlout,"Bad page name: ");
02079    HTMLEscape(htmlout,page);
02080    return 103;
02081  }
02082 
02083  if (!ret) if (strlen(dbname)>128) ret = 102;
02084  if (!ret) if (strlen(password)>128) ret = 102;
02085  if (!ret) if (strlen(action)>128) ret = 102;
02086  if (!ret) if (strlen(page)>128) ret = 102;
02087 
02088  if (ret)
02089  {
02090    return ret;
02091  }
02092  else
02093  {
02094     char fn[MAXPATH];
02095     ExpandLocalPath(argv0,fn,dbname,".ini");
02096     /* If you want to use a fixed, obfuscated .ini file name, do it here */
02097     /* ExpandLocalPath(argv0,fn,"my secret file name.ini","") */
02098     config = ReadINIFileSection(fn,"DATABASE",0);
02099 
02100    if (config == NULL)
02101    {
02102    SendCGIHeader(htmlout,NULL);
02103 
02104    PrintInstructions(htmlout);
02105 
02106    HTMLWrite(htmlout,argv0);
02107    HTMLWrite(htmlout,": A configuration file for the database \"<b>");
02108    HTMLEscape(htmlout,dbname);
02109    HTMLWrite(htmlout,"</b>\" was not found. Please check your spelling and server setup and try again.<P>\n");
02110    HTMLWrite(htmlout,"Cannot access file (");
02111    HTMLEscape(htmlout,dbname);
02112    HTMLWrite(htmlout,".ini)");
02113    LogError("\nCould not open config file ");
02114    LogError(fn);
02115    return 21;
02116    }
02117  }
02118 
02119   dbname = strdup(dbname);
02120   action = strdup(action);
02121   password = strdup(password);
02122   page = strdup(page);
02123 
02124   /* fix up the form data. Password doesn't get erased -- might need it later.*/
02125   RenameField(Params,"DATABASE",0);
02126   RenameField(Params,"_ACTION",0);
02127 
02128   /* options that we'll need to refer to later */
02129   if (!atoi(GetSetting(config,"ACTIVE","1")))
02130   {
02131    SendCGIHeader(htmlout,NULL);
02132    PrintInstructions(htmlout);
02133   }
02134 
02135   needslogin = atoi(GetFieldValue(config,"HASUID"));
02136   hasSession = *GetFieldValue(config,"_SESSION");
02137   multipage = atoi(GetFieldValue(config,"MULTIPAGE"));
02138 
02139   {
02140    char*c;
02141    firstPW[0]=0;
02142    strncpy(firstPW,GetSetting(config,"IDFIELDS","IFMUID"),sizeof(firstPW));
02143    firstPW[sizeof(firstPW)-1]=0;
02144    c = strchr(firstPW,',');
02145    if (c) *c=0;
02146    hasuid = (*GetFieldValue(Params,firstPW) != 0);
02147   }
02148 
02149   if (!*session)
02150   {
02151    char newsession[48];
02152    GenerateUniqueID(newsession, GetFieldValue(config,"HOST"));
02153    SetFieldValue(Params,"_SESSION",newsession);
02154   }
02155 
02156 /* to limit the number of responses, set "MAXRESPONSES=100" and "MAXMESSAGE=http://..."
02157  * in the project's .ini file. On Windows, a file called "counts.ini" will be created,
02158  * and the number of responses received in each project saved in that file. On UNIX,
02159  * it's dbname.respcount, and the file is binary. When the max number of responses
02160  * have been finally submitted, the project will close, and this CGI program will no
02161  * longer work, instead directing respondents to a web page with an explanation or displaying
02162  * a message.
02163  */
02164 
02165   {
02166    int maxResponses = atoi(GetSetting(config,"MAXRESPONSES",""));
02167    if (maxResponses != 0)
02168    {
02169     char filename[MAXPATH];
02170     int i = 0;
02171 
02172 #if defined(XP_WIN) &&!defined(__WINCE__)
02173     ExpandLocalPath(argv0,filename,"ezscounts.ini",0);
02174 #ifdef UNICODE
02175     i = GetPrivateProfileIntA("responses",dbname,0,filename);
02176 #else
02177     i = GetPrivateProfileInt("responses",dbname,0,filename);
02178 #endif
02179 #else
02180     ExpandLocalPath(argv0,filename,dbname,".respcount");
02181     {
02182         FILE * f;
02183         f = CGIFOPEN(filename,"rb");
02184         if (f) { fread(&i,sizeof(i),1,f); CGIFCLOSE(f);}
02185      }
02186 #endif
02187     if (i >= maxResponses)
02188      {
02189       ErrorMessage = GetSetting(config,"MAXMESSAGE","Sorry, this form is no longer available.");
02190       ret = 12;
02191      }
02192    }
02193   }
02194 
02195   if (!ret)
02196   {
02197    char* stoptime = GetFieldValue(config,"STOPDATE");
02198    if (*stoptime)
02199    {
02200     char now[16];
02201     size_t l = strlen(stoptime);
02202     GetTime(now, now+8,0);
02203     if (l < sizeof(now)) now[l]=0;
02204     if (strcmp(now,stoptime)>0)
02205      ret = 13;
02206    }
02207   }
02208 
02209   if (!ret)
02210   {
02211    char* active = GetFieldValue(config,"ACTIVE");
02212    if (*active)
02213     if (!atoi(active))
02214       ret = 13;
02215   }
02216 
02217   if (!ret) /* check password if no error set */
02218   {
02219    char* pwdfile = GetSetting(config,"PWDFILE","");
02220    if (*pwdfile)
02221    {
02222     char* userid = GetFieldValue(Params,firstPW);
02223 
02224     if (!*userid)
02225     {
02226         ret = 11;
02227     }
02228     else
02229     {
02230      FILE* pwlist;
02231      char line[128];
02232 
02233      pwlist = CGIFOPEN(pwdfile,"rt");
02234      ret = 11;
02235 
02236      if (pwlist)
02237      {
02238       while (ReadUntilChar(pwlist,line,128," \t\r\n",0) > 0)
02239       {
02240        if (!stricmp(line,userid)) /* if the password is found, clear the error */
02241         {ret = 0; break;}
02242       }
02243       CGIFCLOSE(pwlist);
02244      } /* search the list */
02245     }
02246    }
02247   }
02248 
02249   if (ret)
02250   {
02251    switch(ret)
02252    {
02253     case 11: ErrorMessage = GetSetting(config,"PWDMESSAGE","Sorry, you need a password to access this form."); break;
02254     case 12:
02255     case 13: ErrorMessage = GetSetting(config,"MAXMESSAGE","Sorry, this form is no longer available.");
02256    }
02257   }
02258   else
02259   {
02260     if (!stricmp(action,"REPORT"))
02261    {
02262     if (!(Security & CGI_ALLOW_REPORT))
02263     {
02264      SendCGIHeader(htmlout,NULL);
02265       ret = SecurityError(htmlout,Params,dbname,action,CGI_ALLOW_REPORT);
02266     }
02267     else
02268     {
02269      char *c;
02270      FILE *f;
02271 
02272      c = GetSetting(config,"REPORT2",NULLSTR);
02273      /*if (!*c) c = GetSetting(config,"REPORT",NULLSTR);  */
02274 
02275      /* use the filename from the config file, but in the current directory */
02276      f = *c ? FileOpen(argv0,c,"") : 0;
02277 
02278      /* 4d. Display the report you set above */
02279      SendCGIHeader(htmlout,NULL);
02280      if (f)
02281      {
02282       RunReport(argv0,htmlout,f,Params,NULL,NULL,0,NULL);
02283       CGIFCLOSE(f);
02284       ret = 0;
02285      }
02286      else
02287        HTMLWrite(htmlout,"Report file not found");
02288      }
02289    }
02290    else if (!*action || !stricmp(action,"START")) /* probably starting a form or loggin in */
02291    {
02292      char* form = GetFieldValue(config,"FORM");
02293      SendCGIHeader(htmlout,NULL);
02294 
02295      if (needslogin)
02296       {/* load stored data from the database */
02297        if (hasuid || (!stricmp(action,"START") && (Security &CGI_ALLOW_APPEND)))
02298        /* Do we already have login info? Or we'll allow them to enter it later*/
02299        {
02300          CGINameValue* userdata = NULL;
02301          if (hasuid)
02302           userdata = LoadUserData(config,argv0,dbname,Params,&ret);
02303 
02304          if (!ret)
02305          {
02306          if (userdata != NULL)
02307            {
02308             char* next = "";
02309           char* pageback = "";
02310           if (atoi(GetFieldValue(config,"FORGETPAGES"))==0)
02311           {
02312            next = GetFieldValue(userdata,"_PAGE");
02313            pageback = GetFieldValue(userdata,"_PAGEBACK");
02314           }
02315            if (!*next) next = GetSetting(config,"STARTPAGE","page0");
02316 
02317           if (Security & CGI_ALLOW_UPDATE)
02318            ret = multipage
02319                 ? ShowFormPage(argv0,htmlout,dbname,userdata,pageback,next)
02320                 : ShowForm(argv0,htmlout,form,userdata);
02321             else
02322           {
02323              ret = SecurityError(htmlout,Params,dbname,action,CGI_ALLOW_UPDATE);
02324            Login(htmlout,Security,dbname,Params,argv0,config);
02325           }
02326 
02327             DeleteNVP(userdata);
02328            }
02329            else if (!ret) /* no existing data: start a new form */
02330            {
02331             if (Security & CGI_ALLOW_APPEND)
02332            ret = multipage
02333                 ? ShowFormPage(argv0,htmlout,dbname,Params,"",GetSetting(config,"STARTPAGE","page0"))
02334                 : ShowForm(argv0,htmlout,form,Params);
02335             else
02336           {
02337              ret = SecurityError(htmlout,Params,dbname,action,CGI_ALLOW_APPEND);
02338            Login(htmlout,Security,dbname,Params,argv0,config);
02339           }
02340            }
02341          }
02342        } /* has uid */
02343        else /* log in page, come back to start later. */
02344        {
02345         Login(htmlout,Security,dbname,Params,argv0,config);
02346         }
02347       } /* needs login */
02348       else
02349       {/* show the first page */
02350        ret = multipage
02351                 ? ShowFormPage(argv0,htmlout,dbname,Params,"",GetSetting(config,"STARTPAGE","page0"))
02352                 : ShowForm(argv0,htmlout,form,Params);
02353        }
02354    } /* !*action */
02355    else if (multipage && !stricmp(action,"NEXT"))
02356    {/* go on to the next page, and add the current page to the history*/
02357     char* pagenext;
02358     char* pageback;
02359     char* skip;
02360 
02361     skip = GetFieldValue(Params,"_PAGESKIP");
02362 
02363     SendCGIHeader(htmlout,NULL);
02364 
02365     /* check validation, but save first */
02366 
02367     if (atoi(GetFieldValue(config,"SAVEPAGE")) && stricmp(skip,"(save)"))
02368      SaveData(argv0, dbname, Params, config, hasSession);
02369 
02370     if (*page) ValidatePage(argv0,htmlout,dbname,config,Params,page);
02371 
02372     pagenext = GetFieldValue(Params,"_PAGENEXT");
02373     pageback = GetFieldValue(Params,"_PAGEBACK");
02374     skip = GetFieldValue(Params,"_PAGESKIP");
02375 
02376     /* since we've been there, we can remove it from the future list */
02377     while (HasToken(pagenext,page,0))
02378        ClearToken(pagenext,page);
02379 
02380     if (*GetFieldValue(Params,"_PAGEWARN")) /* show the page again */
02381     {/* don't add anything to the history list */
02382      ret = ShowFormPage(argv0,htmlout,dbname,Params,pageback,page);
02383     }
02384     else
02385     {
02386      /* if this page was successful, go to the SUBMIT validation */
02387      if (!strcmp(skip,"(save)"))
02388       goto atSaveData;
02389 
02390       if (*skip && *pagenext) /* put the skip pages at the beginning of the list */
02391      {
02392       char * p;
02393        if (HasToken(pagenext,skip,0))
02394           ClearToken(pagenext,skip);
02395       p = strdup3(skip," ",pagenext);
02396       SetFieldValue(Params,"_PAGENEXT",p);
02397       CGIFREE(p);
02398      }
02399       else if (*skip)
02400          SetFieldValue(Params,"_PAGENEXT",skip);
02401 
02402      /* add the page we came from to the history */
02403      pageback = strdup3(page,",",pageback);
02404 
02405      /* what's the next page in the list? */
02406      CGIFREE(page);
02407      page = strdup(PopList(Params,"_PAGENEXT",0));
02408 
02409      /* skipping to several pages, to BACK should treat _PAGENEXT specially
02410         until it's done with this page */
02411      if (strchr(skip,','))
02412       page[0] = 'P';
02413 
02414      /* make copies of pagenext and pageback, which may get erased by ShowFormPage */
02415      ret = ShowFormPage(argv0,htmlout,dbname,Params,pageback,page);
02416      CGIFREE(pageback);
02417     }
02418    }
02419    else if (multipage && !stricmp(action,"BACK"))
02420    {/* go back a page, and don't add the current page to the history */
02421     char * pageback, * pagenext;
02422 
02423     SendCGIHeader(htmlout,NULL);
02424 
02425     ValidateBack(argv0,htmlout,dbname,config,Params,page);
02426 
02427     pageback = GetFieldValue(Params,"_PAGEBACK");
02428     pagenext = GetFieldValue(Params,"_PAGENEXT");
02429 
02430     if (*GetFieldValue(Params,"_PAGEWARN")) /* show the page again */
02431     {/* don't add anything to the history list */
02432      ret = ShowFormPage(argv0,htmlout,dbname,Params,pageback,page);
02433     }
02434      else
02435      {
02436      /* remove the last set of pages that were added */
02437 
02438      /* when we go forward again, the page that sent us here will be re-added
02439         to the future list by the validation script
02440         but only if we're returning from the first page in a skip list. Hmm, tricky
02441        */
02442 
02443     if (strchr(pagenext,' ')) /* we're in a skip subroutine */
02444     {
02445      if (toupper(page[0]) == 'P') /* going back from the first page in the subroutine, so clear the future list */
02446        PopList(Params,"_PAGENEXT",' ');
02447      else
02448      {
02449       /* we're going to need to remember this page */
02450       char * p = strdup3(page,",",pagenext);
02451       SetFieldValue(Params,"_PAGENEXT",p);
02452       CGIFREE(p);
02453      }
02454     }
02455 
02456     /* where are we going back to? */
02457     page = strdup(PopList2(pageback,0));
02458 
02459     ret = ShowFormPage(argv0,htmlout,dbname,Params,pageback,page);
02460      }
02461    }
02462    else if (!stricmp(action,"SAVE") || !stricmp(action,"SUBMIT"))
02463    {/* Save & Quit or done with the form */ /* save ODBC data first, so we get the key value */
02464     /* Check user id. Are we allowed to enter data? */
02465     atSaveData:
02466     {
02467      int allowsave = 1;
02468 
02469      if (!(Security & CGI_ALLOW_APPEND))
02470      {/* look for an existing record before saving */
02471 
02472       if (!(Security & CGI_ALLOW_UPDATE))
02473       {
02474        SendCGIHeader(htmlout,NULL);
02475        ret = SecurityError(htmlout,Params,dbname,action,CGI_ALLOW_APPEND);
02476       }
02477       else
02478       {
02479        CGINameValue* userdata;
02480        userdata = LoadUserData(config,argv0,dbname,Params,&ret);
02481 
02482        if (!userdata)
02483        {
02484          SendCGIHeader(htmlout,NULL);
02485          ret = SecurityError(htmlout,Params,dbname,action,CGI_ALLOW_APPEND);
02486        }
02487 
02488        DeleteNVP(userdata);
02489       }
02490      } /* security */
02491 
02492      if (!ret) /* OK so far */
02493      {
02494       /* Runs the SUBMIT validation page, which may save or modify field values */
02495        /* Last page -- also run the particular page's validation */
02496       if (!GetField(Params,"_PAGEWARN"))
02497       {/* the slot from DATABASE should be available */
02498        RenameField(Params,"","_PAGEWARN");
02499        /*SetFieldValue(Params,"_PAGEWARN","0"); */
02500       }
02501 
02502      if (multipage)
02503      {
02504       if (!stricmp(action,"SUBMIT")) /* final submission of a multi-page form. */
02505       {
02506        ValidatePage(argv0,htmlout,dbname,config,Params,page);
02507        if (*GetFieldValue(Params,"_PAGEWARN")) allowsave = 0;
02508        if (allowsave) SetFieldValue(Params,"_FORMDONE","1");
02509       }
02510       /* else don't validate: save & quit can never fail */
02511       if (allowsave)
02512        ValidatePage(argv0,htmlout,dbname,config,Params,"SUBMIT");
02513      }
02514      else
02515      {
02516       ValidatePage(argv0,htmlout,dbname,config,Params,"SUBMIT");
02517       if (*GetFieldValue(Params,"_PAGEWARN")) allowsave = 0;
02518       if (allowsave) SetFieldValue(Params,"_FORMDONE","1");
02519      } /*if multipage */
02520 
02521      if (allowsave == 0) /* show the page again */
02522      {
02523       /* SetFieldValue(Params,"_PAGEWARN","1"); */
02524       SendCGIHeader(htmlout,NULL);
02525       ret = multipage
02526                 ? ShowFormPage(argv0,htmlout,dbname,Params,GetFieldValue(Params,"_PAGEBACK"),page)
02527                 : ShowForm(argv0,htmlout,dbname,Params);
02528      }
02529      else
02530      {
02531       /* SUBMIT validation doesn't do error checking, so we can always run it.
02532         A SAVE action must always succeed, so we don't do validation for it */
02533       ret = SaveData(argv0,dbname, Params, config,
02534          (atoi(GetFieldValue(config,"SAVEPAGE")) && hasSession)
02535          || (hasuid && needslogin));
02536       PrintFinish(argv0,htmlout,dbname,config,Params,ret);
02537      } /* if allowsave == 0 */
02538     }
02539    } /* range of allowsave */
02540   } /* SAVE */
02541  } /* if ret */
02542 
02543  if (ret) /* something went wrong? */
02544  {
02545     if (ErrorMessage)
02546     {
02547         if (strnicmp(ErrorMessage,"http://",7) == 0)
02548         {
02549             char * temp = (char*)CGIMALLOC(strlen(ErrorMessage) + 16);
02550             sprintf(temp,"Location: %s\n\n",ErrorMessage);
02551             SendCGIHeader(htmlout,temp);
02552             CGIFREE(temp);
02553       }
02554       else
02555       {
02556             SendCGIHeader(htmlout,NULL);
02557             HTMLWrite(htmlout,ErrorMessage);
02558         }
02559    }
02560    else
02561    {
02562         SendCGIHeader(htmlout,NULL);
02563         HTMLWrite(htmlout,"<P>CGI error: unknown action<pre>");
02564         HTMLWrite(htmlout,"database: '");
02565         HTMLWrite(htmlout,dbname);
02566         HTMLWrite(htmlout,"'\npassword: '");
02567         HTMLWrite(htmlout,password);
02568         HTMLWrite(htmlout,"'\naction: '");
02569         HTMLWrite(htmlout,action);
02570         HTMLWrite(htmlout,"'\npage: '");
02571         HTMLWrite(htmlout,page);
02572         HTMLWrite(htmlout,"'\nsession: '");
02573         HTMLWrite(htmlout,session);
02574         HTMLWrite(htmlout,"'\nAll parameters: \n");
02575         DebugShowNVP(htmlout,Params);
02576    }
02577  }
02578 
02579  if (ret > 100)
02580  {
02581     char * msg;
02582     char* email = GetFieldValue(config,"ADMINEMAIL");
02583     if (*email)
02584     {
02585         char temp[32];
02586         TextBuffer* m = NewBuffer(1024);
02587         sprintf(temp,"%d",ret);
02588         BufferWrite(m,"Database: ");
02589         BufferWrite(m,dbname);
02590         BufferWrite(m,"\r\nError code: ");
02591         BufferWrite(m,temp);
02592         BufferWrite(m,"\r\nRemote host: ");
02593         BufferWrite(m,GetFieldValue(config,"HOST"));
02594         BufferWrite(m,"\r\nPage file: ");
02595         BufferWrite(m,page);
02596         BufferWrite(m,"\r\nAction: ");
02597         BufferWrite(m,action);
02598         BufferWrite(m,"\r\n_PAGE: ");
02599         BufferWrite(m,GetFieldValue(config,"_PAGE"));
02600         BufferWrite(m,"\r\n_PAGEBACK: ");
02601         BufferWrite(m,GetFieldValue(config,"_PAGEBACK"));
02602         BufferWrite(m,"\r\n_PAGENEXT: ");
02603         BufferWrite(m,GetFieldValue(config,"_PAGENEXT"));
02604         BufferWrite(m,"\r\n_PASSWORD: ");
02605         BufferWrite(m,password);
02606         BufferWrite(m,"\r\n");
02607         msg = CopyBuffer(m);
02608         SendMail(email, "Web access security violation",
02609             msg,
02610             GetSetting(config,"EMAILSERVER",""),
02611             GetSetting(config,"EMAILPROFILE","Windows Messaging Settings"),
02612             GetSetting(config,"EMAILNAME",""),
02613             GetSetting(config,"EMAILPWD",""));
02614         CGIFREE(msg);
02615         DeleteBuffer(m);
02616     }
02617     ShowProgramStatus(htmlout,Security);
02618  }
02619 
02620  DeleteNVP(config);
02621  if (dbname) CGIFREE(dbname);
02622  if (password) CGIFREE(password);
02623  if (action) CGIFREE(action);
02624  if (page) CGIFREE(page);
02625 
02626  return ret;
02627 }

int CheckFileName char *  Name,
char *  AllowedEndings
 

Definition at line 223 of file ezs.c.

References HasToken().

Referenced by ShowForm().

00224 {
00225   char * c = strrchr(Name,'.');
00226   if (!c) return 0;
00227   return HasToken(AllowedEndings,c+1,0);
00228 }

int DeleteOldRecords FILE *  database,
CGINameValue header,
CGINameValue Params
 

Definition at line 230 of file ezs.c.

References DatabaseFindFast(), GetFieldValue, CGINameValue::name, and CGINameValue::value.

00233 {
00234   CGINameValue Userid[2];
00235   int previous = 0;
00236 
00237   Userid[0].name="_SESSION";  Userid[0].value=GetFieldValue(Params,"_SESSION");
00238   Userid[1].name=0;
00239 
00240   if (Userid[0].value[0] == 0) return 0; /* don't look for empties */
00241 
00242   while(1)
00243   {
00244    int current;
00245    if (DatabaseFindFast(database, header,Userid,&current)==0) break;
00246    if (previous)
00247    {
00248        int ptr = ftell(database);
00249        if (fseek(database,previous,SEEK_SET) == 0)
00250        {
00251            fwrite("#",1,1,database);
00252            if (fseek(database,ptr,SEEK_SET) != 0) return 1;
00253        }
00254        if (ptr == -1) break;
00255    }
00256    previous = current;
00257   }
00258 
00259   return 0; /* success */
00260 }

int FindUserRecordASC char *  idfields,
FILE *  database,
CGINameValue header,
CGINameValue Params
 

Searches for the last row in a tab-delimited ascii file matching the 'Params' query. Returns 0 on failure or if the Params are null.

Definition at line 266 of file ezs.c.

References CopyList(), DatabaseFindFast(), DeleteNVP(), GetField(), GetFieldValue, CGINameValue::name, NULL, ReadPairedString(), strdup(), and CGINameValue::value.

Referenced by LoadUserDataASC().

00270 {
00271   CGINameValue * Userid;
00272   CGINameValue * Current = NULL;
00273   int i;
00274   int ret = 0;
00275 
00276   Userid = ReadPairedString(idfields,',',0);
00277 
00278   for (i=0; Userid[i].name; i++)
00279   {
00280    Userid[i].value = strdup(GetFieldValue(Params,Userid[i].name));
00281    if (Userid[i].value[0]) ret = 1;
00282   }
00283 
00284   if (ret)
00285   {
00286    ret = 0;
00287    while(1)
00288    {
00289     if (DatabaseFindFast(database, header,Userid,NULL)==0)
00290       break;
00291 
00292     ret = 1;
00293     DeleteNVP(Current);
00294     Current = CopyList(header,0); /* store a copy of the last record we've found */
00295    }
00296 
00297    if (Current != NULL)
00298    {
00299     CGINameValue* x;
00300     char*c;
00301 
00302     for(i=0; header[i].name; i++)
00303     {/* swap the pointers to avoid allocating memory */
00304      if (!header[i].name[0]) continue;
00305      x = GetField(Current,header[i].name);
00306      if (!x) continue;
00307 
00308      c = x->value;
00309      x->value = header[i].value;
00310      header[i].value = c;
00311     }
00312    }
00313   }
00314 
00315   DeleteNVP(Current);
00316   DeleteNVP(Userid);
00317   return ret;
00318 }

void GenerateSessionID char *  session,
unsigned int  i
 

We can track version numbers with the session id. Z**G** EZSurvey 2000 (ODBC early release) Z**H** EZSurvey 2001 g**g** EZSurvey 2002 x****Z** EZSurvey 2003 x****Y** EZSurvey 2004 X****Y** EZSurvey 2007

Definition at line 112 of file ezs.c.

References itos().

Referenced by GenerateUniqueID().

00113 {
00114 #ifdef XP_WIN
00115   SYSTEMTIME tb;
00116   unsigned int a,b,c;
00117   GetSystemTime(&tb);
00118 
00119         a  = (tb.wMonth - 1); a = a << 4;
00120         a |= (tb.wDay - 1);   a = a << 5;
00121         a |= (tb.wHour);      a = a << 5;
00122         a |= (tb.wMinute);    a = a << 6;
00123         a |= (tb.wSecond);
00124 
00125   b = (i & 0xAA55AA55)|(a&0x55AA55AA);
00126   c = (i & 0x55AA55AA)|(a&0xAA55AA55);
00127   *session = 'X';
00128   session = itos(tb.wYear-2000,session+1);
00129   session = itos(b,session);
00130   *session = 'Y';
00131   session++;
00132   session = itos(c,session);
00133 #else
00134   time_t timer;
00135   struct tm *tb;
00136   unsigned int a,b,c;
00137 
00138   time(&timer);
00139   tb = gmtime(&timer);
00140 
00141         a  = (tb->tm_mon);      a = a << 4;
00142         a |= (tb->tm_mday - 1); a = a << 5;
00143         a |= (tb->tm_hour);     a = a << 5;
00144         a |= (tb->tm_min);      a = a << 6;
00145         a |= (tb->tm_sec);
00146 
00147   b = ((i) & 0xAA55AA55)|(a&0x55AA55AA);
00148   c = ((i) & 0x55AA55AA)|(a&0xAA55AA55);
00149   *session = 'x';
00150   session = itos(tb->tm_year-100,session+1);
00151   session = itos(b,session);
00152   *session = 'Z';
00153   session++;
00154   session = itos(c,session);
00155  #endif
00156 }

void GenerateUniqueID char *  newsession,
char *  hash
 

Definition at line 158 of file ezs.c.

References CGIFCLOSE, CGIFOPEN, and GenerateSessionID().

Referenced by CGImain(), and JSUniqueId().

00159 {
00160    unsigned int j, i = 0;
00161 #ifdef XP_WIN
00162    HKEY key;
00163 #ifdef UNICODE
00164    HANDLE  Mutex = CreateMutex(0,FALSE,L"EZS.CGI.RANDOM");
00165 #else
00166    HANDLE  Mutex = CreateMutex(0,FALSE,"EZS.CGI.RANDOM");
00167 #endif
00168    WaitForSingleObject(Mutex,20000);
00169    #ifdef UNICODE
00170    if (RegOpenKeyEx(HKEY_CURRENT_USER,L"SOFTWARE\\Raosoft\\EZSurvey",0,0,&key) == ERROR_SUCCESS)
00171    {
00172     DWORD type,length = sizeof(i);
00173     RegQueryValueEx(key,L"RANDOM",0,&type,(unsigned char*)&i,&length);
00174     RegCloseKey(key);
00175    }
00176    #else
00177    if (RegOpenKeyEx(HKEY_CURRENT_USER,"SOFTWARE\\Raosoft\\EZSurvey",0,KEY_ALL_ACCESS,&key) == ERROR_SUCCESS)
00178    {
00179     DWORD type,length = sizeof(i);
00180     RegQueryValueEx(key,"RANDOM",0,&type,(unsigned char*)&i,&length);
00181     RegCloseKey(key);
00182    }
00183    #endif
00184 #else
00185    FILE* f = CGIFOPEN("random.seed","rb");
00186    if (f) { fread(&i,sizeof(i),1,f); CGIFCLOSE(f);}
00187 #endif
00188 
00189    j = i >> 16;
00190    if (hash) while (*hash) j += *hash++;
00191 #ifdef XP_WIN
00192    j += GetTickCount();
00193 #else
00194 #endif
00195 #ifndef __WINCE__
00196    i += getpid();
00197 #endif
00198    i = (j << 16) | (i & 0x0000ffff);
00199    GenerateSessionID(newsession,i);
00200 
00201 #ifdef XP_WIN
00202    #ifdef UNICODE
00203    if (RegOpenKeyEx(HKEY_CURRENT_USER,L"SOFTWARE\\Raosoft\\EZSurvey",0,0,&key) == ERROR_SUCCESS)
00204    {
00205     RegSetValueEx(key,L"RANDOM",0,REG_DWORD,(unsigned char*)&i,sizeof(i));
00206     RegCloseKey(key);
00207    }
00208    #else
00209    if (RegOpenKeyEx(HKEY_CURRENT_USER,"SOFTWARE\\Raosoft\\EZSurvey",0,KEY_ALL_ACCESS,&key) == ERROR_SUCCESS)
00210    {
00211     RegSetValueEx(key,"RANDOM",0,REG_DWORD,(unsigned char*)&i,sizeof(i));
00212     RegCloseKey(key);
00213    }
00214    #endif
00215    ReleaseMutex(Mutex);
00216    CloseHandle(Mutex);
00217 #else
00218    f = CGIFOPEN("random.seed","wb");
00219    if (f) { fwrite(&i,sizeof(i),1,f); CGIFCLOSE(f);}
00220 #endif
00221 }

int GetRespcount char *  argv0,
char *  dbname
 

Definition at line 1244 of file ezs.c.

References CGIFOPEN, ExpandLocalPath(), and MAXPATH.

01245 {
01246   char filename[MAXPATH];
01247   int i = 0;
01248   FILE * f;
01249 
01250   ExpandLocalPath(argv0,filename,dbname,".respcount");
01251   f = CGIFOPEN(filename,"rb");
01252   if (f)
01253   {
01254    fread(&i,sizeof(i),1,f);
01255    fclose(f);
01256   }
01257   return i;
01258 }

char* itos unsigned int  value,
char *  p
 

Definition at line 87 of file ezs.c.

Referenced by GenerateSessionID().

00088 {
00089     int     i,j;
00090     char    c;
00091 
00092     j=0;
00093     for (i=0;value && i<34;i++)
00094     {
00095      c = (char)(value % 32);
00096      p[j++]= (c < 10) ? c + '0' : c + 'a' - 10;
00097      value = value / 32;
00098     }
00099     p[j]=0;
00100     return p+j;
00101 }

static char* JSRankIndex ScriptEnvironment Env,
char *  cmd,
int  argc,
char **  argv,
CGINameValue Params
[static]
 

in: "3,4,2,1" , "2" out: "3"

Definition at line 609 of file ezs.c.

References HasToken(), NULL, and strdup().

Referenced by ODBCRunScript(), and ValidatePage().

00610 {
00611  if (argc > 1 )
00612  {
00613   char temp[64];
00614   int i=0;
00615   if (HasToken(argv[0], argv[1],&i))
00616   {
00617    sprintf(temp,"%d",i);
00618    return strdup(temp);
00619   }
00620  }
00621  return NULL;
00622 }

static char* JSRankSort ScriptEnvironment Env,
char *  cmd,
int  argc,
char **  argv,
CGINameValue Params
[static]
 

in: code1=rank1,code2=rank2,code3=rank3 out: code2,code3,code1

Definition at line 570 of file ezs.c.

References CGIMALLOC, NULL, ReadPairedString(), ReadPairedValues(), and SortNVP().

Referenced by ODBCRunScript(), and ValidatePage().

00571 {
00572  CGINameValue* list;
00573  int i;
00574  int length;
00575  char* ret;
00576  if (argc == 0) return NULL;
00577  if (argc == 1)
00578   list = ReadPairedString(argv[0],',',0);
00579  else
00580   list = ReadPairedValues(argc,argv,0);
00581 
00582  SortNVP(list);
00583  length = 0;
00584  for (i=0; list[i].name; i++)
00585  {
00586   length += strlen(list[i].name);
00587   length ++;
00588  }
00589  if (!length) return NULL;
00590  ret = CGIMALLOC(1+length);
00591  length = 0;
00592  for (i=0; list[i].name; i++)
00593  {
00594   if (!list[i].value) continue;
00595   if (!list[i].value[0]) continue;
00596   strcpy(ret+length,list[i].name);
00597   length += strlen(list[i].name);
00598   strcpy(ret+length,",");
00599   length ++;
00600  }
00601  if (length) ret[length-1] = 0;
00602  else ret[0]=0;
00603  return ret;
00604 }

static char* JSSendMail ScriptEnvironment Env,
char *  cmd,
int  argc,
char **  argv,
CGINameValue Params
[static]
 

recipient, subject, message

Definition at line 534 of file ezs.c.

References ScriptEnvironment::config, GetSetting(), and SendMail().

00535 {
00536  if (!Env->config) return 0;
00537  if (argc < 3) return 0;
00538  {
00539    char* server   = GetSetting(Env->config,"EMAILSERVER","");
00540    char* profile  = GetSetting(Env->config,"EMAILPROFILE","Windows Messaging Settings");
00541    char* name     = GetSetting(Env->config,"EMAILNAME","");
00542    char* password = GetSetting(Env->config,"EMAILPWD","");
00543 
00544    SendMail(argv[0],argv[1],argv[2], server, profile, name, password);
00545  }
00546  return 0;
00547 }

static char* JSShowPage ScriptEnvironment Env,
char *  cmd,
int  argc,
char **  argv,
CGINameValue Params
[static]
 

Definition at line 493 of file ezs.c.

References CGIFREE, GetFieldValue, HasToken(), SetFieldValue(), and strdup3().

Referenced by ValidateBack(), and ValidatePage().

00494 {/* prepend the next page to the _PAGENEXT list */
00495  char* pageskip;
00496  if (argc < 1) return 0;
00497  pageskip = GetFieldValue(Params,"_PAGESKIP");
00498  if (*pageskip)
00499   {
00500    if (!HasToken(pageskip,argv[0],0))
00501     {
00502      char*x = strdup3(pageskip,",",argv[0]);
00503      SetFieldValue(Params,"_PAGESKIP",x);
00504      CGIFREE(x);
00505     }
00506   }
00507  else
00508   {
00509    SetFieldValue(Params,"_PAGESKIP",argv[0]);
00510   }
00511  return 0;
00512 }

static char* JSSQLEscape ScriptEnvironment Env,
char *  cmd,
int  argc,
char **  argv,
CGINameValue Params
[static]
 

in: I am 4' out: I am 4'' tall

Definition at line 628 of file ezs.c.

References CGIMALLOC, and NULL.

00629 {
00630    size_t i=0,j=0;
00631    char *in;
00632     char *out;
00633    char *extra = NULL;;
00634    if (argc == 0) return NULL;
00635 
00636    in = argv[0];
00637    out = CGIMALLOC(1 + (strlen(in) * 2));
00638    if (argc > 1) extra = argv[1];
00639 
00640    while (in[i])
00641    {
00642     if (in[i] == '\'')
00643       {
00644        out[j++] = '\'';
00645        out[j++] = '\'';
00646       }
00647     else if (strchr("\t\r\n",in[i]))
00648      {
00649        out[j++] = ' ';
00650      }
00651     else if (extra && strchr(extra,in[i]))
00652      {
00653       out[j++] = '\\';
00654       out[j++] = in[i];
00655      }
00656     else out[j++] = in[i];
00657 
00658     i++;
00659    }
00660 
00661    out[j]=0;
00662    return out;
00663 }

static char* JSTimeDate ScriptEnvironment Env,
char *  cmd,
int  argc,
char **  argv,
CGINameValue Params
[static]
 

Definition at line 521 of file ezs.c.

References GetTime(), and strdup().

Referenced by ODBCRunScript(), ValidateBack(), and ValidatePage().

00522 {
00523     char datetime[16];
00524     GetTime(datetime,0,0);
00525     return strdup(datetime);
00526 }

static char* JSTimeTime ScriptEnvironment Env,
char *  cmd,
int  argc,
char **  argv,
CGINameValue Params
[static]
 

Definition at line 527 of file ezs.c.

References GetTime(), and strdup().

Referenced by ODBCRunScript(), ValidateBack(), and ValidatePage().

00528 {
00529     char datetime[16];
00530     GetTime(0,datetime,0);
00531     return strdup(datetime);
00532 }

static char* JSUniqueId ScriptEnvironment Env,
char *  cmd,
int  argc,
char **  argv,
CGINameValue Params
[static]
 

Definition at line 514 of file ezs.c.

References GenerateUniqueID(), and strdup().

Referenced by ODBCRunScript(), ValidateBack(), and ValidatePage().

00515 {
00516     char datetime[32];
00517    GenerateUniqueID(datetime,argc?argv[0]:0);
00518     return strdup(datetime);
00519 }

CGINameValue* LoadUserData CGINameValue config,
char *  argv0,
char *  dbname,
CGINameValue Params,
int *  err
 

Definition at line 469 of file ezs.c.

References GetSetting(), LoadUserDataASC(), LoadUserDataSQL(), and strnicmp().

Referenced by CGImain(), and SaveData().

00470 {
00471  char* order = GetSetting(config,"LOGINSEQUENCE","ASC");
00472  CGINameValue* x = 0;
00473  while (*order && !x)
00474  {
00475   if (strchr(" ;,",*order)) order++;
00476   else if (!strnicmp(order,"ASC",3))
00477   {
00478    x = LoadUserDataASC(config,argv0,dbname,Params,err);
00479    order += 3;
00480   }
00481 #ifdef CGI_ODBC
00482   else if (!strnicmp(order,"ODBC",4))
00483   {
00484    x = LoadUserDataSQL(config,argv0,dbname,Params,err);
00485    order += 4;
00486   }
00487 #endif
00488  }
00489  return x;
00490 }

CGINameValue* LoadUserDataASC CGINameValue config,
char *  argv0,
char *  dbname,
CGINameValue Params,
int *  err
 

Definition at line 320 of file ezs.c.

References DatabaseClose(), DatabaseOpen(), DatabaseReadRecord(), ExpandLocalPath(), FindUserRecordASC(), GetField(), GetFieldValue, GetSetting(), MAXPATH, NULL, NULLSTR, stricmp(), and CGINameValue::value.

Referenced by LoadUserData().

00321 {
00322  FILE * db;
00323  CGINameValue * header;
00324  char dbfile[MAXPATH];
00325  int ret = 0;
00326  char *c = GetSetting(config,"SAVEDATANAME",NULLSTR);
00327  char *index = GetSetting(config,"SAVEINDEXNAME",NULLSTR);
00328  char *idfields = GetSetting(config,"IDFIELDS","IFMUID,IFMUID1,IFMUID2,IFMUID3,IFMUID4");
00329 
00330  if (!*idfields) idfields = "_SESSION";
00331 
00332  if (*c)
00333  {
00334   if (strlen(c) > 1000) c[1000]=0;
00335   ExpandLocalPath(argv0,dbfile,c,NULLSTR);
00336  }
00337  else
00338  {
00339   ExpandLocalPath(argv0,dbfile,dbname,".asc");
00340  }
00341 
00342  if (!DatabaseOpen(dbfile,&db,&header,0,0))
00343  {
00344   if (err) *err = 2;
00345   return NULL;
00346  }
00347 
00348  if (*index)
00349  {
00350   FILE * indexdb;
00351   CGINameValue * indexheader;
00352   char indexfile[MAXPATH];
00353   int pos;
00354   if (strlen(index) > 1000) index[1000]=0;
00355   ExpandLocalPath(argv0,indexfile,index,NULLSTR);
00356   if (DatabaseOpen(indexfile,&indexdb,&indexheader,0,0))
00357   {
00358    if (FindUserRecordASC(idfields,indexdb,indexheader,Params))
00359    {
00360     pos = atoi(GetFieldValue(indexheader,"_POS"));
00361     if (pos > 0)
00362      if (fseek(db,pos,0) == 0)
00363       ret = DatabaseReadRecord(db,header,0);
00364       /* ret = 1 if a record was found successfully */
00365 
00366     if (ret) /* did we get the right field? */
00367     {
00368      int i;
00369      CGINameValue* c ;
00370      for (i=0; ret && indexheader[i].name; i++)
00371      {
00372       if (!stricmp(indexheader[i].name,"_POS")) continue;
00373       c = GetField(header,indexheader[i].name);
00374       if (c)
00375        if (strcmp(indexheader[i].value,c->value))
00376         ret = 0;
00377      }
00378     }
00379    }
00380    DatabaseClose(indexdb,indexheader);
00381   }
00382  }
00383 
00384  if (!ret)
00385  ret = FindUserRecordASC(idfields,db,header,Params);
00386 
00387  if (ret)
00388  {
00389   DatabaseClose(db,NULL);
00390   return header;
00391  }
00392  else
00393  {
00394   DatabaseClose(db,header);
00395   return 0;
00396  }
00397 }

CGINameValue* LoadUserDataSQL CGINameValue config,
char *  argv0,
char *  dbname,
CGINameValue Params,
int *  err
 

Definition at line 399 of file ezs.c.

References CGIFREE, CopyBuffer(), CopyListDeep(), DeleteBuffer(), DeleteNVP(), GetSetting(), LogError(), NewBuffer(), ODBCConnect(), ODBCDisconnect(), ODBCQuery(), and ODBCRunScript().

Referenced by LoadUserData().

00400 {
00401   SQLDB* db = 0;
00402   CGINameValue* x = 0;
00403   EZSSTREAM result;
00404   char *c;
00405   int ret;
00406 
00407   /* First, try to UPDATE the database. If that doesn't work, try UPDATE */
00408   db = ODBCConnect( GetSetting(config,"ODBCSERVICE",""),
00409                     GetSetting(config,"ODBCNAME",""),
00410                     GetSetting(config,"ODBCPASSWORD",""),0);
00411   if (!db)
00412   {
00413         LogError("\nODBCOpen() failed");
00414       if (err) *err = 52;
00415         return 0;
00416   }
00417 
00418   /* Try a SELECT statement. */
00419   memset(&result,0,sizeof(result));
00420   result.t = NewBuffer(1024);
00421   /* select * from table where IFMUID1={IFMUID1} */
00422   ret = ODBCRunScript(argv0,&result,dbname,config,Params,"<SCRIPT NAME=\"LOADODBC\"");
00423   c = CopyBuffer(result.t);
00424   DeleteBuffer(result.t);
00425   if (ret && *c)
00426   {
00427    char s[128];
00428    sprintf(s,"\nODBCRunScript error %d for LOADODBC ",ret);
00429    LogError(s);
00430   }
00431 
00432   if (!ret)
00433   {
00434    x = ODBCQuery(db,c,0);
00435 
00436    if (x)
00437    {/*If it succeeds, we need to run ODBCREAD */
00438     EZSSTREAM result;
00439     CGINameValue* y;
00440     memset(&result,0,sizeof(result));
00441     result.t = NewBuffer(1024);
00442     ret = ODBCRunScript(argv0,&result,dbname,config,x,"<SCRIPT NAME=\"READODBC\"");
00443     CGIFREE(c);
00444     c = CopyBuffer(result.t);
00445     DeleteBuffer(result.t);
00446     if (ret && *c)
00447     {
00448      char s[128];
00449      sprintf(s,"\nODBCRunScript error %d for READODBC ",ret);
00450      LogError(s);
00451     }
00452     y = CopyListDeep(x,0);
00453     DeleteNVP(x);
00454     x=y;
00455    }
00456   }
00457 
00458   if (ret && *c)
00459   {
00460     LogError(c);
00461   }
00462 
00463   CGIFREE(c);
00464   ODBCDisconnect(db);
00465   return x;
00466 }

int Login EZSSTREAM htmlout,
int  Security,
char *  dbname,
CGINameValue Params,
char *  argv0,
CGINameValue config
 

Definition at line 1917 of file ezs.c.

References CGI_ALLOW_APPEND, DatabaseClose(), DatabaseOpen(), ExpandLocalPath(), GetField(), GetFieldValue, GetSetting(), HasTokenI(), HTMLEscape(), HTMLPrintf(), HTMLWrite(), MAXPATH, NULL, NULLSTR, and ReadPairedString().

01918 {
01919  FILE * db = NULL;
01920  CGINameValue * header = NULL;
01921  char dbfile[MAXPATH];
01922  int i;
01923 
01924  char *c = GetSetting(config,"SAVEDATANAME",NULLSTR);
01925 
01926  if (*c)
01927  {
01928   if (strlen(c) > 1000) c[1000]=0;
01929   ExpandLocalPath(argv0,dbfile,c,NULLSTR);
01930  }
01931  else
01932  {
01933   ExpandLocalPath(argv0,dbfile,dbname,".asc");
01934  }
01935 
01936  if (HasTokenI(GetSetting(config,"LOGINSEQUENCE","ASC"),"ASC",0) &&
01937      !DatabaseOpen(dbfile,&db,&header,0,0))
01938  {
01939   HTMLWrite(htmlout,"<head><title>Setup error</title></head>\n\n<BODY>\n");
01940   HTMLWrite(htmlout,"Sorry, I can't access the data file. Check the read/write permissions.");
01941   return 0;
01942  }
01943 
01944  HTMLWrite(htmlout,"<head><title>Login</title></head>\n\n<BODY>\n");
01945 
01946  if (Security & CGI_ALLOW_APPEND)
01947  {
01948  HTMLWrite(htmlout,"<H3>Start</H3>");
01949 #ifdef __WINCE__
01950  HTMLWrite(htmlout,"<FORM ACTION=\"/ezs\" METHOD=\"POST\" ACCEPT-CHARSET=\"UTF-8\">\n");
01951 #else
01952  HTMLWrite(htmlout,"<FORM METHOD=\"POST\" ACCEPT-CHARSET=\"UTF-8\">\n");
01953 #endif
01954  HTMLWrite(htmlout,"<INPUT TYPE=\"HIDDEN\" NAME=\"_ACTION\" VALUE=\"START\" />\n");
01955  HTMLWrite(htmlout,"<INPUT TYPE=\"HIDDEN\" NAME=\"DATABASE\" VALUE=\"");
01956  HTMLEscape(htmlout,dbname);
01957  HTMLWrite(htmlout,"\" />\n");
01958  HTMLWrite(htmlout,"<INPUT TYPE=\"SUBMIT\" VALUE=\"  Start Survey  \" /></FORM>");
01959 
01960  }
01961  HTMLWrite(htmlout,"<H3>Please enter your login and password</H3>");
01962  #ifdef __WINCE__
01963  HTMLWrite(htmlout,"<FORM ACTION=\"/ezs\" METHOD=\"POST\" ACCEPT-CHARSET=\"UTF-8\">\n");
01964 #else
01965  HTMLWrite(htmlout,"<FORM METHOD=\"POST\" ACCEPT-CHARSET=\"UTF-8\">\n");
01966 #endif
01967  HTMLWrite(htmlout,"<INPUT TYPE=\"HIDDEN\" NAME=\"_ACTION\" VALUE=\"START\" />\n");
01968  HTMLWrite(htmlout,"<INPUT TYPE=\"HIDDEN\" NAME=\"DATABASE\" VALUE=\"");
01969  HTMLEscape(htmlout,dbname);
01970  HTMLWrite(htmlout,"\" />\n<tt>");
01971  {
01972    char* idfields = GetSetting(config,"IDFIELDS","IFMUID,IFMUID1,IFMUID2,IFMUID3,IFMUID4");
01973    CGINameValue *f = ReadPairedString(idfields,',',0);
01974    if (f)
01975    {
01976     HTMLWrite(htmlout,"<label for=\"N\">Login:</label>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tt>");
01977     HTMLWrite(htmlout,"<INPUT ID=\"N\" NAME=\"");
01978     HTMLEscape(htmlout,f[0].name);
01979     HTMLWrite(htmlout,"\" VALUE=\"");
01980     HTMLEscape(htmlout,GetFieldValue(Params,f[0].name));
01981     HTMLWrite(htmlout,"\" />\n<br>");
01982    }
01983    for (i=1; f[i].name; i++)
01984    {
01985     if (header && !GetField(header,f[i].name)) continue;
01986     if (i == 1)
01987     {
01988      HTMLWrite(htmlout,"<tt><label for=\"P\">Password:</label>&nbsp;");
01989      HTMLWrite(htmlout,"</tt><INPUT ID=\"P\" TYPE=\"PASSWORD\" NAME=\"");
01990     }
01991     else
01992     {
01993      HTMLPrintf(htmlout,"<tt><label for=\"P%d\">Password%d:</label>&nbsp;",i,i);
01994      HTMLPrintf(htmlout,"</tt><INPUT ID=\"P%d\" TYPE=\"PASSWORD\" NAME=\"",i);
01995     }
01996     HTMLEscape(htmlout,f[i].name);
01997     HTMLWrite(htmlout,"\" VALUE=\"");
01998     HTMLEscape(htmlout,GetFieldValue(Params,f[i].name));
01999     HTMLWrite(htmlout,"\" />\n<br>");
02000    }
02001  }
02002  HTMLWrite(htmlout,"<INPUT TYPE=\"SUBMIT\" VALUE=\"  Login to the survey  \" /></FORM></BODY>");
02003  DatabaseClose(db,header);
02004  return 0;
02005 }

int ODBCRunScript char *  argv0,
EZSSTREAM result,
char *  dbname,
CGINameValue config,
CGINameValue Params,
char *  search
 

search = <script name=SAVEODBC

Definition at line 1138 of file ezs.c.

References CGIFCLOSE, FileOpen(), JSEval(), JSGetEnv(), JSIndexOf(), JSPrint(), JSRandom(), JSRankIndex(), JSRankSort(), JSReport(), JSSQLEscape(), JSstrlen(), JSsubstr(), JSTimeDate(), JSTimeStamp(), JSTimeTime(), JStoFixed(), JSToNumber(), JSUniqueId(), NULL, PrintScriptError(), ReadUntilChar(), ReadUntilWordS(), and RunScript().

Referenced by LoadUserDataSQL(), and TryODBC().

01142 {
01143  int ret;
01144  FILE* script;
01145   ScriptFunction Functions[] =
01146   {{"escape",2,(ScriptFunctionCall)*JSSQLEscape},
01147    {"print",16,(ScriptFunctionCall)*JSPrint},
01148    {"write",16,(ScriptFunctionCall)*JSPrint},
01149    {"eval",1,(ScriptFunctionCall)*JSEval},
01150    {"timestamp",0,(ScriptFunctionCall)*JSTimeStamp},
01151    {"timedate",0,(ScriptFunctionCall)*JSTimeDate},
01152    {"timetime",0,(ScriptFunctionCall)*JSTimeTime},
01153    {"uniqueid",1,(ScriptFunctionCall)*JSUniqueId},
01154    {"toFixed",2,(ScriptFunctionCall)*JStoFixed},
01155    {"ranksort",128,(ScriptFunctionCall)*JSRankSort},
01156    {"rankindex",2,(ScriptFunctionCall)*JSRankIndex},
01157    {"runReport",8,(ScriptFunctionCall)*JSReport},
01158       {"environment",1,(ScriptFunctionCall)*JSGetEnv},
01159    {"number",1,(ScriptFunctionCall)*JSToNumber},
01160    {"toNumber",1,(ScriptFunctionCall)*JSToNumber},
01161    {"random",1,(ScriptFunctionCall)*JSRandom},
01162          {"subStr",3,(ScriptFunctionCall)*JSsubstr},
01163       {"indexOf",4,(ScriptFunctionCall)*JSIndexOf},
01164       {"length",1,(ScriptFunctionCall)*JSstrlen},
01165 {0,0,0}};
01166 
01167  ScriptEnvironment Global;
01168 
01169  memset(&Global,0,sizeof(Global));
01170  Global.htmlout   = result;
01171  Global.Functions = Functions;
01172  Global.argv0     = argv0;
01173  Global.config    = config;
01174 
01175  script = FileOpen(argv0,dbname,".val");
01176  if (script == NULL) return 1; /* OK */
01177 
01178  if (!ReadUntilWordS(script,0,search))
01179  {
01180      ret = 57;
01181      goto end;
01182  }
01183 
01184  ReadUntilChar(script,0,0,">",0);
01185 
01186  ret = RunScript(&Global,script,Params); /* stops at </SCRIPT> */
01187  if (ret > 0)
01188  {
01189   PrintScriptError(result,&Global, script, ret);
01190  }
01191 
01192  end:
01193  CGIFCLOSE(script);
01194  return ret;
01195 }

int PrintFinish char *  argv0,
EZSSTREAM htmlout,
char *  dbname,
CGINameValue config,
CGINameValue Params,
int  ret
 

Definition at line 1658 of file ezs.c.

References CGIFCLOSE, CGIFREE, CGIMALLOC, DebugShowNVP(), FileOpen(), GetEnvironment(), GetSetting(), HTMLPrintf(), HTMLWrite(), LogError(), LogMessage(), NULL, NULLSTR, RunReport(), and SendCGIHeader().

Referenced by CGImain().

01660 {
01661     if (ret)
01662     { /* if there are any data errors, we want to deal with them now. */
01663      SendCGIHeader(htmlout,NULL);
01664      switch (ret)
01665      {
01666      case 2 : HTMLWrite(htmlout,"<P>Unable to read from the data file. ");
01667 #ifdef XP_WIN
01668               HTMLWrite(htmlout,"You probably need to configure your server to allow writing to ");
01669               HTMLWrite(htmlout,GetSetting(config,"SAVEDATANAME",dbname));
01670 #else
01671               HTMLWrite(htmlout,"You probably need to log into the server and run <tt>chmod a+w ");
01672               HTMLWrite(htmlout,GetSetting(config,"SAVEDATANAME",dbname));
01673               HTMLWrite(htmlout,"</tt>");
01674 #endif
01675               break;
01676 
01677      case 6 : HTMLWrite(htmlout,"<P>Unable to write to the data file. ");
01678 #ifdef XP_WIN
01679               HTMLWrite(htmlout,"You probably need to configure your server to allow writing to ");
01680               HTMLWrite(htmlout,GetSetting(config,"SAVEDATANAME",dbname));
01681 #else
01682               HTMLWrite(htmlout,"You probably need to log into the server and run <tt>chmod a+w ");
01683               HTMLWrite(htmlout,GetSetting(config,"SAVEDATANAME",dbname));
01684               HTMLWrite(htmlout,"</tt>");
01685 #endif
01686               break;
01687 
01688      case 9 : HTMLWrite(htmlout,"<P>Unable to write to the index file. ");
01689 #ifdef XP_WIN
01690               HTMLWrite(htmlout,"You probably need to configure your server to allow writing to ");
01691               HTMLWrite(htmlout,GetSetting(config,"SAVEINDEXNAME",dbname));
01692 #else
01693               HTMLWrite(htmlout,"You probably need to log into the server and run <tt>chmod a+w ");
01694               HTMLWrite(htmlout,GetSetting(config,"SAVEINDEXNAME",dbname));
01695               HTMLWrite(htmlout,"</tt>");
01696 #endif
01697               break;
01698 
01699      case 8 : HTMLWrite(htmlout,"<P>Unable to write to the data file. ");
01700 #ifdef XP_WIN
01701               HTMLWrite(htmlout,"You probably need to configure your server to allow writing to ");
01702               HTMLWrite(htmlout,GetSetting(config,"SAVEXMLNAME",dbname));
01703 #else
01704               HTMLWrite(htmlout,"You probably need to log into the server and run <tt>chmod a+w ");
01705               HTMLWrite(htmlout,GetSetting(config,"SAVEXMLNAME",dbname));
01706               HTMLWrite(htmlout,"</tt>");
01707 #endif
01708               break;
01709 
01710      case 4 : HTMLWrite(htmlout,"<P>A data file did not exist, and a new file could not be created. ");
01711               HTMLWrite(htmlout,"Please check the file acces permissions for ");
01712               HTMLWrite(htmlout,GetSetting(config,"SAVEDATANAME",dbname));
01713               break;
01714 
01715      case 5 : HTMLWrite(htmlout,"<P>The database file does not match this form. "
01716               "Please download the current data and then republish the web site. ");
01717               LogMessage("\nezs: data file does not match the form: ");
01718               LogMessage(GetSetting(config,"SAVEDATANAME",dbname));
01719               HTMLWrite(htmlout,GetSetting(config,"SAVEDATANAME",dbname));
01720               HTMLWrite(htmlout,"<P>Data dump:<PRE>\n");
01721               DebugShowNVP(htmlout,Params);
01722               HTMLWrite(htmlout,"</PRE>\n");
01723               break;
01724 
01725      case 23: HTMLWrite(htmlout,"<P>The server ran out of time waiting for a file lock.");
01726               HTMLWrite(htmlout,"<P>Data dump:<PRE>\n");
01727               DebugShowNVP(htmlout,Params);
01728               HTMLWrite(htmlout,"</PRE>\n");
01729               break;
01730 #ifdef XP_WIN
01731      case 31: HTMLWrite(htmlout,"<P>The mapi32.dll library is not available.");
01732               break;
01733 
01734      case 32: HTMLWrite(htmlout,"<P>The mapi32.dll library does not support the CMC protocol.");
01735               break;
01736 
01737      case 33: HTMLWrite(htmlout,"<P>The destination email address was invalid.");
01738               break;
01739 
01740      case 34: HTMLWrite(htmlout,"<P>The email server refused to accept your message.");
01741               break;
01742 
01743 #else
01744      case 36: HTMLWrite(htmlout,"<P>The sendmail program could not be found. ");
01745               break;
01746 #endif
01747 
01748      case 52: HTMLWrite(htmlout,"<P>A connection could not be made to the database. See logerr.txt for details.");
01749               LogError("Service: ");
01750               LogError(GetSetting(config,"ODBCSERVICE","(undefined)"));
01751               LogError("Login: ");
01752               LogError(GetSetting(config,"ODBCNAME","(undefined)"));
01753               break;
01754 
01755 #ifdef XP_WIN
01756      case 61: HTMLWrite(htmlout,"<P>Winsock 2.0 is not available.");
01757               break;
01758 #endif
01759 
01760      case 62: HTMLWrite(htmlout,"<P>The server could not be found. Server:");
01761               HTMLWrite(htmlout,GetSetting(config,"EMAILSERVER",""));
01762               break;
01763      case 63: HTMLWrite(htmlout,"<P>An outgoing network connection could not be opened.");
01764               break;
01765      case 64: HTMLWrite(htmlout,"<P>Could not connect to the outgoing server.");
01766               break;
01767      case 66: HTMLWrite(htmlout,"<P>The SOAP transaction failed because the function name is missing.");
01768               break;
01769      case 68: HTMLWrite(htmlout,"<P>The SOAP connection to ");
01770               HTMLWrite(htmlout,GetSetting(config,"SOAPHOST","127.0.0.1"));
01771               HTMLWrite(htmlout,":");
01772               HTMLWrite(htmlout,GetSetting(config,"SOAPPORT","80"));
01773               HTMLWrite(htmlout,"/");
01774               HTMLWrite(htmlout,"failed.");
01775               break;
01776 
01777      default: HTMLPrintf(htmlout,"<P>Error %d occurred. See logerr.txt for details. Data were not saved.",ret);
01778       } /* switch (ret) */
01779       HTMLWrite(htmlout,"<hr>");
01780     }
01781     else /* ret */
01782     {
01783 
01784      if (atoi(GetSetting(config,"SHOWREDIRECT","0")) && *GetSetting(config,"REDIRECT",""))
01785      {
01786       char * c = GetSetting(config,"REDIRECT","");
01787       char * temp;
01788       if (c[0] == '/')
01789       {
01790 #ifndef VPWSCGI
01791           char * hostRoot = GetEnvironment(htmlout,"HTTP_HOST");
01792         if (!hostRoot) hostRoot = "";
01793 #endif
01794           temp= (char*)CGIMALLOC(strlen(c) + strlen(hostRoot) + 32);
01795           sprintf(temp,"Location: http://%s%s\r\n\r\n",hostRoot,c);
01796       }
01797       else
01798       {
01799           temp = (char*)CGIMALLOC(strlen(c)  + 16);
01800           sprintf(temp,"Location: %s\r\n\r\n",c);
01801       }
01802       SendCGIHeader(htmlout,temp);
01803       CGIFREE(temp);
01804      }
01805      else
01806      {
01807       int isform = 0;
01808       SendCGIHeader(htmlout,NULL);
01809       HTMLWrite(htmlout,"<html>");
01810 
01811       HTMLWrite(htmlout,"<head><title>");
01812       HTMLWrite(htmlout,GetSetting(config,"MESSAGE",""));
01813       HTMLWrite(htmlout,"</title></head><body>");
01814 
01815       if (atoi(GetSetting(config,"DISPLAYMESSAGE","1")) )
01816       {
01817        /* Display the message */
01818        HTMLWrite(htmlout,GetSetting(config,"MESSAGE","<P>Thank you!"));
01819       }
01820 
01821       if (atoi(GetSetting(config,"DISPLAYFORM","0")))
01822        isform = 1;
01823 
01824       if (isform || atoi(GetSetting(config,"DISPLAYREPORT","0")))
01825       {
01826        char *c = GetSetting(config,isform ? "FORM" : "REPORT",NULLSTR);
01827 
01828        /* use the filename from the config file, but in the current directory */
01829        FILE *f = FileOpen(argv0,c,"");
01830 
01831        /* 4d. Display the report you set above */
01832        if (f)
01833        {
01834         RunReport(argv0,htmlout,f,Params,NULL,NULL,isform,NULL);
01835         CGIFCLOSE(f);
01836        }
01837       }
01838 
01839       if (atoi(GetSetting(config,"DISPLAYHOTLINK","0")))
01840        {
01841         /* 4e. Display the link you set above */
01842         HTMLWrite(htmlout,"<HR><A HREF=\"");
01843         HTMLWrite(htmlout,GetSetting(config,"HOTLINK","/index.html"));
01844         HTMLWrite(htmlout,"\">Click here to continue</A>\n");
01845        }
01846 
01847       HTMLWrite(htmlout,"</body></html>\n");
01848       } /* redirect */
01849      } /* ret */
01850 return 0;
01851 }

int PrintInstructions EZSSTREAM htmlout  ) 
 

Definition at line 2007 of file ezs.c.

References HTMLWrite(), RAOSOFT_CGI_COPYRIGHT, and RAOSOFT_CGI_VERSION.

Referenced by CGImain().

02008 {
02009  HTMLWrite(htmlout,"<head><title>EZSurvey CGI</title></head>\n");
02010 
02011 #ifdef __WINCE__ /* IE caches POSTs if they look like GETs */
02012  HTMLWrite(htmlout,"<FORM ACTION=/ezs METHOD=POST ACCEPT-CHARSET=\"UTF-8\">\n");
02013 #else
02014  HTMLWrite(htmlout,"<FORM METHOD=GET ACCEPT-CHARSET=\"UTF-8\">\n");
02015 #endif
02016  HTMLWrite(htmlout,
02017  "<H3>Start filling out a form</H3>"
02018  "<P><label for=D>Please type the name of the form:</label> <input ID=D name=DATABASE><BR>\n"
02019  "<input type=submit value=\"  Click here to begin   \"></FORM>");
02020 
02021  HTMLWrite(htmlout,
02022  "<HR><P><A href=http://www.raosoft.com/products/ezsurvey>EZSurvey</A>&reg; "
02023  RAOSOFT_CGI_VERSION ". " RAOSOFT_CGI_COPYRIGHT );
02024 
02025  return 0;
02026 }

int SaveData char *  argv0,
char *  dbname,
CGINameValue Params,
CGINameValue config,
int  SubtractOldStats
 

Definition at line 1276 of file ezs.c.

References CalcCountSummary(), CGIFCLOSE, CGIFOPEN, CGIFREE, CopyBuffer(), DeleteBuffer(), ExpandLocalPath(), FileOpen(), GetFieldValue, GetRespcount(), GetSetting(), HTMLWrite(), LoadUserData(), MAXPATH, CGINameValue::name, NewBuffer(), NULL, NULLSTR, ReadINIFileSection(), RenameField(), RunReport(), SendMail(), and swapchars().

Referenced by CGImain().

01279 {
01280  int ret = 0;
01281  int respcount = GetRespcount(argv0,dbname);
01282 
01283  if ( atoi( GetSetting(config,"LOGDATETIME","1")) == 0)
01284   {
01285    RenameField(Params,"HOST","_HOST");
01286    RenameField(Params,"DATE","_DATE");
01287    RenameField(Params,"TIME","_TIME");
01288   }
01289 
01290  if (atoi(GetSetting(config,"SAVEEMAIL","0")))
01291   {
01292    char* form     = GetSetting(config,"EMAILREPORT","");
01293    char* address  = GetSetting(config,"SAVEEMAILNAME","");
01294    char* server   = GetSetting(config,"EMAILSERVER","");
01295    char* profile  = GetSetting(config,"EMAILPROFILE","Windows Messaging Settings");
01296    char* name     = GetSetting(config,"EMAILNAME","");
01297    char* password = GetSetting(config,"EMAILPWD","");
01298 
01299    {
01300     EZSSTREAM result;
01301     char*c;
01302     FILE* script = NULL;
01303 
01304     memset(&result,0,sizeof(result));
01305     result.t = NewBuffer(1024);
01306 
01307     if (*form)
01308       script = FileOpen(argv0,form,0);
01309     if (script)
01310      {
01311       RunReport(argv0,&result,script,Params,NULL,NULL,0,NULL);
01312       CGIFCLOSE(script);script=NULL;
01313      }
01314     else
01315     {
01316      int i;
01317      HTMLWrite(&result,"EZSurvey web data from: ");
01318      HTMLWrite(&result,GetFieldValue(Params,"HOST"));
01319      HTMLWrite(&result,"\r\nX-DATABASE: ");
01320      HTMLWrite(&result,dbname);
01321      HTMLWrite(&result,"\r\n");
01322 
01323      for (i=0; Params[i].name; i++)
01324      {
01325       if (Params[i].name[0] == '_' || Params[i].name[0] == 0) continue;
01326       HTMLWrite(&result,Params[i].name);
01327       HTMLWrite(&result,": ");
01328       HTMLWrite(&result,Params[i].value);
01329       HTMLWrite(&result,"\r\n");
01330      }
01331     }
01332 
01333     c = CopyBuffer(result.t);
01334     ret = SendMail(address,"EZSurvey form submission report",c, server, profile, name, password);
01335     CGIFREE(c);
01336     DeleteBuffer(result.t);
01337    }
01338    if (ret) return ret;
01339   }
01340 
01341 #if defined(XP_WIN) && !defined(__WINCE__)
01342 #define USE_MUTEX
01343 #endif
01344  if (atoi(GetSetting(config,"SAVESTAT","0")))
01345   {
01346    char statfile[MAXPATH];
01347    char *c = GetSetting(config,"SAVESTATNAME",NULLSTR);
01348    CGINameValue* count;
01349    CGINameValue* sum;
01350    CGINameValue* old;
01351 #ifdef USE_MUTEX
01352    HANDLE  Mutex;
01353    char Mutex_name[MAXPATH+1];
01354    strncpy(Mutex_name,statfile,MAXPATH);
01355    Mutex_name[MAXPATH] = 0;
01356    swapchars(Mutex_name, '\\', '/');
01357    Mutex = CreateMutex(0,FALSE,statfile);
01358    if (Mutex) WaitForSingleObject(Mutex,20000);
01359 #else
01360    FILE* out;
01361 #endif
01362 
01363    old = NULL;
01364    if (SubtractOldStats) old = LoadUserData(config,argv0,dbname,Params,&ret);
01365 
01366    if (ret) return ret;
01367 
01368    ExpandLocalPath(argv0,statfile,c,NULLSTR);
01369    count = ReadINIFileSection(statfile, "COUNT",0);
01370    sum = ReadINIFileSection(statfile, "SUM",0);
01371 #ifndef USE_MUTEX
01372    out = CGIFOPEN(statfile,"wt");
01373 
01374    if (out) /* can I open the file for writing? */
01375 #endif
01376    {
01377     int i;
01378     if (count)
01379     {
01380 #ifndef USE_MUTEX
01381     fwrite("[COUNT]\n",1,8,out);
01382 #endif
01383     for(i=0; count[i].name; i++)
01384     {/* count */
01385      int x = atoi(count[i].value);
01386      int d = CalcCountSummary(Params,count[i].name);
01387      if (old != NULL) d -= CalcCountSummary(old,count[i].name);
01388      x += d;
01389 
01390 #ifdef USE_MUTEX
01391      if (d)
01392      {
01393       char temp[32];
01394       sprintf(temp,"%d",x);
01395 #ifdef UNICODE
01396       WritePrivateProfileStringA("COUNT",count[i].name,temp,statfile);
01397 #else
01398       WritePrivateProfileString("COUNT",count[i].name,temp,statfile);
01399 #endif
01400      }
01401 #else
01402      fprintf(out,"%s=%d\n",count[i].name,x);
01403 #endif
01404     }
01405     }
01406     if (sum)
01407     {
01408 #ifndef USE_MUTEX
01409     fwrite("[SUM]\n",1,6,out);
01410 #endif
01411     for(i=0; sum[i].name; i++)
01412     {/* count */
01413      double x = strtod(sum[i].value,0);
01414      double d = strtod(GetFieldValue(Params,sum[i].name),0);
01415      if (x < 10E16 && x > -10E16 && d < 10E16 && d > -10E16)
01416      {
01417       if (old) d -= strtod(GetFieldValue(old,sum[i].name),0);
01418       if (d < 10E16 && d > -10E16)
01419        x += d;
01420      }
01421 
01422 #ifdef USE_MUTEX
01423      if (d != 0.0)
01424      {
01425       char temp[64];
01426       sprintf(temp,"%f",x);
01427 #ifdef UNICODE
01428       WritePrivateProfileStringA("SUM",sum[i].name,temp,statfile);
01429 #else
01430       WritePrivateProfileString("SUM",sum[i].name,temp,statfile);
01431 #endif
01432      }
01433 #else
01434      fprintf(out,"%s=%f\n",sum[i].name,x);
01435 #endif
01436     }
01437     }
01438 #ifndef USE_MUTEX
01439    CGIFCLOSE(out);
01440 #endif
01441    }
01442 #ifdef USE_MUTEX
01443 if (Mutex)
01444 {
01445    ReleaseMutex(Mutex);
01446    CloseHandle(Mutex);
01447 }
01448 #endif
01449    if (old) DeleteNVP(old);
01450    DeleteNVP(count);
01451    DeleteNVP(sum);
01452  } /* save stats */
01453 #undef USE_MUTEX
01454 
01455  if (atoi(GetSetting(config,"SAVEDATA","0")))
01456   {
01457    char dbfile[MAXPATH];
01458    char *c = GetSetting(config,"SAVEDATANAME",NULLSTR);
01459    char *index = GetSetting(config,"SAVEINDEXNAME",NULLSTR);
01460    int pos = 0;
01461 
01462    if (strlen(c) > 1000) c[1000]=0;
01463    if (strlen(index) > 1000) index[1000]=0;
01464 
01465    ExpandLocalPath(argv0,dbfile,c,NULLSTR);
01466 
01467    ret = SaveDataToASC(Params,dbfile,&pos);
01468    if (ret)
01469    {
01470      char s[128];
01471      sprintf(s,"\nSaveDataToASC error %d for ",ret);
01472      LogError(dbfile);
01473    }
01474    else
01475    {
01476        FILE * db;
01477        CGINameValue * header;
01478        if (DatabaseOpen(dbfile,&db,&header,0,1))
01479        {
01480            DeleteOldRecords(db,header,Params);
01481            DatabaseClose(db,header);
01482        }
01483    }
01484 
01485    if (pos && *index && ret == 0)
01486    {
01487     char indexfile[MAXPATH];
01488 
01489     ExpandLocalPath(argv0,indexfile,index,NULLSTR);
01490     ret = DatabaseSaveIndex(indexfile,Params,pos);
01491    }
01492    if (ret) return ret;
01493   }
01494 
01495  if (atoi(GetSetting(config,"SAVEXML","0")))
01496   {
01497    char dbfile[MAXPATH];
01498    char *c = GetSetting(config,"SAVEXMLNAME",NULLSTR);
01499 
01500    if (strlen(c) > 1000) c[1000]=0;
01501 
01502    ExpandLocalPath(argv0,dbfile,c,NULLSTR);
01503 
01504    ret = SaveDataToXML(Params,dbfile,0);
01505    if (ret)
01506    {
01507      char s[128];
01508      sprintf(s,"\nSaveDataToXML error %d for ",ret);
01509      LogError(dbfile);
01510    }
01511 
01512    if (ret) return ret;
01513   }
01514 
01515 #ifdef CGI_SOAP
01516  if (atoi(GetSetting(config,"SAVESOAP","0")))
01517  {
01518   char* c;
01519   FILE* script;
01520   EZSSTREAM result;
01521   ScriptFunction Functions[] =
01522   {{"escape",1,(ScriptFunctionCall)*JSHTMLEscape},
01523    {"print",16,(ScriptFunctionCall)*JSPrint},
01524    {"write",16,(ScriptFunctionCall)*JSPrint},
01525    {"eval",1,(ScriptFunctionCall)*JSEval},
01526    {"toFixed",2,(ScriptFunctionCall)*JStoFixed},
01527    {"ranksort",128,(ScriptFunctionCall)*JSRankSort},
01528    {"runReport",8,(ScriptFunctionCall)*JSReport},
01529    {"random",1,(ScriptFunctionCall)*JSRandom},
01530    {"timestamp",0,(ScriptFunctionCall)*JSTimeStamp},
01531    {"timedate",0,(ScriptFunctionCall)*JSTimeDate},
01532    {"timetime",0,(ScriptFunctionCall)*JSTimeTime},
01533    {"uniqueid",1,(ScriptFunctionCall)*JSUniqueId},
01534    {"subStr",3,(ScriptFunctionCall)*JSsubstr},
01535    {"indexOf",4,(ScriptFunctionCall)*JSIndexOf},
01536    {"length",1,(ScriptFunctionCall)*JSstrlen},
01537   {0,0,0}};
01538 
01539   ScriptEnvironment Global;
01540   memset(Global,0,sizeof(Global));
01541   Global.htmlout   = &result;
01542   Global.Functions = Functions;
01543   Global.argv0     = argv0;
01544   Global.config    = Config;
01545 
01546   char* host = GetSetting(config,"SOAPHOST","127.0.0.1");
01547   char* port = GetSetting(config,"SOAPPORT","80");
01548   char* function = GetSetting(config,"SOAPFUNCTION","");
01549   char* soapaction = GetSetting(config,"SOAPACTION","SUBMIT");
01550 
01551   if (!*function) return 66;
01552 
01553   /* generate the SOAP command */
01554   script = FileOpen(argv0,dbname,".val");
01555 
01556   if (!ReadUntilWordS(script,0,"<SCRIPT NAME=\"SAVESOAP\""))
01557    {
01558     rewind(script);
01559     /* 2003 and 2004 before SP1 didn't have quotes */
01560     if (!ReadUntilWordS(script,0,"<SCRIPT NAME=SAVESOAP"))
01561     {
01562      CGIFCLOSE(script);script=NULL;
01563      return 65;
01564     }
01565    }
01566   ReadUntilChar(script,0,0,">");
01567 
01568   memset(&result,0,sizeof(result));
01569   result.t = NewBuffer(1024);
01570 
01571   ret = RunScript(&Global,script,Params,Plugins,0);
01572   if (ret > 0)
01573   {
01574    PrintScriptError(htmlout,&Env, script, ret);
01575   }
01576   CGIFCLOSE(script);
01577 
01578   if (ret)
01579     return ret;
01580 
01581   c = CopyBuffer(result.t);
01582 
01583   if (SOAPExec(host, atoi(port), function, soapaction, c))
01584    ret = 68;
01585 
01586   CGIFREE(c);
01587   DeleteBuffer(result.t);
01588  }
01589 #endif
01590 
01591 #ifdef CGI_ODBC
01592  if (atoi(GetSetting(config,"SAVEODBC","0")))
01593  {
01594   SQLDB* db = 0;
01595   char* idfields = GetSetting(config,"IDFIELDS","IFMUID,IFMUID1,IFMUID2,IFMUID3,IFMUID4");
01596   /* First, try to UPDATE the database. If that doesn't work, try UPDATE */
01597 
01598   db = ODBCConnect( GetSetting(config,"ODBCSERVICE",""),
01599                         GetSetting(config,"ODBCNAME",""),
01600                         GetSetting(config,"ODBCPASSWORD",""),0);
01601   if (!db)
01602   {
01603         LogError("\nODBCOpen() failed");
01604         return 52;
01605   }
01606 
01607   /* If Update fails, there's no need to write error log information.
01608      We hope it means that the record isn't present */
01609 
01610   ret = -1;
01611 
01612   if (*idfields)
01613   {
01614    CGINameValue* Userid = ReadPairedString(idfields,',',0);
01615    int i;
01616    int any = 0;
01617    for(i=0; any == 0 && Userid[i].name; i++)
01618      any = GetFieldValue(Params,Userid[i].name)[0];
01619 
01620    DeleteNVP(Userid);
01621    if (any != 0)
01622     ret = TryODBC(db, argv0, dbname, config, Params, "<SCRIPT NAME=\"UPDATEODBC\"");
01623   }
01624 
01625   if (ret)
01626   {
01627    ret = TryODBC(db, argv0, dbname, config, Params, "<SCRIPT NAME=\"SAVEODBC\"");
01628   }
01629 
01630   if (ret == -1)
01631   {
01632    LogError("\nSQLExec Statement had no effect ");
01633   }
01634   else if (ret) /* both update and save failed */
01635   {
01636    char*c;
01637    LogError("\nSQLExec Failure:\n------\n");
01638    c = CopyBuffer(db->ErrorMessage);
01639    LogError(c);
01640    LogError("\n------");
01641    CGIFREE(c);
01642   }
01643   else
01644   {
01645    ODBCCommit(db);
01646   }
01647 
01648   ODBCDisconnect(db);
01649   if (ret) return ret;
01650  }
01651 
01652 #endif
01653  /* save succeeded! */
01654  SetRespcount(argv0,dbname,respcount+1);
01655  return 0;
01656 }

int SecurityError EZSSTREAM htmlout,
CGINameValue Params,
char *  dbname,
char *  action,
int  error
 

Definition at line 1878 of file ezs.c.

References CGI_ALLOW_APPEND, CGI_ALLOW_REPORT, CGI_ALLOW_UPDATE, HTMLEscape(), and HTMLWrite().

Referenced by CGImain().

01879 {
01880  int i;
01881  HTMLWrite(htmlout,"<H3>Permission denied</H3>\n");
01882  HTMLWrite(htmlout,"<P>Please enter your password to ");
01883 
01884  if (error == CGI_ALLOW_UPDATE) HTMLWrite(htmlout,"update data in");
01885  else if (error == CGI_ALLOW_APPEND) HTMLWrite(htmlout,"append data to");
01886  else if (error == CGI_ALLOW_REPORT) HTMLWrite(htmlout,"view reports of");
01887  else HTMLWrite(htmlout,"use");
01888 
01889  HTMLWrite(htmlout," this file.\n");
01890 
01891 #ifdef __WINCE__
01892  HTMLWrite(htmlout,"<P><FORM ACTION=/ezs METHOD=POST ACCEPT-CHARSET=\"UTF-8\">");
01893 #else
01894  HTMLWrite(htmlout,"<P><FORM METHOD=POST ACCEPT-CHARSET=\"UTF-8\">");
01895 #endif
01896  HTMLWrite(htmlout,"\n<INPUT TYPE=HIDDEN NAME=DATABASE VALUE=\"");
01897  HTMLWrite(htmlout,dbname);
01898  HTMLWrite(htmlout,"\">\n<INPUT TYPE=HIDDEN NAME=_ACTION VALUE=\"");
01899  HTMLWrite(htmlout,action);
01900  HTMLWrite(htmlout,"\">\n");
01901 
01902  for (i=0; Params[i].name; i++)
01903  {
01904   if (!Params[i].name[0]) continue;
01905   HTMLWrite(htmlout,"<INPUT TYPE=HIDDEN NAME=\"");
01906   HTMLEscape(htmlout,Params[i].name);
01907   HTMLWrite(htmlout,"\" VALUE=\"");
01908   HTMLEscape(htmlout,Params[i].value);
01909   HTMLWrite(htmlout,"\">\n");
01910  }
01911 
01912  HTMLWrite(htmlout,"<INPUT TYPE=PASSWORD NAME=_PASSWORD> <INPUT TYPE=SUBMIT VALUE=\"Login\"></FORM><HR>");
01913 
01914  return 101;
01915 }

int SetRespcount char *  argv0,
char *  dbname,
int  i
 

Definition at line 1260 of file ezs.c.

References CGIFOPEN, ExpandLocalPath(), and MAXPATH.

01261 {
01262   char filename[MAXPATH];
01263 
01264   FILE * f;
01265   ExpandLocalPath(argv0,filename,dbname,".respcount");
01266   f = CGIFOPEN(filename,"wb");
01267   if (f)
01268   {
01269    fwrite(&i,sizeof(i),1,f);
01270    fclose(f);
01271    return 1;
01272   }
01273   return 0;
01274 }

int ShowForm char *  argv0,
EZSSTREAM htmlout,
char *  formname,
CGINameValue Params
 

Definition at line 825 of file ezs.c.

References CheckFileName(), FileOpen(), NULL, and RunReport().

Referenced by CGImain().

00826 {
00827  FILE * f = NULL;
00828  if (!formname) return 2;
00829  if (!*formname) return 2;
00830 
00831  if (CheckFileName(formname,"html,htm"))
00832   f = FileOpen(argv0,formname,"");
00833 
00834  if (!f)
00835   f = FileOpen(argv0,formname,".html");
00836 
00837  if (!f) return 2;
00838 
00839  RunReport(argv0,htmlout,f,Params,NULL,NULL,1,NULL);
00840 
00841  fclose(f);
00842  return 0;
00843 }

int ShowFormPage char *  argv0,
EZSSTREAM htmlout,
char *  dbname,
CGINameValue Params,
char *  history,
char *  curpage
 

Definition at line 845 of file ezs.c.

References CGIFCLOSE, CGIFOPEN, CGIFREE, CopyList(), DeleteNVP(), ExpandLocalPath(), FileOpen(), GetField(), GetFieldValue, HasToken(), HasTokenI(), HTMLEscape(), HTMLWrite(), HTMLWriteFile(), LogError(), MAXPATH, NULL, ReadHTMLAttributes(), ReadPairedString(), ReadUntilChar(), ReadUntilWordS(), RenameField(), RunReport(), SetFieldValue(), SLASH, strdup3(), and strnicmp().

Referenced by CGImain().

00847 {
00848  char dbdir[MAXPATH];
00849  char filename[MAXPATH];
00850  char temp[1024];
00851  int i, p;
00852  FILE * config;
00853  FILE * script;
00854 
00855  CGINameValue * Options = NULL;
00856  CGINameValue * unused = CopyList(Params,0);
00857 
00858 /* char* pagenext, *pageback, *next;  */
00859 
00860  if (curpage[0] == 'P') curpage[0] = 'p';
00861  /* check that curpage doesn't try to sneak into another directory */
00862  /* also, may not access file names with periods in them */
00863  i = strcspn(curpage,"/.\\*?$|'\"<>~");
00864  if (curpage[i] != 0) return 104;
00865 
00866  /* Kluge: starting each page name with "page" takes up too much space in the
00867     database. So let's strip out the word "page" from the history, and prepend
00868     "page" if necessary when loading the page data.
00869  */
00870  if (history && *history)
00871  {
00872   char * x = history;
00873   char * y = history;
00874   while (*x)
00875   {
00876    if (!strncmp(x,"page",4))
00877      x += 4;
00878    else
00879      *y++ = *x++;
00880   }
00881   *y = 0;
00882  }
00883 
00884  ExpandLocalPath(argv0,dbdir,dbname,SLASH);
00885 
00886  /* open the page file */
00887  strcpy(filename,dbdir);
00888  strcat(filename,curpage);
00889  config = CGIFOPEN(filename,"rb");
00890 
00891  if (!config && !strstr(curpage,"page"))
00892  {
00893   strcpy(filename,dbdir);
00894   strcat(filename,"page");
00895   strcat(filename,curpage);
00896   config = CGIFOPEN(filename,"rb");
00897  }
00898 
00899  /* look for page information */
00900 
00901  if (!config)
00902   {
00903    HTMLWrite(htmlout,"<P>Error: page data missing for page");
00904    HTMLEscape(htmlout,curpage);
00905    HTMLWrite(htmlout," ");
00906    HTMLEscape(htmlout,filename);
00907    LogError("\nCould not open page data file ");
00908    LogError(filename);
00909    return 2;
00910   }
00911 
00912  script = FileOpen(argv0,dbname,".val");
00913  if (script != NULL)
00914  {/*EZS2003: config info in the .val file.
00915    All we need are the INCLUDE, ACTION, and METHOD tags.
00916    The rest is in the HTML. */
00917    /* prepend "page" if necessary */
00918   char* check ;
00919   if (!strnicmp(curpage,"page",4)) curpage += 4;
00920   check = strdup3("<PAGE NAME=\"page",curpage,"\"");
00921   if (ReadUntilWordS(script,0,check))
00922     Options = ReadHTMLAttributes(script,32);
00923   CGIFCLOSE(script);
00924   CGIFREE(check);
00925  }
00926 
00927  temp[0]=0;
00928  if (!Options || !GetField(Options,"ACTION")) /* ACTION added in 2003 */
00929  {/*EZS2000-2002: config info at the top of each HTML file */
00930   /* send the header */
00931   strcpy(filename,dbdir);
00932   strcat(filename,"header");
00933 
00934   HTMLWriteFile(htmlout,filename);
00935 
00936   /* start the form */
00937   ReadUntilChar(config,temp,sizeof(temp),"\n",'\r'); /* read 1k config */
00938   Options = ReadPairedString(temp,'&',0);
00939 
00940   ReadUntilChar(config,0,0,"\n",'\r'); /* unused line */
00941 
00942   /* read the included file list. actually, it's just one file. */
00943   ReadUntilChar(config,temp,sizeof(temp),"\n",'\r'); /* read 1k config */
00944  }
00945 
00946  /* scan until the form tag and replace it with ours */
00947  RunReport(argv0,htmlout,config,Params,0,unused,1,"FORM");
00948 
00949 
00950 /* RunReport always finishes the tag if possible.
00951   if (i != '>' && i != EOF)
00952   ReadUntilChar(config,0,0,">");
00953   */
00954 
00955  HTMLWrite(htmlout,
00956   "<FORM NAME=F onSubmit=\"return ezsOnSubmit(this);\" ACCEPT-CHARSET=\"UTF-8\"");
00957 
00958 #ifdef __WINCE__
00959  HTMLWrite(htmlout," ACTION=/ezs METHOD=POST");
00960 #else
00961  if (GetField(Options,"ACTION"))
00962   {
00963    HTMLWrite(htmlout," ACTION=\"");
00964    HTMLWrite(htmlout,GetFieldValue(Options,"ACTION"));
00965    HTMLWrite(htmlout,"\"");
00966   }
00967 
00968  if (GetField(Options,"AUTOCOMPLETE"))
00969   {
00970    HTMLWrite(htmlout," AUTOCOMPLETE=\"");
00971    HTMLWrite(htmlout,GetFieldValue(Options,"AUTOCOMPLETE"));
00972    HTMLWrite(htmlout,"\"");
00973   }
00974 
00975  if (GetField(Options,"METHOD"))
00976   {
00977    HTMLWrite(htmlout," METHOD=\"");
00978    HTMLWrite(htmlout,GetFieldValue(Options,"METHOD"));
00979    HTMLWrite(htmlout,"\"");
00980   }
00981  else HTMLWrite(htmlout," METHOD=POST");
00982 #endif
00983 
00984  HTMLWrite(htmlout,">\n");
00985 
00986  /* pageback = GetFieldValue(Options,"PAGEBACK");
00987  pageback = GetFieldValue(Params,"_PAGEBACK");
00988  pagenext = GetFieldValue(Params,"_PAGENEXT");    */
00989 
00990  /*next = GetFieldValue(Options,"PAGENEXT");*/
00991 
00992  /* pagenext could be a comma-delimited list of places we need to visit.
00993     They take prescedence over the default _PAGENEXT value that is
00994     written into the HTML file. The default _PAGENEXT value is also given
00995     to us as PAGENEXT in the Options list.
00996  */
00997 
00998  /* we've visited this page, so remove it from the list */
00999 #if 0
01000  if (*pagenext)
01001  {/* generate a new _PAGENEXT value to replace the one in the file*/
01002   if (HasToken(pagenext,next,0))
01003    {/* do nothing -- _PAGENEXT stays as is */
01004    }
01005   else
01006    {/* add 'next' to the end of pagenext, so that we can skip to
01007        a group of pages. The last set of page names before a space will be
01008        stripped when going back.
01009     */
01010     char * x = strdup3(pagenext," ",next);
01011     SetFieldValue(Params,"_PAGENEXT",x);
01012     CGIFREE(x);
01013    }
01014  }
01015  else
01016  {
01017   RenameField(Params,"_PAGENEXT",0);
01018  }
01019 #endif
01020 
01021  HTMLWrite(htmlout,"<INPUT TYPE=HIDDEN NAME=DATABASE VALUE=\"");
01022  HTMLWrite(htmlout,dbname);
01023  HTMLWrite(htmlout,"\">\n");
01024 
01025  HTMLWrite(htmlout,"<INPUT TYPE=HIDDEN NAME=_PAGEBACK VALUE=\"");
01026  HTMLWrite(htmlout,history);
01027  HTMLWrite(htmlout,"\">\n");
01028 
01029  RenameField(Params,"_PAGEBACK",0);
01030  RenameField(Params,"_PAGE",0);
01031  RenameField(Params,"_PAGESKIP",0);
01032  /* don't remove the DATABASE field: we need to write it on each form */
01033  /* We used to rename these fields earlier, but that resulted in clearing the
01034     curpage variable. Oops! */
01035 
01036 
01037  /* send the included files -- only one file for now */
01038  if(*temp)
01039  {
01040  strcpy(filename,dbdir);
01041  strcat(filename,temp);
01042  HTMLWriteFile(htmlout,filename);
01043  }
01044  /* pretend to run the report, so we can find the unused field names */
01045  p = ftell(config);
01046  RunReport(argv0,0,config,Params,NULL,unused,1,"/FORM");
01047 
01048  /* send the hidden field data */
01049  for (i = 0; unused[i].name; i++)
01050  {
01051    if (!unused[i].name[0]) continue;
01052       /* skip fields that have already been printed */
01053       /*name is short, but value could be long*/
01054 
01055    if (!HasTokenI("HOST,DATE,TIME",unused[i].name,0) &&
01056        strncmp("_PAGE",unused[i].name,5) ) /* skip special fields */
01057       {
01058        HTMLWrite(htmlout,"<INPUT TYPE=HIDDEN NAME=\"");
01059        HTMLEscape(htmlout,unused[i].name);
01060        HTMLWrite(htmlout,"\" VALUE=\"");
01061        HTMLEscape(htmlout,unused[i].value);
01062        HTMLWrite(htmlout,"\">\n");
01063      }
01064  }
01065 
01066  /* send the remaining page data */
01067  fseek(config,p,SEEK_SET);
01068  RunReport(argv0,htmlout,config,Params,NULL,unused,1,0);
01069 
01070  CGIFCLOSE(config);
01071  DeleteNVP(unused);
01072  DeleteNVP(Options);
01073 
01074  /* send the footer */
01075  // strcpy(filename,dbdir);
01076  // strcat(filename,"footer");
01077  // HTMLWriteFile(htmlout,filename);
01078 
01079  return 0;
01080 }

void ShowProgramStatus EZSSTREAM htmlout,
int  Security
 

Definition at line 1853 of file ezs.c.

References CGI_ALLOW_ADMIN, CGI_ALLOW_APPEND, CGI_ALLOW_DELETE, CGI_ALLOW_NONE, CGI_ALLOW_READ, CGI_ALLOW_UPDATE, CGI_ALLOW_WRITE, and HTMLWrite().

Referenced by CGImain().

01854 {
01855  if (Security == CGI_ALLOW_NONE)
01856  {
01857   HTMLWrite(htmlout,"<P>You are not permitted to use this server.");
01858  }
01859  else
01860  {
01861   HTMLWrite(htmlout,"<P>With this database, you may:<UL>");
01862   if (Security & CGI_ALLOW_READ)
01863    HTMLWrite(htmlout,"<LI>Read data\n");
01864   if (Security & CGI_ALLOW_WRITE)
01865    HTMLWrite(htmlout,"<LI>Edit records\n");
01866   if (Security & CGI_ALLOW_UPDATE)
01867    HTMLWrite(htmlout,"<LI>Update existing records\n");
01868   if (Security & CGI_ALLOW_APPEND)
01869    HTMLWrite(htmlout,"<LI>Append new records\n");
01870   if (Security & CGI_ALLOW_ADMIN)
01871    HTMLWrite(htmlout,"<LI>Administer the database\n");
01872   if (Security & CGI_ALLOW_DELETE)
01873    HTMLWrite(htmlout,"<LI>Delete records\n");
01874   HTMLWrite(htmlout,"</UL>");
01875  }
01876 }

static int SortFunction const void *  a0,
const void *  b0
[static]
 

Definition at line 549 of file ezs.c.

References CGINameValue::value.

Referenced by SortNVP().

00550 {
00551  CGINameValue* a = (CGINameValue*)a0;
00552  CGINameValue* b = (CGINameValue*)b0;
00553  int x=0,y=0;
00554  if (a->value) x = atoi(a->value);
00555  if (b->value) y = atoi(b->value);
00556  return x - y;
00557 };

void SortNVP CGINameValue list  ) 
 

Definition at line 559 of file ezs.c.

References NULL, and SortFunction().

Referenced by JSRankSort().

00560 {
00561  size_t x= 0;
00562  while (list[x].name != NULL) x++;
00563  qsort(list,x,sizeof(CGINameValue),*SortFunction);
00564 }

int TryODBC SQLDB db,
char *  argv0,
char *  dbname,
CGINameValue config,
CGINameValue Params,
char *  script
 

Definition at line 1197 of file ezs.c.

References CGIFREE, CopyBuffer(), DeleteBuffer(), LogError(), NewBuffer(), ODBCExec(), and ODBCRunScript().

01198 {
01199   char *c;
01200   int ret;
01201   EZSSTREAM result;
01202   int rowsUpdated = 0;
01203 
01204   memset(&result,0,sizeof(result));
01205   result.t = NewBuffer(1024);
01206 
01207   ret = ODBCRunScript(argv0,&result,dbname,config,Params,script);
01208   if (ret)
01209    {
01210     char s[128];
01211     sprintf(s,"ODBCRunScript error %d for ",ret);
01212     LogError(s);
01213     LogError(script);
01214    }
01215 
01216   c = CopyBuffer(result.t);
01217   DeleteBuffer(result.t);
01218 
01219   if (ret)
01220   {
01221     LogError(c);
01222     CGIFREE(c);
01223     return ret;
01224   }
01225 
01226   if (*c)
01227   ret = ODBCExec(db,c,&rowsUpdated);
01228 
01229   if (ret)
01230    {
01231     char s[128];
01232     sprintf(s,"\nODBCRunScript error %d",ret);
01233     LogError(s);
01234    }
01235 
01236 
01237   CGIFREE(c);
01238   if (ret) return ret;
01239   if (rowsUpdated == 0) return -1; /* code had no effect */
01240   return 0;
01241 }

int ValidateBack char *  argv0,
EZSSTREAM htmlout,
char *  dbname,
CGINameValue Config,
CGINameValue Params,
char *  page
 

Definition at line 759 of file ezs.c.

References CGIFCLOSE, CGIFREE, FileOpen(), GetField(), JSEval(), JSGetEnv(), JSIndexOf(), JSPrint(), JSRandom(), JSReport(), JSSendMail(), JSShowPage(), JSstrlen(), JSsubstr(), JSTimeDate(), JSTimeStamp(), JSTimeTime(), JStoFixed(), JSToNumber(), JSUniqueId(), NULL, PrintScriptError(), ReadUntilWordS(), RenameField(), RunScript(), and strdup3().

Referenced by CGImain().

00763 {
00764  char *check;
00765  int ret;
00766  FILE* script;
00767  ScriptFunction Functions[] =
00768  {
00769   {"print",10,(ScriptFunctionCall)*JSPrint},
00770   {"write",10,(ScriptFunctionCall)*JSPrint},
00771   {"eval",1,(ScriptFunctionCall)*JSEval},
00772   {"timestamp",0,(ScriptFunctionCall)*JSTimeStamp},
00773   {"timedate",0,(ScriptFunctionCall)*JSTimeDate},
00774   {"timetime",0,(ScriptFunctionCall)*JSTimeTime},
00775   {"uniqueid",1,(ScriptFunctionCall)*JSUniqueId},
00776   {"toFixed",2,(ScriptFunctionCall)*JStoFixed},
00777   {"sendMail",3,(ScriptFunctionCall)*JSSendMail},
00778   {"showpage",1,(ScriptFunctionCall)*JSShowPage},
00779   {"runReport",8,(ScriptFunctionCall)*JSReport},
00780   {"number",1,(ScriptFunctionCall)*JSToNumber},
00781         {"environment",1,(ScriptFunctionCall)*JSGetEnv},
00782   {"toNumber",1,(ScriptFunctionCall)*JSToNumber},
00783   {"random",1,(ScriptFunctionCall)*JSRandom},
00784         {"subStr",3,(ScriptFunctionCall)*JSsubstr},
00785       {"indexOf",4,(ScriptFunctionCall)*JSIndexOf},
00786       {"length",1,(ScriptFunctionCall)*JSstrlen},
00787 {0,0,0}};
00788 
00789  ScriptEnvironment Global;
00790  memset(&Global,0,sizeof(Global));
00791  Global.htmlout   = htmlout;
00792  Global.Functions = Functions;
00793  Global.argv0     = argv0;
00794  Global.config    = Config;
00795 
00796  if (!page || !*page) return 0;
00797 
00798  script = FileOpen(argv0,dbname,".val");
00799  if (script == NULL) return 1; /* OK */
00800 
00801  check = strdup3("<PAGE NAME=\"",page,"\"");
00802 
00803  if (!ReadUntilWordS(script,0,check)) {CGIFCLOSE(script);script=NULL;CGIFREE(check); return 0; }
00804 
00805  CGIFREE(check);
00806 
00807  if (!ReadUntilWordS(script,0,"<SCRIPT TYPE=BACK>")) {CGIFCLOSE(script);script=NULL; return 0; }
00808 
00809  if (!GetField(Params,"_PAGEWARN"))
00810     RenameField(Params,"","_PAGEWARN");
00811  if (!GetField(Params,"_PAGENEXT"))
00812     RenameField(Params,"","_PAGENEXT");
00813  if (!GetField(Params,"_PAGESKIP"))
00814     RenameField(Params,"","_PAGESKIP");
00815 
00816  ret = RunScript(&Global,script,Params);
00817  if (ret > 0)
00818  {
00819   PrintScriptError(htmlout,&Global, script, ret);
00820  }
00821  CGIFCLOSE(script);
00822  return 0;
00823 }

int ValidatePage char *  argv0,
EZSSTREAM htmlout,
char *  dbname,
CGINameValue Config,
CGINameValue Params,
char *  page
 

Doesn't do a proper XML parsing, but scans for the page's entry in the .val file. The <SCRIPT> tag is assumed to be in our modified JavaScript language. Since it isn't parsed, > and < may be used in the script. For the perl version, scan for <Script language="perl>"> instead.

Example:

<?xml version="1.0" ?> <!DOCTYPE VALIDATE SYSTEM "http://www.raosoft.com/xml/validate.dtd"> <VALIDATE source="form.ezf"> <page name="page4>"> <script language="EZSURVEY2004>"> </script> </page> <submit> <script>JS submit script </script> <script language="Perl>">Perl submit script </script> </submit> </VALIDATE>

Definition at line 691 of file ezs.c.

References CGIFCLOSE, CGIFREE, FileOpen(), GetField(), JSEval(), JSGetEnv(), JSIndexOf(), JSPrint(), JSRandom(), JSRankIndex(), JSRankSort(), JSReport(), JSSendMail(), JSShowPage(), JSstrlen(), JSsubstr(), JSTimeDate(), JSTimeStamp(), JSTimeTime(), JStoFixed(), JSToNumber(), JSUniqueId(), NULL, PrintScriptError(), ReadUntilWordS(), RenameField(), RunScript(), and strdup3().

Referenced by CGImain().

00695 {
00696  char *check;
00697  int ret;
00698  FILE* script;
00699  ScriptFunction Functions[] =
00700  {
00701   {"print",10,(ScriptFunctionCall)*JSPrint},
00702   {"write",10,(ScriptFunctionCall)*JSPrint},
00703   {"eval",1,(ScriptFunctionCall)*JSEval},
00704   {"timestamp",0,(ScriptFunctionCall)*JSTimeStamp},
00705   {"timedate",0,(ScriptFunctionCall)*JSTimeDate},
00706   {"timetime",0,(ScriptFunctionCall)*JSTimeTime},
00707   {"uniqueid",1,(ScriptFunctionCall)*JSUniqueId},
00708   {"tofixed",2,(ScriptFunctionCall)*JStoFixed},
00709   {"sendmail",3,(ScriptFunctionCall)*JSSendMail},
00710   {"showpage",1,(ScriptFunctionCall)*JSShowPage},
00711   {"ranksort",128,(ScriptFunctionCall)*JSRankSort},
00712   {"rankindex",2,(ScriptFunctionCall)*JSRankIndex},
00713   {"runReport",8,(ScriptFunctionCall)*JSReport},
00714   {"number",1,(ScriptFunctionCall)*JSToNumber},
00715   {"environment",1,(ScriptFunctionCall)*JSGetEnv},
00716   {"toNumber",1,(ScriptFunctionCall)*JSToNumber},
00717   {"random",1,(ScriptFunctionCall)*JSRandom},
00718         {"subStr",3,(ScriptFunctionCall)*JSsubstr},
00719       {"indexOf",4,(ScriptFunctionCall)*JSIndexOf},
00720       {"length",1,(ScriptFunctionCall)*JSstrlen},
00721 {0,0,0}};
00722 
00723  ScriptEnvironment Global;
00724  memset(&Global,0,sizeof(Global));
00725  Global.htmlout   = htmlout;
00726  Global.Functions = Functions;
00727  Global.argv0     = argv0;
00728  Global.config    = Config;
00729  if (!page || !*page) return 0;
00730 
00731  script = FileOpen(argv0,dbname,".val");
00732  if (script == NULL) return 1; /* OK */
00733 
00734  check = strdup3("<PAGE NAME=\"",page,"\"");
00735 
00736  if (!ReadUntilWordS(script,0,check)) {CGIFCLOSE(script);script=NULL;CGIFREE(check); return 0; }
00737 
00738  CGIFREE(check);
00739 
00740  if (!ReadUntilWordS(script,0,"<SCRIPT")) {CGIFCLOSE(script);script=NULL; return 0; }
00741  if (!ReadUntilWordS(script,0,">")) {CGIFCLOSE(script);script=NULL; return 0; }
00742  if (!GetField(Params,"_PAGEWARN"))
00743     RenameField(Params,"","_PAGEWARN");
00744  if (!GetField(Params,"_PAGENEXT"))
00745     RenameField(Params,"","_PAGENEXT");
00746  if (!GetField(Params,"_PAGESKIP"))
00747     RenameField(Params,"","_PAGESKIP");
00748 
00749  ret = RunScript(&Global,script,Params);
00750  if (ret > 0)
00751  {
00752   PrintScriptError(htmlout,&Global, script, ret);
00753  }
00754  CGIFCLOSE(script);
00755  return 0;
00756 }



Raosoft, Inc.
Raosoft EZReport, EZSurvey, InterForm, RapidReport, Raosoft, and SurveyWin are registered trademarks of Raosoft, Inc. Page contents © 1996-2007 by Raosoft, Inc. You may use and modify this file for your own use, but may not distribute it or derivative works without the prior written consent of Raosoft, Inc. This software is provided "as is," and Raosoft makes no warranty, express or implied, of fitness for a particular application. Every measure has been taken to anticipate risks inherent to computer networks, but we cannot guarantee safety or reliability of this program in every situation.
Tel: 206-525-4025 (US) Email: raosoft@raosoft.com
http://www.raosoft.com/