403Webshell
Server IP : 93.86.61.54  /  Your IP : 216.73.216.60
Web Server : Apache/2.4.62 (Ubuntu)
System : Linux rasin.ddns.net 6.8.0-124-generic #124~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Tue May 26 21:05:19 UTC x86_64
User : www-data ( 33)
PHP Version : 8.4.22
Disable Function : NONE
MySQL : OFF  |  cURL : ON  |  WGET : ON  |  Perl : ON  |  Python : OFF  |  Sudo : ON  |  Pkexec : ON
Directory :  /var/www/html/projects/cslinfo/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ Back ]     

Current File : /var/www/html/projects/cslinfo/funkcije.php
<?php 
/**
* Globalne funkcije aplikacije.
* 
* @package CSLInfo
* @subpackage Funkcije
* @category Include
* @author Marina Terzic <terzic.marina@gmail.com>
* @copyright Laboratorija za racunarsku tehniku, Tehnicki fakultet Cacak <csl@tfc.kg.ac.rs>
*/

/**
* Slanje SQL upita i vracanje dobijenog rezultata ili samo konekcije.
*
* @param string $sql String upita koji se salje.
* @param bool $samoKonekcija Da li se vraca samo konekcija ili rezultat upita.
* @return mixed Rezultat upita.
*/
function upit($sql, $samoKonekcija = false){
	/**
	* Konekcija na MySQL bazu za parametre date u 'config.php'
	*/
	$konekcija = mysqli_connect(DB_HOST, DB_KORISNICKO_IME, DB_LOZINKA, 'cslinfo') or die('Neuspesna konekcija: '.mysqli_error());

	/*
	* Selektovanje odgovarajuce baze
	*/
//	mysqli_select_db(DB_NAZIV_BAZE);
	
	/*
	* Postavljanje enkodinga i kolacije pred slanje svakog upita kako ne bi dolazilo do problema sa nasim slovima
	*/
	mysqli_query($konekcija, 'set names '.DB_ENKODING) or die('Neuspelo postavljanje enkodinga: '.mysqli_error());
	mysqli_query($konekcija, 'set collation_connection='.DB_KOLACIJA) or die('Neuspelo postavljanje kolacije: '.mysqli_error());
	
	/*
	* Slanje upita. Ukoliko je prilikom pozivanja funkcije prosledjen i parametar '$samoKonekcija' koji ima podrazumevanu
	* vrednost false onda se umesto rezultata upita pozivaocu vraca samo konekcija na bazu.
	* U suprotnom vraca se kompletan set rezultata.
	*/
	if($samoKonekcija){
		return $konekcija;
	} else {
		$rezultat = mysqli_query($konekcija, $sql) or die('Neuspeo upit: '.mysqli_error());
	}
	
	return $rezultat;
}

/**
* Provera ispravnosti unetih podataka u formu za dodavanje novog clana.
*
* @param array $forma Prosledjena POST forma iz forme za dodavanje clanova.
* @return array Niz sa rezultatima provere.
*/
//*****************************************************************************************/
function formaProveraDodavanje($forma) {
    $greske = array(
        'IME_NEDOSTAJE'      => true,
        'IME_NEISPRAVNO'     => true,
        'PREZIME_NEDOSTAJE'  => true,
        'PREZIME_NEISPRAVNO' => true,
        'EMAIL_NEDOSTAJE'    => true,
        'EMAIL_NEISPRAVAN'   => true,
        'EMAIL_POSTOJI'      => true
    );

    $ime = trim($forma['formaIme'] ?? '');
    $prezime = trim($forma['formaPrezime'] ?? '');
    $email = trim($forma['formaEmail'] ?? '');

    // 1. Provera Imena (prihvata slova, razmake i crtice)
    if (strlen($ime) > 0) {
        $greske['IME_NEDOSTAJE'] = false;
    }
    if (preg_match('/^[ \pL\-]+$/u', $ime)) {
        $greske['IME_NEISPRAVNO'] = false;
    }

    // 2. Provera Prezimena
    if (strlen($prezime) > 0) {
        $greske['PREZIME_NEDOSTAJE'] = false;
    }
    if (preg_match('/^[ \pL\-]+$/u', $prezime)) {
        $greske['PREZIME_NEISPRAVNO'] = false;
    }

    // 3. Provera Emaila
    if (strlen($email) > 0) {
        $greske['EMAIL_NEDOSTAJE'] = false;
    }

    if (function_exists('proveraEmaila')) {
        if (proveraEmaila($email)) {
            $greske['EMAIL_NEISPRAVAN'] = false;
        }
    } else if (filter_var($email, FILTER_VALIDATE_EMAIL)) {
        $greske['EMAIL_NEISPRAVAN'] = false;
    }

    // 4. Provera postojanja Email-a u bazi
    $konekcija = upit('', true);
    
    if (is_object($konekcija) || is_resource($konekcija)) {
        $emailClean = mysqli_real_escape_string($konekcija, $email);
    } else {
        $emailClean = addslashes($email);
    }

    $sql = "SELECT idClana FROM clanovi WHERE email='" . $emailClean . "'";
    $rezultat = upit($sql);

    if ($rezultat && mysqli_num_rows($rezultat) === 0) {
        $greske['EMAIL_POSTOJI'] = false;
    }

    // 5. Provera fotografije (ako je poslata)
    if (isset($_FILES['formaFotografija']) && $_FILES['formaFotografija']['error'] === UPLOAD_ERR_OK) {
        global $dozvoljeniFotoFormati;
        if (is_array($dozvoljeniFotoFormati) && !in_array($_FILES['formaFotografija']['type'], $dozvoljeniFotoFormati, true)) {
            $greske['NEDOZVOLJEN_FORMAT'] = true;
        }
    } else if (isset($_FILES['formaFotografija']['error']) && $_FILES['formaFotografija']['error'] !== UPLOAD_ERR_NO_FILE) {
        $greske['GRESKA_PRI_UPLOADU_FAJLA'] = true;
    }

    return $greske;
}
/*******************************************************************************************************/

