summaryrefslogblamecommitdiffstats
path: root/admin/survey/classes/class.SurveyCheck.php
blob: 40dde283c8c2b4daf6a74f8ded29764823cd88db (plain) (tree)

























































































































































































































































































































































                                                                                                                                                                                          
<?php

/* 
 * Preverjanje ankete - limiti velikosti, vabil, preverjanmje phishinga...
 * 
 * Zaenkrat samo preverjamo in posljemo mail adminu
 * 
 */

class SurveyCheck {
	

    var $anketa;

    public function __construct($anketa){

        if($anketa == null || $anketa <= 0)
            return 'ID ankete ne obstaja!';

        $this->anketa = $anketa;
    }


    // Preverimo stevilo vprasanj v anketi
    public function checkLimitSpremenljivke(){

        // Ce limit ni nastavljen ignoriramo
        if(!AppSettings::getInstance()->getSetting('app_limits-question_count_limit'))
            return true;

        // Dobimo stevilo vprasanj v anketi
        $stevilo_vprasanj = SurveyInfo::getInstance()->getSurveyQuestionCount();

        // Obvestilo (mail adminu) posljemo pri dosezeni stevilki
        if($stevilo_vprasanj == AppSettings::getInstance()->getSetting('app_limits-question_count_limit')){
            $this->sendAlert($alert_type='limit_spremenljivke', $stevilo_vprasanj);
        }

        // Ce je v anketi ze vec vprasanj kot je limit
        if($stevilo_vprasanj > AppSettings::getInstance()->getSetting('app_limits-question_count_limit')){
            return true;
        }
        else{
            return false;
        }
    }

