warn about failed login attempts

This commit is contained in:
basefont
2021-03-13 15:31:34 +00:00
parent a3be33ddbc
commit 5c88e6832c
14 changed files with 54 additions and 6 deletions

View File

@ -81,6 +81,7 @@ function route(){
send_post(); send_post();
}elseif($_REQUEST['action']==='login'){ }elseif($_REQUEST['action']==='login'){
check_login(); check_login();
show_fails();
send_frameset(); send_frameset();
}elseif($_REQUEST['action']==='controls'){ }elseif($_REQUEST['action']==='controls'){
check_session(); check_session();
@ -769,7 +770,7 @@ function restore_backup(array $C){
if(isset($_POST['members']) && isset($code['members'])){ if(isset($_POST['members']) && isset($code['members'])){
$db->exec('DELETE FROM ' . PREFIX . 'inbox;'); $db->exec('DELETE FROM ' . PREFIX . 'inbox;');
$db->exec('DELETE FROM ' . PREFIX . 'members;'); $db->exec('DELETE FROM ' . PREFIX . 'members;');
$stmt=$db->prepare('INSERT INTO ' . PREFIX . 'members (nickname, passhash, status, refresh, bgcolour, regedby, lastlogin, timestamps, embed, incognito, style, nocache, tz, eninbox, sortupdown, hidechatters, nocache_old) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);'); $stmt=$db->prepare('INSERT INTO ' . PREFIX . 'members (nickname, passhash, status, refresh, bgcolour, regedby, lastlogin, loginfails, timestamps, embed, incognito, style, nocache, tz, eninbox, sortupdown, hidechatters, nocache_old) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);');
foreach($code['members'] as $member){ foreach($code['members'] as $member){
$new_settings=['nocache', 'tz', 'eninbox', 'sortupdown', 'hidechatters', 'nocache_old']; $new_settings=['nocache', 'tz', 'eninbox', 'sortupdown', 'hidechatters', 'nocache_old'];
foreach($new_settings as $setting){ foreach($new_settings as $setting){
@ -777,7 +778,7 @@ function restore_backup(array $C){
$member[$setting]=0; $member[$setting]=0;
} }
} }
$stmt->execute([$member['nickname'], $member['passhash'], $member['status'], $member['refresh'], $member['bgcolour'], $member['regedby'], $member['lastlogin'], $member['timestamps'], $member['embed'], $member['incognito'], $member['style'], $member['nocache'], $member['tz'], $member['eninbox'], $member['sortupdown'], $member['hidechatters'], $member['nocache_old']]); $stmt->execute([$member['nickname'], $member['passhash'], $member['status'], $member['refresh'], $member['bgcolour'], $member['regedby'], $member['lastlogin'], $member['loginfails'], $member['timestamps'], $member['embed'], $member['incognito'], $member['style'], $member['nocache'], $member['tz'], $member['eninbox'], $member['sortupdown'], $member['hidechatters'], $member['nocache_old']]);
} }
} }
if(isset($_POST['notes']) && isset($code['notes'])){ if(isset($_POST['notes']) && isset($code['notes'])){
@ -2437,6 +2438,20 @@ function write_new_session(string $password){
} }
} }
function show_fails() {
global $db, $I, $U;
$stmt=$db->prepare('SELECT * FROM ' . PREFIX . 'members WHERE nickname=?;');
$stmt->execute([$U['nickname']]);
if($U['loginfails']>0){
print_start('failednotice');
echo (int) $U['loginfails']. "&nbsp;" . $I['failednotice']. "<br>";
$stmt=$db->prepare('UPDATE ' . PREFIX . 'members SET loginfails=? WHERE nickname=?;');
$stmt->execute([0, $U['nickname']]);
echo form_target('_blank', 'login').submit($I['dismiss']).'</form></td>';
print_end();
}
}
function approve_session(){ function approve_session(){
global $db; global $db;
if(isset($_POST['what'])){ if(isset($_POST['what'])){
@ -2658,6 +2673,9 @@ function check_member(string $password) : bool {
$stmt->execute([time(), $U['nickname']]); $stmt->execute([time(), $U['nickname']]);
return true; return true;
}else{ }else{
$U=$temp;
$stmt=$db->prepare('UPDATE ' . PREFIX . 'members SET loginfails=? WHERE nickname=?;');
$stmt->execute([$U['loginfails']+1, $U['nickname']]);
send_error("$I[regednick]<br>$I[wrongpass]"); send_error("$I[regednick]<br>$I[wrongpass]");
} }
} }
@ -2967,6 +2985,7 @@ function add_user_defaults(string $password){
}else{ }else{
$U['nocache_old']=1; $U['nocache_old']=1;
} }
$U['loginfails']=0;
$U['tz']=get_setting('defaulttz'); $U['tz']=get_setting('defaulttz');
$U['eninbox']=0; $U['eninbox']=0;
$U['sortupdown']=get_setting('sortupdown'); $U['sortupdown']=get_setting('sortupdown');
@ -3737,7 +3756,7 @@ function init_chat(){
$db->exec('CREATE INDEX ' . PREFIX . 'inbox_poster ON ' . PREFIX . 'inbox(poster);'); $db->exec('CREATE INDEX ' . PREFIX . 'inbox_poster ON ' . PREFIX . 'inbox(poster);');
$db->exec('CREATE INDEX ' . PREFIX . 'inbox_recipient ON ' . PREFIX . 'inbox(recipient);'); $db->exec('CREATE INDEX ' . PREFIX . 'inbox_recipient ON ' . PREFIX . 'inbox(recipient);');
$db->exec('CREATE TABLE ' . PREFIX . "linkfilter (id $primary, filtermatch varchar(255) NOT NULL, filterreplace varchar(255) NOT NULL, regex smallint NOT NULL)$diskengine$charset;"); $db->exec('CREATE TABLE ' . PREFIX . "linkfilter (id $primary, filtermatch varchar(255) NOT NULL, filterreplace varchar(255) NOT NULL, regex smallint NOT NULL)$diskengine$charset;");
$db->exec('CREATE TABLE ' . PREFIX . "members (id $primary, nickname varchar(50) NOT NULL UNIQUE, passhash varchar(255) NOT NULL, status smallint NOT NULL, refresh smallint NOT NULL, bgcolour char(6) NOT NULL, regedby varchar(50) DEFAULT '', lastlogin integer DEFAULT 0, timestamps smallint NOT NULL, embed smallint NOT NULL, incognito smallint NOT NULL, style varchar(255) 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)$diskengine$charset;"); $db->exec('CREATE TABLE ' . PREFIX . "members (id $primary, nickname varchar(50) NOT NULL UNIQUE, passhash varchar(255) NOT NULL, status smallint NOT NULL, refresh smallint NOT NULL, bgcolour char(6) NOT NULL, regedby varchar(50) DEFAULT '', lastlogin integer DEFAULT 0, loginfails integer unsigned NOT NULL DEFAULT 0, timestamps smallint NOT NULL, embed smallint NOT NULL, incognito smallint NOT NULL, style varchar(255) 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)$diskengine$charset;");
$db->exec('ALTER TABLE ' . PREFIX . 'inbox ADD FOREIGN KEY (recipient) REFERENCES ' . PREFIX . 'members(nickname) ON DELETE CASCADE ON UPDATE CASCADE;'); $db->exec('ALTER TABLE ' . PREFIX . 'inbox ADD FOREIGN KEY (recipient) REFERENCES ' . PREFIX . 'members(nickname) ON DELETE CASCADE ON UPDATE CASCADE;');
$db->exec('CREATE TABLE ' . PREFIX . "messages (id $primary, postdate integer NOT NULL, poststatus smallint NOT NULL, poster varchar(50) NOT NULL, recipient varchar(50) NOT NULL, text text NOT NULL, delstatus smallint NOT NULL)$diskengine$charset;"); $db->exec('CREATE TABLE ' . PREFIX . "messages (id $primary, postdate integer NOT NULL, poststatus smallint NOT NULL, poster varchar(50) NOT NULL, recipient varchar(50) NOT NULL, text text NOT NULL, delstatus smallint NOT NULL)$diskengine$charset;");
$db->exec('CREATE INDEX ' . PREFIX . 'poster ON ' . PREFIX . 'messages (poster);'); $db->exec('CREATE INDEX ' . PREFIX . 'poster ON ' . PREFIX . 'messages (poster);');
@ -4082,7 +4101,7 @@ function update_db(){
$data=$result->fetchAll(PDO::FETCH_NUM); $data=$result->fetchAll(PDO::FETCH_NUM);
$db->exec('DROP TABLE ' . PREFIX . 'members;'); $db->exec('DROP TABLE ' . PREFIX . 'members;');
$db->exec('CREATE TABLE ' . PREFIX . "members (id integer PRIMARY KEY AUTO_INCREMENT, nickname varchar(50) NOT NULL UNIQUE, passhash char(32) NOT NULL, status smallint NOT NULL, refresh smallint NOT NULL, bgcolour char(6) NOT NULL, regedby varchar(50) DEFAULT '', lastlogin integer DEFAULT 0, timestamps smallint NOT NULL, embed smallint NOT NULL, incognito smallint NOT NULL, style varchar(255) NOT NULL, nocache smallint NOT NULL, tz smallint NOT NULL, eninbox smallint NOT NULL, sortupdown smallint NOT NULL, hidechatters smallint NOT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;"); $db->exec('CREATE TABLE ' . PREFIX . "members (id integer PRIMARY KEY AUTO_INCREMENT, nickname varchar(50) NOT NULL UNIQUE, passhash char(32) NOT NULL, status smallint NOT NULL, refresh smallint NOT NULL, bgcolour char(6) NOT NULL, regedby varchar(50) DEFAULT '', lastlogin integer DEFAULT 0, timestamps smallint NOT NULL, embed smallint NOT NULL, incognito smallint NOT NULL, style varchar(255) NOT NULL, nocache smallint NOT NULL, tz smallint NOT NULL, eninbox smallint NOT NULL, sortupdown smallint NOT NULL, hidechatters smallint NOT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;");
$stmt=$db->prepare('INSERT INTO ' . PREFIX . 'members (nickname, passhash, status, refresh, bgcolour, regedby, lastlogin, timestamps, embed, incognito, style, nocache, tz, eninbox, sortupdown, hidechatters) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);'); $stmt=$db->prepare('INSERT INTO ' . PREFIX . 'members (nickname, passhash, status, refresh, bgcolour, regedby, lastlogin, loginfails, timestamps, embed, incognito, style, nocache, tz, eninbox, sortupdown, hidechatters) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);');
foreach($data as $tmp){ foreach($data as $tmp){
$stmt->execute($tmp); $stmt->execute($tmp);
} }
@ -4194,6 +4213,9 @@ function update_db(){
if($dbversion<45){ if($dbversion<45){
$db->exec('INSERT INTO ' . PREFIX . "settings (setting,value) VALUES ('memkickalways', '0'), ('sysmessagetxt', ' &nbsp;'),('namedoers', '1');"); $db->exec('INSERT INTO ' . PREFIX . "settings (setting,value) VALUES ('memkickalways', '0'), ('sysmessagetxt', ' &nbsp;'),('namedoers', '1');");
} }
if($dbversion<46){
$db->exec('ALTER TABLE ' . PREFIX . 'members ADD COLUMN loginfails integer unsigned 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')){
@ -4386,7 +4408,7 @@ function load_lang(){
function load_config(){ function load_config(){
mb_internal_encoding('UTF-8'); mb_internal_encoding('UTF-8');
define('VERSION', '1.24.1'); // Script version define('VERSION', '1.24.1'); // Script version
define('DBVERSION', 45); // Database layout version define('DBVERSION', 46); // 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

View File

@ -342,6 +342,8 @@ $T=[
'optional' => '(опционално)', 'optional' => '(опционално)',
'userloggedin' => 'Потребителят с това потребителско име е вече логнат.', 'userloggedin' => 'Потребителят с това потребителско име е вече логнат.',
'regednick' => 'Този ник е на регистриран член.', 'regednick' => 'Този ник е на регистриран член.',
'failednotice' => 'неуспешен опит за влизане',
'dismiss' => 'призна',
'eninbox' => 'Позволи офлайн пощенска кутия', 'eninbox' => 'Позволи офлайн пощенска кутия',
'inboxmsgs' => 'Прочети %d съобщения в пощенската ти кутия', 'inboxmsgs' => 'Прочети %d съобщения в пощенската ти кутия',
'offline' => '(офлайн)', 'offline' => '(офлайн)',

View File

@ -342,6 +342,8 @@ $T=[
'optional' => '(volitelný)', 'optional' => '(volitelný)',
'userloggedin' => 'Uživatel s touto přezdívkou je již přihlášen.', 'userloggedin' => 'Uživatel s touto přezdívkou je již přihlášen.',
'regednick' => 'Tato přezdívka používá registrovaný člen.', 'regednick' => 'Tato přezdívka používá registrovaný člen.',
'failednotice' => 'neúspěšné pokusy o přihlášení',
'dismiss' => 'uznal',
'eninbox' => 'Povolit offline doručenou poštu ', 'eninbox' => 'Povolit offline doručenou poštu ',
'inboxmsgs' => 'Přečtěte si %d zprávy ve vaší doručené poště', 'inboxmsgs' => 'Přečtěte si %d zprávy ve vaší doručené poště',
'offline' => '(offline)', 'offline' => '(offline)',

View File

@ -343,6 +343,8 @@ $T=[
'optional' => '(optional)', 'optional' => '(optional)',
'userloggedin' => 'Ein Nutzer mit diesem Nicknamen ist bereits angemeldet.', 'userloggedin' => 'Ein Nutzer mit diesem Nicknamen ist bereits angemeldet.',
'regednick' => 'Dieser Nickname ist ein registeriertes Mitglied.', 'regednick' => 'Dieser Nickname ist ein registeriertes Mitglied.',
'failednotice' => 'Fehlgeschlagener Anmeldeversuch(n)',
'dismiss' => 'entlassen',
'eninbox' => 'Offline Posteingang aktivieren', 'eninbox' => 'Offline Posteingang aktivieren',
'inboxmsgs' => '%d Nachrichten im Posteingang lesen', 'inboxmsgs' => '%d Nachrichten im Posteingang lesen',
'offline' => '(offline)', 'offline' => '(offline)',

View File

@ -343,6 +343,8 @@ $I=[
'optional' => '(optional)', 'optional' => '(optional)',
'userloggedin' => 'A user with this nickname is already logged in.', 'userloggedin' => 'A user with this nickname is already logged in.',
'regednick' => 'This nickname is a registered member.', 'regednick' => 'This nickname is a registered member.',
'failednotice' => 'failed login attempt(s)',
'dismiss' => 'dismiss',
'eninbox' => 'Enable offline inbox', 'eninbox' => 'Enable offline inbox',
'inboxmsgs' => 'Read %d messages in your inbox', 'inboxmsgs' => 'Read %d messages in your inbox',
'offline' => '(offline)', 'offline' => '(offline)',

View File

@ -342,6 +342,8 @@ $T=[
'optional' => '(opcional)', 'optional' => '(opcional)',
'userloggedin' => 'Un usuario con ese nombre ya está registrado.', 'userloggedin' => 'Un usuario con ese nombre ya está registrado.',
'regednick' => 'Este nombre es un usuario registrado.', 'regednick' => 'Este nombre es un usuario registrado.',
'failednotice' => 'intento(s) de inicio de sesión fallido(s)',
'dismiss' => 'reconocido',
'eninbox' => 'Activar inbox offline', 'eninbox' => 'Activar inbox offline',
'inboxmsgs' => 'Leer %d mensajes en tu bandeja', 'inboxmsgs' => 'Leer %d mensajes en tu bandeja',
'offline' => '(offline)', 'offline' => '(offline)',

View File

@ -312,5 +312,7 @@ $T=[
'nicknametaken' => 'Pseudo déjà pris', 'nicknametaken' => 'Pseudo déjà pris',
'nopass' => 'Mot de passe invalide (au moins % caractères), ne pas changer le pseudo', 'nopass' => 'Mot de passe invalide (au moins % caractères), ne pas changer le pseudo',
'namedoers' => 'Montrez qui expulse les gens ou nettoie tous les messages.', 'namedoers' => 'Montrez qui expulse les gens ou nettoie tous les messages.',
'failednotice' => 'tentative de connexion ratée(s)',
'dismiss' => 'reconnu',
]; ];

View File

@ -311,6 +311,8 @@ $T=[
'newnickname' => 'Nama baru:', 'newnickname' => 'Nama baru:',
'nicknametaken' => 'Nama sudah ada', 'nicknametaken' => 'Nama sudah ada',
'nopass' => 'Kata sandi salah (Minimal %d karakter), tak merubah nama', 'nopass' => 'Kata sandi salah (Minimal %d karakter), tak merubah nama',
'namedoers' => 'Memperlihatkan siapa yang mengusir orang atau membersihkan semua pesan.' 'namedoers' => 'Memperlihatkan siapa yang mengusir orang atau membersihkan semua pesan.',
'failednotice' => 'upaya log masuk gagal',
'dismiss' => 'mengakui',
]; ];

View File

@ -342,6 +342,8 @@ $T=[
'optional' => '(optional)', 'optional' => '(optional)',
'userloggedin' => 'Utilizzatore con questo nome è già in rete.', 'userloggedin' => 'Utilizzatore con questo nome è già in rete.',
'regednick' => 'Questo nome appartiene già ad un altro.', 'regednick' => 'Questo nome appartiene già ad un altro.',
'failednotice' => 'tentativi di accesso non riusciti',
'dismiss' => 'riconosciuto',
'eninbox' => 'Abilitare offline-posta', 'eninbox' => 'Abilitare offline-posta',
'inboxmsgs' => 'Leggete %d messaggi in entrata', 'inboxmsgs' => 'Leggete %d messaggi in entrata',
'offline' => '(offline)', 'offline' => '(offline)',

View File

@ -343,6 +343,8 @@ $I=[
'optional' => '(opcional)', 'optional' => '(opcional)',
'userloggedin' => 'Um usuário com este nickname já está logado.', 'userloggedin' => 'Um usuário com este nickname já está logado.',
'regednick' => 'Este nickname é de um membro registrado.', 'regednick' => 'Este nickname é de um membro registrado.',
'failednotice' => 'tentativas de login falhada(s)',
'dismiss' => 'reconhecido',
'eninbox' => 'Ativar caixa de entrada offline', 'eninbox' => 'Ativar caixa de entrada offline',
'inboxmsgs' => 'Leia %d mensagens na sua caixa de entrada', 'inboxmsgs' => 'Leia %d mensagens na sua caixa de entrada',
'offline' => '(offline)', 'offline' => '(offline)',

View File

@ -342,6 +342,8 @@ $T=[
'optional' => '(опционально)', 'optional' => '(опционально)',
'userloggedin' => 'Пользователь с текущим именем уже в сети.', 'userloggedin' => 'Пользователь с текущим именем уже в сети.',
'regednick' => 'Это имя принадлежит зарегистрированному пользователю.', 'regednick' => 'Это имя принадлежит зарегистрированному пользователю.',
'failednotice' => 'неудачная попытка входа (ы)',
'dismiss' => 'признал',
'eninbox' => 'Включить оффлайн-почту', 'eninbox' => 'Включить оффлайн-почту',
'inboxmsgs' => 'Прочитайте %d входящих сообщений', 'inboxmsgs' => 'Прочитайте %d входящих сообщений',
'offline' => '(оффлайн)', 'offline' => '(оффлайн)',

View File

@ -343,6 +343,8 @@ $T=[
'optional' => '(isteğe bağlı)', 'optional' => '(isteğe bağlı)',
'userloggedin' => 'Bu kullanıcı ismine sahip birisi zaten giriş yapmış.', 'userloggedin' => 'Bu kullanıcı ismine sahip birisi zaten giriş yapmış.',
'regednick' => 'Bu kullanıcı adı kayıtlı bir üyeye ait.', 'regednick' => 'Bu kullanıcı adı kayıtlı bir üyeye ait.',
'failednotice' => 'başarısız oturum açma girişimleri',
'dismiss' => 'anlaşıldı',
'eninbox' => 'Çevrimdışı gelen kutusunu etkinleştir', 'eninbox' => 'Çevrimdışı gelen kutusunu etkinleştir',
'inboxmsgs' => 'Gelen kutunuzdaki %d mesajı okuyun', 'inboxmsgs' => 'Gelen kutunuzdaki %d mesajı okuyun',
'offline' => '(çevrimdışı)', 'offline' => '(çevrimdışı)',

View File

@ -342,6 +342,8 @@ $T=[
'optional' => '(опційно)', 'optional' => '(опційно)',
'userloggedin' => 'Гость з таким имям вже в чаті.', 'userloggedin' => 'Гость з таким имям вже в чаті.',
'regednick' => 'Це імя використовуе зарегістріруваний участник.', 'regednick' => 'Це імя використовуе зарегістріруваний участник.',
'failednotice' => 'невдалі спроби входу',
'dismiss' => 'визнав',
'eninbox' => 'Включити офлайн-почту', 'eninbox' => 'Включити офлайн-почту',
'inboxmsgs' => 'Прочитайте %d вхідящих повідомлень', 'inboxmsgs' => 'Прочитайте %d вхідящих повідомлень',
'offline' => '(офлайн)', 'offline' => '(офлайн)',

View File

@ -322,6 +322,8 @@ $T=[
'optional' => '(可选的)', 'optional' => '(可选的)',
'userloggedin' => '具有此昵称的用户已登录.', 'userloggedin' => '具有此昵称的用户已登录.',
'regednick' => '这个昵称是注册会员.', 'regednick' => '这个昵称是注册会员.',
'failednotice' => '登录尝试失败',
'dismiss' => '承认',
'eninbox' => '启用离线收件箱', 'eninbox' => '启用离线收件箱',
'inboxmsgs' => '阅读收件箱中的%d条消息', 'inboxmsgs' => '阅读收件箱中的%d条消息',
'offline' => '(离线)', 'offline' => '(离线)',