function proveraEmaila($email) {
	/*
	* Ukoliko prosledjena email adresa ne ispunjava uslov naveden regularnim izrazom funkcija indikuje neispravan mail (false)
	*/
	if(!preg_match("/^([a-zA-Z0-9])+([a-zA-Z0-9\._-])*@([a-zA-Z0-9_-])+([a-zA-Z0-9\._-]+)+$/", $email)){
		return false;
	}
	return true; //... u suprotnom mail je sintaksicki ispravan (true)
}

/**
* Dodavanje novog clana u bazu clanova.
*
* @param array $forma Forma sa podacima o clanu koji se dodaje
* @param string $kodFotografije Ukoliko je prosledjen parametar sadrzi naziv koda fotografije pridruzene clanu.
*/


function dodavanjeClana($forma, $kodFotografije = ''){
    // Generisanje jedinstvenog idKoda
    $emailForma = $forma['formaEmail'] ?? '';
    $duzinaKoda = defined('DUZINA_ID_KODA') ? DUZINA_ID_KODA : 15;
    $idKod = substr(sha1($emailForma), 10, $duzinaKoda);

    // Pribavljanje konekcije sa bazom
    $konekcija = upit('', true);

    // Priprema podataka za upit (escape-ovanje radi bezbednosti)
    if (is_object($konekcija) || is_resource($konekcija)) {
        $idKodClean         = mysqli_real_escape_string($konekcija, $idKod);
        $imeClean           = mysqli_real_escape_string($konekcija, $forma['formaIme'] ?? '');
        $prezimeClean       = mysqli_real_escape_string($konekcija, $forma['formaPrezime'] ?? '');
        $adresaClean        = mysqli_real_escape_string($konekcija, $forma['formaAdresa'] ?? '');
        $mestoClean         = mysqli_real_escape_string($konekcija, $forma['formaMesto'] ?? '');
        $postanskiBrojClean = mysqli_real_escape_string($konekcija, $forma['formaPostanskiBroj'] ?? '');
        $telefonClean       = mysqli_real_escape_string($konekcija, $forma['formaTelefon'] ?? '');
        $emailClean         = mysqli_real_escape_string($konekcija, $emailForma);
        $kodFotoClean       = mysqli_real_escape_string($konekcija, $kodFotografije);
    } else {
        $idKodClean         = addslashes($idKod);
        $imeClean           = addslashes($forma['formaIme'] ?? '');
        $prezimeClean       = addslashes($forma['formaPrezime'] ?? '');
        $adresaClean        = addslashes($forma['formaAdresa'] ?? '');
        $mestoClean         = addslashes($forma['formaMesto'] ?? '');
        $postanskiBrojClean = addslashes($forma['formaPostanskiBroj'] ?? '');
        $telefonClean       = addslashes($forma['formaTelefon'] ?? '');
        $emailClean         = addslashes($emailForma);
        $kodFotoClean       = addslashes($kodFotografije);
    }

    $sada = date('Y-m-d H:i:s');

    // SQL upit za unos u bazu
    $sql = "INSERT INTO clanovi 
            (idClana, idKod, ime, prezime, poslednjaPrijava, poslednjaOdjava, adresa, mesto, postanskiBroj, telefon, email, kodFotografije) 
            VALUES 
            (NULL, '{$idKodClean}', '{$imeClean}', '{$prezimeClean}', '{$sada}', '{$sada}', '{$adresaClean}', '{$mestoClean}', '{$postanskiBrojClean}', '{$telefonClean}', '{$emailClean}', '{$kodFotoClean}')";

    // Izvršavanje upita
    upit($sql);
}

