Annotation of capa/capa51/pProj/capaNewCgi.c, revision 1.4

1.2       albertel    1: /* broken start to a new CGI library
                      2:    Copyright (C) 1992-2000 Michigan State University
                      3: 
                      4:    The CAPA system is free software; you can redistribute it and/or
1.4     ! albertel    5:    modify it under the terms of the GNU General Public License as
1.2       albertel    6:    published by the Free Software Foundation; either version 2 of the
                      7:    License, or (at your option) any later version.
                      8: 
                      9:    The CAPA system is distributed in the hope that it will be useful,
                     10:    but WITHOUT ANY WARRANTY; without even the implied warranty of
                     11:    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
1.4     ! albertel   12:    General Public License for more details.
1.2       albertel   13: 
1.4     ! albertel   14:    You should have received a copy of the GNU General Public
1.2       albertel   15:    License along with the CAPA system; see the file COPYING.  If not,
                     16:    write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
1.3       albertel   17:    Boston, MA 02111-1307, USA.
                     18: 
                     19:    As a special exception, you have permission to link this program
                     20:    with the TtH/TtM library and distribute executables, as long as you
                     21:    follow the requirements of the GNU GPL in regard to all of the
                     22:    software in the executable aside from TtH/TtM.
                     23: */
1.2       albertel   24: 
1.1       albertel   25: char *makeword(char *line, char stop)
                     26: {
                     27:     int x = 0,y;
                     28:     char *word = (char *) malloc(sizeof(char) * (strlen(line) + 1));
                     29: 
                     30:     for(x=0;((line[x]) && (line[x] != stop));x++)
                     31:         word[x] = line[x];
                     32: 
                     33:     word[x] = '\0';
                     34:     if(line[x]) ++x;
                     35:    y=0;
                     36: 
                     37:     while((line[y++] = line[x++]));
                     38:     return word;
                     39: }
                     40: 
                     41: char *fmakeword(FILE *f,char  stop,int * cl)
                     42: {
                     43:     int wsize;
                     44:     char *word;
                     45:     int ll;
                     46: 
                     47:     wsize = 102400;
                     48:     ll=0;
                     49:     word = (char *) malloc(sizeof(char) * (wsize + 1));
                     50: 
                     51:     while(1) {
                     52:         word[ll] = (char)fgetc(f);
                     53:         if(ll==wsize) {
                     54:             word[ll+1] = '\0';
                     55:             wsize+=102400;
                     56:             word = (char *)realloc(word,sizeof(char)*(wsize+1));
                     57:         }
                     58:         --(*cl);
                     59:         if((word[ll] == stop) || (feof(f)) || (!(*cl))) {
                     60:             if(word[ll] != stop) ll++;
                     61:             word[ll] = '\0';
                     62:             return word;
                     63:         }
                     64:         ++ll;
                     65:     }
                     66: }
                     67: 
                     68: char x2c(char *what)
                     69: {
                     70:     register char digit;
                     71: 
                     72:     digit = (what[0] >= 'A' ? ((what[0] & 0xdf) - 'A')+10 : (what[0] - '0'));
                     73:     digit *= 16;
                     74:     digit += (what[1] >= 'A' ? ((what[1] & 0xdf) - 'A')+10 : (what[1] - '0'));
                     75:     return(digit);
                     76: }
                     77: 
                     78: void unescape_url(char *url)
                     79: {
                     80:     register int x,y;
                     81: 
                     82:     for(x=0,y=0;url[y];++x,++y) {
                     83:         if((url[x] = url[y]) == '%') {
                     84:             url[x] = x2c(&url[y+1]);
                     85:             y+=2;
                     86:         }
                     87:     }
                     88:     url[x] = '\0';
                     89: }
                     90: 
                     91: void plustospace(char *str)
                     92: {
                     93:     register int x;
                     94: 
                     95:     for(x=0;str[x];x++) if(str[x] == '+') str[x] = ' ';
                     96: }
                     97: 
                     98: void web_parse_input(char * submissions_str)
                     99: {
                    100:   int x;
                    101: 
                    102:   for(x=0; x <= m; x++) {
                    103:     if( !strcmp(g_entries[x].name,"CLASS") ) {
                    104:       strncpy(g_class_name,g_entries[x].val,MAX_CLASS_CHAR);
                    105:     }
                    106:     if( !strcmp(g_entries[x].name,"M") ) {
                    107:       sscanf(g_entries[x].val,"%d",&g_run_mode);
                    108:     }
                    109:     if( !strcmp(g_entries[x].name,"SNUM") ) {
                    110:       strncpy(g_student_number,g_entries[x].val,MAX_STUDENT_NUMBER+4);
                    111:     }
                    112:     if( !strcmp(g_entries[x].name,"CAPAID") ) {
                    113:       sscanf(g_entries[x].val,"%d",&g_entered_pin);
                    114:     }
                    115:     if( !strcmp(g_entries[x].name,"SET") ) {
                    116:       sscanf(g_entries[x].val,"%d",&g_set);
                    117:     }
                    118:     if( !strcmp(g_entries[x].name,"VSET") ) {
                    119:       if (g_entries[x].val[0] == '\0') {
                    120: 	g_vset=0;
                    121:       } else {
                    122: 	sscanf(g_entries[x].val,"%d",&g_vset);
                    123:       }
                    124:     }
                    125:     if( !strcmp(g_entries[x].name,"KND") ) {
                    126:       sscanf(g_entries[x].val,"%d",&g_skind);
                    127:     }
                    128:     if( !strncmp(g_entries[x].name,"INPUT",5) ) {
                    129:       sscanf(g_entries[x].name,"INPUT%d",&q_idx);
                    130:       if( q_idx > 0 && q_idx < MAX_PROBLEM_CNT ) {
                    131: 	strncpy(g_student_answer[q_idx],g_entries[x].val,MAX_ANSWER_CHAR);
                    132:       }
                    133:       if ( g_student_answer[q_idx][0] != '\0' ) {
                    134: 	sprintf(buf,"%d\t%s\t",q_idx,g_student_answer[q_idx]);
                    135: 	strcat(submissions_str,buf);
                    136:       }
                    137:     }
                    138:     if( !strncmp(g_entries[x].name,"LAST",4) ) {
                    139:       sscanf(g_entries[x].name,"LAST%d",&q_idx);
                    140:       if( q_idx > 0 && q_idx < MAX_PROBLEM_CNT ) {
                    141: 	strncpy(g_last_answer[q_idx],g_entries[x].val,MAX_ANSWER_CHAR);
                    142:       }
                    143:     }
                    144:     free(g_entries[x].val);
                    145:     free(g_entries[x].name);
                    146:   }
                    147: }
                    148: 
                    149: int web_login() 
                    150: {
                    151:   if( g_entered_pin != 0 ) {
                    152:     g_login_set = capa_PIN(g_student_number,999,g_entered_pin);
                    153:   } else {
                    154:     return WEB_ERR_ENTERED_PIN;
                    155:   }
                    156: 
                    157:   if (!g_login_set) { 
                    158:     return WEB_ERR_BADLOGIN;
                    159:   } else {
                    160:     if ( g_login_set > 99 )  { return WEB_ERR_LOGINTOHIGH; }
                    161:     if(g_login_set < g_vset ) {
                    162:       return WEB_ERR_NOTVIEWABLE;
                    163:     }
                    164:     chdir(g_class_fullpath);  /* again, to make sure */
                    165:       
                    166:     if ( capa_get_student(g_student_number,&g_student_data) == 0 ) {
                    167:       return WEB_ERR_STUDENT_NOT_EXIST;
                    168:     } else {
                    169:       time(&curtime);
                    170:       if (capa_get_header(&header, g_login_set, wgt, pcr))  {
                    171: 	return WEB_ERR_SET_NOT_READY;
                    172:       }
                    173:       if(capa_check_date(CHECK_OPEN_DATE,g_student_data.s_sec,
                    174: 			 g_login_set) < 0 ) {
                    175: 	
                    176: 	return WEB_ERR_SET_NOT_OPEN;
                    177:       }
                    178:     }
                    179:   }
                    180:   return (error);
                    181: }
                    182: 
                    183: int web_get_input() 
                    184: {
                    185:   
                    186:   envPtr=getenv("REQUEST_METHOD");
                    187:   if (!envPtr ) { return WEB_ERR_REQ_METHOD; }
                    188:   if (strcmp(envPtr,"POST")) { return WEB_ERR_ENV_POST; }
                    189:   envPtr=getenv("CONTENT_TYPE");
                    190:   if (!envPtr ) { return WEB_ERR_CONTENT_TYPE; }
                    191:   if (strcmp(envPtr,"application/x-www-form-urlencoded")) { 
                    192:     return WEB_ERR_ENV_CONTENT; 
                    193:   }
                    194:   envPtr=getenv("CONTENT_LENGTH");
                    195:   if (!envPtr ) { return WEB_ERR_CONTENT_LENGTH; }
                    196:   content_length=atoi(envPtr);
                    197: 
                    198:   /* read the form into the g_entries array*/
                    199:   for(x=0;content_length && (!feof(stdin));x++) {
                    200:     m=x;
                    201:     g_entries[x].val = fmakeword(stdin,'&',&content_length);
                    202:     plustospace(g_entries[x].val);
                    203:     unescape_url(g_entries[x].val);
                    204:     g_entries[x].name = makeword(g_entries[x].val,'=');
                    205:   }
                    206: 
                    207:   web_parse_input(submissions_str);
                    208: 
                    209:   if ( g_run_mode == WEB_CHECKIN ) {
                    210:     time(&curtime); time_str = ctime(&curtime);
                    211:     time_str[ strlen(time_str)-1 ] = '\0';
                    212:     envPtr=getenv("REMOTE_HOST");
                    213:     envPtr2=getenv("HTTP_USER_AGENT");
                    214:     sprintf(log_str,"%s\t%s\t%s\t%s\t%s\n",g_class_name,g_student_number,
                    215: 	    time_str,envPtr,envPtr2);
                    216:     if (web_log(log_str) == -1 ) { return WEB_ERR_WEB_LOG; }
                    217:   }
                    218: 
                    219:   getwd(g_cwd);
                    220: 
                    221:   web_getclassdir(&g_cpath, &g_cowner, g_class_name);
                    222:   sprintf(g_class_fullpath,"%s/%s",g_cpath,g_class_name);
                    223:   if( !capa_access(g_class_fullpath, F_OK) == 0 ) { return WEB_ERR_ACCESS; }
                    224:     
                    225:   chdir(g_class_fullpath);
                    226:   if ( g_run_mode == M_CHECKANS) {
                    227:     if (w_log_submissions(g_student_number,g_set,submissions_str) == -1 ) {
                    228:       return WEB_ERR_SUBMMISIONS_LOG;    
                    229:     }
                    230:   }
                    231:   
                    232:   result=read_capa_config("capaweb_cgibin_path",buf);
                    233:   if (result != 0 && result != -1) {
                    234:     g_cgibin_path=capa_malloc(strlen(buf)+1,1);
                    235:     strcpy(g_cgibin_path,buf);
                    236:   } else {
                    237:     g_cgibin_path=capa_malloc(strlen("capa-bin")+1,1);
                    238:     strcpy(g_cgibin_path,"capa-bin");
                    239:   }  
                    240:   return web_login();
                    241: }
                    242: 

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>