function akcijaslanje() { global $userid, $conf_files_path; require "lib/manip.php"; // update komponente nakon slanja // Parametri $predmet = intval($_REQUEST['predmet']); $ag = intval($_REQUEST['ag']); $zadaca = intval($_POST['zadaca']); $zadatak = intval($_POST['zadatak']); $program = $_POST['program']; $povratak_url = "?sta=student/zadaca&predmet={$predmet}&ag={$ag}&zadaca={$zadaca}&zadatak={$zadatak}"; $povratak_html = "<a href=\"{$povratak_url}\">Nastavak</a>"; $povratak_js = "<script>window.onload = function() { setTimeout('redirekcija()', 3000); }\nfunction redirekcija() { window.location='{$povratak_url}'; } </script>\n"; // Da li student slusa predmet? $q195 = myquery("select sp.predmet from student_predmet as sp, ponudakursa as pk where sp.student={$userid} and sp.predmet=pk.id and pk.predmet={$predmet} and pk.akademska_godina={$ag}"); if (mysql_num_rows($q195) < 1) { biguglyeerror("Ova zadaća nije iz vašeg predmeta"); return; } $ponudakursa = mysql_result($q195, 0, 0); // Standardna lokacija zadaca $lokacijazadaca = "{$conf_files_path}/zadace/{$predmet}-{$ag}/{$userid}/"; if (!file_exists("{$conf_files_path}/zadace/{$predmet}-{$ag}")) { mkdir("{$conf_files_path}/zadace/{$predmet}-{$ag}", 0777, true); } // Da li neko pokušava da spoofa zadaću? $q200 = myquery("SELECT count(*) FROM zadaca as z, student_predmet as sp, ponudakursa as pk\n\tWHERE sp.student={$userid} and sp.predmet=pk.id and pk.predmet=z.predmet and pk.akademska_godina=z.akademska_godina and z.id={$zadaca}"); if (mysql_result($q200, 0, 0) == 0) { biguglyeerror("Ova zadaća nije iz vašeg predmeta"); return; } // Ovo je potrebno radi pravljenja diff-a if (get_magic_quotes_gpc()) { $program = stripslashes($program); } // Podaci o zadaći $q210 = myquery("select programskijezik, UNIX_TIMESTAMP(rok), attachment, naziv, komponenta, dozvoljene_ekstenzije, automatsko_testiranje from zadaca where id={$zadaca}"); $jezik = mysql_result($q210, 0, 0); $rok = mysql_result($q210, 0, 1); $attach = mysql_result($q210, 0, 2); $naziv_zadace = mysql_result($q210, 0, 3); $komponenta = mysql_result($q210, 0, 4); $zadaca_dozvoljene_ekstenzije = mysql_result($q210, 0, 5); $automatsko_testiranje = mysql_result($q210, 0, 6); // Ako je aktivno automatsko testiranje, postavi status na 1 (automatska kontrola), inace na 4 (ceka pregled) if ($automatsko_testiranje == 1) { $prvi_status = 1; } else { $prvi_status = 4; } // Provjera roka if ($rok <= time()) { niceerror("Vrijeme za slanje zadaće je isteklo!"); zamgerlog("isteklo vrijeme za slanje zadaće z{$zadaca}", 3); // nivo 3 - greska zamgerlog2("isteklo vrijeme za slanje zadace", $zadaca); // nivo 3 - greska print $povratak_html; return; } // Prepisane zadaće se ne mogu ponovo slati $q240 = myquery("select status from zadatak where zadaca={$zadaca} and redni_broj={$zadatak} and student={$userid} order by id desc limit 1"); if (mysql_num_rows($q240) > 0 && mysql_result($q240, 0, 0) == 2) { // status = 2 - prepisana zadaća niceerror("Zadaća je prepisana i ne može se ponovo poslati."); print $povratak_html; return; } // Pravimo potrebne puteve if (!file_exists($lokacijazadaca)) { mkdir($lokacijazadaca, 0777); } if ($zadaca > 0 && !file_exists("{$lokacijazadaca}{$zadaca}")) { mkdir("{$lokacijazadaca}{$zadaca}", 0777); } // Temp fajl radi određivanja diff-a if (file_exists("{$lokacijazadaca}{$zadaca}/difftemp")) { unlink("{$lokacijazadaca}{$zadaca}/difftemp"); } // Vrsta zadaće: textarea ili attachment if ($attach == 0) { // textarea if (!check_csrf_token()) { niceerror("Forma za slanje zadaće je istekla."); print "<p>Kada otvorite prozor za unos zadaće, imate određeno vrijeme (npr. 15 minuta) da pošaljete zadaću, u suprotnom zahtjev neće biti prihvaćen iz sigurnosnih razloga. Preporučujemo da zadaću ne radite direktno u prozoru za slanje zadaće nego u nekom drugom programu (npr. CodeBlocks) iz kojeg kopirate u Zamger.</p>"; print $povratak_html; return; } // Određivanje ekstenzije iz jezika $q220 = myquery("select ekstenzija from programskijezik where id={$jezik}"); $ekst = mysql_result($q220, 0, 0); $filename = "{$lokacijazadaca}{$zadaca}/{$zadatak}{$ekst}"; // Kreiranje datoteke if (strlen($program) <= 10) { niceerror("Pokušali ste poslati praznu zadaću!"); print "<p>Vjerovatno ste zaboravili kopirati kod u prozor za slanje.</p>"; zamgerlog("poslao praznu zadacu z{$zadaca} zadatak {$zadatak}", 3); // nivo 3 - greska zamgerlog2("poslao praznu zadacu", $zadaca, $zadatak); // nivo 3 - greska print $povratak_html; return; } else { if ($zadaca > 0 && $zadatak > 0) { // Pravimo backup fajla za potrebe računanja diff-a $postoji_prosla_verzija = false; if (file_exists($filename)) { rename($filename, "{$lokacijazadaca}{$zadaca}/difftemp"); $postoji_prosla_verzija = true; } $f = fopen($filename, 'w'); if (!$f) { niceerror("Greška pri pisanju fajla za zadaću."); zamgerlog("greska pri pisanju zadace z{$zadaca} zadatak {$zadatak}", 3); // nivo 3 - greska zamgerlog2("greska pri pisanju zadace", $zadaca, $zadatak); // nivo 3 - greska if ($postoji_prosla_verzija) { rename("{$lokacijazadaca}{$zadaca}/difftemp", $filename); } print $povratak_html; return; } fwrite($f, $program); fclose($f); // Tabela "zadatak" funkcioniše kao log događaja u // koji se stvari samo dodaju $q230 = myquery("insert into zadatak set zadaca={$zadaca}, redni_broj={$zadatak}, student={$userid}, status={$prvi_status}, vrijeme=now(), filename='{$zadatak}{$ekst}', userid={$userid}"); $id_zadatka = mysql_insert_id(); // Pravljenje diffa if ($postoji_prosla_verzija) { $diff = `/usr/bin/diff -u {$lokacijazadaca}{$zadaca}/difftemp {$filename}`; $diff = my_escape($diff); if (strlen($diff) > 1) { $q250 = myquery("insert into zadatakdiff set zadatak={$id_zadatka}, diff='{$diff}'"); } unlink("{$lokacijazadaca}{$zadaca}/difftemp"); } nicemessage($naziv_zadace . "/Zadatak " . $zadatak . " uspješno poslan!"); update_komponente($userid, $ponudakursa); zamgerlog("poslana zadaca z{$zadaca} zadatak {$zadatak}", 2); // nivo 2 - edit zamgerlog2("poslana zadaca (textarea)", $zadaca, $zadatak); // nivo 2 - edit print $povratak_html; print $povratak_js; return; } else { zamgerlog("greska pri slanju zadace (zadaca z{$zadaca} zadatak {$zadatak} filename {$filename})", 3); zamgerlog2("greska pri slanju zadace (textarea)", $zadaca, $zadatak); // nivo 2 - edit niceerror("Greška pri slanju zadaće. Kontaktirajte tutora."); print $povratak_html; return; } } } else { // if ($attach==0)... $program = $_FILES['attachment']['tmp_name']; if ($program && file_exists($program) && $_FILES['attachment']['error'] === UPLOAD_ERR_OK) { $ime_fajla = strip_tags(basename($_FILES['attachment']['name'])); // Ukidam HTML znakove radi potencijalnog XSSa $ime_fajla = str_replace("&", "", $ime_fajla); $ime_fajla = str_replace("\"", "", $ime_fajla); $puni_put = "{$lokacijazadaca}{$zadaca}/{$ime_fajla}"; // Provjeravamo da li je ekstenzija na spisku dozvoljenih $ext = "." . pathinfo($ime_fajla, PATHINFO_EXTENSION); // FIXME: postojeći kod očekuje da ekstenzije počinju tačkom... $db_doz_eks = explode(',', $zadaca_dozvoljene_ekstenzije); if ($zadaca_dozvoljene_ekstenzije != "" && !in_array($ext, $db_doz_eks)) { niceerror("Tip datoteke koju ste poslali nije dozvoljen."); print "<p>Na ovoj zadaći dozvoljeno je slati samo datoteke jednog od sljedećih tipova: <b>{$zadaca_dozvoljene_ekstenzije}</b>.<br>\n\t\t\t\tVi ste poslali datoteku tipa: <b>{$ext}</b>.</p>"; zamgerlog("pogresan tip datoteke (z{$zadaca})", 3); zamgerlog2("pogresan tip datoteke", $zadaca); print $povratak_html; return; } // Diffing $diff = ""; $q255 = myquery("SELECT filename FROM zadatak WHERE zadaca={$zadaca} AND redni_broj={$zadatak} AND student={$userid} ORDER BY id DESC LIMIT 1"); if (mysql_num_rows($q255) > 0) { $stari_filename = "{$lokacijazadaca}{$zadaca}/" . mysql_result($q255, 0, 0); // Podržavamo diffing ako je i stara i nova ekstenzija ZIP (TODO ostale vrste arhiva) if (ends_with($stari_filename, ".zip") && ends_with($puni_put, ".zip")) { // Pripremamo temp dir $zippath = "/tmp/difftemp"; if (!file_exists($zippath)) { mkdir($zippath, 0777, true); } else { if (!is_dir($zippath)) { unlink($zippath); mkdir($zippath); } else { rmMinusR($zippath); } } $oldpath = "{$zippath}/old"; $newpath = "{$zippath}/new"; mkdir($oldpath); mkdir($newpath); `unzip -j "{$stari_filename}" -d {$oldpath}`; `unzip -j "{$program}" -d {$newpath}`; $diff = `/usr/bin/diff -ur {$oldpath} {$newpath}`; $diff = clear_unicode(my_escape($diff)); } } if (file_exists($puni_put)) { unlink($puni_put); } rename($program, $puni_put); chmod($puni_put, 0640); // Escaping za SQL $ime_fajla = my_escape($ime_fajla); $q260 = myquery("insert into zadatak set zadaca={$zadaca}, redni_broj={$zadatak}, student={$userid}, status={$prvi_status}, vrijeme=now(), filename='{$ime_fajla}', userid={$userid}"); $id_zadatka = mysql_insert_id(); if (strlen($diff) > 1) { $q270 = myquery("insert into zadatakdiff set zadatak={$id_zadatka}, diff='{$diff}'"); } nicemessage("Z" . $naziv_zadace . "/" . $zadatak . " uspješno poslan!"); update_komponente($userid, $ponudakursa, $komponenta); zamgerlog("poslana zadaca z{$zadaca} zadatak {$zadatak} (attachment)", 2); // nivo 2 - edit zamgerlog2("poslana zadaca (attachment)", $zadaca, $zadatak); print $povratak_html; print $povratak_js; return; } else { switch ($_FILES['attachment']['error']) { case UPLOAD_ERR_OK: $greska = "Poslali ste praznu ili nepostojeću datoteku."; break; case UPLOAD_ERR_INI_SIZE: $greska = "Poslana datoteka je veća od dozvoljene. Trenutno maksimalna dozvoljena veličina je " . ini_get('upload_max_filesize'); break; case UPLOAD_ERR_FORM_SIZE: $greska = "Poslana datoteka je veća od dozvoljene."; // jednom ćemo omogućiti nastavniku da ograniči veličinu kroz formu break; case UPLOAD_ERR_PARTIAL: $greska = "Slanje datoteke je prekinuto, vjerovatno zbog problema sa vašom konekcijom. Molimo pokušajte ponovo."; break; case UPLOAD_ERR_NO_FILE: $greska = "Poslali ste praznu ili nepostojeću datoteku."; break; case UPLOAD_ERR_NO_TMP_DIR: $greska = "1 Greška u konfiguraciji Zamgera: nepostojeći TMP direktorij."; break; case UPLOAD_ERR_CANT_WRITE: $greska = "2 Greška u konfiguraciji Zamgera: nemoguće pisati u TMP direktorij."; break; case UPLOAD_ERR_EXTENSION: $greska = "3 Greška u konfiguraciji Zamgera: neka ekstenzija sprječava upload."; break; default: $greska = "Nepoznata greška u slanju datoteke. Kod: " . $_FILES['attachment']['error']; } zamgerlog("greska kod attachmenta (z{$zadaca}): {$greska}", 3); zamgerlog2("greska pri slanju zadace (attachment)", $zadaca, $zadatak, 0, $greska); niceerror("{$greska}"); print $povratak_html; return; } } }
function do_profile($exe_file, $profiler, $filelist, $params, $instance) { global $conf_max_program_output, $profiler_plugin, $conf_verbosity, $conf_nice; $profiler_log_file = instance_path($instance) . "/" . basename($exe_file) . "_profiler_log.txt"; if ($conf_verbosity > 0) { print "Profiling " . basename($exe_file) . "...\n"; } $stdin_file = instance_path($instance) . "/buildservice_stdin.txt"; $stderr_file = instance_path($instance) . "/buildservice_stderr.txt"; $stdout_file = instance_path($instance) . "/buildservice_stdout.txt"; // Do it! $descriptorspec = array(0 => array("pipe", "r"), 1 => array("pipe", "w"), 2 => array("file", $stderr_file, "a")); $cwd = instance_path($instance); $env = array(); $optslog = str_replace("LOGFILE", $profiler_log_file, $profiler["opts_log"]); $cmd = $profiler["path"] . " " . $profiler["local_opts"] . " " . $optslog . " {$exe_file}"; if (isset($conf_nice)) { $cmd = "nice -n {$conf_nice} {$cmd}"; } // Redirect output cause it's combined program and profiler output // We will get just the profiler output from $profiler_log_file // Add execution params if (array_key_exists("timeout", $params) && $params['timeout'] > 0) { $timeout = $params['timeout'] * $profiler['timeout_ratio']; $cmd = "ulimit -t {$timeout}; {$cmd}"; } if (array_key_exists("vmem_hard_limit", $profiler)) { $cmd = "ulimit -v " . $profiler['vmem_hard_limit'] . "; {$cmd}"; } else { if (array_key_exists("vmem", $params) && $params['vmem'] > 0) { $cmd = "ulimit -v " . $params['vmem'] . "; {$cmd}"; } } if (array_key_exists("stdin", $params) && strlen($params['stdin']) > 0) { $stdin_name = instance_path($instance) . "/" . basename($exe_file) . "_stdin.txt"; file_put_contents($stdin_name, $params['stdin'] . "\n"); //$cmd .= "< $stdin_name"; } // NOT TESTED $process = proc_open($cmd, $descriptorspec, $pipes, $cwd, $env); $profile_result = array(); if (is_resource($process)) { $statusar = proc_get_status($process); $pid = $statusar['pid'] + 1; // first one is ulimit... print "PID: {$pid}\n"; fwrite($pipes[0], $params['stdin']); fclose($pipes[0]); // stream_get_contents will get stuck until program ends $start_time = time(); $stdout = stream_get_contents($pipes[1], $conf_max_program_output + 10); $duration = time() - $start_time; file_put_contents($stdout_file, $stdout); fclose($pipes[1]); } else { if ($conf_verbosity > 0) { print "Not a resource\n"; } $profile_result['status'] = PROFILER_FAIL; return $profile_result; } $joutput = file_get_contents($profiler_log_file, false, NULL, -1, $conf_max_program_output); unlink($profiler_log_file); $output = explode("\n", $joutput); $profile_result['output'] = clear_unicode($joutput); $profile_result['status'] = PROFILER_OK; // If we can't parse output, we should assume that profiling was ok if (array_key_exists($profiler['name'], $profiler_plugin)) { eval($profiler_plugin[$profiler['name']] . "(\$output, \$filelist, \$profile_result);"); } // Remove references to local paths $profile_result['output'] = str_replace(instance_path($instance) . "/", "", $profile_result['output']); if (array_key_exists("parsed_output", $profile_result)) { foreach ($profile_result['parsed_output'] as &$msg) { $msg['file'] = str_replace(instance_path($instance) . "/", "", $msg['file']); } } if ($conf_verbosity > 2) { print $profile_result['output']; } return $profile_result; }