function listaClanova(){
	/**
	* SQL upit kojim se ucitava lista clanova iz baze. Uz pomoc date_FORMAT datumi smesteni u bazi se automatski
	* formatiraju da budu u obliku DD.MM.GGGG. U isto vreme (poslednjaOdjava - poslednjaPrijava) predstavlja razliku
	* vremena u sekundama tj. ako se clan odjavio recimo 5 sekundi posle prijave razlika ce biti 5. Rezultat te razlike
	* se smesta u promenjljivu 'prisutan'. Pozitivna vrednost za 'prisutan' znaci da je clan jos uvek prisutan, negativna
	* da je odsutan a nula znaci da clan nije nikada ni odjavljivan ni prijavljivan.
	*/
	$sql = "SELECT idClana, ime, prezime, date_FORMAT(poslednjaPrijava, '%d.%m.%Y. %H:%i:%s') AS poslednjaPrijava, date_FORMAT(poslednjaOdjava, '%d.%m.%Y. %H:%i:%s') AS poslednjaOdjava, (poslednjaOdjava - poslednjaPrijava) as prisutan FROM clanovi";
	
	/*
	* Upit.
	*/
	$rezultat = upit($sql);
	
	/*
	* Ukoliko je lista clanova (rezultat upita) prazna...
	*/
	if(!mysqli_num_rows($rezultat)){
		return false; //...vraca se false
	} else {
		/*
		* Ukoliko lista nije prazna...
		*/
		$clanovi = array();
		/*
		* ...za svaki od redova zapisa rezultata dok se ne dodje do kraja rezultata...
		*/
		while($zapis = mysqli_fetch_assoc($rezultat)){
			/*
			* ...se proverava da kojim slucajem nije jednak nuli (novi clan koji nije nikad prijavljen/odjavljen)...
			*/
			if((int) $zapis['prisutan'] == 0){
				/*
				* ... ukoliko jeste onda se ne ispisuju datumi poslednje prijave/dojave (jer su za nove clanove isti)
				* vec se odredjene vrednosti za tog clana menjaju sa '- / -' cisto estetski.
				*/
				$zapis['poslednjaPrijava'] = '- / -';
				$zapis['poslednjaOdjava'] = '- / -';
			}
			/*
			* Podaci za svakog clana se smestaju u jedan visdimenzioni niz.
			*/
			$clanovi[] = $zapis;
		}
	}
	
	/*
	* Pozivaoc funkcije dobija rezultate u obliku visedimenzionog niza.
	*/
	return $clanovi;
}

/**
* Ucitava iz baze podataka detalje za clana sa navedenim 'idClan' brojem.
*
* @param int $idClana identifikacioni broj clana ciji se detalji zahtevaju.
* @return array Niz sa detaljima o clanu
*/
function detaljiClana($idClana){
	/**
	* SQL upit kojim se ucitavaju detaljni podaci o clanu iz baze
	*/
	$sql = "SELECT idClana, idKod, ime, prezime, date_FORMAT(poslednjaPrijava, '%d.%m.%Y. %H:%i:%s') AS poslednjaPrijava, date_FORMAT(poslednjaOdjava, '%d.%m.%Y. %H:%i:%s') AS poslednjaOdjava, adresa, mesto, postanskiBroj, telefon, email, kodFotografije FROM clanovi WHERE idClana=".(int)$idClana;

	/*
	* Upit.
	*/
	$rezultat = upit($sql);
	
	/*
	* Ukoliko nema rezultata za navedeni 'idClan' broj...
	*/
	if(!mysqli_num_rows($rezultat)){
		return false; //... pozivaoc funkcije dobija povratnu vrednost false...
	} else {
		/*
		* ... u suprotnom se iz rezultata uzima prvi red...
		*/
		$zapis = mysqli_fetch_assoc($rezultat);
		
		/*
		* ... i vraca pozivaocu u obliku jednodimenzionog asocijativnog niza...
		*/
		return $zapis;
	}
}

