mirror of
https://github.com/alchemy-fr/Phraseanet.git
synced 2025-10-10 11:33:17 +00:00
1082 lines
33 KiB
PHP
1082 lines
33 KiB
PHP
<?php
|
|
|
|
class p4
|
|
{
|
|
|
|
public static function fullmkdir($path, $depth=0)
|
|
{
|
|
clearstatcache();
|
|
if (!is_dir($path))
|
|
{
|
|
$p = dirname($path);
|
|
if ($p != "\\" && $p != "/" && $p != "." && $depth < 40)
|
|
self::fullmkdir($p, $depth + 1);
|
|
if (!is_dir($path))
|
|
{
|
|
mkdir($path);
|
|
if (is_dir($path) && defined('GV_filesGroup') && defined('GV_filesOwner'))
|
|
{
|
|
if (trim(GV_filesGroup) !== '' && function_exists('chgrp'))
|
|
chgrp($path, GV_filesGroup);
|
|
if (trim(GV_filesOwner) !== '' && function_exists('chown'))
|
|
chown($path, GV_filesOwner);
|
|
self::chmod($path);
|
|
}
|
|
}
|
|
}
|
|
return is_dir($path);
|
|
}
|
|
|
|
public static function chmod($path)
|
|
{
|
|
if (function_exists('chmod'))
|
|
{
|
|
if (is_dir($path))
|
|
chmod($path, 0755);
|
|
if (is_file($path))
|
|
chmod($path, 0766);
|
|
}
|
|
return true;
|
|
}
|
|
|
|
public static function getHttpCodeFromUrl($url)
|
|
{
|
|
$result = false;
|
|
if (function_exists('curl_init'))
|
|
{
|
|
$ch = curl_init();
|
|
curl_setopt($ch, CURLOPT_URL, $url);
|
|
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 2);
|
|
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
|
|
curl_setopt($ch, CURLOPT_BINARYTRANSFER, true);
|
|
curl_setopt($ch, CURLOPT_NOBODY, true);
|
|
curl_setopt($ch, CURLOPT_HEADER, true);
|
|
|
|
curl_exec($ch);
|
|
|
|
$result = curl_getinfo($ch, CURLINFO_HTTP_CODE);
|
|
|
|
curl_close($ch);
|
|
}
|
|
else
|
|
{
|
|
$opts = array(
|
|
'http' => array(
|
|
'method' => "HEAD"
|
|
)
|
|
);
|
|
|
|
$result = false;
|
|
|
|
$context = stream_context_create($opts);
|
|
$stream = fopen($url, 'r', false, $context);
|
|
|
|
$datas = stream_get_meta_data($stream);
|
|
|
|
if (isset($datas['wrapper_data']))
|
|
{
|
|
$datas = $datas['wrapper_data'];
|
|
foreach ($datas as $value)
|
|
{
|
|
preg_match('/HTTP\/[0-9\.]+.*([0-9]{3}).*[a-zA-Z]+/', $value, $matches);
|
|
if (is_array($matches) && isset($matches[1]) && strlen($matches[1]) == 3)
|
|
{
|
|
$result = $matches[1];
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
fclose($stream);
|
|
}
|
|
return $result;
|
|
}
|
|
|
|
public static function getUrl($url, $post_data=false)
|
|
{
|
|
$result = false;
|
|
if (function_exists('curl_init'))
|
|
{
|
|
$ch = curl_init();
|
|
curl_setopt($ch, CURLOPT_URL, $url);
|
|
curl_setopt($ch, CURLOPT_HEADER, false);
|
|
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 2);
|
|
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
|
|
curl_setopt($ch, CURLOPT_BINARYTRANSFER, true);
|
|
|
|
if ($post_data)
|
|
{
|
|
curl_setopt($ch, CURLOPT_POST, true);
|
|
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
|
|
}
|
|
|
|
$result = (curl_exec($ch));
|
|
curl_close($ch);
|
|
}
|
|
else
|
|
{
|
|
$result = file_get_contents($url);
|
|
}
|
|
return $result;
|
|
}
|
|
|
|
public static function checkUpdate()
|
|
{
|
|
$url = 'http://update.alchemyasp.com/';
|
|
$ret = false;
|
|
|
|
$infos = json_decode(self::getUrl($url));
|
|
|
|
if (isset($infos->version) && isset($infos->sha256) && isset($infos->url))
|
|
{
|
|
if (version_compare(GV_version, $infos->version, '<'))
|
|
{
|
|
$archivefile = GV_RootPath . 'tmp/' . time() . '__update_' . $infos->version . '.zip';
|
|
$archiveunzipped = GV_RootPath . 'tmp/' . 'update_' . $infos->version . '/';
|
|
|
|
|
|
if (is_dir($archiveunzipped))
|
|
return false;
|
|
|
|
$zip = self::getUrl($infos->url);
|
|
|
|
if ($zip !== false)
|
|
{
|
|
|
|
$dir = opendir(GV_RootPath . 'tmp/');
|
|
while (($file = readdir($dir)) !== false)
|
|
{
|
|
if ($file != '.' && $file != '..' && is_dir(GV_RootPath . 'tmp/' . $file))
|
|
{
|
|
preg_match_all('/(update_[0-9]{1}\.[0-9]{1}\.[0-9]{1})/', $file, $matches);
|
|
if (isset($matches[0]) && isset($matches[0][0]))
|
|
{
|
|
p4::rmdir(GV_RootPath . 'tmp/' . $file);
|
|
}
|
|
}
|
|
}
|
|
|
|
$archive = fopen('file://' . $archivefile, 'w');
|
|
fwrite($archive, $zip);
|
|
fclose($archive);
|
|
|
|
self::chmod($archivefile);
|
|
|
|
if (hash_file('sha256', $archivefile) === $infos->sha256)
|
|
{
|
|
if (self::unzip($archivefile, $archiveunzipped))
|
|
$ret = $archiveunzipped;
|
|
}
|
|
unlink($archivefile);
|
|
}
|
|
elseif (GV_debug)
|
|
{
|
|
echo 'impossible de telecharger le zip\n\n';
|
|
}
|
|
}
|
|
elseif (GV_debug)
|
|
{
|
|
echo "version compare donne une version plutot bonne\n\n";
|
|
}
|
|
}
|
|
elseif (GV_debug)
|
|
{
|
|
echo 'Manque des elements sur le webservice\n\n';
|
|
var_dump($infos);
|
|
}
|
|
return $ret;
|
|
}
|
|
|
|
public static function unzip($zipfile, $dest)
|
|
{
|
|
|
|
$fzip = zip_open($zipfile);
|
|
$ret = true;
|
|
|
|
if (!is_dir($dest))
|
|
{
|
|
if (!mkdir($dest, 0755, true))
|
|
$ret = false;
|
|
}
|
|
while ($zip_read = zip_read($fzip))
|
|
{
|
|
$zip_content = zip_entry_name($zip_read);
|
|
|
|
$c = substr($zip_content, -1, 1);
|
|
$path_dest = $dest . $zip_content;
|
|
|
|
if ($c != "/" && $c != "\\")
|
|
{
|
|
$path_dest_hand = fopen('file://' . $path_dest, 'w+');
|
|
while (($entry = zip_entry_read($zip_read)) !== false && $entry !== '')
|
|
{
|
|
if (!fwrite($path_dest_hand, $entry))
|
|
$ret = false;
|
|
}
|
|
fclose($path_dest_hand);
|
|
}
|
|
else
|
|
{
|
|
if (!mkdir($path_dest, 0755, true))
|
|
$ret = false;
|
|
}
|
|
}
|
|
return $ret;
|
|
}
|
|
|
|
public static function copyUpdate($source, $dest)
|
|
{
|
|
$result = false;
|
|
|
|
if (is_file($source))
|
|
{
|
|
if (is_dir($dest))
|
|
$__dest = p4string::addEndSlash($dest) . basename($source);
|
|
else
|
|
$__dest = $dest;
|
|
|
|
$result = copy($source, $__dest);
|
|
self::chmod($__dest);
|
|
unlink($source);
|
|
}
|
|
elseif (is_dir($source))
|
|
{
|
|
if (!is_dir($dest))
|
|
{
|
|
@mkdir($dest, $folderPermission);
|
|
self::chmod($dest);
|
|
}
|
|
|
|
$source = p4string::addEndSlash($source);
|
|
$dest = p4string::addEndSlash($dest);
|
|
|
|
$result = true;
|
|
$dirHandle = opendir($source);
|
|
while ($file = readdir($dirHandle))
|
|
{
|
|
if ($file != "." && $file != "..")
|
|
$result = self::copyUpdate($source . $file, $dest . $file);
|
|
}
|
|
closedir($dirHandle);
|
|
rmdir($source);
|
|
}
|
|
else
|
|
{
|
|
$result = false;
|
|
}
|
|
return $result;
|
|
}
|
|
|
|
public static function rmdir($source)
|
|
{
|
|
$result = false;
|
|
|
|
if (is_file($source))
|
|
{
|
|
unlink($source);
|
|
$result = true;
|
|
}
|
|
elseif (is_dir($source))
|
|
{
|
|
$result = true;
|
|
$dirHandle = opendir($source);
|
|
while ($file = readdir($dirHandle))
|
|
{
|
|
if ($file != "." && $file != "..")
|
|
$result = self::rmdir($source);
|
|
}
|
|
closedir($dirHandle);
|
|
rmdir($source);
|
|
}
|
|
else
|
|
{
|
|
$result = false;
|
|
}
|
|
return $result;
|
|
}
|
|
|
|
public static function doUpdate($folder)
|
|
{
|
|
|
|
set_time_limit(300);
|
|
if (self::copyUpdate($folder, GV_RootPath) !== true)
|
|
return false;
|
|
|
|
$appb = new appbox();
|
|
|
|
if ($appb->upgradeAvalaible())
|
|
{
|
|
$appb->upgradeDB();
|
|
}
|
|
|
|
$sbas = $appb->getSbas();
|
|
foreach ($sbas as $s)
|
|
{
|
|
if ($s->upgradeAvalaible())
|
|
$s->upgradeDB();
|
|
}
|
|
|
|
self::rmdir($folder);
|
|
|
|
return true;
|
|
}
|
|
|
|
public static function checkBeforeUpgrade()
|
|
{
|
|
$conn = connection::getInstance();
|
|
$sql = 'SELECT schedstatus FROM sitepreff';
|
|
if ($rs = $conn->query($sql))
|
|
{
|
|
if ($row = $conn->fetch_assoc($rs))
|
|
{
|
|
if ($row['schedstatus'] != 'stopped')
|
|
{
|
|
return array(_('Veuillez arreter le planificateur avant la mise a jour'));
|
|
}
|
|
}
|
|
$conn->free_result($rs);
|
|
}
|
|
return true;
|
|
}
|
|
|
|
public static function empty_directory($origine, $delete_origine = true)
|
|
{
|
|
$origine = p4string::addEndSlash($origine);
|
|
|
|
$dirs = array();
|
|
foreach (new RecursiveIteratorIterator(new RecursiveDirectoryIterator($origine), RecursiveIteratorIterator::LEAVES_ONLY) as $file)
|
|
{
|
|
$pathfile = $file->getRealPath();
|
|
if (substr($file->getFilename(), 0, 1) == '.' || strpos($pathfile, '.svn') !== false)
|
|
{
|
|
continue;
|
|
}
|
|
$path = p4string::addEndSlash($file->getPath());
|
|
if($delete_origine || $path != $origine)
|
|
$dirs[$path] = $path;
|
|
unlink($pathfile);
|
|
}
|
|
|
|
arsort($dirs);
|
|
|
|
foreach ($dirs as $dir)
|
|
rmdir($dir);
|
|
}
|
|
|
|
public static function forceUpgrade()
|
|
{
|
|
$ret = false;
|
|
$appb = new appbox();
|
|
|
|
skins::delete_skins_files();
|
|
self::empty_directory(GV_RootPath . 'tmp/cache_minify/', false);
|
|
self::empty_directory(GV_RootPath . 'tmp/cache_twig/', false);
|
|
skins::merge();
|
|
self::copy_custom_files();
|
|
|
|
if ($appb->upgradeDB())
|
|
{
|
|
|
|
$sbas = $appb->getSbas();
|
|
foreach ($sbas as $s)
|
|
{
|
|
$s->upgradeDB();
|
|
}
|
|
$ret = true;
|
|
}
|
|
|
|
$cache = cache::getInstance();
|
|
|
|
if ($cache->is_ok())
|
|
{
|
|
$cache->flush();
|
|
}
|
|
|
|
return $ret;
|
|
}
|
|
|
|
private static function copy_custom_files()
|
|
{
|
|
|
|
$origine = GV_RootPath . 'config/custom_files/';
|
|
$dest = GV_RootPath . 'www/custom/';
|
|
|
|
foreach (new RecursiveIteratorIterator(new RecursiveDirectoryIterator($origine), RecursiveIteratorIterator::LEAVES_ONLY) as $file)
|
|
{
|
|
if (substr($file->getFilename(), 0, 1) == '.' || strpos($file->getRealPath(), '.svn') !== false)
|
|
continue;
|
|
|
|
$dest_file = str_replace($origine, $dest, $file->getRealPath());
|
|
$dest_dir = dirname($dest_file);
|
|
if (!is_dir($dest_dir))
|
|
self::fullmkdir($dest_dir);
|
|
copy($file->getRealPath(), $dest_file);
|
|
self::chmod($dest_file);
|
|
}
|
|
}
|
|
|
|
public static function signOnAPI($login, $password)
|
|
{
|
|
$session = session::getInstance();
|
|
|
|
$usr_id = false;
|
|
$error = 'bad';
|
|
$conn = connection::getInstance();
|
|
|
|
$sql = 'SELECT usr_id, usr_login FROM usr WHERE usr_login="' . $conn->escape_string($login) . '" AND usr.usr_password="' . $conn->escape_string(hash('sha256', $conn->escape_string($password))) . '" AND usr_login != "invite" AND usr_login != "autoregister" AND model_of="0" AND invite="0"';
|
|
|
|
if ($rs = $conn->query($sql))
|
|
{
|
|
if ($row = $conn->fetch_assoc($rs))
|
|
{
|
|
$usr_id = $row['usr_id'];
|
|
$login = $row['usr_login'];
|
|
}
|
|
$conn->free_result($rs);
|
|
}
|
|
|
|
if ($usr_id)
|
|
{
|
|
$error = false;
|
|
if (!self::authenticate($usr_id))
|
|
$error = 'session';
|
|
else
|
|
{
|
|
$session->invite = false;
|
|
}
|
|
}
|
|
|
|
return array('error' => $error, 'usr_id' => $usr_id);
|
|
}
|
|
|
|
public static function signOn($login, $password, $captcha)
|
|
{
|
|
|
|
$session = session::getInstance();
|
|
|
|
$error = $usr_id = false;
|
|
|
|
$conn = connection::getInstance();
|
|
|
|
$theclient = browser::getInstance();
|
|
$ip = $theclient->getIP();
|
|
|
|
$sql = 'SELECT id FROM badlog WHERE (login="' . $conn->escape_string($login) . '" OR ip="' . $conn->escape_string($ip) . '") AND locked="1"';
|
|
|
|
if ($rs = $conn->query($sql))
|
|
{
|
|
if (($conn->num_rows($rs)) > 0)
|
|
{
|
|
if ($captcha)
|
|
{
|
|
$sql = 'UPDATE badlog SET locked="0" WHERE (login="' . $conn->escape_string($login) . '" OR ip="' . $conn->escape_string($ip) . '")';
|
|
$conn->query($sql);
|
|
}
|
|
elseif (($conn->num_rows($rs)) > 9)
|
|
{
|
|
$error = 'bad';
|
|
if (GV_captchas && trim(GV_captcha_private_key) !== '' && trim(GV_captcha_public_key) !== '')
|
|
$error = 'captcha';
|
|
}
|
|
}
|
|
$conn->free_result($rs);
|
|
}
|
|
|
|
|
|
|
|
$sql = 'SELECT usr_id, canchgprofil FROM usr WHERE usr_login="' . $conn->escape_string($login) . '" AND usr.usr_password="' . $conn->escape_string(hash('sha256', $password)) . '" AND usr_login NOT IN ("invite","autoregister") AND model_of="0" AND invite="0"';
|
|
|
|
if ($rs = $conn->query($sql))
|
|
{
|
|
if (($conn->num_rows($rs)) == 0)
|
|
{
|
|
|
|
$sql = 'DELETE FROM badlog WHERE date < "' . date('Y-m-d H:i:s', mktime(0, 0, 0, date("m") - 1, date("d"), date("Y"))) . '"';
|
|
$conn->query($sql);
|
|
|
|
if (GV_captchas && trim(GV_captcha_private_key) !== '' && trim(GV_captcha_public_key) !== '')
|
|
{
|
|
$sql = 'INSERT INTO badlog (date,login,pwd,ip,locked) VALUES (NOW(),"' . $conn->escape_string($login) . '","' . $conn->escape_string($password) . '","' . $conn->escape_string($ip) . '","1")';
|
|
$conn->query($sql);
|
|
}
|
|
|
|
$sql = 'SELECT login FROM badlog WHERE (login="' . $conn->escape_string($login) . '" OR ip="' . $conn->escape_string($ip) . '") AND date >= "' . date('Y-m-d H:i:s', mktime(date("H"), date("i") - 10, date("s"), date("m") - 1, date("d"), date("Y"))) . '" AND locked="1"';
|
|
|
|
$error = 'bad';
|
|
$mail = '';
|
|
if (GV_captchas && trim(GV_captcha_private_key) !== '' && trim(GV_captcha_public_key) !== '' && ($rs = $conn->query($sql)))
|
|
{
|
|
if (($conn->num_rows($rs)) > 9)
|
|
{
|
|
$error = 'captcha';
|
|
|
|
if ($rs2 = $conn->query('SELECT * FROM badlog WHERE login="' . $conn->escape_string($login) . '"'))
|
|
{
|
|
while ($row = $conn->fetch_assoc($rs2))
|
|
$mail .= '<div>bad log FROM ' . $row['ip'] . ' --- tried login "' . $row['login'] . '" AND password "' . $row['pwd'] . '" on "' . $row['date'] . '"' . "</div>\n";
|
|
$conn->free_result($rs2);
|
|
}
|
|
}
|
|
$conn->free_result($rs);
|
|
}
|
|
|
|
if ($mail != '' && trim(GV_adminMail) != '')
|
|
{
|
|
mail::hack_alert(GV_adminMail, $mail);
|
|
}
|
|
}
|
|
elseif ($row = $conn->fetch_assoc($rs))
|
|
{
|
|
$usr_id = $row['usr_id'];
|
|
}
|
|
$conn->free_result($rs);
|
|
}
|
|
|
|
$sql = 'SELECT mail_locked, usr_id FROM usr WHERE usr_login="' . $conn->escape_string($login) . '" AND usr.usr_password="' . $conn->escape_string($password) . '"';
|
|
if ($rs = $conn->query($sql))
|
|
{
|
|
if ($row = $conn->fetch_assoc($rs))
|
|
{
|
|
if ($row['mail_locked'] == "1")
|
|
{
|
|
$error = 'mail_lock';
|
|
$usr_id = $row['usr_id'];
|
|
}
|
|
}
|
|
$conn->free_result($rs);
|
|
}
|
|
|
|
if (!$error)
|
|
{
|
|
$session->invite = false;
|
|
|
|
$transferBasks = false;
|
|
|
|
if (isset($session->postlog) && $session->postlog)
|
|
$transferBasks = true;
|
|
|
|
if ($transferBasks && $session->isset_cookie('invite-usr_id'))
|
|
{
|
|
$basks = array();
|
|
$oldusr = $session->get_cookie('invite-usr_id');
|
|
|
|
$sql = 'SELECT sselcont_id, s.ssel_id FROM sselcont c, ssel s WHERE s.usr_id="' . $conn->escape_string($oldusr) . '" and s.ssel_id = c.ssel_id';
|
|
|
|
if ($rs = $conn->query($sql))
|
|
{
|
|
while ($row = $conn->fetch_assoc($rs))
|
|
$basks[] = $row['ssel_id'];
|
|
$conn->free_result($rs);
|
|
}
|
|
foreach ($basks as $ssel_id)
|
|
{
|
|
$sql = 'UPDATE ssel set usr_id = "' . $conn->escape_string($usr_id) . '" WHERE ssel_id="' . $conn->escape_string($ssel_id) . '" AND usr_id ="' . $conn->escape_string($oldusr) . '"';
|
|
if ($conn->query($sql))
|
|
{
|
|
|
|
}
|
|
}
|
|
if ($usr_id != $oldusr)
|
|
{
|
|
$sql = 'DELETE FROM ssel WHERE usr_id = "' . $conn->escape_string($oldusr) . '"';
|
|
$conn->query($sql);
|
|
}
|
|
|
|
$sql = 'UPDATE dsel SET usr_id="' . $conn->escape_string($usr_id) . '" WHERE usr_id="' . $conn->escape_string($oldusr) . '"';
|
|
$conn->query($sql);
|
|
|
|
$sql = 'DELETE FROM usr WHERE usr_id = "' . $conn->escape_string($oldusr) . '"';
|
|
$conn->query($sql);
|
|
$sql = 'DELETE FROM basusr WHERE usr_id = "' . $conn->escape_string($oldusr) . '"';
|
|
$conn->query($sql);
|
|
$sql = 'DELETE FROM sbasusr WHERE usr_id = "' . $conn->escape_string($oldusr) . '"';
|
|
$conn->query($sql);
|
|
|
|
$session->set_cookie('invite-usr_id', $usr_id, -400000, true);
|
|
$session->set_cookie('invite-hash', hash('sha256', $password), -400000, true);
|
|
}
|
|
|
|
if (!$transferBasks)
|
|
$session->set_cookie('last_act', '', -400000, true);
|
|
|
|
if (!self::authenticate($usr_id))
|
|
$error = 'session';
|
|
}
|
|
|
|
return array('error' => $error, 'usr_id' => $usr_id);
|
|
}
|
|
|
|
public static function signOnWithToken($token)
|
|
{
|
|
|
|
$session = session::getInstance();
|
|
$error = $usr_id = false;
|
|
|
|
$datas = random::helloToken($token);
|
|
if (!$datas)
|
|
$error = 'wrong-token';
|
|
else
|
|
{
|
|
|
|
$usr_id = $datas['usr_id'];
|
|
if ((int) $usr_id > 0)
|
|
{
|
|
$session->invite = true;
|
|
|
|
$conn = connection::getInstance();
|
|
|
|
$sql = 'SELECT usr_login FROM usr WHERE usr_id="' . $conn->escape_string($usr_id) . '" AND invite="0" AND usr_login!="invite" AND usr_login !="autoregister"';
|
|
|
|
if ($rs = $conn->query($sql))
|
|
{
|
|
if ($row = $conn->fetch_assoc($rs))
|
|
{
|
|
$session->invite = false;
|
|
}
|
|
}
|
|
|
|
if (!self::authenticate($usr_id))
|
|
$error = 'session';
|
|
}
|
|
}
|
|
|
|
|
|
return array('error' => $error, 'usr_id' => $usr_id);
|
|
}
|
|
|
|
public static function signOnasGuest()
|
|
{
|
|
$session = session::getInstance();
|
|
|
|
$conn = connection::getInstance();
|
|
|
|
$usr_id = $error = false;
|
|
$invite_modtime = false;
|
|
$inviteUsrid = false;
|
|
|
|
$sql = 'SELECT usr_id, UNIX_TIMESTAMP(usr_modificationdate) as t_time FROM usr WHERE usr_login="' . $conn->escape_string('invite') . '"';
|
|
if ($rs = $conn->query($sql))
|
|
{
|
|
if ($row = $conn->fetch_assoc($rs))
|
|
{
|
|
$inviteUsrid = $row['usr_id'];
|
|
$invite_modtime = $row['t_time'];
|
|
}
|
|
$conn->free_result($rs);
|
|
}
|
|
|
|
if ($session->isset_cookie('invite-usr_id') && $session->isset_cookie('invite-hash'))
|
|
{
|
|
if ($session->isset_cookie('invite-time'))
|
|
{
|
|
$reload_privileges = false;
|
|
|
|
$date = new DateTime("@" . (int) $session->get_cookie('invite-time'));
|
|
|
|
if ($invite_modtime != phraseadate::format_mysql($date))
|
|
{
|
|
$reload_privileges = true;
|
|
}
|
|
}
|
|
else
|
|
$reload_privileges = true;
|
|
|
|
|
|
$sql = 'SELECT usr_id, usr_password FROM usr WHERE invite="1" AND usr_login="' . $conn->escape_string('invite' . $session->get_cookie('invite-usr_id')) . '"';
|
|
|
|
if ($rs = $conn->query($sql))
|
|
{
|
|
if (($conn->num_rows($rs)) == 1)
|
|
{
|
|
$row = $conn->fetch_assoc($rs);
|
|
|
|
if (hash('sha256', $row['usr_password']) == $session->get_cookie('invite-hash'))
|
|
{
|
|
$login = 'invite' . $session->get_cookie('invite-usr_id');
|
|
$usr_id = $row['usr_id'];
|
|
$password = $row['usr_password'];
|
|
|
|
if ($reload_privileges)
|
|
{
|
|
$conn->query('DELETE FROM basusr WHERE usr_id = "' . $usr_id . '"');
|
|
$conn->query('DELETE FROM sbasusr WHERE usr_id = "' . $usr_id . '"');
|
|
$conn->query("INSERT INTO basusr (SELECT null as id, base_id, '" . $conn->escape_string($usr_id) . "' as usr_id, canpreview, canhd, canputinalbum, candwnldhd, candwnldsubdef, candwnldpreview, cancmd, canadmin, actif, canreport, canpush, creationdate, basusr_infousr, mask_and, mask_xor, restrict_dwnld, month_dwnld_max, remain_dwnld, time_limited, limited_from, limited_to, canaddrecord, canmodifrecord, candeleterecord, chgstatus, lastconn, imgtools, manage, modify_struct, bas_manage, bas_modify_struct, needwatermark FROM basusr WHERE usr_id='" . $conn->escape_string($inviteUsrid) . "')");
|
|
$conn->query("INSERT INTO sbasusr (SELECT null as sbasusr_id, sbas_id, '" . $conn->escape_string($usr_id) . "' as usr_id, bas_manage, bas_modify_struct, bas_modif_th, bas_chupub FROM sbasusr WHERE usr_id='" . $conn->escape_string($inviteUsrid) . "')");
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (!$usr_id)
|
|
{
|
|
$usr_id = $conn->getId("USR");
|
|
$login = 'invite' . $usr_id;
|
|
$password = random::generatePassword();
|
|
|
|
$conn->query("INSERT INTO usr (usr_id, usr_login, usr_password,model_of,usr_creationdate,invite) values ('" . $conn->escape_string($usr_id) . "', '" . $conn->escape_string($login) . "', '" . $conn->escape_string($password) . "',0,now(),'1')");
|
|
$conn->query("INSERT INTO basusr (SELECT null as id, base_id, '" . $conn->escape_string($usr_id) . "' as usr_id, canpreview, canhd, canputinalbum, candwnldhd, candwnldsubdef, candwnldpreview, cancmd, canadmin, actif, canreport, canpush, creationdate, basusr_infousr, mask_and, mask_xor, restrict_dwnld, month_dwnld_max, remain_dwnld, time_limited, limited_from, limited_to, canaddrecord, canmodifrecord, candeleterecord, chgstatus, lastconn, imgtools, manage, modify_struct, bas_manage, bas_modify_struct, needwatermark FROM basusr WHERE usr_id='" . $conn->escape_string($inviteUsrid) . "')");
|
|
$conn->query("INSERT INTO sbasusr (SELECT null as sbasusr_id, sbas_id, '" . $conn->escape_string($usr_id) . "' as usr_id, bas_manage, bas_modify_struct, bas_modif_th, bas_chupub FROM sbasusr WHERE usr_id='" . $conn->escape_string($inviteUsrid) . "')");
|
|
}
|
|
|
|
if ($usr_id)
|
|
{
|
|
$session->invite = true;
|
|
$expire = 30 * 24 * 3600;
|
|
$session->set_cookie('invite-usr_id', $usr_id, $expire, true);
|
|
$session->set_cookie('invite-hash', hash('sha256', $password), $expire, true);
|
|
$session->set_cookie('invite-time', $invite_modtime, $expire, true);
|
|
|
|
if (!self::authenticate($usr_id))
|
|
$error = 'session';
|
|
else
|
|
$session->set_cookie('last_act', '', -400000, true);
|
|
}
|
|
else
|
|
$error = 'Error';
|
|
|
|
|
|
return array('error' => $error, 'usr_id' => $usr_id);
|
|
}
|
|
|
|
public static function logout($ses_id = false)
|
|
{
|
|
$conn = connection::getInstance();
|
|
$session = session::getInstance();
|
|
|
|
if(!$ses_id)
|
|
$ses_id = $session->ses_id;
|
|
|
|
phrasea_close_session($ses_id);
|
|
|
|
$session->destroy();
|
|
return true;
|
|
}
|
|
|
|
/*
|
|
*
|
|
* This function is activated everytime somebody logins and make several checks
|
|
*
|
|
*/
|
|
|
|
private function auto_batch()
|
|
{
|
|
$conn = connection::getInstance();
|
|
|
|
$sql = "SELECT session_id FROM cache WHERE lastaccess < DATE_SUB(NOW(), INTERVAL 48 HOUR)";
|
|
if ($rs = $conn->query($sql))
|
|
{
|
|
while ($row = $conn->fetch_assoc($rs))
|
|
{
|
|
phrasea_close_session($row['session_id']);
|
|
}
|
|
$conn->free_result($rs);
|
|
}
|
|
|
|
if (defined('GV_validation_reminder'))
|
|
{
|
|
$date_two_day = new DateTime('+' . (int) GV_validation_reminder . ' days');
|
|
|
|
$events_mngr = eventsmanager::getInstance();
|
|
//Je veux les validations en cours dont la date de fin est dans les 48heures et dont vers laquelle il n'est pas encore parti de mail
|
|
$sql = 'SELECT v.id as validate_id, v.usr_id, v.ssel_id, s.usr_id as owner, t.value
|
|
FROM (validate v, ssel s) LEFT JOIN tokens t ON (t.datas = s.ssel_id AND v.usr_id=t.usr_id AND t.type="validate")
|
|
WHERE expires_on < "' . $conn->escape_string(phraseadate::format_mysql($date_two_day)) . '"
|
|
AND ISNULL(last_reminder) AND confirmed="0" AND s.ssel_id = v.ssel_id ';
|
|
|
|
if ($rs = $conn->query($sql))
|
|
{
|
|
while ($row = $conn->fetch_assoc($rs))
|
|
{
|
|
$params = array(
|
|
'to' => $row['usr_id'],
|
|
'ssel_id' => $row['ssel_id'],
|
|
'from' => $row['owner'],
|
|
'validate_id' => $row['validate_id'],
|
|
'url' => GV_ServerName . 'lightbox/?LOG=' . $row['value']
|
|
);
|
|
|
|
$events_mngr->trigger('__VALIDATION_REMINDER__', $params);
|
|
}
|
|
$conn->free_result($rs);
|
|
}
|
|
}
|
|
}
|
|
|
|
static function authenticate($usr_id)
|
|
{
|
|
if (GV_maintenance)
|
|
return false;
|
|
|
|
$session = session::getInstance();
|
|
|
|
if (file_exists(GV_RootPath . "config/prelog.php"))
|
|
include(GV_RootPath . "config/prelog.php");
|
|
|
|
$session = session::getInstance();
|
|
$conn = connection::getInstance();
|
|
$theclient = browser::getInstance();
|
|
$ip = $theclient->getIP();
|
|
|
|
$admin = false;
|
|
$upload = false;
|
|
$thesaurus = false;
|
|
$report = false;
|
|
$userPrefs = false;
|
|
$userRegis = null;
|
|
$ses_id = $locale = false;
|
|
$bases_logged = array();
|
|
$sbases = array();
|
|
|
|
$fonction = $societe = $activite = $pays = '';
|
|
|
|
$session->account_editor = false;
|
|
|
|
self::auto_batch();
|
|
|
|
$sql = 'SELECT usr_id, create_db, desktop, locale, usr_login, usr_mail, canchgprofil, fonction, societe, activite, pays FROM usr WHERE usr_id="' . $conn->escape_string($usr_id) . '"';
|
|
|
|
if ($rs = $conn->query($sql))
|
|
{
|
|
if ($row = $conn->fetch_assoc($rs))
|
|
{
|
|
if (($ses_id = phrasea_create_session((int) $row['usr_id'])) !== false)
|
|
{
|
|
if ($row['create_db'] === '1')
|
|
$admin = true;
|
|
$userPrefs = $row['desktop'];
|
|
$locale = $row['locale'];
|
|
$login = $session->login = $row['usr_login'];
|
|
$session->email = $row['usr_mail'];
|
|
if ($row['canchgprofil'] == '1' && $session->invite === false)
|
|
$session->account_editor = true;
|
|
|
|
$fonction = $row['fonction'];
|
|
$societe = $row['societe'];
|
|
$activite = $row['activite'];
|
|
$pays = $row['pays'];
|
|
}
|
|
}
|
|
}
|
|
if (!$ses_id || (int) $ses_id <= 0)
|
|
return false;
|
|
|
|
$sql = 'SELECT bas.sbas_id, dbname, bas.server_coll_id, basusr.canaddrecord, bas.base_id,usr.usr_id, basusr.canadmin, basusr.canreport,
|
|
basusr.manage, sbasusr.bas_manage, basusr.modify_struct, sbasusr.bas_modify_struct, sbasusr.bas_modif_th, mask_and, mask_xor, restrict_dwnld, basusr.id AS basusrid
|
|
FROM (usr INNER JOIN basusr
|
|
ON usr.usr_id="' . $conn->escape_string($usr_id) . '"
|
|
AND usr.usr_id=basusr.usr_id AND model_of=0 AND actif=1)
|
|
INNER JOIN ( bas INNER JOIN sbas ON sbas.sbas_id=bas.sbas_id )
|
|
ON (bas.active>0 AND bas.base_id=basusr.base_id)
|
|
AND (time_limited=0 OR ( limited_from<NOW() AND limited_to>NOW() ) )
|
|
INNER JOIN sbasusr ON (bas.sbas_id=sbasusr.sbas_id AND sbasusr.usr_id=usr.usr_id)
|
|
ORDER BY sbas.ord, sbas.sbas_id, bas.ord, bas.server_coll_id';
|
|
|
|
if ($rs = $conn->query($sql))
|
|
{
|
|
$iord = 1;
|
|
while ($row = $conn->fetch_assoc($rs))
|
|
{
|
|
|
|
if (!isset($sbases[$row['sbas_id']]))
|
|
{
|
|
$sbases[$row['sbas_id']] = array();
|
|
$sbases[$row['sbas_id']]['colls'] = array();
|
|
}
|
|
$connbas = connection::getInstance($row['sbas_id']);
|
|
if ($connbas)
|
|
{
|
|
$sql = sprintf("REPLACE INTO collusr (site, usr_id, coll_id, mask_and, mask_xor, ord) VALUES ('%s', %s, %s, '%s', '%s', %s)",
|
|
$connbas->escape_string(GV_sit),
|
|
$connbas->escape_string($usr_id),
|
|
$connbas->escape_string($row["server_coll_id"]),
|
|
$connbas->escape_string($row["mask_and"]),
|
|
$connbas->escape_string($row["mask_xor"]),
|
|
$connbas->escape_string($iord++)
|
|
);
|
|
$connbas->query($sql);
|
|
|
|
$sql = 'REPLACE INTO clients (site_id) VALUES ("' . $connbas->escape_string(GV_ServerName) . '")';
|
|
$connbas->query($sql);
|
|
|
|
if (phrasea_register_base($ses_id, $row["base_id"], "", "") === true)
|
|
{
|
|
|
|
if (!isset($userRegis[$row['dbname']]))
|
|
$userRegis[$row['dbname']] = null;
|
|
$userRegis[$row['dbname']][$row['server_coll_id']] = false;
|
|
|
|
$sbases[$row['sbas_id']]['colls'][] = $row['server_coll_id'];
|
|
|
|
if ($row['canreport'] == '1')
|
|
{
|
|
if (!isset($report[$row['sbas_id']]))
|
|
$report[$row['sbas_id']] = array();
|
|
$report[$row['sbas_id']][$row['server_coll_id']] = $row['base_id'];
|
|
}
|
|
if ($row['canaddrecord'] == '1')
|
|
{
|
|
if (!isset($upload[$row['sbas_id']]))
|
|
$upload[$row['sbas_id']] = array();
|
|
$upload[$row['sbas_id']][$row['server_coll_id']] = $row['base_id'];
|
|
}
|
|
if ($row['canadmin'] == '1' || $row['manage'] == '1' || $row['bas_manage'] == '1' || $row['modify_struct'] == '1' || $row['bas_modify_struct'] == '1')
|
|
$admin = true;
|
|
if ($row['bas_modif_th'] == '1')
|
|
$thesaurus = true;
|
|
|
|
if ($row["restrict_dwnld"] && ($row["moiscourant"] != $row["moislastconn"]))
|
|
{
|
|
$conn->query("UPDATE basusr SET remain_dwnld='" . $conn->escape_string($row["month_dwnld_max"]) . "' WHERE id='" . $conn->escape_string($row["basusrid"]) . "'");
|
|
}
|
|
|
|
$conn->query("UPDATE basusr SET lastconn=now() WHERE id='" . $conn->escape_string($row["basusrid"]) . "'");
|
|
|
|
$bases_logged[] = $row["base_id"];
|
|
}
|
|
}
|
|
}
|
|
}
|
|
$logs = array();
|
|
|
|
foreach ($sbases as $sbas => $props)
|
|
{
|
|
$connbas = connection::getInstance($sbas);
|
|
if ($connbas)
|
|
{
|
|
$newid = $connbas->getId("LOG");
|
|
|
|
$screen = $session->isset_cookie('screen') ? $session->get_cookie('screen') : 'unknown';
|
|
|
|
$browser_version = $theclient->getVersion() . ($theclient->isChromeFrame() ? ' ChromeFrame' : '');
|
|
|
|
$sql = "INSERT INTO log
|
|
(id, date,sit_session, user, site, usrid,coll_list, nav, version, os, res, ip, user_agent,appli, fonction, societe, activite, pays) VALUES ";
|
|
$sql .= "('" . $connbas->escape_string($newid) . "',now() ,'" . $connbas->escape_string($ses_id) . "','" . $connbas->escape_string($login) . "', '" . $connbas->escape_string(GV_sit) . "', '" . $connbas->escape_string($usr_id) . "','" . $connbas->escape_string(implode(',', $props['colls'])) . "', '" . $connbas->escape_string($theclient->getBrowser()) . "', '" . $connbas->escape_string($browser_version) . "', '" . $connbas->escape_string($theclient->getPlatform()) . "', '" . $connbas->escape_string($screen) . "','" . $connbas->escape_string($theclient->getIP()) . "','" . $connbas->escape_string($theclient->getUserAgent()) . "','" . $connbas->escape_string(serialize(array())) . "'
|
|
,'" . $connbas->escape_string($fonction) . "','" . $connbas->escape_string($societe) . "','" . $connbas->escape_string($activite) . "','" . $connbas->escape_string($pays) . "')";
|
|
|
|
if ($connbas->query($sql))
|
|
$logs[$sbas] = $newid;
|
|
}
|
|
}
|
|
|
|
$session->locale = isset($session->locale) ? $session->locale : $locale;
|
|
|
|
$conn->query("UPDATE cache SET dist_logid='" . $conn->escape_string(serialize($logs)) . "' WHERE session_id='" . $conn->escape_string($ses_id) . "'");
|
|
$conn->query('UPDATE usr SET last_conn=now(), locale="' . $conn->escape_string($session->locale) . '" WHERE usr_id = "' . $conn->escape_string($usr_id) . '"');
|
|
|
|
|
|
if (isset($session->postlog))
|
|
unset($session->postlog);
|
|
|
|
|
|
$session->logs = $logs;
|
|
$session->admin = $admin;
|
|
$session->upload = $upload;
|
|
$session->thesaurus = $thesaurus;
|
|
$session->report = $report;
|
|
$session->userPrefs = $userPrefs;
|
|
$session->userRegis = $userRegis;
|
|
$session->b_log = $bases_logged;
|
|
$session->usr_id = $usr_id;
|
|
$session->ses_id = $ses_id;
|
|
$session->prod = array('push' => array(), 'query' => array('nba' => 0));
|
|
$session->client = array();
|
|
$session->lightbox = false;
|
|
$session->prefs = array();
|
|
$valNews = self::lightboxNews($usr_id);
|
|
|
|
if ($valNews[0])
|
|
{
|
|
$session->lightbox = array('enabled' => true, 'new' => $valNews[1]);
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
public static function lightboxNews($usrid)
|
|
{
|
|
|
|
$conn = connection::getInstance();
|
|
|
|
$sql = 'SELECT id, confirmed FROM validate WHERE usr_id ="' . $conn->escape_string($usrid) . '"';
|
|
|
|
$validator_enabled = false;
|
|
$new_thg_toval = 0;
|
|
|
|
if ($rs = $conn->query($sql))
|
|
{
|
|
while ($row = $conn->fetch_assoc($rs))
|
|
{
|
|
$validator_enabled = true;
|
|
if ($row['confirmed'] == "0")
|
|
{
|
|
$new_thg_toval++;
|
|
break;
|
|
}
|
|
}
|
|
$conn->free_result($rs);
|
|
}
|
|
|
|
return array($validator_enabled, $new_thg_toval);
|
|
}
|
|
|
|
public static function dispatch($repository_path, $date=false)
|
|
{
|
|
if (!$date)
|
|
$date = date('Y-m-d H:i:s');
|
|
|
|
$repository_path = p4string::addEndSlash($repository_path);
|
|
|
|
$year = date('Y', strtotime($date));
|
|
$month = date('m', strtotime($date));
|
|
$day = date('d', strtotime($date));
|
|
|
|
$n = 0;
|
|
$comp = $year . '/' . $month . '/' . $day . '/';
|
|
|
|
$condition = true;
|
|
|
|
$pathout = $repository_path . $comp;
|
|
|
|
while (($pathout = $repository_path . $comp . self::addZeros($n)) && is_dir($pathout) && self::more_than_limit_in_dir($pathout))
|
|
{
|
|
$n++;
|
|
}
|
|
if (!is_dir($pathout))
|
|
self::fullmkdir($pathout);
|
|
|
|
|
|
return p4string::addEndSlash($pathout);
|
|
}
|
|
|
|
private function more_than_limit_in_dir($path)
|
|
{
|
|
$limit = 1000;
|
|
$n = 0;
|
|
if (is_dir($path))
|
|
{
|
|
if ($hdir = opendir($path))
|
|
{
|
|
while ($file = readdir($hdir))
|
|
{
|
|
if ($file != '.' && $file != '..')
|
|
{
|
|
$n++;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if ($n > $limit)
|
|
return true;
|
|
|
|
return false;
|
|
}
|
|
|
|
private function addZeros($n, $length = 4)
|
|
{
|
|
while (strlen($n) < $length)
|
|
$n = '0' . $n;
|
|
return $n;
|
|
}
|
|
|
|
} |