Compare commits
26 Commits
34758972f8
...
master
Author | SHA1 | Date | |
---|---|---|---|
b8eeda6023
|
|||
39e3018222
|
|||
5243ef0e94
|
|||
0f7006275c
|
|||
f1f991ae6c
|
|||
39482f0f55 | |||
4e865f06bc
|
|||
b0e1851b7a
|
|||
da65b9febd | |||
a1dff47984 | |||
9e5ab4f8a3
|
|||
7fd96ccb38
|
|||
a42485b248
|
|||
47aa90259d
|
|||
4610c71e09
|
|||
fac752f61b | |||
db7f1559c9
|
|||
32f3c23039
|
|||
2fca51cb7c
|
|||
735b639d10 | |||
3491ae057e | |||
5426a761eb
|
|||
dba4f49849
|
|||
9fa78a68e9 | |||
a3fdae6377 | |||
f6461376ed |
@ -38,11 +38,12 @@ Features:
|
|||||||
Installation Instructions:
|
Installation Instructions:
|
||||||
--------------------------
|
--------------------------
|
||||||
|
|
||||||
You'll need to have php with intl, gettext, pdo, pcre, mbstring and date extension, and a web-server installed.
|
You'll need to have php with gettext, pdo, pcre, mbstring and date extension, and a web-server installed.
|
||||||
You will also need the pdo_sqlite, pdo_mysql or pdo_pgsql extension, depending on which database you choose.
|
You will also need the pdo_sqlite, pdo_mysql or pdo_pgsql extension, depending on which database you choose.
|
||||||
Optionally, you can install:
|
Optionally, you can install:
|
||||||
- the gd extension for the captcha feature
|
- the gd extension for the captcha feature
|
||||||
- the json extension for save/restore
|
- the json extension for save/restore
|
||||||
|
- the intl extension for browser language detection
|
||||||
- a memcached server and the memcached extension and change the configuration to use memcached. This will lessen the database load a bit.
|
- a memcached server and the memcached extension and change the configuration to use memcached. This will lessen the database load a bit.
|
||||||
- a MySQL or PostgreSQL server to use as an external database instead of SQLite
|
- a MySQL or PostgreSQL server to use as an external database instead of SQLite
|
||||||
- the libsodium extension (PHP >= 7.2) for encryption of messages and notes in the database
|
- the libsodium extension (PHP >= 7.2) for encryption of messages and notes in the database
|
||||||
|
152
chat.php
152
chat.php
@ -32,6 +32,16 @@
|
|||||||
* 9 - Private messages
|
* 9 - Private messages
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
if (!extension_loaded('gettext')) {
|
||||||
|
prepare_stylesheets('fatal_error');
|
||||||
|
send_headers();
|
||||||
|
echo '<!DOCTYPE html><html lang="en" dir="ltr"><head>'.meta_html();
|
||||||
|
echo '<title>Fatal error</title>';
|
||||||
|
echo "<style>$styles[fatal_error]</style>";
|
||||||
|
echo '</head><body>';
|
||||||
|
echo '<h2>Fatal error: The gettext extension of PHP is required, please install it first.</h2>';
|
||||||
|
print_end();
|
||||||
|
}
|
||||||
// initialize and load variables/configuration
|
// initialize and load variables/configuration
|
||||||
const LANGUAGES = [
|
const LANGUAGES = [
|
||||||
'ar' => ['name' => 'العربية', 'locale' => 'ar', 'dir' => 'rtl'],
|
'ar' => ['name' => 'العربية', 'locale' => 'ar', 'dir' => 'rtl'],
|
||||||
@ -42,8 +52,11 @@ const LANGUAGES = [
|
|||||||
'es' => ['name' => 'Español', 'locale' => 'es_ES', 'dir' => 'ltr'],
|
'es' => ['name' => 'Español', 'locale' => 'es_ES', 'dir' => 'ltr'],
|
||||||
'fi' => ['name' => 'Suomi', 'locale' => 'fi_FI', 'dir' => 'ltr'],
|
'fi' => ['name' => 'Suomi', 'locale' => 'fi_FI', 'dir' => 'ltr'],
|
||||||
'fr' => ['name' => 'Français', 'locale' => 'fr_FR', 'dir' => 'ltr'],
|
'fr' => ['name' => 'Français', 'locale' => 'fr_FR', 'dir' => 'ltr'],
|
||||||
|
'hi' => ['name' => 'हिन्दी', 'locale' => 'hi', 'dir' => 'ltr'],
|
||||||
'id' => ['name' => 'Bahasa Indonesia', 'locale' => 'id_ID', 'dir' => 'ltr'],
|
'id' => ['name' => 'Bahasa Indonesia', 'locale' => 'id_ID', 'dir' => 'ltr'],
|
||||||
'it' => ['name' => 'Italiano', 'locale' => 'it_IT', 'dir' => 'ltr'],
|
'it' => ['name' => 'Italiano', 'locale' => 'it_IT', 'dir' => 'ltr'],
|
||||||
|
'nl' => ['name' => 'Nederlands', 'locale' => 'nl_NL', 'dir' => 'ltr'],
|
||||||
|
'pl' => ['name' => 'Polski', 'locale' => 'pl_PL', 'dir' => 'ltr'],
|
||||||
'pt' => ['name' => 'Português', 'locale' => 'pt_PT', 'dir' => 'ltr'],
|
'pt' => ['name' => 'Português', 'locale' => 'pt_PT', 'dir' => 'ltr'],
|
||||||
'ru' => ['name' => 'Русский', 'locale' => 'ru_RU', 'dir' => 'ltr'],
|
'ru' => ['name' => 'Русский', 'locale' => 'ru_RU', 'dir' => 'ltr'],
|
||||||
'tr' => ['name' => 'Türkçe', 'locale' => 'tr_TR', 'dir' => 'ltr'],
|
'tr' => ['name' => 'Türkçe', 'locale' => 'tr_TR', 'dir' => 'ltr'],
|
||||||
@ -67,6 +80,12 @@ if(!isset($_REQUEST['session']) && isset($_COOKIE[COOKIENAME])){
|
|||||||
}
|
}
|
||||||
$session = preg_replace('/[^0-9a-zA-Z]/', '', $session);
|
$session = preg_replace('/[^0-9a-zA-Z]/', '', $session);
|
||||||
load_lang();
|
load_lang();
|
||||||
|
foreach(['date', 'mbstring', 'pcre'] as $extension) {
|
||||||
|
if(!extension_loaded($extension)) {
|
||||||
|
send_fatal_error(sprintf(_('The %s extension of PHP is required, please install it first.'), $extension));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
mb_internal_encoding('UTF-8');
|
||||||
check_db();
|
check_db();
|
||||||
cron();
|
cron();
|
||||||
route();
|
route();
|
||||||
@ -74,7 +93,7 @@ route();
|
|||||||
// main program: decide what to do based on queries
|
// main program: decide what to do based on queries
|
||||||
function route(): void
|
function route(): void
|
||||||
{
|
{
|
||||||
global $U;
|
global $U, $db;
|
||||||
if(!isset($_REQUEST['action'])){
|
if(!isset($_REQUEST['action'])){
|
||||||
send_login();
|
send_login();
|
||||||
}elseif($_REQUEST['action']==='view'){
|
}elseif($_REQUEST['action']==='view'){
|
||||||
@ -87,7 +106,7 @@ function route(): void
|
|||||||
send_waiting_room();
|
send_waiting_room();
|
||||||
}elseif($_REQUEST['action']==='post'){
|
}elseif($_REQUEST['action']==='post'){
|
||||||
check_session();
|
check_session();
|
||||||
if(isset($_POST['kick']) && isset($_POST['sendto']) && $_POST['sendto']!=='s _'){
|
if(isset($_POST['kick']) && isset($_POST['sendto']) && $_POST['sendto']!=='s *'){
|
||||||
if($U['status']>=5 || ($U['status']>=3 && (get_setting('memkickalways') || (get_count_mods()==0 && get_setting('memkick'))))){
|
if($U['status']>=5 || ($U['status']>=3 && (get_setting('memkickalways') || (get_count_mods()==0 && get_setting('memkick'))))){
|
||||||
if(isset($_POST['what']) && $_POST['what']==='purge'){
|
if(isset($_POST['what']) && $_POST['what']==='purge'){
|
||||||
kick_chatter([$_POST['sendto']], $_POST['message'], true);
|
kick_chatter([$_POST['sendto']], $_POST['message'], true);
|
||||||
@ -137,7 +156,14 @@ function route(): void
|
|||||||
}
|
}
|
||||||
send_profile($arg);
|
send_profile($arg);
|
||||||
}elseif($_REQUEST['action']==='logout' && $_SERVER['REQUEST_METHOD'] === 'POST'){
|
}elseif($_REQUEST['action']==='logout' && $_SERVER['REQUEST_METHOD'] === 'POST'){
|
||||||
kill_session();
|
check_session();
|
||||||
|
if($U['status']<3 && get_setting('exitwait')){
|
||||||
|
$U['exiting']=1;
|
||||||
|
$stmt=$db->prepare('UPDATE ' . PREFIX . 'sessions SET exiting=1 WHERE session=? LIMIT 1;');
|
||||||
|
$stmt->execute([$U['session']]);
|
||||||
|
} else {
|
||||||
|
kill_session();
|
||||||
|
}
|
||||||
send_logout();
|
send_logout();
|
||||||
}elseif($_REQUEST['action']==='colours'){
|
}elseif($_REQUEST['action']==='colours'){
|
||||||
check_session();
|
check_session();
|
||||||
@ -314,6 +340,7 @@ function route_setup(): void
|
|||||||
'guestexpire' => _('Guest timeout (minutes)'),
|
'guestexpire' => _('Guest timeout (minutes)'),
|
||||||
'kickpenalty' => _('Kick penalty (minutes)'),
|
'kickpenalty' => _('Kick penalty (minutes)'),
|
||||||
'entrywait' => _('Waiting room time (seconds)'),
|
'entrywait' => _('Waiting room time (seconds)'),
|
||||||
|
'exitwait' => _('Logout delay (seconds)'),
|
||||||
'captchatime' => _('Captcha timeout (seconds)'),
|
'captchatime' => _('Captcha timeout (seconds)'),
|
||||||
'messageexpire' => _('Message timeout (minutes)'),
|
'messageexpire' => _('Message timeout (minutes)'),
|
||||||
'messagelimit' => _('Message limit (public)'),
|
'messagelimit' => _('Message limit (public)'),
|
||||||
@ -343,6 +370,7 @@ function route_setup(): void
|
|||||||
'passregex' => _('Password regex'),
|
'passregex' => _('Password regex'),
|
||||||
'externalcss' => _('Link to external CSS file (on your own server)'),
|
'externalcss' => _('Link to external CSS file (on your own server)'),
|
||||||
'metadescription' => _('Meta description (best 50 - 160 characters for SEO)'),
|
'metadescription' => _('Meta description (best 50 - 160 characters for SEO)'),
|
||||||
|
'exitingtxt' => _('Show this text when a user\'s logout is delayed'),
|
||||||
'sysmessagetxt' => _('Prepend this text to system messages'),
|
'sysmessagetxt' => _('Prepend this text to system messages'),
|
||||||
];
|
];
|
||||||
$extra_settings=[
|
$extra_settings=[
|
||||||
@ -657,6 +685,45 @@ function send_captcha(): void
|
|||||||
imagesetpixel($im, mt_rand(0, 55), mt_rand(0, 24), $dots);
|
imagesetpixel($im, mt_rand(0, 55), mt_rand(0, 24), $dots);
|
||||||
}
|
}
|
||||||
echo '<img alt="" width="55" height="24" src="data:image/gif;base64,';
|
echo '<img alt="" width="55" height="24" src="data:image/gif;base64,';
|
||||||
|
}elseif($difficulty===3){
|
||||||
|
$im=imagecreatetruecolor(55, 24);
|
||||||
|
$bg=imagecolorallocatealpha($im, 0, 0, 0, 127);
|
||||||
|
$fg=imagecolorallocate($im, 255, 255, 255);
|
||||||
|
$cc=imagecolorallocate($im, 200, 200, 200);
|
||||||
|
$cb=imagecolorallocatealpha($im, 0, 0, 0, 127);
|
||||||
|
imagefill($im, 0, 0, $bg);
|
||||||
|
$line=imagecolorallocate($im, 255, 255, 255);
|
||||||
|
$deg=(mt_rand(0,1)*2-1)*mt_rand(10, 20);
|
||||||
|
|
||||||
|
$background=imagecreatetruecolor(120, 80);
|
||||||
|
imagefill($background, 0, 0, $cb);
|
||||||
|
|
||||||
|
for ($i=0; $i<20; $i++) {
|
||||||
|
$char=imagecreatetruecolor(12, 16);
|
||||||
|
imagestring($char, 5, 2, 2, $captchachars[mt_rand(0, $length)], $cc);
|
||||||
|
$char = imagerotate($char, (mt_rand(0,1)*2-1)*mt_rand(10, 20), $cb);
|
||||||
|
$char = imagescale($char, 24, 32);
|
||||||
|
imagefilter($char, IMG_FILTER_SMOOTH, 0.6);
|
||||||
|
imagecopy($background, $char, rand(0, 100), rand(0, 60), 0, 0, 24, 32);
|
||||||
|
}
|
||||||
|
|
||||||
|
imagestring($im, 5, 5, 5, $code, $fg);
|
||||||
|
$im = imagescale($im, 110, 48);
|
||||||
|
imagefilter($im, IMG_FILTER_SMOOTH, 0.5);
|
||||||
|
imagefilter($im, IMG_FILTER_GAUSSIAN_BLUR);
|
||||||
|
$im = imagerotate($im, $deg, $bg);
|
||||||
|
$im = imagecrop($im, array('x'=>0, 'y'=>0, 'width'=>120, 'height'=>80));
|
||||||
|
imagecopy($background, $im, 0, 0, 0, 0, 110, 80);
|
||||||
|
imagedestroy($im);
|
||||||
|
$im = $background;
|
||||||
|
|
||||||
|
for($i=0;$i<1000;++$i){
|
||||||
|
$c = mt_rand(100,230);
|
||||||
|
$dots=imagecolorallocate($im, $c, $c, $c);
|
||||||
|
imagesetpixel($im, mt_rand(0, 120), mt_rand(0, 80), $dots);
|
||||||
|
}
|
||||||
|
imagedestroy($char);
|
||||||
|
echo '<img width="120" height="80" src="data:image/png;base64,';
|
||||||
}else{
|
}else{
|
||||||
$im=imagecreatetruecolor(150, 200);
|
$im=imagecreatetruecolor(150, 200);
|
||||||
$bg=imagecolorallocate($im, 0, 0, 0);
|
$bg=imagecolorallocate($im, 0, 0, 0);
|
||||||
@ -855,6 +922,11 @@ function send_setup(array $C): void
|
|||||||
if($captcha===3){
|
if($captcha===3){
|
||||||
echo ' selected';
|
echo ' selected';
|
||||||
}
|
}
|
||||||
|
echo '>'._('Hard').'</option>';
|
||||||
|
echo '<option value="4"';
|
||||||
|
if($captcha===4){
|
||||||
|
echo ' selected';
|
||||||
|
}
|
||||||
echo '>'._('Extreme').'</option>';
|
echo '>'._('Extreme').'</option>';
|
||||||
echo '</select></td></tr>';
|
echo '</select></td></tr>';
|
||||||
}
|
}
|
||||||
@ -1622,7 +1694,7 @@ function send_linkfilter(string $arg=''): void
|
|||||||
echo form('admin', 'linkfilter').hidden('id', $filter['id']);
|
echo form('admin', 'linkfilter').hidden('id', $filter['id']);
|
||||||
echo '<table><tr><td>'._('Filter')." $filter[id]:</td>";
|
echo '<table><tr><td>'._('Filter')." $filter[id]:</td>";
|
||||||
echo '<td><input type="text" name="match" value="'.$filter['match'].'" size="20" style="'.$U['style'].'"></td>';
|
echo '<td><input type="text" name="match" value="'.$filter['match'].'" size="20" style="'.$U['style'].'"></td>';
|
||||||
echo '<td><input type="text" name="replace" value="'.htmlspecialchars($filter['replace']).'" size="20" style="'-$U['style'].'"></td>';
|
echo '<td><input type="text" name="replace" value="'.htmlspecialchars($filter['replace']).'" size="20" style="'.$U['style'].'"></td>';
|
||||||
echo '<td><label><input type="checkbox" name="regex" value="1"'.$checked.'>'._('Regex').'</label></td>';
|
echo '<td><label><input type="checkbox" name="regex" value="1"'.$checked.'>'._('Regex').'</label></td>';
|
||||||
echo '<td class="filtersubmit">'.submit(_('Change')).'</td></tr></table></form></td></tr>';
|
echo '<td class="filtersubmit">'.submit(_('Change')).'</td></tr></table></form></td></tr>';
|
||||||
}
|
}
|
||||||
@ -2013,11 +2085,13 @@ function send_post(string $rejected=''): void
|
|||||||
$disablepm=(bool) get_setting('disablepm');
|
$disablepm=(bool) get_setting('disablepm');
|
||||||
if(!$disablepm){
|
if(!$disablepm){
|
||||||
$users=[];
|
$users=[];
|
||||||
$stmt=$db->prepare('SELECT * FROM (SELECT nickname, style, 0 AS offline FROM ' . PREFIX . 'sessions WHERE entry!=0 AND status>0 AND incognito=0 UNION SELECT nickname, style, 1 AS offline FROM ' . PREFIX . 'members WHERE eninbox!=0 AND eninbox<=? AND nickname NOT IN (SELECT nickname FROM ' . PREFIX . 'sessions WHERE incognito=0)) AS t WHERE nickname NOT IN (SELECT ign FROM '. PREFIX . 'ignored WHERE ignby=? UNION SELECT ignby FROM '. PREFIX . 'ignored WHERE ign=?) ORDER BY LOWER(nickname);');
|
$stmt=$db->prepare('SELECT * FROM (SELECT nickname, style, exiting, 0 AS offline FROM ' . PREFIX . 'sessions WHERE entry!=0 AND status>0 AND incognito=0 UNION SELECT nickname, style, 0, 1 AS offline FROM ' . PREFIX . 'members WHERE eninbox!=0 AND eninbox<=? AND nickname NOT IN (SELECT nickname FROM ' . PREFIX . 'sessions WHERE incognito=0)) AS t WHERE nickname NOT IN (SELECT ign FROM '. PREFIX . 'ignored WHERE ignby=? UNION SELECT ignby FROM '. PREFIX . 'ignored WHERE ign=?) ORDER BY LOWER(nickname);');
|
||||||
$stmt->execute([$U['status'], $U['nickname'], $U['nickname']]);
|
$stmt->execute([$U['status'], $U['nickname'], $U['nickname']]);
|
||||||
while($tmp=$stmt->fetch(PDO::FETCH_ASSOC)){
|
while($tmp=$stmt->fetch(PDO::FETCH_ASSOC)){
|
||||||
if($tmp['offline']){
|
if($tmp['offline']){
|
||||||
$users[]=["$tmp[nickname] "._('(offline)'), $tmp['style'], $tmp['nickname']];
|
$users[]=["$tmp[nickname] "._('(offline)'), $tmp['style'], $tmp['nickname']];
|
||||||
|
}elseif($tmp['exiting']){
|
||||||
|
$users[]=["$tmp[nickname] "._('(logging out)'), $tmp['style'], $tmp['nickname']];
|
||||||
}else{
|
}else{
|
||||||
$users[]=[$tmp['nickname'], $tmp['style'], $tmp['nickname']];
|
$users[]=[$tmp['nickname'], $tmp['style'], $tmp['nickname']];
|
||||||
}
|
}
|
||||||
@ -2206,10 +2280,10 @@ function send_profile(string $arg=''): void
|
|||||||
'hidechatters' => _('Hide list of chatters'),
|
'hidechatters' => _('Hide list of chatters'),
|
||||||
];
|
];
|
||||||
if(get_setting('imgembed')){
|
if(get_setting('imgembed')){
|
||||||
$bool_settings[]='embed';
|
$bool_settings['embed'] = _('Embed images');
|
||||||
}
|
}
|
||||||
if($U['status']>=5 && get_setting('incognito')){
|
if($U['status']>=5 && get_setting('incognito')){
|
||||||
$bool_settings[]='incognito';
|
$bool_settings['incognito'] = _('Incognito mode');
|
||||||
}
|
}
|
||||||
foreach($bool_settings as $setting => $title){
|
foreach($bool_settings as $setting => $title){
|
||||||
echo "<tr><td><table id=\"$setting\"><tr><th>".$title.'</th><td>';
|
echo "<tr><td><table id=\"$setting\"><tr><th>".$title.'</th><td>';
|
||||||
@ -2507,7 +2581,7 @@ function print_chatters(): void
|
|||||||
global $U, $db, $language;
|
global $U, $db, $language;
|
||||||
if(!$U['hidechatters']){
|
if(!$U['hidechatters']){
|
||||||
echo '<div id="chatters"><table><tr>';
|
echo '<div id="chatters"><table><tr>';
|
||||||
$stmt=$db->prepare('SELECT nickname, style, status FROM ' . PREFIX . 'sessions WHERE entry!=0 AND status>0 AND incognito=0 AND nickname NOT IN (SELECT ign FROM '. PREFIX . 'ignored WHERE ignby=? UNION SELECT ignby FROM '. PREFIX . 'ignored WHERE ign=?) ORDER BY status DESC, lastpost DESC;');
|
$stmt=$db->prepare('SELECT nickname, style, status, exiting FROM ' . PREFIX . 'sessions WHERE entry!=0 AND status>0 AND incognito=0 AND nickname NOT IN (SELECT ign FROM '. PREFIX . 'ignored WHERE ignby=? UNION SELECT ignby FROM '. PREFIX . 'ignored WHERE ign=?) ORDER BY status DESC, lastpost DESC;');
|
||||||
$stmt->execute([$U['nickname'], $U['nickname']]);
|
$stmt->execute([$U['nickname'], $U['nickname']]);
|
||||||
$nc=substr(time(), -6);
|
$nc=substr(time(), -6);
|
||||||
$G=$M=$S=$A=[];
|
$G=$M=$S=$A=[];
|
||||||
@ -2515,6 +2589,9 @@ function print_chatters(): void
|
|||||||
$nicklink="<a class=\"nicklink\" href=\"$_SERVER[SCRIPT_NAME]?action=post&session=$U[session]&lang=$language&nc=$nc&sendto=";
|
$nicklink="<a class=\"nicklink\" href=\"$_SERVER[SCRIPT_NAME]?action=post&session=$U[session]&lang=$language&nc=$nc&sendto=";
|
||||||
while($user=$stmt->fetch(PDO::FETCH_NUM)){
|
while($user=$stmt->fetch(PDO::FETCH_NUM)){
|
||||||
$link=$nicklink.urlencode($user[0]).'" target="post">'.style_this(htmlspecialchars($user[0]), $user[1]).'</a>';
|
$link=$nicklink.urlencode($user[0]).'" target="post">'.style_this(htmlspecialchars($user[0]), $user[1]).'</a>';
|
||||||
|
if ($user[3]>0) {
|
||||||
|
$link .= '<span class="sysmsg" title="'._('logging out').'">'.get_setting('exitingtxt').'</span>';
|
||||||
|
}
|
||||||
if($user[2]<3){ // guest or superguest
|
if($user[2]<3){ // guest or superguest
|
||||||
$G[]=$link;
|
$G[]=$link;
|
||||||
} elseif($user[2]>=7){ // admin or superadmin
|
} elseif($user[2]>=7){ // admin or superadmin
|
||||||
@ -2575,6 +2652,7 @@ function create_session(bool $setup, string $nickname, string $password): void
|
|||||||
send_error(_('Wrong global Password!'));
|
send_error(_('Wrong global Password!'));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
$U['exiting']=0;
|
||||||
try {
|
try {
|
||||||
$U[ 'postid' ] = bin2hex( random_bytes( 3 ) );
|
$U[ 'postid' ] = bin2hex( random_bytes( 3 ) );
|
||||||
} catch(Exception $e) {
|
} catch(Exception $e) {
|
||||||
@ -2673,8 +2751,8 @@ function write_new_session(string $password): void
|
|||||||
}else{
|
}else{
|
||||||
$ip='';
|
$ip='';
|
||||||
}
|
}
|
||||||
$stmt=$db->prepare('INSERT INTO ' . PREFIX . 'sessions (session, nickname, status, refresh, style, lastpost, passhash, useragent, bgcolour, entry, timestamps, embed, incognito, ip, nocache, tz, eninbox, sortupdown, hidechatters, nocache_old, postid) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);');
|
$stmt=$db->prepare('INSERT INTO ' . PREFIX . 'sessions (session, nickname, status, refresh, style, lastpost, passhash, useragent, bgcolour, entry, exiting, timestamps, embed, incognito, ip, nocache, tz, eninbox, sortupdown, hidechatters, nocache_old, postid) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);');
|
||||||
$stmt->execute([$U['session'], $U['nickname'], $U['status'], $U['refresh'], $U['style'], $U['lastpost'], $U['passhash'], $useragent, $U['bgcolour'], $U['entry'], $U['timestamps'], $U['embed'], $U['incognito'], $ip, $U['nocache'], $U['tz'], $U['eninbox'], $U['sortupdown'], $U['hidechatters'], $U['nocache_old'], $U['postid']]);
|
$stmt->execute([$U['session'], $U['nickname'], $U['status'], $U['refresh'], $U['style'], $U['lastpost'], $U['passhash'], $useragent, $U['bgcolour'], $U['entry'], $U['exiting'], $U['timestamps'], $U['embed'], $U['incognito'], $ip, $U['nocache'], $U['tz'], $U['eninbox'], $U['sortupdown'], $U['hidechatters'], $U['nocache_old'], $U['postid']]);
|
||||||
$session = $U['session'];
|
$session = $U['session'];
|
||||||
set_secure_cookie(COOKIENAME, $U['session']);
|
set_secure_cookie(COOKIENAME, $U['session']);
|
||||||
if($U['status']>=3 && !$U['incognito']){
|
if($U['status']>=3 && !$U['incognito']){
|
||||||
@ -2731,10 +2809,14 @@ function approve_session(): void
|
|||||||
|
|
||||||
function check_login(): void
|
function check_login(): void
|
||||||
{
|
{
|
||||||
global $U;
|
global $U, $db;
|
||||||
$ga=(int) get_setting('guestaccess');
|
$ga=(int) get_setting('guestaccess');
|
||||||
parse_sessions();
|
parse_sessions();
|
||||||
if(isset($U['session'])){
|
if(isset($U['session'])){
|
||||||
|
if($U['exiting']==1){
|
||||||
|
$stmt=$db->prepare('UPDATE ' . PREFIX . 'sessions SET exiting=0 WHERE session=? LIMIT 1;');
|
||||||
|
$stmt->execute([$U['session']]);
|
||||||
|
}
|
||||||
check_kicked();
|
check_kicked();
|
||||||
}elseif(get_setting('englobalpass')==1 && (!isset($_POST['globalpass']) || $_POST['globalpass']!=get_setting('globalpass'))){
|
}elseif(get_setting('englobalpass')==1 && (!isset($_POST['globalpass']) || $_POST['globalpass']!=get_setting('globalpass'))){
|
||||||
send_error(_('Wrong global Password!'));
|
send_error(_('Wrong global Password!'));
|
||||||
@ -2784,11 +2866,14 @@ function kill_session(): void
|
|||||||
function kick_chatter(array $names, string $mes, bool $purge) : bool {
|
function kick_chatter(array $names, string $mes, bool $purge) : bool {
|
||||||
global $U, $db;
|
global $U, $db;
|
||||||
$lonick='';
|
$lonick='';
|
||||||
|
if (strlen($mes)<1){
|
||||||
|
$mes=_("no kick message");
|
||||||
|
}
|
||||||
$time=60*(get_setting('kickpenalty')-get_setting('guestexpire'))+time();
|
$time=60*(get_setting('kickpenalty')-get_setting('guestexpire'))+time();
|
||||||
$check=$db->prepare('SELECT style, entry FROM ' . PREFIX . 'sessions WHERE nickname=? AND status!=0 AND (status<? OR nickname=?);');
|
$check=$db->prepare('SELECT style, entry FROM ' . PREFIX . 'sessions WHERE nickname=? AND status!=0 AND (status<? OR nickname=?);');
|
||||||
$stmt=$db->prepare('UPDATE ' . PREFIX . 'sessions SET lastpost=?, status=0, kickmessage=? WHERE nickname=?;');
|
$stmt=$db->prepare('UPDATE ' . PREFIX . 'sessions SET lastpost=?, status=0, kickmessage=? WHERE nickname=?;');
|
||||||
$all=false;
|
$all=false;
|
||||||
if($names[0]==='s _'){
|
if($names[0]==='s *'){
|
||||||
$tmp=$db->query('SELECT nickname FROM ' . PREFIX . 'sessions WHERE status=1;');
|
$tmp=$db->query('SELECT nickname FROM ' . PREFIX . 'sessions WHERE status=1;');
|
||||||
$names=[];
|
$names=[];
|
||||||
while($name=$tmp->fetch(PDO::FETCH_NUM)){
|
while($name=$tmp->fetch(PDO::FETCH_NUM)){
|
||||||
@ -2810,13 +2895,13 @@ function kick_chatter(array $names, string $mes, bool $purge) : bool {
|
|||||||
}
|
}
|
||||||
if($i>0){
|
if($i>0){
|
||||||
if($all){
|
if($all){
|
||||||
add_system_message(get_setting('msgallkick'), $U['nickname']);
|
add_system_message(sprintf(get_setting('msgallkick'), $mes), $U['nickname']);
|
||||||
}else{
|
}else{
|
||||||
$lonick=substr($lonick, 0, -2);
|
$lonick=substr($lonick, 0, -2);
|
||||||
if($i>1){
|
if($i>1){
|
||||||
add_system_message(sprintf(get_setting('msgmultikick'), $lonick), $U['nickname']);
|
add_system_message(sprintf(get_setting('msgmultikick'), $lonick, $mes), $U['nickname']);
|
||||||
}else{
|
}else{
|
||||||
add_system_message(sprintf(get_setting('msgkick'), $lonick), $U['nickname']);
|
add_system_message(sprintf(get_setting('msgkick'), $lonick, $mes), $U['nickname']);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
@ -2828,7 +2913,7 @@ function logout_chatter(array $names): void
|
|||||||
{
|
{
|
||||||
global $U, $db;
|
global $U, $db;
|
||||||
$stmt=$db->prepare('DELETE FROM ' . PREFIX . 'sessions WHERE nickname=? AND status<?;');
|
$stmt=$db->prepare('DELETE FROM ' . PREFIX . 'sessions WHERE nickname=? AND status<?;');
|
||||||
if($names[0]==='s _'){
|
if($names[0]==='s *'){
|
||||||
$tmp=$db->query('SELECT nickname FROM ' . PREFIX . 'sessions WHERE status=1;');
|
$tmp=$db->query('SELECT nickname FROM ' . PREFIX . 'sessions WHERE status=1;');
|
||||||
$names=[];
|
$names=[];
|
||||||
while($name=$tmp->fetch(PDO::FETCH_NUM)){
|
while($name=$tmp->fetch(PDO::FETCH_NUM)){
|
||||||
@ -3260,6 +3345,7 @@ function add_user_defaults(string $password): void
|
|||||||
$U['hidechatters']=get_setting('hidechatters');
|
$U['hidechatters']=get_setting('hidechatters');
|
||||||
$U['passhash']=password_hash($password, PASSWORD_DEFAULT);
|
$U['passhash']=password_hash($password, PASSWORD_DEFAULT);
|
||||||
$U['entry']=$U['lastpost']=time();
|
$U['entry']=$U['lastpost']=time();
|
||||||
|
$U['exiting']=0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// message handling
|
// message handling
|
||||||
@ -4000,8 +4086,8 @@ function cron(): void
|
|||||||
}
|
}
|
||||||
update_setting('nextcron', $time+10);
|
update_setting('nextcron', $time+10);
|
||||||
// delete old sessions
|
// delete old sessions
|
||||||
$stmt=$db->prepare('DELETE FROM ' . PREFIX . 'sessions WHERE (status<=2 AND lastpost<(?-60*(SELECT value FROM ' . PREFIX . "settings WHERE setting='guestexpire'))) OR (status>2 AND lastpost<(?-60*(SELECT value FROM " . PREFIX . "settings WHERE setting='memberexpire')));");
|
$stmt=$db->prepare('DELETE FROM ' . PREFIX . 'sessions WHERE (status<=2 AND lastpost<(?-60*(SELECT value FROM ' . PREFIX . "settings WHERE setting='guestexpire'))) OR (status>2 AND lastpost<(?-60*(SELECT value FROM " . PREFIX . "settings WHERE setting='memberexpire'))) OR (status<3 AND exiting>0 AND lastpost<(?-(SELECT value FROM " . PREFIX . "settings WHERE setting='exitwait')));");
|
||||||
$stmt->execute([$time, $time]);
|
$stmt->execute([$time, $time, $time]);
|
||||||
// delete old messages
|
// delete old messages
|
||||||
$limit=get_setting('messagelimit');
|
$limit=get_setting('messagelimit');
|
||||||
$stmt=$db->query('SELECT id FROM ' . PREFIX . "messages WHERE poststatus=1 OR poststatus=4 ORDER BY id DESC LIMIT 1 OFFSET $limit;");
|
$stmt=$db->query('SELECT id FROM ' . PREFIX . "messages WHERE poststatus=1 OR poststatus=4 ORDER BY id DESC LIMIT 1 OFFSET $limit;");
|
||||||
@ -4146,7 +4232,7 @@ function init_chat(): void
|
|||||||
$db->exec('CREATE TABLE ' . PREFIX . "notes (id $primary, type smallint NOT NULL, lastedited integer NOT NULL, editedby varchar(50) NOT NULL, text text NOT NULL)$diskengine$charset;");
|
$db->exec('CREATE TABLE ' . PREFIX . "notes (id $primary, type smallint NOT NULL, lastedited integer NOT NULL, editedby varchar(50) NOT NULL, text text NOT NULL)$diskengine$charset;");
|
||||||
$db->exec('CREATE INDEX ' . PREFIX . 'notes_type ON ' . PREFIX . 'notes(type);');
|
$db->exec('CREATE INDEX ' . PREFIX . 'notes_type ON ' . PREFIX . 'notes(type);');
|
||||||
$db->exec('CREATE INDEX ' . PREFIX . 'notes_editedby ON ' . PREFIX . 'notes(editedby);');
|
$db->exec('CREATE INDEX ' . PREFIX . 'notes_editedby ON ' . PREFIX . 'notes(editedby);');
|
||||||
$db->exec('CREATE TABLE ' . PREFIX . "sessions (id $primary, session char(32) NOT NULL UNIQUE, nickname varchar(50) NOT NULL UNIQUE, status smallint NOT NULL, refresh smallint NOT NULL, style varchar(255) NOT NULL, lastpost integer NOT NULL, passhash varchar(255) NOT NULL, postid char(6) NOT NULL DEFAULT '000000', useragent varchar(255) NOT NULL, kickmessage varchar(255) DEFAULT '', bgcolour char(6) NOT NULL, entry integer NOT NULL, timestamps smallint NOT NULL, embed smallint NOT NULL, incognito smallint NOT NULL, ip varchar(45) NOT NULL, nocache smallint NOT NULL, tz varchar(255) NOT NULL, eninbox smallint NOT NULL, sortupdown smallint NOT NULL, hidechatters smallint NOT NULL, nocache_old smallint NOT NULL)$memengine$charset;");
|
$db->exec('CREATE TABLE ' . PREFIX . "sessions (id $primary, session char(32) NOT NULL UNIQUE, nickname varchar(50) NOT NULL UNIQUE, status smallint NOT NULL, refresh smallint NOT NULL, style varchar(255) NOT NULL, lastpost integer NOT NULL, passhash varchar(255) NOT NULL, postid char(6) NOT NULL DEFAULT '000000', useragent varchar(255) NOT NULL, kickmessage varchar(255) DEFAULT '', bgcolour char(6) NOT NULL, entry integer NOT NULL, exiting smallint NOT NULL, timestamps smallint NOT NULL, embed smallint NOT NULL, incognito smallint NOT NULL, ip varchar(45) NOT NULL, nocache smallint NOT NULL, tz varchar(255) NOT NULL, eninbox smallint NOT NULL, sortupdown smallint NOT NULL, hidechatters smallint NOT NULL, nocache_old smallint NOT NULL)$memengine$charset;");
|
||||||
$db->exec('CREATE INDEX ' . PREFIX . 'status ON ' . PREFIX . 'sessions(status);');
|
$db->exec('CREATE INDEX ' . PREFIX . 'status ON ' . PREFIX . 'sessions(status);');
|
||||||
$db->exec('CREATE INDEX ' . PREFIX . 'lastpost ON ' . PREFIX . 'sessions(lastpost);');
|
$db->exec('CREATE INDEX ' . PREFIX . 'lastpost ON ' . PREFIX . 'sessions(lastpost);');
|
||||||
$db->exec('CREATE INDEX ' . PREFIX . 'incognito ON ' . PREFIX . 'sessions(incognito);');
|
$db->exec('CREATE INDEX ' . PREFIX . 'incognito ON ' . PREFIX . 'sessions(incognito);');
|
||||||
@ -4166,6 +4252,7 @@ function init_chat(): void
|
|||||||
['guestexpire', '15'],
|
['guestexpire', '15'],
|
||||||
['kickpenalty', '10'],
|
['kickpenalty', '10'],
|
||||||
['entrywait', '120'],
|
['entrywait', '120'],
|
||||||
|
['exitwait', '180'],
|
||||||
['messageexpire', '14400'],
|
['messageexpire', '14400'],
|
||||||
['messagelimit', '150'],
|
['messagelimit', '150'],
|
||||||
['maxmessage', 2000],
|
['maxmessage', 2000],
|
||||||
@ -4198,9 +4285,9 @@ function init_chat(): void
|
|||||||
['msgexit', _('%s left the chat.')],
|
['msgexit', _('%s left the chat.')],
|
||||||
['msgmemreg', _('%s is now a registered member.')],
|
['msgmemreg', _('%s is now a registered member.')],
|
||||||
['msgsureg', _('%s is now a registered applicant.')],
|
['msgsureg', _('%s is now a registered applicant.')],
|
||||||
['msgkick', _('%s has been kicked.')],
|
['msgkick', _('%1$s has been kicked: %2$s')],
|
||||||
['msgmultikick', _('%s have been kicked.')],
|
['msgmultikick', _('%1$s have been kicked: %2$s')],
|
||||||
['msgallkick', _('All guests have been kicked.')],
|
['msgallkick', _('All guests have been kicked: %1$s')],
|
||||||
['msgclean', _('%s has been cleaned.')],
|
['msgclean', _('%s has been cleaned.')],
|
||||||
['numnotes', '3'],
|
['numnotes', '3'],
|
||||||
['mailsender', 'www-data <www-data@localhost>'],
|
['mailsender', 'www-data <www-data@localhost>'],
|
||||||
@ -4226,6 +4313,7 @@ function init_chat(): void
|
|||||||
['publicnotes', '1'],
|
['publicnotes', '1'],
|
||||||
['filtermodkick', '0'],
|
['filtermodkick', '0'],
|
||||||
['metadescription', _('A chat community')],
|
['metadescription', _('A chat community')],
|
||||||
|
['exitingtxt', '🚪'], // door emoji
|
||||||
['sysmessagetxt', 'ℹ️ '],
|
['sysmessagetxt', 'ℹ️ '],
|
||||||
['hide_reload_post_box', '0'],
|
['hide_reload_post_box', '0'],
|
||||||
['hide_reload_messages', '0'],
|
['hide_reload_messages', '0'],
|
||||||
@ -4339,7 +4427,7 @@ function update_db(): void
|
|||||||
$db->exec('INSERT INTO ' . PREFIX . "settings (setting, value) VALUES ('css', ''), ('memberexpire', '60'), ('guestexpire', '15'), ('kickpenalty', '10'), ('entrywait', '120'), ('messageexpire', '14400'), ('messagelimit', '150'), ('maxmessage', 2000), ('captchatime', '600');");
|
$db->exec('INSERT INTO ' . PREFIX . "settings (setting, value) VALUES ('css', ''), ('memberexpire', '60'), ('guestexpire', '15'), ('kickpenalty', '10'), ('entrywait', '120'), ('messageexpire', '14400'), ('messagelimit', '150'), ('maxmessage', 2000), ('captchatime', '600');");
|
||||||
}
|
}
|
||||||
if($dbversion<11){
|
if($dbversion<11){
|
||||||
$db->exec('ALTER TABLE ' , PREFIX . 'captcha CHARACTER SET utf8 COLLATE utf8_bin;');
|
$db->exec('ALTER TABLE ' . PREFIX . 'captcha CHARACTER SET utf8 COLLATE utf8_bin;');
|
||||||
$db->exec('ALTER TABLE ' . PREFIX . 'filter CHARACTER SET utf8 COLLATE utf8_bin;');
|
$db->exec('ALTER TABLE ' . PREFIX . 'filter CHARACTER SET utf8 COLLATE utf8_bin;');
|
||||||
$db->exec('ALTER TABLE ' . PREFIX . 'ignored CHARACTER SET utf8 COLLATE utf8_bin;');
|
$db->exec('ALTER TABLE ' . PREFIX . 'ignored CHARACTER SET utf8 COLLATE utf8_bin;');
|
||||||
$db->exec('ALTER TABLE ' . PREFIX . 'messages CHARACTER SET utf8 COLLATE utf8_bin;');
|
$db->exec('ALTER TABLE ' . PREFIX . 'messages CHARACTER SET utf8 COLLATE utf8_bin;');
|
||||||
@ -4375,7 +4463,7 @@ function update_db(): void
|
|||||||
$db->exec('ALTER TABLE ' . PREFIX . 'notes MODIFY type char(5) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL, MODIFY editedby varchar(50) NOT NULL, MODIFY text varchar(20000) NOT NULL;');
|
$db->exec('ALTER TABLE ' . PREFIX . 'notes MODIFY type char(5) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL, MODIFY editedby varchar(50) NOT NULL, MODIFY text varchar(20000) NOT NULL;');
|
||||||
$db->exec('ALTER TABLE ' . PREFIX . 'settings MODIFY id integer unsigned NOT NULL, MODIFY setting varchar(50) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL, MODIFY value varchar(20000) NOT NULL;');
|
$db->exec('ALTER TABLE ' . PREFIX . 'settings MODIFY id integer unsigned NOT NULL, MODIFY setting varchar(50) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL, MODIFY value varchar(20000) NOT NULL;');
|
||||||
$db->exec('ALTER TABLE ' . PREFIX . 'settings DROP PRIMARY KEY, DROP id, ADD PRIMARY KEY(setting);');
|
$db->exec('ALTER TABLE ' . PREFIX . 'settings DROP PRIMARY KEY, DROP id, ADD PRIMARY KEY(setting);');
|
||||||
$stmt = $db->exec('INSERT INTO ' . PREFIX . "settings (setting, value) VALUES ('chatname', 'My Chat'), ('topic', ''), ('msgsendall', ?), ('msgsendmem', ?), ('msgsendmod', ?), ('msgsendadm', ?), ('msgsendprv', ?), ('numnotes', '3');");
|
$stmt = $db->prepare('INSERT INTO ' . PREFIX . "settings (setting, value) VALUES ('chatname', 'My Chat'), ('topic', ''), ('msgsendall', ?), ('msgsendmem', ?), ('msgsendmod', ?), ('msgsendadm', ?), ('msgsendprv', ?), ('numnotes', '3');");
|
||||||
$stmt->execute([_('%s - '), _('[M] %s - '), _('[Staff] %s - '), _('[Admin] %s - '), _('[%1$s to %2$s] - ')]);
|
$stmt->execute([_('%s - '), _('[M] %s - '), _('[Staff] %s - '), _('[Admin] %s - '), _('[%1$s to %2$s] - ')]);
|
||||||
}
|
}
|
||||||
if($dbversion<13){
|
if($dbversion<13){
|
||||||
@ -4615,6 +4703,10 @@ function update_db(): void
|
|||||||
if($dbversion<47){
|
if($dbversion<47){
|
||||||
$db->exec('INSERT INTO ' . PREFIX . "settings (setting,value) VALUES ('hide_reload_post_box', '0'), ('hide_reload_messages', '0'),('hide_profile', '0'),('hide_admin', '0'),('hide_notes', '0'),('hide_clone', '0'),('hide_rearrange', '0'),('hide_help', '0'),('max_refresh_rate', '150'),('min_refresh_rate', '5'),('postbox_delete_globally', '0'),('allow_js', '1');");
|
$db->exec('INSERT INTO ' . PREFIX . "settings (setting,value) VALUES ('hide_reload_post_box', '0'), ('hide_reload_messages', '0'),('hide_profile', '0'),('hide_admin', '0'),('hide_notes', '0'),('hide_clone', '0'),('hide_rearrange', '0'),('hide_help', '0'),('max_refresh_rate', '150'),('min_refresh_rate', '5'),('postbox_delete_globally', '0'),('allow_js', '1');");
|
||||||
}
|
}
|
||||||
|
if($dbversion<48){
|
||||||
|
$db->exec('INSERT INTO ' . PREFIX . "settings (setting, value) VALUES ('exitwait', '180'), ('exitingtxt', ' 🚪"); // door emoji
|
||||||
|
$db->exec('ALTER TABLE ' . PREFIX . 'sessions ADD COLUMN exiting smallint NOT NULL DEFAULT 0;');
|
||||||
|
}
|
||||||
update_setting('dbversion', DBVERSION);
|
update_setting('dbversion', DBVERSION);
|
||||||
if($msgencrypted!==MSGENCRYPTED){
|
if($msgencrypted!==MSGENCRYPTED){
|
||||||
if(!extension_loaded('sodium')){
|
if(!extension_loaded('sodium')){
|
||||||
@ -4785,7 +4877,7 @@ function load_lang(): void
|
|||||||
$locale = LANGUAGES[$_COOKIE['language']]['locale'];
|
$locale = LANGUAGES[$_COOKIE['language']]['locale'];
|
||||||
$language = $_COOKIE['language'];
|
$language = $_COOKIE['language'];
|
||||||
$dir = LANGUAGES[$_COOKIE['language']]['dir'];
|
$dir = LANGUAGES[$_COOKIE['language']]['dir'];
|
||||||
}elseif(!empty($_SERVER['HTTP_ACCEPT_LANGUAGE'])){
|
}elseif(!empty($_SERVER['HTTP_ACCEPT_LANGUAGE']) && extension_loaded('intl')){
|
||||||
$prefLocales = array_reduce(
|
$prefLocales = array_reduce(
|
||||||
explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']),
|
explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']),
|
||||||
function (array $res, string $el) {
|
function (array $res, string $el) {
|
||||||
@ -4805,13 +4897,19 @@ function load_lang(): void
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if(function_exists('putenv')) {
|
||||||
|
putenv('LC_ALL='.$locale);
|
||||||
|
}
|
||||||
|
setlocale(LC_ALL, $locale);
|
||||||
|
bindtextdomain('le-chat-php', __DIR__.'/locale');
|
||||||
|
bind_textdomain_codeset('le-chat-php', 'UTF-8');
|
||||||
|
textdomain('le-chat-php');
|
||||||
}
|
}
|
||||||
|
|
||||||
function load_config(): void
|
function load_config(): void
|
||||||
{
|
{
|
||||||
mb_internal_encoding('UTF-8');
|
|
||||||
define('VERSION', '1.24.1'); // Script version
|
define('VERSION', '1.24.1'); // Script version
|
||||||
define('DBVERSION', 47); // Database layout version
|
define('DBVERSION', 48); // Database layout version
|
||||||
define('MSGENCRYPTED', false); // Store messages encrypted in the database to prevent other database users from reading them - true/false - visit the setup page after editing!
|
define('MSGENCRYPTED', false); // Store messages encrypted in the database to prevent other database users from reading them - true/false - visit the setup page after editing!
|
||||||
define('ENCRYPTKEY_PASS', 'MY_SECRET_KEY'); // Recommended length: 32. Encryption key for messages
|
define('ENCRYPTKEY_PASS', 'MY_SECRET_KEY'); // Recommended length: 32. Encryption key for messages
|
||||||
define('AES_IV_PASS', '012345678912'); // Recommended length: 12. AES Encryption IV
|
define('AES_IV_PASS', '012345678912'); // Recommended length: 12. AES Encryption IV
|
||||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
BIN
locale/ja/LC_MESSAGES/le-chat-php.mo
Normal file
BIN
locale/ja/LC_MESSAGES/le-chat-php.mo
Normal file
Binary file not shown.
1719
locale/ja/LC_MESSAGES/le-chat-php.po
Normal file
1719
locale/ja/LC_MESSAGES/le-chat-php.po
Normal file
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user