/**
* Promena statusa (odjava/prijava) clana.
*
* @param string $idClana Id clana kome se menaj status
* @param string $tipIzmene Indikuje ko je izvor izmene ('kod' ili 'manuelno')
* @return string $tipDogadjaja String sa oznakom tipa promene statusa koja je izvrsena ('prijava' ili 'odjava')
*/
function promenaStatusa($idClana, $tipIzmene){
	/**
	* SQL upit kojim se ucitavaju odredjeni podaci o clanu iz baze na osnovu kojih se proverava 
	* da li je clan kojem se menja status trenutno prisutan ili ne.
	*/
	$sql = "SELECT (poslednjaOdjava - poslednjaPrijava) AS prisutan FROM clanovi WHERE idClana=".(int)$idClana;

	/*
	* Upit.
	*/
	$rezultat = upit($sql);
	
	/*
	* Ukoliko kojim slucajem nema rezultata (nema clana sa prosledjenim 'idClana' parametrom)...
	*/
	if(!mysqli_num_rows($rezultat)){
		/*
		* ... pozivalac funkcije dobija kao rezultat funkcije false...
		*/
		return false;
	} else {
		/*
		* ... u suprotnom ucitava se prvi (i jedini) red podataka iz rezultata upita.
		*/
		$zapis = mysqli_fetch_assoc($rezultat);

		/*
		* Odredjivanje dosadasnjeg statusa clana i regulisanje novog.
		*/
		if(((int)$zapis['prisutan'] == 0) || ((int)$zapis['prisutan'] > 0)){
			/*
			* Clan do sada nije ni prijavljivan ni odjavljivan (samo registrovan) 
			* ili je poslednja promena statusa bila odjava.
			* Treba ga prijaviti.
			*/
			
			/**
			* String upita kojim ce se promeniti status u tabeli clanovi
			*/
			$sql_clanovi = "UPDATE clanovi SET poslednjaPrijava = NOW() WHERE idClana=".(int)$idClana;
			
			/**
			* String upita kojim ce se novi dogadjaj (promena statusa) upisati u tabelu istorija.
			*/
			$sql_istorija = "INSERT INTO istorija (idDogadjaja, datumDogadjaja, tipDogadjaja, tipIzmene, clanovi_idClana) VALUES (NULL, NOW(), 'prijava', '{$tipIzmene}', {$idClana})";
			
			/*
			* Tip dogadjaja koji ce se dogoditi je 'prijava'
			*/
			$tipDogadjaja = 'prijava';
		} else {
			/*
			* Clan je pri poslednjem menjanju statusa bio prijavljen.
			* Treba ga odjaviti.
			*/
			
			/**
			* String upita kojim ce se promeniti status u tabeli clanovi
			*/
			$sql_clanovi = "UPDATE clanovi SET poslednjaOdjava = NOW() WHERE idClana=".(int)$idClana;
			
			/**
			* String upita kojim ce se novi dogadjaj (promena statusa) upisati u tabelu istorija.
			*/
			$sql_istorija = "INSERT INTO istorija (idDogadjaja, datumDogadjaja, tipDogadjaja, tipIzmene, clanovi_idClana) VALUES (NULL, NOW(), 'odjava', '{$tipIzmene}', {$idClana})";
			
			/*
			* Tip dogadjaja koji ce se dogoditi je 'odjava'
			*/
			$tipDogadjaja = 'odjava';
		}
		
		/*
		* Slanje upita.
		*/
		upit($sql_clanovi); //promena statusa u tabeli 'clanovi'
		upit($sql_istorija); //evidentiranje promene statusa u tabeli 'istorija'
		
		/*
		* Pozivalac funkcije dobija podatak da li je izvrsena 'prijava' ili 'odjava'
		*/
		return $tipDogadjaja;
	}
}

