示例#1
0
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;
        }
    }
}
示例#2
0
function directoryCleanup($path)
{
    if (!file_exists($path)) {
        mkdir($path, 0777, true);
    } else {
        if (!is_dir($path)) {
            unlink($path);
            mkdir($path);
        } else {
            rmMinusR($path);
        }
    }
}
示例#3
0
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);
}
示例#4
0
function purge_instance($instance)
{
    rmMinusR(instance_path($instance));
    rmdir(instance_path($instance));
}