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 = 'Anketa '.$this->anketa.' ima doseženo omejitev števila vprašanj ('.$count.')!'; break; case 'limit_responses': $title = 'Opozorilo - dosežena omejitev odgovorov'; $content = 'Anketa '.$this->anketa.' ima doseženo omejitev števila odgovorov ('.$count.')!'; break; case 'limit_vabila': $title = 'Opozorilo - dosežena omejitev vabil'; $content = 'Anketa '.$this->anketa.' ima doseženo omejitev poslanih vabil ('.$count.')!'; break; case 'phishing': $title = 'Opozorilo - potencialna phishing anketa'; $content = 'Anketa '.$this->anketa.' - potencialen phishing!'; break; case 'limit_clicks': $title = 'Opozorilo - dosežena omejitev klikov na minuto'; $content = 'Anketa '.$this->anketa.' ima doseženo omejitev klikov na minuto ('.$count.')!'; break; } // Dodamo se link do predogleda $content .= '

Predogled ankete: '.$site_url.'a/'.$anketa_hash.'&preview=on'; 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 ''; echo ''; echo ''; echo ' Server Limit Reached'; echo ' '; echo ' '; echo ' '; echo ''; echo '
'; echo '
'; echo '

Dosežena omejitev strežnika

'; echo '

Prosimo, počakajte nekaj trenutkov. Trenutno je doseženo maksimalno število vnosov ankete na minuto.

'; echo '
'; echo '

Server Limit Reached

'; echo '

Please wait a few moments. Currently, the maximum number of survey entries per minute has been reached.

'; echo '
'; echo ''; die(); } } ?>