/**
* Provera ispravnosti podataka prosledjenih formom za identifikaciju.
*
* @param array $forma Podaci iz forme (u ovom slucaju samo jedan - identifikacioni kod)
* @return array $greske Niz sa statusom potencijalnih gresaka sa unetim podacima u formi.
*/
function formaProveraIdentifikacija($forma){
	/*
	* Asocijativni niz sa potencijalnim greskama koje mogu da jave u vezi prosledjenih podataka.
	* Sistem bele liste, sve je neispravno dok se ne dokaze suprotno.
	*/
	$greske = array(
		'ID_BROJ_NIJE_UNET' => true,
		'NEPOSTOJECI_ID_BROJ' => true				
	);	
	
	/*
	* Da li je duzina identifikacionog koda veca od nule?
	*/
	if(strlen(trim($forma['idKod']))){
		$greske['ID_BROJ_NIJE_UNET'] = false;
	}
	
	$konekcija = upit('', true); //konekcija potrebna za 'mysql_real_escape_string' u sledecem redu.
	
	/*
	* Iz baze podataka se ucitava 'idClana' za koji je vezan prosledjeni identifikacioni kod.
	*/
	$sql = "SELECT idClana FROM clanovi WHERE idKod='".mysqli_real_escape_string($konekcija, $forma['idKod'])."'";
	$rezultat = upit($sql);
	
	/*
	* Ukoliko ima rezultata (clan sa navedenim identifikacionim kodom postoji)...
	*/
	if(mysqli_num_rows($rezultat)){
		/*
		* ... evidentira se postojanje takvog clana.
		*/
		$greske['NEPOSTOJECI_ID_BROJ'] = false;	
	}
	
	/*
	* Pozivaocu funkcije se prosledjuju rezultati provere.
	*/
	return $greske;
}

/**
* Ucitavanje istorije promene statusa prijava/odjava.
*
* @param string $datum Ukoliko je prosledjen predstavlja datum za koji se trazi pregled istorije.
* @return array Visedimenzioni niz sa rezultatima upita istorije za zadati dan ili za poslednje izvrsene prijave/odjave. 
*/
/*********************************************************************************************/

function ucitavanjeIstorije($datum = ''){
    /*
    * Obezbeđujemo limit prikazivanja, u slučaju da konstanta nije definisana
    */
    $limit = defined('PRIKAZA_ZA_ISTORIJU') ? PRIKAZA_ZA_ISTORIJU : 50;

    /*
    * Ukoliko kao parametar nije prosledjeno nista funkciji...
    */
    if($datum == ''){
        /*
        * ... vrsi se ucitavanje poslednjih izmena statusa (definisano limitom)
        * Precizirali smo iz koje tabele se vuce koja kolona kako bi izbegli "ambiguous" gresku.
        */
        $sql = "SELECT DATE_FORMAT(istorija.datumDogadjaja, '%d.%m.%Y. %H:%i:%s') AS datumDogadjaja, 
                       istorija.tipDogadjaja, 
                       istorija.tipIzmene, 
                       clanovi.idClana, 
                       clanovi.ime, 
                       clanovi.prezime 
                FROM istorija 
                LEFT JOIN clanovi ON istorija.clanovi_idClana = clanovi.idClana 
                ORDER BY istorija.datumDogadjaja DESC 
                LIMIT {$limit}";
    } else {
        /*
        * ...u suprotnom prikazuju se sve promene statusa za navedeni datum.
        */
        $konekcija = upit('', true);
        if (is_object($konekcija) || is_resource($konekcija)) {
            $datumClean = mysqli_real_escape_string($konekcija, $datum);
        } else {
            $datumClean = addslashes($datum);
        }
        
        $sql = "SELECT DATE_FORMAT(istorija.datumDogadjaja, '%d.%m.%Y. %H:%i:%s') AS datumDogadjaja, 
                       istorija.tipDogadjaja, 
                       istorija.tipIzmene, 
                       clanovi.idClana, 
                       clanovi.ime, 
                       clanovi.prezime 
                FROM istorija 
                LEFT JOIN clanovi ON istorija.clanovi_idClana = clanovi.idClana 
                WHERE istorija.datumDogadjaja LIKE '{$datumClean}%' 
                ORDER BY istorija.datumDogadjaja DESC";
    }

    /*
    * Upit.
    */
    $rezultat = upit($sql);

    /*
    * Ukoliko nema rezultata pozivaocu se vraca false...
    */
    if(!$rezultat || mysqli_num_rows($rezultat) === 0){
        return false;
    } else {
        /*
        * ...a ukoliko ih ima onda se svi smestaju u novi asocijativni visedimenzioni niz.
        */
        $istorija = array();

        while($zapis = mysqli_fetch_assoc($rezultat)){
            $istorija[] = $zapis;
        }
        
        return $istorija;
    }
}

