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 directoryCleanup($path) { if (!file_exists($path)) { mkdir($path, 0777, true); } else { if (!is_dir($path)) { unlink($path); mkdir($path); } else { rmMinusR($path); } } }
function rmMinusR($path) { if ($handle = opendir($path)) { while ($file = readdir($handle)) { if ($file == "." || $file == "..") { continue; } $filepath = "{$path}/{$file}"; if (is_dir($filepath)) { rmMinusR($filepath); rmdir($filepath); } else { unlink($filepath); } } } closedir($handle); }
function purge_instance($instance) { rmMinusR(instance_path($instance)); rmdir(instance_path($instance)); }