oc-server3/htdocs/lib2/logic/user.class.php

1318 lines
36 KiB
PHP

<?php
/***************************************************************************
* For license information see doc/license.txt
*
* Unicode Reminder メモ
*
* get/set has to be commited with save
* add/remove etc. is executed instantly
***************************************************************************/
require_once($opt['rootpath'] . 'lib2/mail.class.php');
require_once($opt['rootpath'] . 'lib2/logic/rowEditor.class.php');
require_once($opt['rootpath'] . 'lib2/logic/statpic.class.php');
require_once($opt['rootpath'] . 'lib2/logic/countriesList.class.php');
require_once($opt['rootpath'] . 'lib2/logic/picture.class.php');
require_once($opt['rootpath'] . 'lib2/logic/cache.class.php');
require_once($opt['rootpath'] . 'lib2/logic/cracklib.inc.php');
require_once($opt['rootpath'] . 'lib2/logic/crypt.class.php');
require_once($opt['rootpath'] . 'lib2/translate.class.php');
class user
{
var $nUserId = 0;
var $reUser;
var $reUserStat;
static function fromEMail($email)
{
$userid = sql_value("SELECT `user_id` FROM `user` WHERE `email`='&1'", 0, $email);
if ($userid == 0)
return null;
return new user($userid);
}
static function fromUsername($username)
{
$userid = sql_value("SELECT `user_id` FROM `user` WHERE `username`='&1'", 0, $username);
if ($userid == 0)
return null;
return new user($userid);
}
function __construct($nNewUserId=ID_NEW)
{
global $opt;
$this->reUser = new rowEditor('user');
$this->reUser->addPKInt('user_id', null, false, RE_INSERT_AUTOINCREMENT);
$this->reUser->addString('username', '', false);
$this->reUser->addString('password', null, true);
$this->reUser->addString('email', null, true);
$this->reUser->addString('email_problems', 0, false);
$this->reUser->addDate('last_email_problem', null, true);
$this->reUser->addInt('mailing_problems', 0, false);
$this->reUser->addFloat('latitude', 0, false);
$this->reUser->addFloat('longitude', 0, false);
$this->reUser->addDate('last_modified', time(), true, RE_INSERT_IGNORE);
$this->reUser->addBoolean('is_active_flag', false, false);
$this->reUser->addString('last_name', '', false);
$this->reUser->addString('first_name', '', false);
$this->reUser->addString('country', null, true);
$this->reUser->addBoolean('accept_mailing', false, false);
$this->reUser->addBoolean('pmr_flag', false, false);
$this->reUser->addString('new_pw_code', null, true);
$this->reUser->addDate('new_pw_date', null, true);
$this->reUser->addDate('date_created', time(), true, RE_INSERT_IGNORE);
$this->reUser->addString('new_email_code', null, true);
$this->reUser->addDate('new_email_date', null, true);
$this->reUser->addString('new_email', null, true);
$this->reUser->addString('uuid', '', false, RE_INSERT_AUTOUUID);
$this->reUser->addBoolean('permanent_login_flag', false, false);
$this->reUser->addInt('watchmail_mode', 1, false);
$this->reUser->addInt('watchmail_hour', 0, false);
$this->reUser->addDate('watchmail_nextmail', time(), false);
$this->reUser->addInt('watchmail_day', 0, false);
$this->reUser->addString('activation_code', '', false);
$this->reUser->addBoolean('no_htmledit_flag', false, false);
$this->reUser->addBoolean('usermail_send_addr', false, false);
$this->reUser->addInt('notify_radius', 0, false);
$this->reUser->addInt('notify_oconly', 1, false);
$this->reUser->addInt('admin', 0, false);
$this->reUser->addInt('data_license', $opt['logic']['license']['newusers'], false);
$this->reUser->addInt('node', 0, false);
$this->reUserStat = new rowEditor('stat_user');
$this->reUserStat->addPKInt('user_id', null, false, RE_INSERT_AUTOINCREMENT);
$this->reUserStat->addInt('found', 0, false);
$this->reUserStat->addInt('notfound', 0, false);
$this->reUserStat->addInt('note', 0, false);
$this->reUserStat->addInt('hidden', 0, false);
$this->nUserId = $nNewUserId+0;
if ($nNewUserId == ID_NEW)
{
$this->reUser->addNew(null);
}
else
{
$this->reUser->load($this->nUserId);
$this->reUserStat->load($this->nUserId);
}
}
function exist()
{
return $this->reUser->exist();
}
static function existUsername($username)
{
return (sql_value("SELECT COUNT(*) FROM `user` WHERE `username`='&1'", 0, $username) != 0);
}
static function existEMail($email)
{
return (sql_value("SELECT COUNT(*) FROM `user` WHERE `email`='&1'", 0, $email) != 0);
}
function getUserId()
{
return $this->nUserId;
}
function getUsername()
{
return $this->reUser->getValue('username');
}
function setUsername($value)
{
if (!mb_ereg_match(REGEX_USERNAME, $value))
return false;
if (is_valid_email_address($value))
return false;
return $this->reUser->setValue('username', $value);
}
function getUsernameChanged()
{
return $this->reUser->getChanged('username');
}
function getEMail()
{
return $this->reUser->getValue('email');
}
function setEMail($value)
{
if (!is_valid_email_address($value))
return false;
return $this->reUser->setValue('email', $value);
}
function getPassword()
{
return $this->reUser->getValue('password');
}
function setPassword($password)
{
if (!mb_ereg_match(REGEX_PASSWORD, $password))
return false;
if (cracklib_checkPW($password, array('open', 'caching', 'cache', $this->getUsername(), $this->getFirstName(), $this->getLastName())) == false)
return false;
$encryptedPassword = crypt::encryptPassword($password);
return $this->reUser->setValue('password', $encryptedPassword);
}
function getFirstName()
{
return $this->reUser->getValue('first_name');
}
function setFirstName($value)
{
if ($value != '')
if (!mb_ereg_match(REGEX_FIRST_NAME, $value))
return false;
return $this->reUser->setValue('first_name', $value);
}
function getLastName()
{
return $this->reUser->getValue('last_name');
}
function setLastName($value)
{
if ($value != '')
if (!mb_ereg_match(REGEX_LAST_NAME, $value))
return false;
return $this->reUser->setValue('last_name', $value);
}
function getCountry()
{
return countriesList::getCountryLocaleName($this->reUser->getValue('country'));
}
function getCountryCode()
{
return $this->reUser->getValue('country');
}
function setCountryCode($value)
{
if ($value !== null && (sql_value("SELECT COUNT(*) FROM countries WHERE short='&1'", 0, $value) == 0))
return false;
return $this->reUser->setValue('country', $value);
}
function getLatitude()
{
return $this->reUser->getValue('latitude');
}
function setLatitude($value)
{
if (($value+0) > 90 || ($value+0) < -90)
return false;
return $this->reUser->setValue('latitude', $value+0);
}
function getLongitude()
{
return $this->reUser->getValue('longitude');
}
function setLongitude($value)
{
if (($value+0) > 180 || ($value+0) < -180)
return false;
return $this->reUser->setValue('longitude', $value+0);
}
function getNotifyRadius()
{
return $this->reUser->getValue('notify_radius');
}
function setNotifyRadius($value)
{
if (($value+0) < 0 || ($value+0) > 150)
return false;
return $this->reUser->setValue('notify_radius', $value+0);
}
function getNotifyOconly()
{
return $this->reUser->getValue('notify_oconly') != 0;
}
function setNotifyOconly($value)
{
return $this->reUser->setValue('notify_oconly', $value ? 1 : 0);
}
function getPermanentLogin()
{
return $this->reUser->getValue('permanent_login_flag');
}
function setPermanentLogin($value)
{
return $this->reUser->setValue('permanent_login_flag', $value);
}
function getAccMailing()
{
return $this->reUser->getValue('accept_mailing');
}
function setAccMailing($value)
{
return $this->reUser->setValue('accept_mailing', $value);
}
function getUsermailSendAddress()
{
return $this->reUser->getValue('usermail_send_addr');
}
function setUsermailSendAddress($value)
{
return $this->reUser->setValue('usermail_send_addr', $value);
}
function getNoHTMLEditor()
{
return $this->reUser->getValue('no_htmledit_flag');
}
function setNoHTMLEditor($value)
{
return $this->reUser->setValue('no_htmledit_flag', $value);
}
function getUsePMR()
{
return $this->reUser->getValue('pmr_flag');
}
function setUsePMR($value)
{
return $this->reUser->setValue('pmr_flag', $value);
}
function getIsActive()
{
return $this->reUser->getValue('is_active_flag');
}
function setIsActive($value)
{
return $this->reUser->setValue('is_active_flag', $value);
}
function getActivationCode()
{
return $this->reUser->getValue('activation_code');
}
function setActivationCode($value)
{
return $this->reUser->setValue('activation_code', $value);
}
function getNewPWCode()
{
return $this->reUser->getValue('new_pw_code');
}
function setNewPWCode($value)
{
return $this->reUser->setValue('new_pw_code', $value);
}
function getNewPWDate()
{
return $this->reUser->getValue('new_pw_date');
}
function setNewPWDate($value)
{
return $this->reUser->setValue('new_pw_date', $value);
}
function getNewEMailCode()
{
return $this->reUser->getValue('new_email_code');
}
function setNewEMailCode($value)
{
return $this->reUser->setValue('new_email_code', $value);
}
function getNewEMailDate()
{
return $this->reUser->getValue('new_email_date');
}
function setNewEMailDate($value)
{
return $this->reUser->setValue('new_email_date', $value);
}
function getNewEMail()
{
return $this->reUser->getValue('new_email');
}
function setNewEMail($value)
{
if ($value !== null)
{
if (!is_valid_email_address($value))
return false;
if (user::existEMail($value))
return false;
}
return $this->reUser->setValue('new_email', $value);
}
function getWatchmailMode()
{
return $this->reUser->getValue('watchmail_mode');
}
function setWatchmailMode($value)
{
$this->setWatchmailNext('0000-00-00 00:00:00');
return $this->reUser->setValue('watchmail_mode', $value);
}
function getWatchmailHour()
{
return $this->reUser->getValue('watchmail_hour');
}
function setWatchmailHour($value)
{
$this->setWatchmailNext('0000-00-00 00:00:00');
return $this->reUser->setValue('watchmail_hour', $value);
}
function getWatchmailDay()
{
return $this->reUser->getValue('watchmail_day');
}
function setWatchmailDay($value)
{
$this->setWatchmailNext('0000-00-00 00:00:00');
return $this->reUser->setValue('watchmail_day', $value);
}
function getWatchmailNext()
{
return $this->reUser->getValue('watchmail_nextmail');
}
function setWatchmailNext($value)
{
return $this->reUser->setValue('watchmail_nextmail', $value);
}
function getStatFound()
{
if ($this->reUserStat->exist())
return $this->reUserStat->getValue('found');
else
return 0;
}
function getStatNotFound()
{
if ($this->reUserStat->exist())
return $this->reUserStat->getValue('notfound');
else
return 0;
}
function getStatNote()
{
if ($this->reUserStat->exist())
return $this->reUserStat->getValue('note');
else
return 0;
}
function getStatHidden()
{
if ($this->reUserStat->exist())
return $this->reUserStat->getValue('hidden');
else
return 0;
}
function getDateRegistered()
{
return $this->reUser->getValue('date_created');
}
function getUUID()
{
return $this->reUser->getValue('uuid');
}
function getLastModified()
{
return $this->reUser->getValue('last_modified');
}
function getDateCreated()
{
return $this->reUser->getValue('date_created');
}
function getAdmin()
{
return $this->reUser->getValue('admin');
}
function getNode()
{
return $this->reUser->getValue('node');
}
function setNode($value)
{
return $this->reUser->setValue('node', $value);
}
function getAnyChanged()
{
return $this->reUser->getAnyChanged();
}
// return if successfull (with insert)
function save()
{
$bNeedStatpicClear = $this->reUser->getChanged('username');
if ($this->reUser->save())
{
if ($this->getUserId() == ID_NEW)
$this->nUserId = $this->reUser->getValue('user_id');
$this->getStatpic()->invalidate();
sql_slave_exclude();
return true;
}
else
return false;
}
function getStatpic()
{
return new statpic($this->nUserId);
}
static function createCode()
{
return mb_strtoupper(mb_substr(md5(uniqid('')), 0, 13));
}
function requestNewPWCode()
{
global $translate;
if (!$this->exist())
return false;
$email = $this->getEMail();
if ($email === null || $email == '')
return false;
if (!$this->getIsActive())
return false;
$this->setNewPWCode($this->createCode());
if (!$this->reUser->saveField('new_pw_code'))
return false;
$this->setNewPWDate(time());
if (!$this->reUser->saveField('new_pw_date'))
return false;
// send confirmation
$mail = new mail();
$mail->name = 'newpw';
$mail->to = $email;
$mail->subject = $translate->t('New password code', '', basename(__FILE__), __LINE__);
$mail->assign('code', $this->getNewPWCode());
$mail->send();
return true;
}
function clearNewPWCode()
{
$this->setNewPWCode(null);
if (!$this->reUser->saveField('new_pw_code'))
return false;
$this->setNewPWDate(null);
if (!$this->reUser->saveField('new_pw_date'))
return false;
return true;
}
function requestNewEMail($email)
{
global $translate;
if (!$this->exist())
return false;
if (mb_strtolower($this->getEMail()) == mb_strtolower($email))
return false;
if ($this->getEMail() === null || $this->getEMail() == '')
return false;
if (!$this->getIsActive())
return false;
$this->setNewEMailCode($this->createCode());
if (!$this->reUser->saveField('new_email_code'))
return false;
$this->setNewEMailDate(time());
if (!$this->reUser->saveField('new_email_date'))
return false;
$this->setNewEMail($email);
if (!$this->reUser->saveField('new_email'))
return false;
// send confirmation
$mail = new mail();
$mail->name = 'newemail';
$mail->to = $email;
$mail->subject = $translate->t('New email code', '', basename(__FILE__), __LINE__);
$mail->assign('code', $this->getNewEMailCode());
$mail->send();
return true;
}
function clearNewEMailCode()
{
$this->setNewEMailCode(null);
if (!$this->reUser->saveField('new_email_code'))
return false;
$this->setNewEMailDate(null);
if (!$this->reUser->saveField('new_email_date'))
return false;
$this->setNewEMail(null);
if (!$this->reUser->saveField('new_email'))
return false;
return true;
}
function remindEMail()
{
global $translate;
if (!$this->exist())
return false;
$email = $this->getEMail();
if ($email === null || $email == '')
return false;
if (!$this->getIsActive())
return false;
// send confirmation
$mail = new mail();
$mail->name = 'remindemail';
$mail->to = $email;
$mail->subject = $translate->t('Reminder to your E-Mail-Address', '', basename(__FILE__), __LINE__);
$mail->assign('username', $this->getUsername());
$mail->assign('email', $email);
$mail->send();
return true;
}
function sendRegistrationCode()
{
global $opt, $translate;
$countriesList = new countriesList();
$mail = new mail();
$mail->name = 'register';
$mail->to = $this->getEMail();
$mail->subject = $translate->t('Registration confirmation', '', basename(__FILE__), __LINE__);
$mail->assign('domain', $opt['page']['domain']);
$mail->assign('activation_page', $opt['page']['absolute_url'] . 'activation.php');
$mail->assign('short_activation_page', $opt['page']['absolute_url'] . 'a.php');
$mail->assign('username', $this->getUsername());
$mail->assign('userid', $this->getUserId());
$mail->assign('last_name', $this->getLastName());
$mail->assign('first_name', $this->getFirstName());
$mail->assign('country', $countriesList->getCountryLocaleName($this->getCountryCode()));
$mail->assign('code', $this->getActivationCode());
if ($mail->send())
return true;
else
return false;
}
function sendEMail($nFromUserId, $sSubject, $sText, $bSendEMailAddress)
{
global $opt, $translate;
if ($this->exist() == false)
return false;
if ($this->getIsActive() == false)
return false;
if ($this->getEMail() === null || $this->getEMail() == '')
return false;
if ($sSubject == '')
return false;
if ($sText == '')
return false;
if (mb_strpos($sSubject, "\n") !== false)
$sSubject = mb_substr($sSubject, 0, mb_strpos($sSubject, "\n"));
$sSubject = mb_trim($sSubject);
$fromUser = new user($nFromUserId);
if ($fromUser->exist() == false)
return false;
if ($fromUser->getIsActive() == false)
return false;
if ($fromUser->getEMail() === null || $fromUser->getEMail() == '')
return false;
// ok, we can send ...
$mail = new mail();
$mail->name = 'usercontactmail';
$mail->to = $this->getEMail();
$mail->from = $opt['mail']['usermail'];
if ($bSendEMailAddress == true)
{
$mail->replyTo = $fromUser->getEMail();
$mail->returnPath = $fromUser->getEMail();
}
$mail->subject = $translate->t('E-Mail from', '', basename(__FILE__), __LINE__) . ' ' . $fromUser->getUsername() . ': ' . $sSubject;
$mail->assign('usersubject', $sSubject);
$mail->assign('text', $sText);
$mail->assign('username', $this->getUsername());
$mail->assign('sendemailaddress', $bSendEMailAddress);
$mail->assign('fromusername', $fromUser->getUsername());
$mail->assign('fromuserid', $fromUser->getUserId());
$mail->assign('fromuseremail', $fromUser->getEMail());
if ($mail->send())
{
// send copy to fromUser
$mail->assign('copy', true);
$mail->to = $fromUser->getEMail();
$mail->send();
// log
sql("INSERT INTO `email_user` (`ipaddress`,
`from_user_id`,
`from_email`,
`to_user_id`,
`to_email`)
VALUES ('&1', '&2', '&3', '&4', '&5')",
$_SERVER["REMOTE_ADDR"],
$fromUser->getUserId(),
$fromUser->getEMail(),
$this->getUserId(),
$this->getEMail());
return true;
}
else
return false;
}
function canDisable()
{
global $login;
$login->verify();
if ($login->userid != $this->nUserId && ($login->admin & ADMIN_USER) != ADMIN_USER)
return false;
if ($this->getIsActive() != 0)
return true;
else
return false;
}
function disable()
{
global $login, $translate;
if ($this->canDisable() == false)
return false;
// write old record to log
$backup = array();
$backup['username'] = $this->getUsername();
$backup['email'] = $this->getEMail();
$backup['last_name'] = $this->getLastName();
$backup['first_name'] = $this->getFirstName();
sql("INSERT INTO `logentries` (`module`, `eventid`, `userid`, `objectid1`, `objectid2`, `logtext`, `details`)
VALUES ('user', 6, '&1', '&2', '&3', '&4', '&5')",
$login->userid, $this->nUserId, 0,
'User ' . sql_escape($this->getUsername()) . ' disabled',
serialize($backup));
// delete private data
sql("UPDATE `user` SET `password`=NULL, `email`=NULL,
`is_active_flag`=0,
`latitude`=0, `longitude`=0,
`last_name`='', `first_name`='', `country`=NULL, `accept_mailing`=0, `pmr_flag`=0,
`new_pw_code`=NULL, `new_pw_date`=NULL,
`new_email`=NULL, `new_email_code`=NULL, `new_email_date`=NULL,
`email_problems`=0, `first_email_problem`=NULL, `last_email_problem`=NULL,
`permanent_login_flag`=0, `activation_code`='',
`notify_radius`=0
WHERE `user_id`='&1'", $this->nUserId);
// Statpic and profile description texts are published under the data license
// terms and therefore need not to be deleted.
sql("DELETE FROM `user_options` WHERE `user_id`='&1'", $this->nUserId);
$this->reload();
// lock the user's caches
$error = false;
$rs = sql("SELECT `cache_id` FROM `caches` WHERE `user_id`='&1' AND `status` IN (1,2,3)", $this->nUserId);
while (($rCache = sql_fetch_assoc($rs)) && !$error)
{
$error = true;
$cache = new cache($rCache['cache_id']);
if ($cache->setStatus(6) && $cache->save())
{
$log = cachelog::createNew($rCache['cache_id'],$login->userid,true);
if ($log !== false)
{
$log->setType(cachelog::LOGTYPE_LOCKED,true);
$log->setOcTeamComment(true);
$log->setDate(date('Y-m-d'));
$log->setText($translate->t('The user account has been disabled.', '','',0,'',1, $cache->getDefaultDescLanguage()));
$log->setTextHtml(false);
if ($log->save())
$error = false;
}
}
echo "\n";
}
sql_free_result($rs);
return !$error;
}
function canDisableDueLicense()
{
global $login;
$login->verify();
if ($login->userid != $this->nUserId && ($login->admin & ADMIN_USER) != ADMIN_USER)
return false;
else
return true;
}
/**
* disables user (if not disabled), removes all licensed content from db and
* replaces every picture with a dummy one
*
* @return string error message, if anything went wrong, true otherwise
*
* old_disabled: the user was disabled already before license transition
* and therefore could not accept/decline the license
*/
function disduelicense($old_disabled=false) {
// get translation-object
global $translate;
// check if disabled, disable if not
if (!$this->canDisableDueLicense())
return 'this user must not be disabled';
if (!$old_disabled)
if ($this->canDisable())
if (!$this->disable())
return 'disable user failed';
// remember that data license was declined
sql("UPDATE user SET data_license='&2' WHERE user_id='&1'",
$this->getUserId(),
$old_disabled ? NEW_DATA_LICENSE_PASSIVELY_DECLINED : NEW_DATA_LICENSE_ACTIVELY_DECLINED);
/*
* set all cache_desc and hint to '', save old texts
*/
// check if there are caches
$num_caches = sql_value("SELECT COUNT(*) FROM `caches` WHERE `user_id`='&1'",
0, $this->getUserId());
if ($num_caches > 0) {
$cache_descs = array();
$rs = sql("SELECT `id`, `language`, `desc`, `hint` " .
"FROM `cache_desc`,`caches` " .
"WHERE `caches`.`cache_id`=`cache_desc`.`cache_id` " .
"AND `caches`.`user_id`='&1'",
$this->getUserId()
);
while ($cache_desc = sql_fetch_array($rs,MYSQL_ASSOC))
$cache_descs[] = $cache_desc;
sql_free_result($rs);
// walk through cache_descs and set message for each language
foreach ($cache_descs as $desc)
{
// save text - added 2013/03/18 to be enable restoring data on reactivation
// of accounts that were disabled before license transition
if ($desc['desc'] != "")
sql("INSERT IGNORE INTO `saved_texts` (`object_type`, `object_id`, `subtype`, `text`)
VALUES ('&1', '&2', '&3', '&4')",
OBJECT_CACHEDESC, $desc['id'], 1, $desc['desc'] );
if ($desc['hint'] != "")
sql("INSERT IGNORE INTO `saved_texts` (`object_type`, `object_id`, `subtype`, `text`)
VALUES ('&1', '&2', '&3', '&4')",
OBJECT_CACHEDESC, $desc['id'], 2, $desc['hint'] );
if ($desc['desc'] != "")
if ($old_disabled)
$descmsg = $translate->t("cache description was removed because the owner's account was inactive when the <a href='articles.php?page=impressum#datalicense'>new content license</a> was launched", '', basename(__FILE__), __LINE__, '', 1, $desc['language']);
else
$descmsg = $translate->t('cache description was removed because owner declined content license', '', basename(__FILE__), __LINE__, '', 1, $desc['language']);
else
$descmsg = "";
sql("UPDATE `cache_desc` " .
"SET `desc`='&1',`hint`='&2' " .
"WHERE `id`='&3'",
"<em>" . $descmsg . "</em>",
'',
$desc['id']
);
}
// replace pictures
$errmesg = $this->replace_pictures(OBJECT_CACHE);
if ($errmesg !== true)
return "removing cache pictures: $errmesg";
}
// delete additional waypoint texts
$rs = sql("SELECT `id`, `description` FROM `coordinates`
WHERE `type`='&1'
AND `cache_id` IN (SELECT `cache_id` FROM `caches` WHERE `user_id`='&2')",
COORDINATE_WAYPOINT, $this->getUserId());
while ($wp = sql_fetch_assoc($rs))
{
if ($wp['description'] != "")
sql("INSERT IGNORE INTO `saved_texts` (`object_type`, `object_id`, `subtype`, `text`)
VALUES ('&1', '&2', '&3', '&4')",
OBJECT_WAYPOINT, $wp['id'], 0, $wp['description'] );
sql("UPDATE `coordinates` SET `description`=''
WHERE `id`='&1'",
$wp['id']);
}
sql_free_result($rs);
/*
* set all cache_logs '', save old texts and delete pictures
*/
$rs = sql("SELECT `id`, `text`
FROM `cache_logs`
WHERE `user_id`='&1'",
$this->getUserId()
);
while ($log = sql_fetch_array($rs,MYSQL_ASSOC))
{
// save text - added 2013/03/18 to be enable restoring data on reactivation
// of accounts that were disabled before license transition
sql("INSERT IGNORE INTO `saved_texts` (`object_type`, `object_id`, `subtype`, `text`)
VALUES ('&1', '&2', '&3', '&4')",
OBJECT_CACHELOG, $log['id'], 0, $log['text']);
// set text ''
sql("UPDATE `cache_logs` SET `text`='' WHERE `id`='&1'", $log['id']);
/*
// replace pictures
$errmesg = $this->replace_pictures(OBJECT_CACHELOG);
if ($errmesg !== true)
return "removing log pictures: $errmesg";
*/
// delete log pictures
$rsp = sql("SELECT `id` FROM `pictures`
WHERE `object_type`='&1' AND `object_id`='&2'",
OBJECT_CACHELOG, $log['id']);
while ($pic = sql_fetch_assoc($rsp))
{
$picture = new picture($pic['id']);
$picture->delete();
}
sql_free_result($rsp);
}
sql_free_result($rs);
// discard achived logs' texts
sql("UPDATE `cache_logs_archived` SET `text`='' WHERE `user_id`='&1'", $this->getUserId());
// success
return true;
}
/**
* replaces all pictures of $this-user with a dummy for the given object-type
* @param int $object_type object_types-id from table object_types
* @return bool true, if replacement worked, false otherwise
*/
function replace_pictures($object_type) {
// get optionsarray
global $opt;
// load bmp-support
require_once($opt['rootpath'] . 'lib2/imagebmp.inc.php');
// paths cleared by trailing '/'
if (substr($opt['logic']['pictures']['dir'],-1) != '/')
$picpath = $opt['logic']['pictures']['dir'];
else
$picpath = substr($opt['logic']['pictures']['dir'],0,-1);
$thumbpath = "$picpath/thumbs";
$pdummy = isset($opt['logic']['pictures']['dummy']);
if ($pdummy && isset($opt['logic']['pictures']['dummy']['bgcolor']) && is_array($opt['logic']['pictures']['dummy']['bgcolor']))
$dummybg = $opt['logic']['pictures']['dummy']['bgcolor'];
else
$dummybg = array(255,255,255);
if ($pdummy && isset($opt['logic']['pictures']['dummy']['text']))
$dummytext = $opt['logic']['pictures']['dummy']['text'];
else
$dummytext = '';
if ($pdummy && isset($opt['logic']['pictures']['dummy']['textcolor']) && is_array($opt['logic']['pictures']['dummy']['textcolor']))
$dummytextcolor = $opt['logic']['pictures']['dummy']['textcolor'];
else
$dummytextcolor = array(0,0,0);
$tmh = 0;
$tmw = 0;
/*
* check log or cache
*/
if ($object_type == OBJECT_CACHE)
// get filenames of the pictures of $this' caches
$rs = sql("SELECT `pictures`.`url` " .
"FROM `pictures`,`caches` " .
"WHERE `caches`.`cache_id`=`pictures`.`object_id`" .
" AND `pictures`.`object_type`='&1' AND `caches`.`user_id`='&2'",
OBJECT_CACHE, $this->getUserId()
);
elseif ($object_type == OBJECT_CACHELOG)
// get filenames of the pictures of $this' logs
$rs = sql("SELECT `pictures`.`url` " .
"FROM `pictures`,`cache_logs` " .
"WHERE `cache_logs`.`id`=`pictures`.`object_id`" .
" AND `pictures`.`object_type`='&1' AND `cache_logs`.`user_id`='&2'",
OBJECT_CACHELOG, $this->getUserId()
);
// set thumb-dimensions
$tmh = $opt['logic']['pictures']['thumb_max_height'];
$tmw = $opt['logic']['pictures']['thumb_max_width'];
$filenames = array();
while ($url = sql_fetch_array($rs,MYSQL_NUM))
$filenames[] = substr($url['url'],-40);
// free result
sql_free_result($rs);
/*
* walk through filenames and replace original
*/
// check if there is something to replace
if (count($filenames) > 0) {
foreach ($filenames as $fn) {
// get uuid and extension
$uuid = substr($fn,0,36);
$ext = substr($fn,-3);
$thumb_dir1 = substr($uuid,0,1);
$thumb_dir2 = substr($uuid,1,1);
// read original size
if (file_exists("$picpath/$fn")) {
list($w,$h,$t,$attr) = getimagesize("$picpath/$fn");
} else {
$w = 600;
$h = 480;
}
// create new image
$im = imagecreatetruecolor($w,$h);
// allocate colors
$col_bg = imagecolorallocate($im,$dummybg[0],$dummybg[1],$dummybg[2]);
$col_text = imagecolorallocate($im,$dummytextcolor[0],$dummytextcolor[1],$dummytextcolor[2]);
// fill bg
imagefill($im,0,0,$col_bg);
// check for replacement-image
if ($pdummy && isset($opt['logic']['pictures']['dummy']['replacepic'])
&& $opt['logic']['pictures']['dummy']['replacepic'] != $opt['rootpath'] . 'images/'
&& file_exists($opt['logic']['pictures']['dummy']['replacepic'])) {
// get dimensions of the replacement
list($rw,$rh,$rt,$rattr) = getimagesize($opt['logic']['pictures']['dummy']['replacepic']);
$rwh = 0;
if($rw > $rh) {
$rwh = $rh;
} else {
$rwh = $rw;
}
// check dimensions of original and set replacement size
$rsize = 0;
if ($w > $h) {
if(($h * 0.85) > $rwh) {
$rsize = $rwh;
} else {
$rsize = $h * 0.9;
}
} else {
if(($w * 0.85) > $rwh) {
$rsize = $rwh;
} else {
$rsize = $w * 0.9;
}
}
$dx = ($w-$rsize)/2;
$dy = ($h-$rsize)/2;
// get replacement image
$rext = substr($opt['logic']['pictures']['dummy']['replacepic'],-3);
$rim = null;
if ($rext == 'jpg') {
$rim = imagecreatefromjpeg($opt['logic']['pictures']['dummy']['replacepic']);
} elseif ($rext == 'png') {
$rim = imagecreatefrompng($opt['logic']['pictures']['dummy']['replacepic']);
} elseif ($rext == 'gif') {
$rim = imagecreatefromgif($opt['logic']['pictures']['dummy']['replacepic']);
} elseif ($rext == 'bmp') {
$rim = imagecreatefrombmp($opt['logic']['pictures']['dummy']['replacepic']);
}
// copy image
if (!is_null($rim))
imagecopyresampled($im, $rim, $dx, $dy, 0, 0, $rsize, $rsize, $rw, $rh);
} else {
// set text
if ($dummytext != '')
imagestring($im,1,10,$h/2,$dummytext,$col_text);
else {
imageline($im,0,0,$w,$h,0xff0000);
imageline($im,0,$h,$w,0,0xff0000);
}
}
// save dummy
if ($ext == 'jpg') {
if (!imagejpeg($im,"$picpath/$fn",75))
return "save dummy failed [$ext]";
} elseif ($ext == 'png') {
if (!imagepng($im,"$picpath/$fn",4))
return "save dummy failed [$ext]";
} elseif ($ext == 'gif') {
if (!imagegif($im,"$picpath/$fn"))
return "save dummy failed [$ext]";
} elseif ($ext == 'bmp') {
if (!imagebmp($im,"$picpath/$fn"))
return "save dummy failed [$ext]";
} else {
return "save dummy failed [$ext], unknown extension";
}
// set thumb-dimensions
if (($h > $tmh) || ($w > $tmw))
{
if ($h > $w)
{
$th = $tmh;
$tw = $w * ($th / $h);
}
else
{
$tw = $tmw;
$th = $h * ($tw / $w);
}
}
else
{
$tw = $w;
$th = $h;
}
// copy dummy
$tim = imagecreatetruecolor($tw, $th);
imagecopyresampled($tim, $im, 0, 0, 0, 0, $tw, $th, $w, $h);
// check directories or create them
if (!file_exists("$thumbpath/$thumb_dir1"))
if (!mkdir("$thumbpath/$thumb_dir1")) {
return 'mkdir in thumbpath failed';
}
if (!file_exists("$thumbpath/$thumb_dir1/$thumb_dir2")){
if (!mkdir("$thumbpath/$thumb_dir1/$thumb_dir2"))
return 'mkdir in thumbpath failed';
}
// save thumb
if ($ext == 'jpg') {
if (!imagejpeg($tim,"$thumbpath/$thumb_dir1/$thumb_dir2/$fn",75))
return "save thumb failed [$ext]";
} elseif ($ext == 'png') {
if (!imagepng($tim,"$thumbpath/$thumb_dir1/$thumb_dir2/$fn",4))
return "save thumb failed [$ext]";
} elseif($ext == 'gif') {
if (!imagegif($tim,"$thumbpath/$thumb_dir1/$thumb_dir2/$fn"))
return "save thumb failed [$ext]";
} elseif($ext == 'bmp') {
if (!imagebmp($tim,"$thumbpath/$thumb_dir1/$thumb_dir2/$fn"))
return "save thumb failed [$ext]";
} else {
return "save thumb failed [$ext], unknown extension";
}
}
}
// success
return true;
}
function canDelete()
{
global $login;
$login->verify();
if ($login->userid != $this->nUserId && ($login->admin & ADMIN_USER) != ADMIN_USER)
return false;
return
sql_value("SELECT COUNT(*) FROM `caches` WHERE `user_id`='&1'", 0, $this->nUserId)
+ sql_value("SELECT COUNT(*) FROM `cache_logs` WHERE `user_id`='&1'", 0, $this->nUserId)
+ sql_value("SELECT COUNT(*) FROM `cache_logs_archived` WHERE `user_id`='&1'", 0, $this->nUserId)
+ sql_value("SELECT COUNT(*) FROM `cache_reports` WHERE `userid`='&1'", 0, $this->nUserId)
== 0;
}
function delete()
{
global $login;
if ($this->canDelete() == false)
return false;
// write old record to log
$backup = array();
$backup['username'] = $this->getUsername();
$backup['email'] = $this->getEMail();
$backup['last_name'] = $this->getLastName();
$backup['first_name'] = $this->getFirstName();
sql("INSERT INTO `logentries` (`module`, `eventid`, `userid`, `objectid1`, `objectid2`, `logtext`, `details`)
VALUES ('user', 7, '&1', '&2', '&3', '&4', '&5')",
$login->userid, $this->nUserId, 0,
'User ' . sql_escape($this->getUsername()) . ' deleted',
serialize($backup));
sql("DELETE FROM `user` WHERE `user_id`='&1'", $this->nUserId);
// all data in depending tables is cleared via trigger
$this->reload();
return true;
}
// email bounce processing
function addEmailProblem($licensemail=false)
{
// mailing_problems is a bit-flag field to remember nondelivered, important mailings
if ($licensemail)
if (!$this->reUser->setValue('mailing_problems', $this->reUser->getValue('mailing_problems') | 1))
return false;
return $this->reUser->setValue('email_problems', $this->getEmailProblems() + 1) &&
$this->reUser->setValue('last_email_problem', date('Y-m-d H:i:s')) &&
$this->save();
}
function getEmailProblems()
{
// see also common.inc.php "SELECT `email_problems`"
return $this->reUser->getValue('email_problems');
}
function getDataLicense()
{
return $this->reUser->getValue('data_license');
}
function getLicenseDeclined()
{
return $this->getDataLicense() == NEW_DATA_LICENSE_ACTIVELY_DECLINED ||
$this->getDataLicense() == NEW_DATA_LICENSE_PASSIVELY_DECLINED;
}
function missedDataLicenseMail()
{
return $this->reUser->getValue('mailing_problems') & 1;
}
function confirmEmailAddress()
{
return $this->reUser->setValue('email_problems', 0) && $this->save();
}
function reload()
{
$this->reUser->reload();
$this->reUserStat->reload();
}
function getGivenRatings()
{
// get number of cache ratings for this user
return sql_value("
SELECT COUNT(`user_id`)
FROM `cache_rating`
WHERE `user_id`='&1'",
0,
$this->getUserId());
}
function getMaxRatings()
{
global $opt;
// get number of possible rates
return floor($this->getStatFound() * $opt['logic']['rating']['percentageOfFounds'] / 100);
}
function allowRatings()
{
// new ratings allowed, if "given ratings" < "max ratings"
return ($this->getGivenRatings() < $this->getMaxRatings());
}
function foundsUntilNextRating()
{
global $opt;
return ($opt['logic']['rating']['percentageOfFounds'] - ($this->getStatFound() % $opt['logic']['rating']['percentageOfFounds']));
}
function showStatFounds()
{
// wether to show the number of founds on log page
// TODO: make customisable in user profile, see #241
return false;
}
}
?>