/*************************************************************************************************
* Vraca listu svih datuma za koje postoji makar i jedan jedini unos u tabelu istorije.
*/
function listaDatumaIstorije(){
	/*
	* Upit kojim se iz tabele 'istorija' uzimaju samo razlicite vrednosti datuma. 
	* Dodatno se za potrebe kreiranja asocijativnog niza formatiraju i dva podatka ('datumIndeks' i 'datumVrednost')
	* kojima se formira asocijativni niz koji ce se kasnije koristiti za formiranje select boxa.
	*/
	$sql = "SELECT DISTINCT date_FORMAT(datumDogadjaja, '%d.%m.%Y.') AS datumIndeks, date_FORMAT(datumDogadjaja, '%Y-%m-%d') AS datumVrednost FROM istorija";
	
	/*
	* Upit.
	*/
	$rezultat = upit($sql);
	
	/**
	* Visedimenzioni asocijativni niz sa elementima u obliku ($datumi['2009-12-03'] = '03.12.2009.') 
	* koji ce se koristiti za select box
	*/
	$datumi = array();
	while($zapis = mysqli_fetch_assoc($rezultat)){
		$datumi[] = $zapis;	
	}

	/*
	* Vracanje liste sa datumima
	*/
	return $datumi;
}

/**
* Provera da li je trenutni posetilac ulogovan kao administrator.
*
* @return bool Da li je trenutni korisnik administrator ili ne?
*/

function administratorskaProvera(){
    // Pokrećemo sesiju ako već nije pokrenuta
    if (session_status() === PHP_SESSION_NONE) {
        session_start();
    }

    // 1. Prva brza provera preko $_SESSION promenljive
    if (isset($_SESSION['admin']) && $_SESSION['admin'] === true) {
        return true;
    }

    // 2. Provera preko baze podataka (registar tabele) i IP adrese
    $loginPodaci = array(
        'adminSesija' => '',
        'adminIP'     => ''
    );

    $sql = "SELECT naziv, vrednost FROM registar WHERE naziv = 'adminSesija' OR naziv = 'adminIP'";
    $rezultat = upit($sql);

    if ($rezultat) {
        while ($zapis = mysqli_fetch_assoc($rezultat)) {
            $loginPodaci[$zapis['naziv']] = $zapis['vrednost'];
        }
    }

    $trenutnaSesija = session_id();
    $ipAdresa = $_SERVER['REMOTE_ADDR'] ?? '';

    // Proverava se da li sesija i IP adresa odgovaraju onima iz baze (koristimo == za poređenje)
    if (!empty($loginPodaci['adminSesija']) && 
        $loginPodaci['adminSesija'] === $trenutnaSesija && 
        $loginPodaci['adminIP'] === $ipAdresa) {
        
        // Zapamti u sesiji radi brže provere ubuduće
        $_SESSION['admin'] = true;
        return true;
    }

    return false;
}

function formaProveraLogin($forma){
	/**
	* Flag registar provere ispravnosti prosledjenie forme po sistemu bele liste. To znaci da se u pocetku
	* pretpostavlja da nijedan uslov ispavnosti prosledjenih podataka nije ispunjen dok se ne dokaze suprotno. 
	*/
	$greske = array(
		'KORISNICKO_IME_NIJE_UNETO' => true,
		'LOZINKA_NIJE_UNETA' =>true,
		'POGRESNI_ADMIN_PARAMETRI' => true
	);
	
	/*
	* Da li je korisnicko ime uneto?
	*/
	if(strlen(trim($forma['korisnickoIme']))){
		$greske['KORISNICKO_IME_NIJE_UNETO'] = false;	
	}
	
	/*
	* Da li je lozinka uneta?
	*/
	if(strlen(trim($forma['lozinka']))){
		$greske['LOZINKA_NIJE_UNETA'] = false;
	}
	
	/*
	* Da li uneto korisnicko ime i lozinka odgovaraju parametrima unesenim u 'config.php' fajlu?
	*/
	if(($forma['korisnickoIme'] == ADMIN_KORISNICKO) && ($forma['lozinka'] == ADMIN_LOZINKA)){
		$greske['POGRESNI_ADMIN_PARAMETRI'] = false;
	}
	
	/*
	* Pozivaocu se vracaju podaci o ispravnosti prosledjenih podataka.
	*/
	return $greske;
}

