function student_zadaca() { global $userid, $conf_files_path; require "lib/autotest.php"; // Akcije if ($_REQUEST['akcija'] == "slanje") { akcijaslanje(); return; } // Poslani parametri $zadaca = intval($_REQUEST['zadaca']); $predmet = intval($_REQUEST['predmet']); $ag = intval($_REQUEST['ag']); $q10 = myquery("select naziv from predmet where id={$predmet}"); if (mysql_num_rows($q10) < 1) { zamgerlog("nepoznat predmet {$predmet}", 3); // nivo 3: greska zamgerlog2("nepoznat predmet", $predmet); biguglyerror("Nepoznat predmet"); return; } $q15 = myquery("select naziv from akademska_godina where id={$ag}"); if (mysql_num_rows($q10) < 1) { zamgerlog("nepoznata akademska godina {$ag}", 3); // nivo 3: greska zamgerlog2("nepoznata akademska godina", $ag); // nivo 3: greska biguglyerror("Nepoznata akademska godina"); return; } // Da li student slusa predmet? $q17 = 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($q17) < 1) { zamgerlog("student ne slusa predmet pp{$predmet}", 3); zamgerlog2("student ne slusa predmet", $predmet, $ag); biguglyerror("Niste upisani na ovaj predmet"); return; } $ponudakursa = mysql_result($q17, 0, 0); // IMA LI AKTIVNIH? // TODO: provjeriti da li je aktivan modul... $q10 = myquery("select count(*) from zadaca where predmet={$predmet} and akademska_godina={$ag} and aktivna=1"); if (mysql_result($q10, 0, 0) == 0) { zamgerlog("nijedna zadaća nije aktivna, predmet pp{$predmet}", 3); zamgerlog2("nijedna zadaca nije aktivna", $predmet); niceerror("Nijedna zadaća nije aktivna"); return; } // ODREĐIVANJE ID ZADAĆE // Da li neko pokušava da spoofa zadaću? if ($zadaca != 0) { $q20 = 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($q20, 0, 0) == 0) { zamgerlog("student nije upisan na predmet (zadaca z{$zadaca})", 3); zamgerlog2("student ne slusa predmet za zadacu", $zadaca); biguglyerror("Ova zadaća nije iz vašeg predmeta"); return; } } // Ili predmet if ($ponudakursa != 0) { $q25 = myquery("select count(*) from student_predmet where student={$userid} and predmet={$ponudakursa}"); if (mysql_result($q25, 0, 0) == 0) { zamgerlog("student nije upisan na predmet (predmet p{$ponudakursa})", 3); zamgerlog2("student ne slusa ponudukursa", $ponudakursa); biguglyerror("Niste upisani na ovaj predmet"); return; } // Odgovarajuci predmet i zadaca if ($zadaca != 0) { $q27 = myquery("select count(*) from zadaca where id={$zadaca} and predmet={$predmet} and akademska_godina={$ag}"); if (mysql_result($q27, 0, 0) == 0) { zamgerlog("zadaca i predmet ne odgovaraju (predmet p{$ponudakursa}, zadaca z{$zadaca})", 3); zamgerlog2("zadaca i ponudakursa ne odgovaraju", $ponudakursa, $zadaca); biguglyerror("Ova zadaća nije iz vašeg predmeta"); return; } } } // Nije izabrana konkretna zadaca if ($zadaca == 0) { // Zadnja zadaca na kojoj je radio/la $q30 = myquery("SELECT z.id FROM zadatak as zk, zadaca as z\n\tWHERE z.id=zk.zadaca and z.aktivna=1 and z.rok>curdate() and z.predmet={$predmet} and z.akademska_godina={$ag} and zk.student={$userid}\n\tORDER BY z.id DESC LIMIT 1"); if (mysql_num_rows($q30) > 0) { $zadaca = mysql_result($q30, 0, 0); } else { // Nije radio ni na jednoj od aktivnih zadaca$predmet_id // Daj najstariju aktivnu zadacu $q40 = myquery("select id from zadaca where predmet={$predmet} and akademska_godina={$ag} and rok>curdate() and aktivna=1 order by id limit 1"); if (mysql_num_rows($q40) > 0) { $zadaca = mysql_result($q40, 0, 0); } else { // Ako ni ovdje nema rezultata, znači da je svim // zadaćama istekao rok. Daćemo zadnju zadaću. // Da li ima aktivnih provjerili smo u $q10 $q50 = myquery("select id from zadaca where predmet={$predmet} and akademska_godina={$ag} and aktivna=1 order by id desc limit 1"); $zadaca = mysql_result($q50, 0, 0); } } } // Standardna lokacija zadaca: $lokacijazadaca = "{$conf_files_path}/zadace/{$predmet}-{$ag}/{$userid}/"; // Ove vrijednosti će nam trebati kasnije $q60 = myquery("select naziv,zadataka,UNIX_TIMESTAMP(rok),programskijezik,attachment,dozvoljene_ekstenzije from zadaca where id={$zadaca}"); $naziv = mysql_result($q60, 0, 0); $brojzad = mysql_result($q60, 0, 1); $rok = mysql_result($q60, 0, 2); $jezik = mysql_result($q60, 0, 3); $attachment = mysql_result($q60, 0, 4); $zadaca_dozvoljene_ekstenzije = mysql_result($q60, 0, 5); // ODREĐIVANJE ZADATKA // Poslani parametar: $zadatak = intval($_REQUEST['zadatak']); if ($zadatak == 0) { // Prvi neurađeni zadatak u datoj zadaći // NOTE: subquery $q70 = myquery("select zk.redni_broj from zadatak as zk where zk.student={$userid} and zk.zadaca={$zadaca} and (select count(*) from zadatak as zk2 where zk2.student={$userid} and zk2.zadaca={$zadaca} and zk2.redni_broj=zk.redni_broj)=0 order by zk.redni_broj limit 1"); if (mysql_num_rows($q70) > 0) { $zadatak = mysql_result($q70, 0, 0); } else { $zadatak = $brojzad; } } // Akcije vezane za autotest if ($_REQUEST['akcija'] == "test_detalji") { $test = intval($_REQUEST['test']); // Provjera spoofinga testa $q10 = myquery("SELECT COUNT(*) FROM autotest WHERE id={$test} AND zadaca={$zadaca} AND zadatak={$zadatak}"); if (mysql_result($q10, 0, 0) == 0) { niceerror("Odabrani test nije sa odabrane zadaće."); return; } autotest_detalji($test, $userid, false); return; } if ($_REQUEST['akcija'] == "test_sa_kodom") { if ($attachment) { niceerror("Download zadaće poslane kao attachment sa ugrađenim testnim kodom trenutno nije podržano."); return; } $test = intval($_REQUEST['test']); // Provjera spoofinga testa $q10 = myquery("SELECT COUNT(*) FROM autotest WHERE id={$test} AND zadaca={$zadaca} AND zadatak={$zadatak}"); if (mysql_result($q10, 0, 0) == 0) { niceerror("Odabrani test nije sa odabrane zadaće."); return; } $kod = autotest_sa_kodom($test, $userid, false); ?> <textarea rows="20" cols="80" name="program" wrap="off"><?php echo $kod; ?> </textarea> <?php return; } // NAVIGACIJA print "<br/><br/><center><h1>{$naziv}, Zadatak: {$zadatak}</h1></center>\n"; // Statusne ikone: $stat_icon = array("zad_bug", "zad_preg", "zad_copy", "zad_bug", "zad_preg", "zad_ok"); $stat_tekst = array("Bug u programu", "Pregled u toku", "Zadaća prepisana", "Bug u programu", "Pregled u toku", "Zadaća OK"); ?> <!-- zadace --> <center> <table cellspacing="0" cellpadding="2" border="0" id="zadace"> <thead> <tr> <?php ?> <td> </td> <?php // Zaglavlje tabele - potreban nam je max. broj zadataka u zadaci $q20 = myquery("select zadataka from zadaca where predmet={$predmet} and akademska_godina={$ag} order by zadataka desc limit 1"); $broj_zadataka = mysql_result($q20, 0, 0); for ($i = 1; $i <= $broj_zadataka; $i++) { ?> <td>Zadatak <?php echo $i; ?> .</td><?php } ?> <td>Rok za slanje</td> </tr> </thead> <tbody> <?php // Tijelo tabele // LEGENDA STATUS POLJA: // 0 - nepoznat status // 1 - nova zadaća // 2 - prepisana // 3 - ne može se kompajlirati // 4 - prošla test, predstoji kontrola // 5 - pregledana /* Ovo se sve moglo kroz SQL rijesiti, ali necu iz razloga: 1. PHP je citljiviji 2. MySQL <4.1 ne podrzava subqueries */ $bodova_sve_zadace = 0; $q21 = myquery("select id, naziv, bodova, zadataka, UNIX_TIMESTAMP(rok) from zadaca where predmet={$predmet} and akademska_godina={$ag} order by komponenta, id"); while ($r21 = mysql_fetch_row($q21)) { $m_zadaca = $r21[0]; $m_mogucih += $r21[2]; $m_maxzadataka = $r21[3]; ?> <tr> <th><?php echo $r21[1]; ?> </th> <?php for ($m_zadatak = 1; $m_zadatak <= $broj_zadataka; $m_zadatak++) { // Ako tekuća zadaća nema toliko zadataka, ispisujemo blank polje if ($m_zadatak > $m_maxzadataka) { ?> <td> </td><?php continue; } // Uzmi samo rjesenje sa zadnjim IDom $q22 = myquery("select status,bodova,komentar from zadatak where student={$userid} and zadaca={$m_zadaca} and redni_broj={$m_zadatak} order by id desc limit 1"); if ($m_zadaca == $zadaca && $m_zadatak == $zadatak) { $bgcolor = ' bgcolor="#DDDDFF"'; } else { $bgcolor = ""; } if (mysql_num_rows($q22) < 1) { ?> <td <?php echo $bgcolor; ?> ><a href="?sta=student/zadaca&predmet=<?php echo $predmet; ?> &ag=<?php echo $ag; ?> &zadaca=<?php echo $m_zadaca; ?> &zadatak=<?php echo $m_zadatak; ?> "><img src="images/16x16/zad_novi.png" width="16" height="16" border="0" align="center" title="Novi zadatak" alt="Novi zadatak"></a></td><?php } else { $status = mysql_result($q22, 0, 0); $bodova_zadatak = mysql_result($q22, 0, 1); if (strlen(mysql_result($q22, 0, 2)) > 2) { $imakomentar = "<img src=\"images/16x16/komentar.png\" width=\"15\" height=\"14\" border=\"0\" title=\"Ima komentar\" alt=\"Ima komentar\" align=\"center\">"; } else { $imakomentar = ""; } ?> <td <?php echo $bgcolor; ?> ><a href="?sta=student/zadaca&predmet=<?php echo $predmet; ?> &ag=<?php echo $ag; ?> &zadaca=<?php echo $m_zadaca; ?> &zadatak=<?php echo $m_zadatak; ?> "><img src="images/16x16/<?php echo $stat_icon[$status]; ?> .png" width="16" height="16" border="0" align="center" title="<?php echo $stat_tekst[$status]; ?> " alt="<?php echo $stat_tekst[$status]; ?> "> <?php echo $bodova_zadatak; ?> <?php echo $imakomentar; ?> </a></td> <?php } } ?> <td><?php if ($r21[4] < time()) { print "<font color=\"red\">"; } print date("d. m. Y. H:i:s", $r21[4]); if ($r21[4] < time()) { print "</font>"; } ?> </td> </tr> <?php } ?> </tbody> </table> </center> <?php // PORUKE I KOMENTARI // Upit za izvjestaj skripte i komentar tutora ?> <br/><br/> <center> <table width="600" border="0"><tr><td> <?php $q110 = myquery("select izvjestaj_skripte, komentar, userid, status, bodova from zadatak where student={$userid} and zadaca={$zadaca} and redni_broj={$zadatak} order by id desc limit 1"); if (mysql_num_rows($q110) > 0) { $poruka = mysql_result($q110, 0, 0); $komentar = mysql_result($q110, 0, 1); $tutor = mysql_result($q110, 0, 2); $status_zadace = mysql_result($q110, 0, 3); $bodova = mysql_result($q110, 0, 4); // Statusni ekran autotest_status_display($userid, $zadaca, $zadatak, false); // Vrijeme slanja - to neće biti isti slog kao onaj koji vraća $q110 jer taj je možda status koji je upisao tutor $q113 = myquery("SELECT UNIX_TIMESTAMP(vrijeme) FROM zadatak WHERE student={$userid} AND userid={$userid} AND zadaca={$zadaca} AND redni_broj={$zadatak} ORDER BY id DESC LIMIT 1"); if (mysql_num_rows($q113) > 0) { ?> <p>Zadatak poslan: <?php echo date("d.m.Y. H:i:s", mysql_result($q113, 0, 0)); ?> </p> <?php } else { ?> <p>Zadatak nije poslan (tutor upisao/la bodove)</p> <?php } // Rezultati automatskog testiranja $nalaz_autotesta = autotest_tabela($userid, $zadaca, $zadatak, false); if ($nalaz_autotesta != "") { print "<p>Rezultati testiranja:</p>\n{$nalaz_autotesta}\n"; } // Poruke i komentari tutora if (preg_match("/\\w/", $poruka)) { $poruka = str_replace("\n", "<br/>\n", $poruka); ?> <p>Poruka kod kompajliranja:<br/><b><?php echo $poruka; ?> </b></p><?php } if (preg_match("/\\w/", $komentar)) { $komentar = str_replace("\n", "<br/>\n", $komentar); // Link za odgovor na komentar $link = ""; if ($tutor > 0) { $q115 = myquery("select a.login,o.ime,o.prezime from auth as a, osoba as o where o.id={$tutor} and a.id=o.id"); $naslov = urlencode("Odgovor na komentar ({$naziv}, Zadatak {$zadatak})"); $tekst = urlencode("> {$komentar}"); $primalac = urlencode(mysql_result($q115, 0, 0) . " (" . mysql_result($q115, 0, 1) . " " . mysql_result($q115, 0, 2) . ")"); $link = " (<a href=\"?sta=common/inbox&akcija=compose&naslov={$naslov}&tekst={$tekst}&primalac={$primalac}\">odgovor</a>)"; } ?> <p>Komentar tutora: <b><?php echo $komentar; ?> </b><?php echo $link; } } // Istek roka za slanje zadace if ($rok <= time()) { print "<p><b>Vrijeme za slanje ove zadaće je isteklo.</b></p>"; // Ovo je onemogućavalo copy&paste u Firefoxu :( //$readonly = "DISABLED"; } else { $readonly = ""; } // FORMA ZA SLANJE if ($attachment) { print "</td></tr></table>\n"; // Attachment $q120 = myquery("select filename,UNIX_TIMESTAMP(vrijeme) from zadatak where zadaca={$zadaca} and redni_broj={$zadatak} and student={$userid} order by id desc limit 1"); if (mysql_num_rows($q120) > 0) { $filename = mysql_result($q120, 0, 0); $the_file = "{$lokacijazadaca}/{$zadaca}/{$filename}"; if ($filename && file_exists("{$conf_files_path}/zadace/{$predmet}-{$ag}") && file_exists($the_file)) { // Utvrđujemo stvarno vrijeme slanja $q130 = myquery("SELECT UNIX_TIMESTAMP(vrijeme) from zadatak where zadaca={$zadaca} and redni_broj={$zadatak} and student={$userid} and userid={$userid} order by id desc limit 1"); if (mysql_num_rows($q130) > 0) { $vrijeme = mysql_result($q130, 0, 0); } else { $vrijeme = mysql_result($q120, 0, 1); } $vrijeme = date("d. m. Y. H:i:s", $vrijeme); $velicina = nicesize(filesize($the_file)); $icon = "images/mimetypes/" . getmimeicon($the_file); $dllink = "index.php?sta=common/attachment&zadaca={$zadaca}&zadatak={$zadatak}"; ?> <center><table width="75%" border="1" cellpadding="6" cellspacing="0" bgcolor="#CCCCCC"><tr><td> <a href="<?php echo $dllink; ?> "><img src="<?php echo $icon; ?> " border="0"></a> </td><td> <p>Poslani fajl: <b><a href="<?php echo $dllink; ?> "><?php echo $filename; ?> </a></b><br/> Datum slanja: <b><?php echo $vrijeme; ?> </b><br/> Veličina: <b><?php echo $velicina; ?> </b></p> </td></tr></table></center> <?php print "<p>Ako želite promijeniti datoteku iznad, izaberite novu i kliknite na dugme za slanje:</p>"; } } else { print "<p>Izaberite datoteku koju želite poslati i kliknite na dugme za slanje."; if ($zadaca_dozvoljene_ekstenzije != "") { print " Dozvoljeni su sljedeći tipovi datoteka: <b>{$zadaca_dozvoljene_ekstenzije}</b>."; } print "</p>\n"; } ?> <form action="index.php" method="POST" enctype="multipart/form-data"> <input type="hidden" name="sta" value="student/zadaca"> <input type="hidden" name="akcija" value="slanje"> <input type="hidden" name="predmet" value="<?php echo $predmet; ?> "> <input type="hidden" name="ag" value="<?php echo $ag; ?> "> <input type="hidden" name="zadaca" value="<?php echo $zadaca; ?> "> <input type="hidden" name="zadatak" value="<?php echo $zadatak; ?> "> <input type="hidden" name="labgrupa" value="<?php echo $labgrupa; ?> "> <input type="file" name="attachment" size="50"> </center> <p> </p> <?php } else { // Forma $q130 = myquery("select ekstenzija from programskijezik where id={$jezik}"); $ekst = mysql_result($q130, 0, 0); if ($status_zadace == 2) { ?> <p>Zadaća je prepisana i ne može se ponovo poslati</p><?php } else { if ($rok > time()) { ?> <p>Kopirajte vaš zadatak u tekstualno polje ispod:</p> </td></tr></table> <?php } } // Moze li se izbaciti labgrupa ispod? ?> </td></tr></table> <center> <?php echo genform("POST"); ?> <input type="hidden" name="zadaca" value="<?php echo $zadaca; ?> "> <input type="hidden" name="zadatak" value="<?php echo $zadatak; ?> "> <input type="hidden" name="akcija" value="slanje"> <input type="hidden" name="labgrupa" value="<?php echo $labgrupa; ?> "> <textarea rows="20" cols="80" name="program" <?php echo $readonly; ?> wrap="off"><?php $the_file = "{$lokacijazadaca}{$zadaca}/{$zadatak}{$ekst}"; $tekst_zadace = ""; if (file_exists("{$conf_files_path}/zadace/{$predmet}-{$ag}") && file_exists($the_file)) { $tekst_zadace = join("", file($the_file)); } $tekst_zadace = htmlspecialchars($tekst_zadace); print $tekst_zadace; ?> </textarea> </center> <?php } ?> <center><input type="submit" value=" Pošalji zadatak! "></center> </form> <?php }
function saradnik_zadaca() { global $conf_files_path, $userid, $user_siteadmin; require "lib/autotest.php"; require "lib/manip.php"; // radi update_komponente // -------------------- // Standardni ulazni podaci i potrebne varijable $stud_id = intval($_REQUEST['student']); $zadaca = intval($_REQUEST['zadaca']); $zadatak = intval($_REQUEST['zadatak']); // Prava pristupa if (!$user_siteadmin) { // Da li je nastavnik na predmetu? $q10 = myquery("select count(*) from nastavnik_predmet as np, zadaca as z where z.id={$zadaca} and z.predmet=np.predmet and z.akademska_godina=np.akademska_godina and np.nastavnik={$userid}"); if (mysql_result($q10, 0, 0) < 1) { zamgerlog("privilegije (student u{$stud_id} zadaca z{$zadaca})", 3); // nivo 3: greska niceerror("Nemate pravo izmjene ove zadaće"); return; } // Ogranicenja (tabela: ogranicenje) ne provjeravamo jer bi to bilo prekomplikovano, // a pitanje je da li ima smisla } // Podaci o zadaci $q20 = myquery("select p.geshi, p.ekstenzija, z.attachment, z.naziv, z.zadataka, z.komponenta, z.predmet, z.akademska_godina, z.programskijezik from zadaca as z, programskijezik as p where z.id={$zadaca} and z.programskijezik=p.id"); if (mysql_num_rows($q20) < 1) { zamgerlog("nepostojeca zadaca {$zadaca}", 3); niceerror("Neispravna zadaća."); exit; } $jezik = mysql_result($q20, 0, 0); $ekst = mysql_result($q20, 0, 1); $attach = mysql_result($q20, 0, 2); $naziv_zadace = mysql_result($q20, 0, 3); $komponenta = mysql_result($q20, 0, 5); $predmet = mysql_result($q20, 0, 6); $ag = mysql_result($q20, 0, 7); $id_jezika = mysql_result($q20, 0, 8); if (mysql_result($q20, 0, 4) < $zadatak || $zadatak < 1) { zamgerlog("pokusao pristupiti nepostojecem zadatku {$zadatak} u zadaci z{$zadaca}", 3); niceerror("Neispravan broj zadatka."); exit; } // Podaci o studentu $q50 = myquery("select ime, prezime from osoba where id={$stud_id}"); if (mysql_num_rows($q50) < 1) { zamgerlog("nepostojeci student {$stud_id}", 3); niceerror("Neispravan student."); exit; } $ime_studenta = mysql_result($q50, 0, 0); $prezime_studenta = mysql_result($q50, 0, 1); $lokacijazadaca = "{$conf_files_path}/zadace/{$predmet}-{$ag}/{$stud_id}/"; // -------------------- // AKCIJE // Akcija: Ispis diffa if ($_GET['akcija'] == "diff") { $diff_id = intval($_GET['diff_id']); $q60 = myquery("select diff from zadatakdiff where zadatak={$diff_id}"); $diff = mysql_result($q60, 0, 0); // Ovo ispod nema potrebe jer je diff već escapovan prilikom // inserta u bazu (stud_zadaca.php) // $diff = str_replace("\n\n","\n",$diff); // $diff = htmlspecialchars($diff); print "<pre>{$diff}</pre>\n\n"; return; } // Akcija: Izvršenje programa if ($_POST['akcija'] == "izvrsi" && check_csrf_token()) { // čuvamo poslane podatke u bazi (ako ih nema) function izvrsi($stdin, $jezik, $lokacijazadaca, $zadaca, $zadatak, $ekst) { global $conf_files_path; // priprema fajlova $tstdin = str_replace('\\n', "\n", $stdin); // više nije dvostruki escape $tstdin = str_replace('\\N', "\n", $tstdin); $tstdin .= "\n"; $result = file_put_contents("{$conf_files_path}/tmp/zamger-gdb.txt", "run\nbt\n"); if ($result) { $result = file_put_contents("{$conf_files_path}/tmp/zamger-input.txt", $tstdin); } if (!$result) { zamgerlog("nije uspjelo kreiranje datoteka", 3); niceerror("Ne mogu kreirati potrebne datoteke u direktoriju /tmp"); return; } // kompajliranje - FIXME: nema podrške za jezike? if ($jezik == "C++") { $kompajler = "g++"; } else { $kompajler = "gcc"; } $the_file = "{$lokacijazadaca}{$zadaca}/{$zadatak}{$ekst}"; $stdout = array(); exec("{$kompajler} -lm -ggdb {$the_file} -o {$conf_files_path}/tmp/zamger.out 2>&1", $stdout, $retvar); if ($retvar != 0) { niceerror("Kompajliranje nije uspjelo! Slijedi ispis"); print "<pre>" . join("\n", $stdout) . "</pre>\n\n"; // čišćenje unlink("{$conf_files_path}/tmp/zamger-gdb.txt"); unlink("{$conf_files_path}/tmp/zamger-input.txt"); unlink("{$conf_files_path}/tmp/zamger.out"); return; } // izvršenje unset($stdout); chmod("{$conf_files_path}/tmp/zamger.out", 0755); exec("gdb --batch --command={$conf_files_path}/tmp/zamger-gdb.txt {$conf_files_path}/tmp/zamger.out <{$conf_files_path}/tmp/zamger-input.txt 2>&1", $stdout, $retvar); // Čistimo viškove iz stdout-a $ispis = join("\n", $stdout); $ispis = preg_replace("/^Using .*? library .*?\n/", "", $ispis); $ok = strpos($ispis, "\nProgram exited normally.\n"); if ($ok) { $ispis = substr($ispis, 0, $ok); } else { $greska = strpos($ispis, "\nProgram received signal SIGABRT, Aborted.\n"); $backtrace = substr($ispis, $greska + 42); $ispis = substr($ispis, 0, $greska); } ?> <center><table width="95%" style="border:1px solid silver;" bgcolor="#FFF3F3"><tr><td> <pre><?php echo $ispis; ?> </pre> </td></tr></table></center><br/><?php if ($ok) { ?> <p><img src="images/16x16/zad_ok.png" width="16" height="16"> Program se izvršio bez problema.</p><?php } else { ?> <p><img src="images/16x16/zad_bug.png" width="16" height="16"> Program se krahirao. Backtrace (obratiti pažnju na zadnje linije):</p> <pre><?php echo $backtrace; ?> </pre> <?php } // čišćenje unlink("{$conf_files_path}/tmp/zamger-gdb.txt"); unlink("{$conf_files_path}/tmp/zamger-input.txt"); unlink("{$conf_files_path}/tmp/zamger.out"); } ?> <h1>Rezultat izvršenja:</h1> <?php if ($_POST['sve']) { $q70 = myquery("select ulaz from stdin where zadaca={$zadaca} and redni_broj={$zadatak}"); while ($r70 = mysql_fetch_row($q70)) { print "<h2>Ulaz: '{$r70['0']}'</h2>"; izvrsi($r70[0], $jezik, $lokacijazadaca, $zadaca, $zadatak, $ekst); } } else { $stdin = $_POST['stdin']; $mstdin = my_escape($stdin); $q70 = myquery("select count(*) from stdin where ulaz='{$mstdin}' and zadaca={$zadaca} and redni_broj={$zadatak}"); if (mysql_result($q70, 0, 0) == 0) { $q80 = myquery("insert into stdin set ulaz='{$mstdin}', zadaca={$zadaca}, redni_broj={$zadatak}"); } izvrsi($stdin, $jezik, $lokacijazadaca, $zadaca, $zadatak, $ekst); } ?> <p><a href="javascript:history.go(-1)">Nazad</a></p> <?php return; } // Akcija: Izmjena statusa if ($_POST['akcija'] == "slanje" && check_csrf_token()) { $komentar = my_escape($_POST['komentar']); $status = intval($_POST['status']); $bodova = floatval(str_replace(",", ".", $_POST['bodova'])); // Osiguravamo da se filename prenese u svaku sljedeću instancu zadatka $filename = $izvjestaj_skripte = ''; $q90 = myquery("select filename, izvjestaj_skripte from zadatak where zadaca={$zadaca} and redni_broj={$zadatak} and student={$stud_id} order by id desc limit 1"); if (mysql_num_rows($q90) > 0) { $filename = mysql_real_escape_string(mysql_result($q90, 0, 0)); $izvjestaj_skripte = mysql_real_escape_string(mysql_result($q90, 0, 1)); // Već je sanitiziran HTML } $q100 = myquery("insert into zadatak set zadaca={$zadaca}, redni_broj={$zadatak}, student={$stud_id}, status={$status}, bodova={$bodova}, vrijeme=now(), komentar='{$komentar}', filename='{$filename}', izvjestaj_skripte='{$izvjestaj_skripte}', userid={$userid}"); // Odredjujemo ponudu kursa (za update komponente) $q110 = myquery("select pk.id from student_predmet as sp, ponudakursa as pk where sp.student={$stud_id} and sp.predmet=pk.id and pk.predmet={$predmet} and pk.akademska_godina={$ag}"); update_komponente($stud_id, mysql_result($q110, 0, 0), $komponenta); zamgerlog("izmjena zadace (student u{$stud_id} zadaca z{$zadaca} zadatak {$zadatak})", 2); // Nakon izmjene statusa, nastavljamo normalno sa prikazom zadatka } if ($_REQUEST["akcija"] == "test_detalji") { $test = intval($_REQUEST['test']); // Provjera spoofinga testa $q10 = myquery("SELECT COUNT(*) FROM autotest WHERE id={$test} AND zadaca={$zadaca} AND zadatak={$zadatak}"); if (mysql_result($q10, 0, 0) == 0) { niceerror("Odabrani test nije sa odabrane zadaće."); return; } autotest_detalji($test, $stud_id, true); return; } if ($_REQUEST["akcija"] == "brisi_testove" && check_csrf_token()) { autotest_brisi_rezultate($stud_id, $zadaca, $zadatak); nicemessage("Rezultati testova obrisani."); ?> <p><a href="?sta=saradnik/zadaca&student=<?php echo $stud_id; ?> &zadaca=<?php echo $zadaca; ?> &zadatak=<?php echo $zadatak; ?> ">Nazad</a></p> <?php return; } // -------------------- // PRIKAZ ZADATKA // Header ?> <h1><a href="?sta=saradnik/student&student=<?php echo $stud_id; ?> &predmet=<?php echo $predmet; ?> &ag=<?php echo $ag; ?> " onclick="window.opener.open(this.href); return false;"><?php echo $ime_studenta . " " . $prezime_studenta; ?> </a>, <?php echo $naziv_zadace . ", Zadatak " . $zadatak . "."; ?> </h1> <?php // Da li ispisati zadatak ili dugme za download attachmenta? if ($attach == 0) { // Nije attachment $src = ""; $the_file = "{$lokacijazadaca}{$zadaca}/{$zadatak}{$ekst}"; $no_lines = 0; if (file_exists($the_file)) { if ($_REQUEST["akcija"] == "test_sa_kodom") { $test = intval($_REQUEST['test']); // Provjera spoofinga testa $q10 = myquery("SELECT COUNT(*) FROM autotest WHERE id={$test} AND zadaca={$zadaca} AND zadatak={$zadatak}"); if (mysql_result($q10, 0, 0) == 0) { niceerror("Odabrani test nije sa odabrane zadaće."); return; } $src = autotest_sa_kodom($test, $stud_id, true); } else { $src = file_get_contents($the_file); } $no_lines = count(explode("\n", $src)); // geshi - biblioteka za syntax highlighting include_once 'lib/geshi/geshi.php'; $geshi = new GeSHi($src, $jezik); ?> <center><table width="95%" style="border:1px solid silver;"><tr> <!-- Brojevi linija --> <td bgcolor="#CCCCCC" align="left"><pre><?php for ($i = 1; $i <= $no_lines; $i++) { print "{$i}\n"; } ?> </pre></td> <td bgcolor="#F3F3F3" align="left"> <?php print $geshi->parse_code(); ?> </td></tr></table></center><br/><?php if ($_REQUEST["akcija"] == "test_sa_kodom") { return; } // Formular za izvršavanje programa if ($id_jezika > 0) { ?> <script type="text/javascript" src="js/combo-box.js"></script> <center><table style="border:1px solid silver;" cellspacing="0" cellpadding="6"><tr><td> Izvrši program sa sljedećim parametrima (kucajte \n za tipku enter):<br/> <?php echo genform("POST"); ?> <input type="hidden" name="akcija" value="izvrsi"> <select name="stdin" onKeyPress="edit(event)" onBlur="this.editing = false;"> <?php // Zadnje korišteni stdin se čuva u bazi $q120 = myquery("select ulaz from stdin where zadaca={$zadaca} and redni_broj={$zadatak} order by id desc"); if (mysql_num_rows($q120) < 1) { print "<option></option>"; } // bez ovoga nije moguće upisati novi tekst while ($r120 = mysql_fetch_row($q120)) { print "<option value=\"{$r120['0']}\">{$r120['0']}</option>\n"; } ?> </select><br/> <b>Pažnja!</b> Prije pokretanja provjerite da li program sadrži opasne naredbe.<br/> <input type="submit" value=" Izvrši program "> <input type="submit" name="sve" value=" Izvrši sve primjere odjednom "> </form></table></center><br/> <br/> <?php } } } else { // Attachment $q130 = myquery("select filename,UNIX_TIMESTAMP(vrijeme) from zadatak where zadaca={$zadaca} and redni_broj={$zadatak} and student={$stud_id} order by id desc limit 1"); if (mysql_num_rows($q130) > 0) { $filename = mysql_result($q130, 0, 0); $the_file = "{$lokacijazadaca}{$zadaca}/{$filename}"; if ($filename && file_exists($the_file)) { $vrijeme = date("d. m. Y. h:i:s", mysql_result($q130, 0, 1)); $velicina = nicesize(filesize($the_file)); $icon = "images/mimetypes/" . getmimeicon($the_file); $dllink = "index.php?sta=common/attachment&student={$stud_id}&zadaca={$zadaca}&zadatak={$zadatak}"; ?> <center><table width="75%" border="1" cellpadding="6" cellspacing="0" bgcolor="#CCCCCC"><tr><td> <a href="<?php echo $dllink; ?> "><img src="<?php echo $icon; ?> " border="0"></a> </td><td> <p>Poslani fajl: <b><a href="<?php echo $dllink; ?> "><?php echo $filename; ?> </a></b><br/> Veličina: <b><?php echo $velicina; ?> </b></p> </td></tr></table></center><br/> <?php } else { ?> <center><table width="75%" border="1" cellpadding="6" cellspacing="0" bgcolor="#CCCCCC"><tr><td> <b><font color="red">Student je zaboravio priložiti datoteku.</font></b> </td></tr></table></center><br/> <?php } } } // Prikaz statusa sa log-om i izmjena $q140 = myquery("select status,bodova,izvjestaj_skripte,komentar from zadatak where zadaca={$zadaca} and redni_broj={$zadatak} and student={$stud_id} order by id desc limit 1"); if (mysql_num_rows($q140) > 0) { $status = mysql_result($q140, 0, 0); $bodova = mysql_result($q140, 0, 1); $izvjestaj_skripte = str_replace("\n", "<br/>", mysql_result($q140, 0, 2)); $komentar = mysql_result($q140, 0, 3); $komentar = str_replace("\"", """, $komentar); // Koristimo poseban upit da bismo odredili vrijeme slanja prve verzije $q150 = myquery("select UNIX_TIMESTAMP(vrijeme) from zadatak where zadaca={$zadaca} and redni_broj={$zadatak} and student={$stud_id} order by id limit 1"); $vrijeme_slanja = date("d. m. Y. H:i:s", mysql_result($q150, 0, 0)); ?> <table border="0"> <tr> <td>Vrijeme slanja:</td> <td><b><?php echo $vrijeme_slanja; ?> </b></td> </tr> <?php // Autotest nalaz $nalaz_autotesta = autotest_tabela($stud_id, $zadaca, $zadatak, true); if ($nalaz_autotesta != "") { ?> <tr> <td>Rezultati testiranja:</td> <td> <p><?php echo genform("POST"); ?> <input type="hidden" name="akcija" value="brisi_testove"> <input type="submit" value=" Obriši sve rezultate testiranja "> </form></p> <?php print $nalaz_autotesta; } if ($id_jezika > 0) { ?> <tr> <td>Izvještaj skripte:</td> <td><i><?php echo $izvjestaj_skripte; ?> </i></td> </tr> <?php } if ($status == 1 && !$user_siteadmin) { // nema mijenjanja ako je status 1 = ceka se automatska provjera print "Izmjena zadaće nije moguća jer se čeka automatsko testiranje"; } else { print genform("POST"); } ?> <input type="hidden" name="akcija" value="slanje"> <?php } else { print genform("POST"); ?> <input type="hidden" name="akcija" value="slanje"> <table border="0"> <tr> <td> </td> <td><b>Unos bodova za zadaću koja nije poslana:</b></td> </tr> <?php } // Dio forme koji se prikazuje bez obzira da li je u pitanju kreiranje nove zadaće ili promjena postojeće ?> <tr> <td>Status</td> <td><select id="status" name="status"><?php function myoption($nr, $tx, $sel) { print "{$sel}"; print "<option value={$nr}"; if ($nr == $sel) { print " selected"; } print ">{$tx}</option>"; } // tabela status kodova $statusi_array = array("nepoznat status", "sačekati automatsko testiranje!", "prepisana", "ne može se kompajlirati", "nova zadaća, potrebno pregledati", "pregledana"); $brstatusa = 6; for ($i = 0; $i < $brstatusa; $i++) { myoption($i, $statusi_array[$i], $status); } ?> </select></td> </tr> <tr> <td>Bodova:</td> <td><input type="text" size="20" name="bodova" value="<?php echo $bodova; ?> " onchange="javascript:document.getElementById('status').value=5;"></td> </tr> <tr> <td valign="top">Komentar:</td> <td><textarea cols="50" rows="5" name="komentar"><?php echo $komentar; ?> </textarea></td> </tr> <tr> <td colspan="2" align="center"><?php if ($status != 1 || $user_siteadmin) { ?> <input type="submit" value="Izmijeni vrijednosti"><?php } ?> </td> </tr> </table> </form> <?php ##### HISTORIJA IZMJENA ###### $q160 = myquery("select id,UNIX_TIMESTAMP(vrijeme),status,bodova,komentar,userid from zadatak where zadaca={$zadaca} and redni_broj={$zadatak} and student={$stud_id} order by vrijeme"); if (mysql_num_rows($q160) > 1) { ?> <p>Historija izmjena:</p> <ul><?php while ($r160 = mysql_fetch_row($q160)) { $imeprezime = ""; if ($r160[5] > 0) { $q165 = myquery("select ime, prezime from osoba where id={$r160['5']}"); if (mysql_num_rows($q165) > 0) { $imeprezime = mysql_result($q165, 0, 0) . " " . mysql_result($q165, 0, 1); } } $vrijeme_slanja = date("d. m. Y. H:i:s", $r160[1]); print "<li><b>{$vrijeme_slanja}"; if ($imeprezime != "") { print " ({$imeprezime})"; } print ":</b> " . $statusi_array[$r160[2]]; if ($r160[3] > 0) { print " (" . $r160[3] . " bodova)"; } if (strlen($r160[4]) > 0) { print " - "" . $r160[4] . """; } $q170 = myquery("select count(zadatak) from zadatakdiff where zadatak={$r160['0']}"); if (mysql_result($q170, 0, 0) > 0) { print " (<a href=\"index.php?sta=saradnik/zadaca&akcija=diff&zadaca={$zadaca}&zadatak={$zadatak}&student={$stud_id}&diff_id={$r160['0']}\">diff</a>)"; } print "</li>"; } ?> </ul><?php } // Kraj historije izmjena }