File:  [LON-CAPA] / capa / capa51 / pProj / capaNewCgi.c
Revision 1.1: download - view: text, annotated - select for diffs
Tue Sep 28 21:26:21 1999 UTC (24 years, 10 months ago) by albertel
Branches: MAIN
CVS tags: HEAD
Initial revision

    1: char *makeword(char *line, char stop)
    2: {
    3:     int x = 0,y;
    4:     char *word = (char *) malloc(sizeof(char) * (strlen(line) + 1));
    5: 
    6:     for(x=0;((line[x]) && (line[x] != stop));x++)
    7:         word[x] = line[x];
    8: 
    9:     word[x] = '\0';
   10:     if(line[x]) ++x;
   11:    y=0;
   12: 
   13:     while((line[y++] = line[x++]));
   14:     return word;
   15: }
   16: 
   17: char *fmakeword(FILE *f,char  stop,int * cl)
   18: {
   19:     int wsize;
   20:     char *word;
   21:     int ll;
   22: 
   23:     wsize = 102400;
   24:     ll=0;
   25:     word = (char *) malloc(sizeof(char) * (wsize + 1));
   26: 
   27:     while(1) {
   28:         word[ll] = (char)fgetc(f);
   29:         if(ll==wsize) {
   30:             word[ll+1] = '\0';
   31:             wsize+=102400;
   32:             word = (char *)realloc(word,sizeof(char)*(wsize+1));
   33:         }
   34:         --(*cl);
   35:         if((word[ll] == stop) || (feof(f)) || (!(*cl))) {
   36:             if(word[ll] != stop) ll++;
   37:             word[ll] = '\0';
   38:             return word;
   39:         }
   40:         ++ll;
   41:     }
   42: }
   43: 
   44: char x2c(char *what)
   45: {
   46:     register char digit;
   47: 
   48:     digit = (what[0] >= 'A' ? ((what[0] & 0xdf) - 'A')+10 : (what[0] - '0'));
   49:     digit *= 16;
   50:     digit += (what[1] >= 'A' ? ((what[1] & 0xdf) - 'A')+10 : (what[1] - '0'));
   51:     return(digit);
   52: }
   53: 
   54: void unescape_url(char *url)
   55: {
   56:     register int x,y;
   57: 
   58:     for(x=0,y=0;url[y];++x,++y) {
   59:         if((url[x] = url[y]) == '%') {
   60:             url[x] = x2c(&url[y+1]);
   61:             y+=2;
   62:         }
   63:     }
   64:     url[x] = '\0';
   65: }
   66: 
   67: void plustospace(char *str)
   68: {
   69:     register int x;
   70: 
   71:     for(x=0;str[x];x++) if(str[x] == '+') str[x] = ' ';
   72: }
   73: 
   74: void web_parse_input(char * submissions_str)
   75: {
   76:   int x;
   77: 
   78:   for(x=0; x <= m; x++) {
   79:     if( !strcmp(g_entries[x].name,"CLASS") ) {
   80:       strncpy(g_class_name,g_entries[x].val,MAX_CLASS_CHAR);
   81:     }
   82:     if( !strcmp(g_entries[x].name,"M") ) {
   83:       sscanf(g_entries[x].val,"%d",&g_run_mode);
   84:     }
   85:     if( !strcmp(g_entries[x].name,"SNUM") ) {
   86:       strncpy(g_student_number,g_entries[x].val,MAX_STUDENT_NUMBER+4);
   87:     }
   88:     if( !strcmp(g_entries[x].name,"CAPAID") ) {
   89:       sscanf(g_entries[x].val,"%d",&g_entered_pin);
   90:     }
   91:     if( !strcmp(g_entries[x].name,"SET") ) {
   92:       sscanf(g_entries[x].val,"%d",&g_set);
   93:     }
   94:     if( !strcmp(g_entries[x].name,"VSET") ) {
   95:       if (g_entries[x].val[0] == '\0') {
   96: 	g_vset=0;
   97:       } else {
   98: 	sscanf(g_entries[x].val,"%d",&g_vset);
   99:       }
  100:     }
  101:     if( !strcmp(g_entries[x].name,"KND") ) {
  102:       sscanf(g_entries[x].val,"%d",&g_skind);
  103:     }
  104:     if( !strncmp(g_entries[x].name,"INPUT",5) ) {
  105:       sscanf(g_entries[x].name,"INPUT%d",&q_idx);
  106:       if( q_idx > 0 && q_idx < MAX_PROBLEM_CNT ) {
  107: 	strncpy(g_student_answer[q_idx],g_entries[x].val,MAX_ANSWER_CHAR);
  108:       }
  109:       if ( g_student_answer[q_idx][0] != '\0' ) {
  110: 	sprintf(buf,"%d\t%s\t",q_idx,g_student_answer[q_idx]);
  111: 	strcat(submissions_str,buf);
  112:       }
  113:     }
  114:     if( !strncmp(g_entries[x].name,"LAST",4) ) {
  115:       sscanf(g_entries[x].name,"LAST%d",&q_idx);
  116:       if( q_idx > 0 && q_idx < MAX_PROBLEM_CNT ) {
  117: 	strncpy(g_last_answer[q_idx],g_entries[x].val,MAX_ANSWER_CHAR);
  118:       }
  119:     }
  120:     free(g_entries[x].val);
  121:     free(g_entries[x].name);
  122:   }
  123: }
  124: 
  125: int web_login() 
  126: {
  127:   if( g_entered_pin != 0 ) {
  128:     g_login_set = capa_PIN(g_student_number,999,g_entered_pin);
  129:   } else {
  130:     return WEB_ERR_ENTERED_PIN;
  131:   }
  132: 
  133:   if (!g_login_set) { 
  134:     return WEB_ERR_BADLOGIN;
  135:   } else {
  136:     if ( g_login_set > 99 )  { return WEB_ERR_LOGINTOHIGH; }
  137:     if(g_login_set < g_vset ) {
  138:       return WEB_ERR_NOTVIEWABLE;
  139:     }
  140:     chdir(g_class_fullpath);  /* again, to make sure */
  141:       
  142:     if ( capa_get_student(g_student_number,&g_student_data) == 0 ) {
  143:       return WEB_ERR_STUDENT_NOT_EXIST;
  144:     } else {
  145:       time(&curtime);
  146:       if (capa_get_header(&header, g_login_set, wgt, pcr))  {
  147: 	return WEB_ERR_SET_NOT_READY;
  148:       }
  149:       if(capa_check_date(CHECK_OPEN_DATE,g_student_data.s_sec,
  150: 			 g_login_set) < 0 ) {
  151: 	
  152: 	return WEB_ERR_SET_NOT_OPEN;
  153:       }
  154:     }
  155:   }
  156:   return (error);
  157: }
  158: 
  159: int web_get_input() 
  160: {
  161:   
  162:   envPtr=getenv("REQUEST_METHOD");
  163:   if (!envPtr ) { return WEB_ERR_REQ_METHOD; }
  164:   if (strcmp(envPtr,"POST")) { return WEB_ERR_ENV_POST; }
  165:   envPtr=getenv("CONTENT_TYPE");
  166:   if (!envPtr ) { return WEB_ERR_CONTENT_TYPE; }
  167:   if (strcmp(envPtr,"application/x-www-form-urlencoded")) { 
  168:     return WEB_ERR_ENV_CONTENT; 
  169:   }
  170:   envPtr=getenv("CONTENT_LENGTH");
  171:   if (!envPtr ) { return WEB_ERR_CONTENT_LENGTH; }
  172:   content_length=atoi(envPtr);
  173: 
  174:   /* read the form into the g_entries array*/
  175:   for(x=0;content_length && (!feof(stdin));x++) {
  176:     m=x;
  177:     g_entries[x].val = fmakeword(stdin,'&',&content_length);
  178:     plustospace(g_entries[x].val);
  179:     unescape_url(g_entries[x].val);
  180:     g_entries[x].name = makeword(g_entries[x].val,'=');
  181:   }
  182: 
  183:   web_parse_input(submissions_str);
  184: 
  185:   if ( g_run_mode == WEB_CHECKIN ) {
  186:     time(&curtime); time_str = ctime(&curtime);
  187:     time_str[ strlen(time_str)-1 ] = '\0';
  188:     envPtr=getenv("REMOTE_HOST");
  189:     envPtr2=getenv("HTTP_USER_AGENT");
  190:     sprintf(log_str,"%s\t%s\t%s\t%s\t%s\n",g_class_name,g_student_number,
  191: 	    time_str,envPtr,envPtr2);
  192:     if (web_log(log_str) == -1 ) { return WEB_ERR_WEB_LOG; }
  193:   }
  194: 
  195:   getwd(g_cwd);
  196: 
  197:   web_getclassdir(&g_cpath, &g_cowner, g_class_name);
  198:   sprintf(g_class_fullpath,"%s/%s",g_cpath,g_class_name);
  199:   if( !capa_access(g_class_fullpath, F_OK) == 0 ) { return WEB_ERR_ACCESS; }
  200:     
  201:   chdir(g_class_fullpath);
  202:   if ( g_run_mode == M_CHECKANS) {
  203:     if (w_log_submissions(g_student_number,g_set,submissions_str) == -1 ) {
  204:       return WEB_ERR_SUBMMISIONS_LOG;    
  205:     }
  206:   }
  207:   
  208:   result=read_capa_config("capaweb_cgibin_path",buf);
  209:   if (result != 0 && result != -1) {
  210:     g_cgibin_path=capa_malloc(strlen(buf)+1,1);
  211:     strcpy(g_cgibin_path,buf);
  212:   } else {
  213:     g_cgibin_path=capa_malloc(strlen("capa-bin")+1,1);
  214:     strcpy(g_cgibin_path,"capa-bin");
  215:   }  
  216:   return web_login();
  217: }
  218: 

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