/**
* Evidencija prijave administratora na sistem.
*/
function administratorskaPrijava(){
	/*
	* POdaci trenutno aktivnog korisnika (sesija i IP adresa) se upisuju kao novi vazeci autentifikacioni podaci
	* za administratora.
	*/
	$sql_sesija = "UPDATE registar SET vrednost = '".session_id()."' WHERE naziv = 'adminSesija'";
	$sql_ip = "UPDATE registar SET vrednost = '".htmlentities($_SERVER['REMOTE_ADDR'], ENT_QUOTES, 'utf-8')."' WHERE naziv = 'adminIP'";
	
	/*
	* Upiti idu odvojeno jer se upis vrsi u dve razlicite kolone ('adminSesija' i 'adminIP')
	*/
	upit($sql_sesija);
	upit($sql_ip);
}

/**
* Odjavljivanje administratora sa sistema. 
*/
function administratorskaOdjava(){
	/*
	* U tabelu 'registar' se upisuju prazne vrednosti za administratorsku sesiju i adminisratorski IP
	* cime se administrator smatra odjavljenim.
	*/
	$sql_sesija = "UPDATE registar SET vrednost = '' WHERE naziv = 'adminSesija'";
	$sql_ip = "UPDATE registar SET vrednost = '' WHERE naziv = 'adminIP'";
	
	/*
	* Odvojeni upiti zato sto se upis vrsi u dve odvojene kolone.
	*/
	upit($sql_sesija);
	upit($sql_ip);		
	
	/*
	* Nakon odjave vrsi se promena vrednosti sesije korisnika koji se odjavio kako
	* ,ako bi se eventualno ponovo prijavio naknadno, ne bi bila koriscena ista sesija kao i pre odjave. 
	*/
	session_regenerate_id();
}


/**
* Cisti prosledjene podatke od potencijalnog malicioznog koda pretvarajuci sve vrednosti koje tako mogu 
* da se predstave u tzv. HTML entitete. Ovo je rekurzivna funkcija!
*
* @param mixed $ulaz Vrednost (potencijalno niz) koji se cisti
* @return mixed $izlaz Ociscene vrednosti.
*/
function ciscenjeIzlaza($ulaz){
	/*
	* Ukoliko je parametar ('$ulaz') tipa niz onda se za svaki od njegovih elemenata rekurzivno ova funkcija.
	*/
	if(is_array($ulaz)){
		foreach($ulaz as $naziv => $vrednost){
			/*
			* Da bi ze zadrzala forma nizova vodi se racuna o tipu niza i pozicijama - nazivi (indeksi) 
			* i vrednosti elemenata izlaznog niza moraju da se poklapaju u potpunosti sa ulaznim nizom.
			*/
			$izlaz[$naziv] = ciscenjeIzlaza($vrednost);
		}
	} else {
		/*
		* Ukoliko '$ulaz' nije tipa niz to znaci da je u pitanju krajnji element koji moze da se obradi.
		*/
		$izlaz = htmlentities($ulaz ?? '', ENT_QUOTES, 'utf-8');
	}
	
	/*
	* Vracanje rezultata obrade pozivaocu ili prethodnom nivou rekurzivne funkcije.
	*/
	return $izlaz;
}

