#include #include #include #include #include /* cgi wrapper pro administraci technickych zprav na FI-MU */ /* #define www_user 181 */ #define www_user 48 #define setgid_group 10259 #define script_suffix ".py" #define path_to_python "/packages/run/links/bin/python" void error(char *text) { printf("Content-type: text/plain\n\n%s\n",text); exit(1); } void switch_group() { /* nejprve zkontrolujeme, zda je program spusten uzivatelem www */ // if (getuid() != www_user) // error("Tento program musi byt spusten www serverem"); /* nyni se pokusim zmenit aktualni gid tohoto procesu na gid vlastnika * tohoto souboru */ setuid(11527); setgid(setgid_group); // setegid(setgid_group); fprintf(stderr, "TS[%d]\n", getgid()); fprintf(stderr, "TU[%d]\n", getuid()); } int test_files(char *file1, char *file2, char *file3) { /* otestuji, zda soubory/adresare file1, file2 a file3 * patri stejne skupine a zaroven nemaji pravo cteni pro ostatni * Navratove hodnoty: 0 - v poradku * 1 - nektery ze souboru ma pravo w pro ost. * 2 - nesouhlasi skupina u testovanych souboru * 3 - nektery ze souboru neexistuje */ struct stat file_info; gid_t gid; /* soubor 1 */ if (stat(file1,&file_info)==-1) return 3; /* soubor neexistuje */ gid=file_info.st_gid; if (file_info.st_mode&S_IWOTH) return 1; /* pravo write pro ostatni */ /* soubor 2 */ if (stat(file2,&file_info)==-1) return 3; /* soubor neexistuje */ if (gid!=file_info.st_gid) return 2; /* soubor2 ma jine gid */ if (file_info.st_mode&S_IWOTH) return 1; /* pravo write pro ostatni */ /* soubor 3 */ if (stat(file3,&file_info)==-1) return 3; /* soubor neexistuje */ if (gid!=file_info.st_gid) return 2; /* soubor2 ma jine gid */ if (file_info.st_mode&S_IWOTH) return 1; /* pravo write pro ostatni */ return 0; } void get_dir(char *dir, char *file) { /* timto skriptem ziskam adresar, ve kterem je soubor "file" * (popr. link na tento soubor) umisten. * vysledkem muze byt bud absolutni, nebo relativni cesta. * napr.: file="ahoj.py" => dir="." * file="./neco" => dir="." Content-type: text/plain\n\n* file="neco/neco" => dir="neco" * file="/home/ja/neco" => dir="/home/ja" */ int i; for(i=(strlen(file)-1);i>=0;i--) if (file[i]=='/') break; if (i==-1){ strcpy(dir,"."); } else { strncpy(dir,file,i); dir[i]=0; } } int main(int argc, char **argv, char **envp){ char *name,*dir; int i; /* do promenne ulozime jmeno skriptu, ktery budeme testovat a spoustet */ name=(char *) malloc(strlen(argv[0])+strlen(script_suffix)+2); strcpy(name,argv[0]); strcat(name,script_suffix); dir=(char *) malloc(strlen(name)); get_dir(dir,name); /* na argv[0] (tento wrapper), name (program, ktery ma byt spusten * a dir (adresar, ve kterem je program (link na program) name * aplikujeme funkci test files, ktera nam overi opravneni */ if(i=test_files(argv[0],name,dir)){ if(i==1) error("Nektery ze souboru ma pravo write pro ostatni"); if(i==2) error("Nesouhlasi skupina u pozadovanych souboru"); if(i==3) error("Nektery ze souboru neexistuje ..."); /* sem by se program nemel dostat, ale exit pro jistotu dam */ exit(1); } switch_group(); /* execl(path_to_python,argv[0],"2>/tmp/stderr2.log",name,(char *)NULL);*/ execl(path_to_python,argv[0],name,(char *)NULL); /* execl(path_to_python,argv[0],"-W ignore",name,(char *)NULL);*/ // execve(path_to_python,argv,envp); error("Exec neprobehl v poradku (nezmenila se cesta k pythonu ?)"); }