    // Preverimo stevilo poslanih vabil
    public function checkLimitVabila(){

        // Ce limit ni nastavljen ignoriramo
        if(!AppSettings::getInstance()->getSetting('app_limits-invitation_count_limit'))
            return true;

        // Prestejemo poslana vabila
        $sql = sisplet_query("SELECT count(id) AS stevilo_vabil
                                FROM srv_invitations_recipients
                                WHERE ank_id='".$this->anketa."' AND sent='1' 
                            ");
        $row = mysqli_fetch_array($sql);

        $stevilo_vabil = $row['stevilo_vabil'];

        // Obvestilo (mail adminu) posljemo pri dosezeni stevilki
        if($stevilo_vabil == AppSettings::getInstance()->getSetting('app_limits-invitation_count_limit')){
            $this->sendAlert($alert_type='limit_vabila', $stevilo_vabil);
        }

        // Ce je poslanih ze vec vabil kot je limit
        if($stevilo_vabil > AppSettings::getInstance()->getSetting('app_limits-invitation_count_limit')){
            return true;
        }
        else{
            return false;
        }
    }

    // Preverimo stevilo responsov na anketo
    public function checkLimitResponses(){

        // Ce limit ni nastavljen ignoriramo
        if(!AppSettings::getInstance()->getSetting('app_limits-response_count_limit'))
            return true;

        // Dobimo stevilo odgovorov na anketo
        $stevilo_odgovorov = SurveyInfo::getInstance()->getSurveyAnswersCount();
        $stevilo_odgovorov_limit = AppSettings::getInstance()->getSetting('app_limits-response_count_limit');

        // Obvestilo (mail adminu) posljemo pri dosezeni stevilki
        if($stevilo_odgovorov > 0 && $stevilo_odgovorov % $stevilo_odgovorov_limit === 0){
            $this->sendAlert($alert_type='limit_responses', $stevilo_odgovorov);

            // Deaktiviramo anketo, ce je aktivna ?
        }

        // Ce je na anketo ze vec responsov kot je limit
        if($stevilo_odgovorov > AppSettings::getInstance()->getSetting('app_limits-response_count_limit')){
            return true;
        }
        else{
            return false;
        }
    }

    // Preverimo ce je anketa potencialno phishing
    public function checkPhishing(){
        global $global_user_id;


        // Dobimo stevilo vprasanj v anketi
        $stevilo_vprasanj = SurveyInfo::getInstance()->getSurveyQuestionCount();

        // Ce imamo v anketi 0 ali vec kot 5 vprasanj je vse ok
        if($stevilo_vprasanj >= 5 || $stevilo_vprasanj == 0){
            return false;
        }


        // Dobimo stevilo anket uporabnika
        $sqlA = sisplet_query("SELECT count(id) AS count_surveys FROM srv_anketa WHERE insert_uid='".$global_user_id."'");
        $rowA = mysqli_fetch_array($sqlA);

        // Ce ima uporabnik ze vec anket je vse ok
        if($rowA['count_surveys'] > 1){
            return false;
        }


        // Prestejemo vprasanja po tipu
        $sql = sisplet_query("SELECT count(s.id) AS count_questions
                                FROM srv_spremenljivka s, srv_grupa g
                                WHERE g.ank_id='".$this->anketa."' AND g.id=s.gru_id 
                                    AND (tip='21' OR tip='5') 
                            ");
        $row = mysqli_fetch_array($sql);

        // Ce imamo v anketi manj kot 5 vprasanj in so vsa tipa nagovor ali text je potencialen phishing
        if($row['count_questions'] == $stevilo_vprasanj){
            
            // Posljemo mail adminu
            $this->sendAlert($alert_type='phishing');
            
            return true;
        }
        else{
            return false;
        }
    }

    // Pri izpolnjevanju ankete preverimo stevilo klikov na minuto - ce jih je prevec, respondenta zavrnemo, drugace se lahko sql zafila in streznik ni vec odziven
    public function checkClicksPerMinute(){

        // Ce maximum na minuto ni nastavljen ignoriramo limit
        if(!AppSettings::getInstance()->getSetting('app_limits-clicks_per_minute_limit'))
            return true;

        // Preverimo ce gre za izpolnjevanje ankete
        if($_SERVER["SCRIPT_NAME"] != '/main/survey/index.php')
            return true;

        // Preverimo ce gre za prvi prihod na doloceno stran ankete in ne na prvo stran
        if(isset($_GET['grupa']))
            return true;

        // Preverimo ce je id ankete ustrezno nastavljen
        if(!isset($this->anketa) || $this->anketa <= 0)
            return true;


        $click_time = time();

        $sql = sisplet_query("SELECT click_count, click_time FROM srv_clicks WHERE ank_id='".$this->anketa."'");
        if (mysqli_num_rows($sql) > 0) {

            list($click_count, $first_click_time) = mysqli_fetch_array($sql);

            // Ce nismo znotraj minute vse resetiramo in pustimo naprej
            if($click_time - $first_click_time > 60){
                $sqlI = sisplet_query("UPDATE srv_clicks SET click_count='1', click_time='".$click_time."' WHERE ank_id='".$this->anketa."'");
                return true;
            }

            // Click count je ok - pustimo naprej
            if($click_count <= AppSettings::getInstance()->getSetting('app_limits-clicks_per_minute_limit')){
                $sqlI = sisplet_query("UPDATE srv_clicks SET click_count=click_count+1 WHERE ank_id='".$this->anketa."'");      
                
                // Dosegli smo limit - posljemo mail adminu
                if($click_count == AppSettings::getInstance()->getSetting('app_limits-clicks_per_minute_limit')){

                    // TODO - da se poslje samo 1x, drugace konstantno letijo maili:D
                    // Includamo vse da lahko posljemo mail
                    //include_once('../../vendor/autoload.php');
            
                    // Posljemo mail adminu
                    //$this->sendAlert($alert_type='limit_clicks', $click_count);
                }
                
                return true;
            }
            // Click count je previsok - ZAVRNEMO
            else{
                // Prikazemo error stran ki jo refreshamo na 5 sekund
                $this->displayClicksPerMinuteError();

                return false;
            }
        }
        else{
            $sqlI = sisplet_query("INSERT INTO srv_clicks (ank_id, click_count, click_time) VALUES ('".$this->anketa."', '1', '".$click_time."')");
        }
        
        return true;
    }


    // Posljemo obvestilo adminu o prebitem limitu, phishing anketi...
    private function sendAlert($alert_type, $count=0){
        global $site_url;

        // Alerta ne posljemo na lastnih instalacijah
        if(isLastnaInstalacija())
            return;

        // Dobimo hash ankete
        $anketa_hash = SurveyInfo::getInstance()->getSurveyColumn('hash');

        switch($alert_type){

            case 'limit_spremenljivke':
                $title = 'Opozorilo - dosežena omejitev vprašanj';
                $content = '<a href="'.$site_url.'admin/survey/index.php?anketa='.$this->anketa.'">Anketa '.$this->anketa.'</a> ima doseženo omejitev števila vprašanj ('.$count.')!';

                break;

            case 'limit_responses':
                $title = 'Opozorilo - dosežena omejitev odgovorov';
                $content = '<a href="'.$site_url.'admin/survey/index.php?anketa='.$this->anketa.'">Anketa '.$this->anketa.'</a> ima doseženo omejitev števila odgovorov ('.$count.')!';

                break;

            case 'limit_vabila':
                $title = 'Opozorilo - dosežena omejitev vabil';
                $content = '<a href="'.$site_url.'admin/survey/index.php?anketa='.$this->anketa.'">Anketa '.$this->anketa.'</a> ima doseženo omejitev poslanih vabil ('.$count.')!';

                break;

            case 'phishing':
                $title = 'Opozorilo - potencialna phishing anketa';
                $content = '<a href="'.$site_url.'admin/survey/index.php?anketa='.$this->anketa.'">Anketa '.$this->anketa.'</a> - potencialen phishing!';

                break;

            case 'limit_clicks':
                $title = 'Opozorilo - dosežena omejitev klikov na minuto';
                $content = '<a href="'.$site_url.'admin/survey/index.php?anketa='.$this->anketa.'">Anketa '.$this->anketa.'</a> ima doseženo omejitev klikov na minuto ('.$count.')!';

                break;
        }

        // Dodamo se link do predogleda 
        $content .= '<br><br>Predogled ankete: <a href="'.$site_url.'a/'.$anketa_hash.'&preview=on">'.$site_url.'a/'.$anketa_hash.'&preview=on</a>';

        try{
            $MA = new MailAdapter($anketa=null, $type='admin');
            //$MA->addRecipients('peter.hrvatin@gmail.com');
            $MA->addRecipients('info@1ka.si');
            $resultX = $MA->sendMail($content, $title);
        }
        catch (Exception $e){
        }

        // Zalogiramo opozorilo
        $SL = new SurveyLog();
        $SL->addMessage(SurveyLog::ERROR, $title.' - anketa '.$this->anketa);
        $SL->write();
    }

    // Prikazemo stran z errorjem za presezeno stevilo klikov na minuto
    private function displayClicksPerMinuteError(){
        global $site_url;

        $refresh_every = 5;

        echo '<!DOCTYPE html>';
        echo '<html>';

        echo '<head>';
        echo '    <title>Server Limit Reached</title>';
        echo '    <meta http-equiv="refresh" content="'.$refresh_every.'" />';
        echo '    <meta name="viewport" content="width=device-width, initial-scale=1.0" />';
        
        echo '    <style>
            body{
                display: flex;
                align-content: center;
                height: 90vh;
                
                flex-wrap: wrap;
                align-content: center;
            }
            .main{
                max-width: 1200px;
                margin: 50px auto;
                padding: 0 20px;

                font-family: Montserrat, Arial, Sans-Serif !important;
                color: #505050;
            }
            h1{
                color: #1e88e5;
                text-align: center;
                margin: 30px 0;
            }
            hr{
                margin: 50px 0;

                border: 0;
                border-top: 1px solid #ddeffd;
            }
            .loading{
                margin: 50px 0;
                text-align: center;
            }
            img{
                width: 80px;
                height: 80px;
            }
        </style>';
        echo '</head>';

        echo '<body><div class="main">';
        echo '    <div class="loading"><img src="'.$site_url.'/public/img/icons/spinner.gif" /></div>';
        echo '    <h1>Dosežena omejitev strežnika</h1>';
        echo '    <h3>Prosimo, počakajte nekaj trenutkov. Trenutno je doseženo maksimalno število vnosov ankete na minuto.</h3>';
        echo '    <hr>';
        echo '    <h1>Server Limit Reached</h1>';
        echo '    <h3>Please wait a few moments. Currently, the maximum number of survey entries per minute has been reached.</h3>';
        echo '</div></body>';

        echo '</html>';
        
        die();
    }
}

?>