/**
* Promena velicine ulazne fotografije uz postovanje proporcija slike i maksimalno uvelicanje
* u odnosu na dozvoljene maksimalne dimenzije.
*
* @param string $ulaz Apsolutna putanja do fotografije cije se dimenzije menjaju
* @param string $izlaz Apsolutna putanja do fajla u koji ce se smestiti rezultat obrade ulaza (promene velicine)
* @param string $formatFotografije Identifikacija tipa fotografije u MIME formatu.
*/
function promenaVelicineFotografije($ulaz, $izlaz, $formatFotografije){
	/*
	* U zavisnosti od prosledjene ekstenzije koristi se druga funkcija za kreiranje radnog objekta ('objektFotografije')
	*/
	switch($formatFotografije){
		/*
		* Izvorni fajl je JPEG (image/pjpeg obicno prosledjuje Explorer pa i njega treba uzeti u obzir)...
		*/
		case 'image/jpeg':
		case 'image/pjpg':
			/*
			* '$ulazniFotoObjekt' sada biva popunjen kompletnim sadrzajem izvornog JPEG fajla (binarni podaci)...
			*/
			$ulazniFotoObjekt = imagecreatefromjpeg($ulaz);
			break;
		case 'image/png':
			/*
			* ... ili sadrzajem PNG fajla...
			*/
			$ulazniFotoObjekt = imagecreatefrompng($ulaz);
			break;
		case 'image/gif' :
			/*
			* ... ili sadrzajem GIF fajla.
			*/
			$ulazniFotoObjekt = imagecreatefromgif($ulaz);
			break;
	}
	
	/**
	* Sirina originalne fotografije pre promene velicine
	*/
	$sirinaOriginala = imageSX($ulazniFotoObjekt);
	
	/**
	* Visina originalne fotografije pre promene velicine
	*/
	$visinaOriginala = imageSY($ulazniFotoObjekt);
	
	/*
	* Odredjivanje proporcije slike i dominantne dimenzije. Osnovno pravilo je da ce nove dimenzije
	* uvek biti proporcionalne dimenzijama originala (nece biti recimo 'zgnjecenih slika') pri cemu ce vodi racuna
	* da slika dobije maksimalno moguce dimenzije u okviru dozvoljenih vrednosti.
	*/
	
	/*
	* Ukoliko je sirina fotografije dominantna dimenzija u odnosu na visinu...
	*/
	if ($sirinaOriginala > $visinaOriginala) {
		/*
		* ... sirina izlazne slike je maksimalna dozvoljena...
		*/
		$sirinaIzlaza = FOTO_SIRINA;
		
		/*
		* ... a visina se proporcionalno prilagodjava.
		*/
		$visinaIzlaza = $visinaOriginala * (FOTO_SIRINA / $sirinaOriginala); 
	}
	
	/*
	* Ukoliko je visina dominantna dimenzija ili su sirina i visina originala jednake...
	*/
	if (($sirinaOriginala < $visinaOriginala) || ($sirinaOriginala == $visinaOriginala)) {
		/*
		* ...visina izlaza je maksimalna dozvoljena...
		*/
		$visinaIzlaza = FOTO_VISINA;
		
		/*
		* ...a sirina se proporcionalno prilagodjava.
		*/
		$sirinaIzlaza = $sirinaOriginala * (FOTO_VISINA / $visinaOriginala);
	}
	
	/*
	* Kreira se novi prazan kontejner objekt '$izlazniFotoObjekt' koji ce sadrzati kranje binarne podatke
	* fotografije sa promenjenim dimenzijama.
	*/
	$izlazniFotoObjekt = ImageCreateTrueColor($sirinaIzlaza,$visinaIzlaza) or die("Ciljni image objekat nije kreiran!");
	
	/*
	* Sadrzaj ulaznog kontejner objekta se kopira u izlazni kontejner pri cemu se podaci automatski binarno obradjuju
	* i izlazna fotografija automatski menja svoje dimenzije.
	*/
	imagecopyresampled($izlazniFotoObjekt, $ulazniFotoObjekt, 0, 0, 0, 0, $sirinaIzlaza, $visinaIzlaza, $sirinaOriginala, $visinaOriginala);
	
	/*
	* Sadrzaj izlaznog kontejnera se sada upisuje u ciljni privremeni fajl koji ce kasnije biti prebacen 
	* na odgovarajucu lokaciju.
	* Na disku servera se u priveremenom folderu (folder u kome PHP smesta privremene fajlove) kreira fajl
	* identicnog imena kao '$ulaz' samo sa pridodatim '_resized' nastavkom.
	*/
	
	switch($formatFotografije){
		/*
		* Tip fomata ulaznog fajla je JPEG...
		*/
		case 'image/jpeg' :
		case 'image/pjpeg' :
			/*
			* ...kreira se JPEG izlazni fajl...
			*/
			imagejpeg($izlazniFotoObjekt, $izlaz) or die("JPEG thumbnail nije kreiran!");
			break;
		/*
		* ...ulazni fajl je tipa PNG...
		*/
		case 'image/png' :
			/*
			* ...kreira se PNG izlazni fajl...
			*/
			imagepng($izlazniFotoObjekt, $izlaz) or die("PNG thumbnail nije kreiran!");
			break;
		/*
		* ...ulazni fajl je tipa PNG...
		*/
		case 'image/gif' : 
			/*
			* ...kreira se GIF izlazni fajl...
			*/
			imagegif($izlazniFotoObjekt, $izlaz) or die("GIF thumbnail nije kreiran!");
			break;
	}
	
	/*
	* Po zavrsetku obrade treba osloboditi memorisjki prostor koji zauzimaju ulazni i izlazni objekt.
	*/
	imagedestroy($ulazniFotoObjekt); 
	imagedestroy($izlazniFotoObjekt); 
}
?>

Youez - 2016 - github.com/yon3zu
LinuXploit