268 lines
9.2 KiB
PHP
268 lines
9.2 KiB
PHP
<?php
|
|
/**
|
|
* skrbi za odjavo posameznega uporabnik od prejemanja obvestil ankete
|
|
*
|
|
*/
|
|
class SurveyUnsubscribe {
|
|
private static $sid = null;
|
|
private static $unsubscribed = null;
|
|
|
|
|
|
function __construct($sid) {
|
|
self::$sid = $sid;
|
|
SurveyInfo::SurveyInit(self::$sid);
|
|
}
|
|
|
|
static function isUnsubscribedEmail($email) {
|
|
|
|
# če še nismo zakeširamo djavljene emaile za anketo
|
|
if (self::$unsubscribed == null && !is_array(self::$unsubscribed)) {
|
|
self::getUnsubscribedEmails();
|
|
}
|
|
if (is_array(self::$unsubscribed) && count(self::$unsubscribed) > 0 && $email != null && trim($email) != '') {
|
|
return isset(self::$unsubscribed[$email]);
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
static function getUnsubscribedEmails() {
|
|
# polovimo vse odjavljene e-maile in jih shranimo v array
|
|
# preverimo ali je uporabnik že odjavljen
|
|
$emails = array();
|
|
$u1s = "SELECT email FROM srv_survey_unsubscribe WHERE ank_id ='".self::$sid."'";
|
|
$u1q = sisplet_query($u1s);
|
|
while ($u1r = mysqli_fetch_assoc($u1q)) {
|
|
if (trim($u1r['email']) != '') {
|
|
$emails[$u1r['email']] = $u1r['email'];
|
|
}
|
|
}
|
|
# preverimo tabelo srv_invitations_recipients
|
|
$u2s = "SELECT email FROM srv_invitations_recipients WHERE ank_id ='".self::$sid."' AND unsubscribed = '1'";
|
|
if (count($emails) > 0 ) {
|
|
$emails_implode = implode('\', \'', $emails);
|
|
$u2s .= " AND email NOT IN ('".$emails_implode."')";
|
|
//$u2s.=" AND email NOT IN ('".implode('\',\'',$emails)."')";
|
|
}
|
|
$u2q = sisplet_query($u2s);
|
|
while ($u2r = mysqli_fetch_assoc($u2q)) {
|
|
if (trim($u2r['email']) != '') {
|
|
$emails[$u2r['email']] = $u2r['email'];
|
|
}
|
|
}
|
|
|
|
# polovimo še vse iz srv_user in users
|
|
$u3s = "SELECT user_id, email FROM srv_user WHERE ank_id ='".self::$sid."' AND unsubscribed = '1'";
|
|
$u3q = sisplet_query($u3s);
|
|
$cms_id = array();
|
|
while ($u3r = mysqli_fetch_assoc($u3q)) {
|
|
if (trim($u3r['email']) != '') {
|
|
$emails[$u3r['email']] = $u3r['email'];
|
|
} else {
|
|
#poiščemo še email v tabeli users (če gre za userja iz cms
|
|
if ((int)$u3r['user_id'] > 0) {
|
|
$cms_id[] = $u3r['user_id'];
|
|
}
|
|
}
|
|
}
|
|
|
|
if (count($cms_id) > 0) {
|
|
$u4s = "SELECT email FROM users WHERE id IN ('".implode("','",$cms_id)."')";
|
|
$u4q = sisplet_query($u4s);
|
|
while ($u4r = mysqli_fetch_assoc($u4q)) {
|
|
if (trim($u4r['email']) != '') {
|
|
$emails[$u4r['email']] = $u4r['email'];
|
|
}
|
|
}
|
|
}
|
|
|
|
self::$unsubscribed = $emails;
|
|
}
|
|
|
|
function generateCodeForEmail($email) {
|
|
|
|
#preverimo ali email že obstaja za to anketo
|
|
$used_codes = array();
|
|
$sql_string = "SELECT code FROM srv_survey_unsubscribe_codes WHERE ank_id = '".self::$sid."' AND email='".$email."'";
|
|
$sql_query = sisplet_query($sql_string);
|
|
if (mysqli_num_rows($sql_query) > 0) {
|
|
$sql_row = mysqli_fetch_assoc($sql_query);
|
|
return $sql_row['code'];
|
|
}
|
|
|
|
|
|
#polovimo katere kode smo že uporabili za to anketo
|
|
$used_codes = array();
|
|
$sql_string = "SELECT code FROM srv_survey_unsubscribe_codes WHERE ank_id = '".self::$sid."'";
|
|
$sql_query = sisplet_query($sql_string);
|
|
while ($sql_row = mysqli_fetch_assoc($sql_query)) {
|
|
$used_codes[$sql_row['code']] = $sql_row['code'];
|
|
}
|
|
# zgeneriramo kodo za upoirabika
|
|
# Izberemo random hash, ki se ni v bazi
|
|
do {
|
|
list($code,$cookie) = self::generateCode();
|
|
} while (in_array($cookie,$used_codes) && !is_numeric($cookie));
|
|
|
|
#vstavimo v tabelo srv_survey_unsubscribe_codes
|
|
$sql_insert = "INSERT INTO srv_survey_unsubscribe_codes (ank_id, email, code) VALUES ( '".self::$sid."', '".$email."', '".$cookie."') ";
|
|
$sqlQuery = sisplet_query($sql_insert);
|
|
|
|
return $cookie;
|
|
}
|
|
|
|
function generateCode() {
|
|
$cookie = md5(random_int(1, PHP_INT_MAX) . '@' . $_SERVER['REMOTE_ADDR']);
|
|
|
|
return array(substr($cookie,0,6), $cookie);
|
|
}
|
|
|
|
public function doUnsubscribe() {
|
|
global $lang;
|
|
|
|
$anketa = self::$sid;
|
|
|
|
$db_table = SurveyInfo::getInstance()->getSurveyArchiveDBString();
|
|
|
|
$lang_id = (int)$_GET['language'];
|
|
if ($lang_id != null) $_lang = '_'.$lang_id; else $_lang = '';
|
|
SurveySetting::getInstance()->init($anketa);
|
|
$user_bye_textA = SurveySetting::getInstance()->getSurveyMiscSetting('srvlang_user_bye_textA'.$_lang);
|
|
if ($user_bye_textA == '') $user_bye_textA = $lang['user_bye_textA'];
|
|
|
|
if (isset($_GET['uc']) && trim($_GET['uc']) != '' && isset($_GET['em']) && trim($_GET['em']) != '') {
|
|
# imamo userja iz cms, email smo poslali kodirano
|
|
#dodamo ga v tabelo: srv_survey_unsubscribe
|
|
$uc = trim($_GET['uc']);
|
|
$em = base64_decode($_GET['em']);
|
|
# preverimo obstoj in pravilnost emaila in kode v bazi
|
|
|
|
$s = "SELECT * FROM srv_survey_unsubscribe_codes WHERE ank_id='".self::$sid."' AND email='".$em."' AND code='".$uc."'";
|
|
$q = sisplet_query($s);
|
|
if (mysqli_num_rows($q) > 0) {
|
|
# zapis je v bazi uporabnika lahko odjavimo
|
|
$si = "INSERT INTO srv_survey_unsubscribe (ank_id, email, unsubscribe_time) VALUES ('".self::$sid."','".$em."',now())";
|
|
$qi = $s = sisplet_query($si);
|
|
|
|
echo $user_bye_textA;
|
|
}
|
|
else {
|
|
# zapisa ni v bazi obvestimo uporabnika o napačni kodi
|
|
echo 'Koda je napačna! Ne moremo vas odjaviti od prejemanja obvestil!';
|
|
}
|
|
|
|
exit();
|
|
}
|
|
else if ( isset($_GET['email']) && trim($_GET['email']) != '' &&
|
|
isset($_GET['uid']) && (int)trim($_GET['uid']) > 0) {
|
|
|
|
$uid = (int)trim($_GET['uid']);
|
|
$email = trim($_GET['email']);
|
|
#poiščemo userja
|
|
#poiščemo id spremenljivke z emailom
|
|
$ssp = "SELECT s.id FROM srv_spremenljivka s, srv_grupa g WHERE s.gru_id=g.id AND g.ank_id='$anketa' AND variable = 'email' and sistem ='1'";
|
|
$qsp = sisplet_query($ssp);
|
|
$rsp = mysqli_fetch_assoc($qsp);
|
|
$spid = $rsp['id'];
|
|
|
|
#poiščemo email uporabnika
|
|
if ((int)$spid > 0 && (int) $uid > 0) {
|
|
$se = "SELECT count(*) from srv_data_text".$db_table." WHERE spr_id = '$spid' AND usr_id = '$uid' AND text ='$email'";
|
|
$qe = sisplet_query($se);
|
|
list($count) = mysqli_fetch_row($qe);
|
|
}
|
|
|
|
# če ustreza email in uid, ga odjavimo
|
|
if ((int)$count > 0) {
|
|
if ($email != null && trim($email) != '') {
|
|
$si = "INSERT INTO srv_survey_unsubscribe (ank_id, email, unsubscribe_time) VALUES ('$anketa','$email',now())";
|
|
$qi = $s = sisplet_query($si);
|
|
}
|
|
$s = sisplet_query("UPDATE srv_user SET unsubscribed='1' WHERE id='$uid' AND ank_id='$anketa'");
|
|
if ($s) {
|
|
echo $user_bye_textA;
|
|
} else {
|
|
//echo mysqli_error($GLOBALS['connect_db']);
|
|
echo 'error';
|
|
}
|
|
} else {
|
|
echo 'V bazi ni podaanega emaila.';
|
|
}
|
|
|
|
}
|
|
else {
|
|
$code = strtolower( $_GET['code'] );
|
|
$msgOutputed = false;
|
|
if (trim($code) != '' && trim($anketa) != '' && (int)$anketa > 0) {
|
|
# id uporabnika v tabeli srv_user
|
|
$su = "SELECT id FROM srv_user WHERE pass='$code' AND ank_id='$anketa'";
|
|
$qu = sisplet_query($su);
|
|
$ru = mysqli_fetch_assoc($qu);
|
|
$uid = $ru['id'];
|
|
|
|
#poiščemo id spremenljivke z emailom
|
|
$ssp = "SELECT s.id FROM srv_spremenljivka s, srv_grupa g WHERE s.gru_id=g.id AND g.ank_id='$anketa' AND variable = 'email' and sistem ='1'";
|
|
$qsp = sisplet_query($ssp);
|
|
$rsp = mysqli_fetch_assoc($qsp);
|
|
$spid = $rsp['id'];
|
|
|
|
#poiščemo email uporabnika
|
|
if ((int)$spid > 0 && (int) $uid > 0) {
|
|
$se = "SELECT text as email from srv_data_text".$db_table." WHERE spr_id = '$spid' AND usr_id = '$uid'";
|
|
$qe = sisplet_query($se);
|
|
$re = mysqli_fetch_assoc($qe);
|
|
$email = $re['email'];
|
|
}
|
|
|
|
if ($email != null && trim($email) != '') {
|
|
$si = "INSERT INTO srv_survey_unsubscribe (ank_id, email, unsubscribe_time) VALUES ('$anketa','$email',now())";
|
|
$qi = $s = sisplet_query($si);
|
|
}
|
|
|
|
# preverimo ali obstaja koda za nov način pošiljanja sporočil
|
|
$sqlString = "SELECT id, email FROM srv_invitations_recipients WHERE ank_id='$anketa' AND password ='$code' AND unsubscribed='0'";
|
|
$sql_query = sisplet_query($sqlString);
|
|
if (mysqli_num_rows($sql_query) > 0 ) {
|
|
$row = mysqli_fetch_assoc($sql_query);
|
|
if (trim($row['email']) != '') {
|
|
// KAJ TO DELA TUKAJ??
|
|
//$sqlG = sisplet_query("INSERT INTO srv_glasovanje (ank_id, spr_id) VALUES ('$anketa', '$spr_id')");
|
|
$si = "INSERT INTO srv_survey_unsubscribe (ank_id, email, unsubscribe_time) VALUES ('$anketa','$row[email]',now())";
|
|
$qi = $s = sisplet_query($si);
|
|
}
|
|
$s = sisplet_query("UPDATE srv_invitations_recipients SET unsubscribed='1', date_unsubscribed=NOW() WHERE password='$code' AND ank_id='$anketa'");
|
|
sisplet_query("COMMIT");
|
|
if ($s) {
|
|
echo $user_bye_textA;
|
|
$msgOutputed = true;
|
|
} else {
|
|
//echo mysqli_error($GLOBALS['connect_db']);
|
|
echo 'error1';
|
|
}
|
|
|
|
} else {
|
|
# preverimo ali je že predhodno odjavljen
|
|
$sqlString = "SELECT id FROM srv_invitations_recipients WHERE ank_id='$anketa' AND password ='$code' AND unsubscribed='1'";
|
|
$sql_query = sisplet_query($sqlString);
|
|
if (mysqli_num_rows($sql_query) > 0 ) {
|
|
echo $lang['user_bye_textC'];
|
|
$msgOutputed = true;
|
|
} else {
|
|
#userja z kodo ni v bazi
|
|
}
|
|
}
|
|
|
|
$s = sisplet_query("UPDATE srv_user SET unsubscribed='1' WHERE (pass='$code' OR SUBSTRING(cookie,1,6) ='$code') AND ank_id='$anketa'");
|
|
if ($s) {
|
|
#tekst je bil poslan že zgoraj!
|
|
if ($msgOutputed == false) {
|
|
echo $user_bye_textA;
|
|
}
|
|
} else {
|
|
//echo mysqli_error($GLOBALS['connect_db']);
|
|
echo 'error';
|
|
}
|
|
}
|
|
}
|
|
}
|
|
} |