Fixed error 500 on logs and sessions pages because of dead library.
This commit is contained in:
parent
f32624c61d
commit
ebac064c59
12 changed files with 99 additions and 186 deletions
6
.gitmodules
vendored
6
.gitmodules
vendored
|
@ -1,3 +1,9 @@
|
||||||
[submodule "lib/index"]
|
[submodule "lib/index"]
|
||||||
path = lib/index
|
path = lib/index
|
||||||
url = https://git.flash.moe/flash/index.git
|
url = https://git.flash.moe/flash/index.git
|
||||||
|
[submodule "lib/device-detector"]
|
||||||
|
path = lib/device-detector
|
||||||
|
url = https://github.com/matomo-org/device-detector.git
|
||||||
|
[submodule "lib/spyc"]
|
||||||
|
path = lib/spyc
|
||||||
|
url = https://github.com/mustangostang/spyc.git
|
||||||
|
|
|
@ -3,7 +3,6 @@
|
||||||
"twig/twig": "^3.0",
|
"twig/twig": "^3.0",
|
||||||
"erusev/parsedown": "~1.6",
|
"erusev/parsedown": "~1.6",
|
||||||
"chillerlan/php-qrcode": "^4.3",
|
"chillerlan/php-qrcode": "^4.3",
|
||||||
"whichbrowser/parser": "^2.0",
|
|
||||||
"symfony/mailer": "^6.0"
|
"symfony/mailer": "^6.0"
|
||||||
},
|
},
|
||||||
"autoload": {
|
"autoload": {
|
||||||
|
|
115
composer.lock
generated
115
composer.lock
generated
|
@ -4,7 +4,7 @@
|
||||||
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
|
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
|
||||||
"This file is @generated automatically"
|
"This file is @generated automatically"
|
||||||
],
|
],
|
||||||
"content-hash": "26152622b2776a8d945647d5c1cfc48c",
|
"content-hash": "d757fc71803876a28a7434df1fa5edf1",
|
||||||
"packages": [
|
"packages": [
|
||||||
{
|
{
|
||||||
"name": "chillerlan/php-qrcode",
|
"name": "chillerlan/php-qrcode",
|
||||||
|
@ -342,55 +342,6 @@
|
||||||
},
|
},
|
||||||
"time": "2019-12-30T22:54:17+00:00"
|
"time": "2019-12-30T22:54:17+00:00"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"name": "psr/cache",
|
|
||||||
"version": "3.0.0",
|
|
||||||
"source": {
|
|
||||||
"type": "git",
|
|
||||||
"url": "https://github.com/php-fig/cache.git",
|
|
||||||
"reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf"
|
|
||||||
},
|
|
||||||
"dist": {
|
|
||||||
"type": "zip",
|
|
||||||
"url": "https://api.github.com/repos/php-fig/cache/zipball/aa5030cfa5405eccfdcb1083ce040c2cb8d253bf",
|
|
||||||
"reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf",
|
|
||||||
"shasum": ""
|
|
||||||
},
|
|
||||||
"require": {
|
|
||||||
"php": ">=8.0.0"
|
|
||||||
},
|
|
||||||
"type": "library",
|
|
||||||
"extra": {
|
|
||||||
"branch-alias": {
|
|
||||||
"dev-master": "1.0.x-dev"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"autoload": {
|
|
||||||
"psr-4": {
|
|
||||||
"Psr\\Cache\\": "src/"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"notification-url": "https://packagist.org/downloads/",
|
|
||||||
"license": [
|
|
||||||
"MIT"
|
|
||||||
],
|
|
||||||
"authors": [
|
|
||||||
{
|
|
||||||
"name": "PHP-FIG",
|
|
||||||
"homepage": "https://www.php-fig.org/"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"description": "Common interface for caching libraries",
|
|
||||||
"keywords": [
|
|
||||||
"cache",
|
|
||||||
"psr",
|
|
||||||
"psr-6"
|
|
||||||
],
|
|
||||||
"support": {
|
|
||||||
"source": "https://github.com/php-fig/cache/tree/3.0.0"
|
|
||||||
},
|
|
||||||
"time": "2021-02-03T23:26:27+00:00"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"name": "psr/container",
|
"name": "psr/container",
|
||||||
"version": "2.0.2",
|
"version": "2.0.2",
|
||||||
|
@ -1427,70 +1378,6 @@
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2023-06-08T12:52:13+00:00"
|
"time": "2023-06-08T12:52:13+00:00"
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "whichbrowser/parser",
|
|
||||||
"version": "v2.1.7",
|
|
||||||
"source": {
|
|
||||||
"type": "git",
|
|
||||||
"url": "https://github.com/WhichBrowser/Parser-PHP.git",
|
|
||||||
"reference": "1044880bc792dbce5948fbff22ae731c43c280d9"
|
|
||||||
},
|
|
||||||
"dist": {
|
|
||||||
"type": "zip",
|
|
||||||
"url": "https://api.github.com/repos/WhichBrowser/Parser-PHP/zipball/1044880bc792dbce5948fbff22ae731c43c280d9",
|
|
||||||
"reference": "1044880bc792dbce5948fbff22ae731c43c280d9",
|
|
||||||
"shasum": ""
|
|
||||||
},
|
|
||||||
"require": {
|
|
||||||
"php": ">=5.4.0",
|
|
||||||
"psr/cache": "^1.0 || ^2.0 || ^3.0"
|
|
||||||
},
|
|
||||||
"require-dev": {
|
|
||||||
"cache/array-adapter": "^1.1",
|
|
||||||
"icomefromthenet/reverse-regex": "0.0.6.3",
|
|
||||||
"php-coveralls/php-coveralls": "^2.0",
|
|
||||||
"phpunit/php-code-coverage": "^5.0 || ^7.0",
|
|
||||||
"phpunit/phpunit": "^6.0 || ^8.0",
|
|
||||||
"squizlabs/php_codesniffer": "^3.5",
|
|
||||||
"symfony/yaml": "~3.4 || ~4.0"
|
|
||||||
},
|
|
||||||
"suggest": {
|
|
||||||
"cache/array-adapter": "Allows testing of the caching functionality"
|
|
||||||
},
|
|
||||||
"type": "library",
|
|
||||||
"autoload": {
|
|
||||||
"psr-4": {
|
|
||||||
"WhichBrowser\\": [
|
|
||||||
"src/",
|
|
||||||
"tests/src/"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"notification-url": "https://packagist.org/downloads/",
|
|
||||||
"license": [
|
|
||||||
"MIT"
|
|
||||||
],
|
|
||||||
"authors": [
|
|
||||||
{
|
|
||||||
"name": "Niels Leenheer",
|
|
||||||
"email": "niels@leenheer.nl",
|
|
||||||
"role": "Developer"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"description": "Useragent sniffing library for PHP",
|
|
||||||
"homepage": "http://whichbrowser.net",
|
|
||||||
"keywords": [
|
|
||||||
"browser",
|
|
||||||
"sniffing",
|
|
||||||
"ua",
|
|
||||||
"useragent"
|
|
||||||
],
|
|
||||||
"support": {
|
|
||||||
"issues": "https://github.com/WhichBrowser/Parser-PHP/issues",
|
|
||||||
"source": "https://github.com/WhichBrowser/Parser-PHP/tree/v2.1.7"
|
|
||||||
},
|
|
||||||
"time": "2022-04-19T20:14:54+00:00"
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"packages-dev": [],
|
"packages-dev": [],
|
||||||
|
|
1
lib/device-detector
Submodule
1
lib/device-detector
Submodule
|
@ -0,0 +1 @@
|
||||||
|
Subproject commit 3e0fac7e77f3faadc3858fea9f5fa7efeb9cf239
|
1
lib/spyc
Submodule
1
lib/spyc
Submodule
|
@ -0,0 +1 @@
|
||||||
|
Subproject commit 4627c838b16550b666d15aeae1e5289dd5b77da0
|
|
@ -29,7 +29,12 @@ Environment::setDebug(MSZ_DEBUG);
|
||||||
mb_internal_encoding('utf-8');
|
mb_internal_encoding('utf-8');
|
||||||
date_default_timezone_set('utc');
|
date_default_timezone_set('utc');
|
||||||
|
|
||||||
|
// Third party libraries
|
||||||
require_once MSZ_ROOT . '/vendor/autoload.php';
|
require_once MSZ_ROOT . '/vendor/autoload.php';
|
||||||
|
require_once MSZ_LIBRARIES . '/spyc/Spyc.php'; // dependency for device-detector
|
||||||
|
require_once MSZ_LIBRARIES . '/device-detector/autoload.php';
|
||||||
|
|
||||||
|
// Procedural components
|
||||||
require_once MSZ_ROOT . '/utility.php';
|
require_once MSZ_ROOT . '/utility.php';
|
||||||
require_once MSZ_SOURCE . '/perms.php';
|
require_once MSZ_SOURCE . '/perms.php';
|
||||||
require_once MSZ_SOURCE . '/manage.php';
|
require_once MSZ_SOURCE . '/manage.php';
|
||||||
|
|
|
@ -111,8 +111,6 @@ if(CSRF::validateRequest() && $canEdit) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!empty($_POST['user']) && is_array($_POST['user'])) {
|
if(!empty($_POST['user']) && is_array($_POST['user'])) {
|
||||||
//$setUsername = (string)($_POST['user']['username'] ?? '');
|
|
||||||
//$setEMailAddress = (string)($_POST['user']['email'] ?? '');
|
|
||||||
$setCountry = (string)($_POST['user']['country'] ?? '');
|
$setCountry = (string)($_POST['user']['country'] ?? '');
|
||||||
$setTitle = (string)($_POST['user']['title'] ?? '');
|
$setTitle = (string)($_POST['user']['title'] ?? '');
|
||||||
|
|
||||||
|
@ -122,21 +120,10 @@ if(CSRF::validateRequest() && $canEdit) {
|
||||||
$userInfo->setDisplayRole(UserRole::byId($displayRole));
|
$userInfo->setDisplayRole(UserRole::byId($displayRole));
|
||||||
} catch(UserRoleNotFoundException $ex) {}
|
} catch(UserRoleNotFoundException $ex) {}
|
||||||
|
|
||||||
//$usernameValidation = User::validateUsername($setUsername);
|
|
||||||
//$emailValidation = User::validateEMailAddress($setEMailAddress);
|
|
||||||
$countryValidation = strlen($setCountry) === 2
|
$countryValidation = strlen($setCountry) === 2
|
||||||
&& ctype_alpha($setCountry)
|
&& ctype_alpha($setCountry)
|
||||||
&& ctype_upper($setCountry);
|
&& ctype_upper($setCountry);
|
||||||
|
|
||||||
//if(!empty($usernameValidation))
|
|
||||||
// $notices[] = User::usernameValidationErrorString($usernameValidation);
|
|
||||||
|
|
||||||
// if(!empty($emailValidation)) {
|
|
||||||
// $notices[] = $emailValidation === 'in-use'
|
|
||||||
// ? 'This e-mail address has already been used!'
|
|
||||||
// : 'This e-mail address is invalid!';
|
|
||||||
// }
|
|
||||||
|
|
||||||
if(!$countryValidation)
|
if(!$countryValidation)
|
||||||
$notices[] = 'Country code was invalid.';
|
$notices[] = 'Country code was invalid.';
|
||||||
|
|
||||||
|
@ -144,10 +131,7 @@ if(CSRF::validateRequest() && $canEdit) {
|
||||||
$notices[] = 'User title was invalid.';
|
$notices[] = 'User title was invalid.';
|
||||||
|
|
||||||
if(empty($notices))
|
if(empty($notices))
|
||||||
$userInfo
|
$userInfo->setCountry((string)($_POST['user']['country'] ?? ''))
|
||||||
// ->setUsername((string)($_POST['user']['username'] ?? ''))
|
|
||||||
// ->setEMailAddress((string)($_POST['user']['email'] ?? ''))
|
|
||||||
->setCountry((string)($_POST['user']['country'] ?? ''))
|
|
||||||
->setTitle((string)($_POST['user']['title'] ?? ''))
|
->setTitle((string)($_POST['user']['title'] ?? ''))
|
||||||
->setDisplayRole(UserRole::byId((int)($_POST['user']['display_role'] ?? 0)));
|
->setDisplayRole(UserRole::byId((int)($_POST['user']['display_role'] ?? 0)));
|
||||||
}
|
}
|
||||||
|
|
76
src/ClientInfo.php
Normal file
76
src/ClientInfo.php
Normal file
|
@ -0,0 +1,76 @@
|
||||||
|
<?php
|
||||||
|
namespace Misuzu;
|
||||||
|
|
||||||
|
use InvalidArgumentException;
|
||||||
|
use Stringable;
|
||||||
|
use DeviceDetector\ClientHints;
|
||||||
|
use DeviceDetector\DeviceDetector;
|
||||||
|
|
||||||
|
class ClientInfo implements Stringable {
|
||||||
|
private DeviceDetector $dd;
|
||||||
|
|
||||||
|
public function __construct(DeviceDetector $dd) {
|
||||||
|
$this->dd = $dd;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function __toString(): string {
|
||||||
|
if($this->dd->isBot()) {
|
||||||
|
$botInfo = $this->dd->getBot();
|
||||||
|
return $botInfo['name'] ?? 'an unknown bot';
|
||||||
|
}
|
||||||
|
|
||||||
|
$clientInfo = $this->dd->getClient();
|
||||||
|
if(empty($clientInfo['name']))
|
||||||
|
return 'an unknown browser';
|
||||||
|
|
||||||
|
$string = $clientInfo['name'];
|
||||||
|
if(!empty($clientInfo['version']))
|
||||||
|
$string .= ' ' . $clientInfo['version'];
|
||||||
|
|
||||||
|
$osInfo = $this->dd->getOs();
|
||||||
|
$hasOsInfo = !empty($osInfo['name']);
|
||||||
|
|
||||||
|
$brandName = $this->dd->getBrandName();
|
||||||
|
$modelName = $this->dd->getModel();
|
||||||
|
$hasModelName = !empty($modelName);
|
||||||
|
|
||||||
|
if($hasOsInfo || $hasModelName)
|
||||||
|
$string .= ' on ';
|
||||||
|
|
||||||
|
if($hasModelName) {
|
||||||
|
$deviceName = trim($brandName . ' ' . $modelName);
|
||||||
|
// most naive check in the world but it works well enough for this lol
|
||||||
|
$firstCharIsVowel = in_array(strtolower($deviceName[0]), ['a', 'i', 'u', 'e', 'o']);
|
||||||
|
$string .= ($firstCharIsVowel ? 'an' : 'a') . ' ' . $deviceName;
|
||||||
|
}
|
||||||
|
|
||||||
|
if($hasOsInfo) {
|
||||||
|
if($hasModelName)
|
||||||
|
$string .= ' running ';
|
||||||
|
|
||||||
|
$string .= $osInfo['name'];
|
||||||
|
if(!empty($osInfo['version']))
|
||||||
|
$string .= ' ' . $osInfo['version'];
|
||||||
|
if(!empty($osInfo['platform']))
|
||||||
|
$string .= ' (' . $osInfo['platform'] . ')';
|
||||||
|
}
|
||||||
|
|
||||||
|
return $string;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function parse(array|string $serverVarsOrUserAgent): self {
|
||||||
|
if(is_string($serverVarsOrUserAgent)) {
|
||||||
|
$userAgent = $serverVarsOrUserAgent;
|
||||||
|
$clientHints = null;
|
||||||
|
} else {
|
||||||
|
$userAgent = array_key_exists('HTTP_USER_AGENT', $serverVarsOrUserAgent)
|
||||||
|
? $serverVarsOrUserAgent['HTTP_USER_AGENT'] : '';
|
||||||
|
$clientHints = ClientHints::factory($serverVarsOrUserAgent);
|
||||||
|
}
|
||||||
|
|
||||||
|
$dd = new DeviceDetector($userAgent, $clientHints);
|
||||||
|
$dd->parse();
|
||||||
|
|
||||||
|
return new static($dd);
|
||||||
|
}
|
||||||
|
}
|
|
@ -92,18 +92,10 @@ class User implements HasRankInterface {
|
||||||
public function getUsername(): string {
|
public function getUsername(): string {
|
||||||
return $this->username;
|
return $this->username;
|
||||||
}
|
}
|
||||||
public function setUsername(string $username): self {
|
|
||||||
$this->username = $username;
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getEmailAddress(): string {
|
public function getEmailAddress(): string {
|
||||||
return $this->email;
|
return $this->email;
|
||||||
}
|
}
|
||||||
public function setEmailAddress(string $address): self {
|
|
||||||
$this->email = mb_strtolower($address);
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getRegisterRemoteAddress(): string {
|
public function getRegisterRemoteAddress(): string {
|
||||||
return $this->register_ip ?? '::1';
|
return $this->register_ip ?? '::1';
|
||||||
|
@ -115,10 +107,6 @@ class User implements HasRankInterface {
|
||||||
public function isSuper(): bool {
|
public function isSuper(): bool {
|
||||||
return boolval($this->user_super);
|
return boolval($this->user_super);
|
||||||
}
|
}
|
||||||
public function setSuper(bool $super): self {
|
|
||||||
$this->user_super = $super ? 1 : 0;
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function hasCountry(): bool {
|
public function hasCountry(): bool {
|
||||||
return $this->user_country !== 'XX';
|
return $this->user_country !== 'XX';
|
||||||
|
@ -400,40 +388,12 @@ class User implements HasRankInterface {
|
||||||
* DELETING *
|
* DELETING *
|
||||||
************/
|
************/
|
||||||
|
|
||||||
private const NUKE_TIMEOUT = 600;
|
|
||||||
|
|
||||||
public function getDeletedTime(): int {
|
public function getDeletedTime(): int {
|
||||||
return $this->user_deleted === null ? -1 : $this->user_deleted;
|
return $this->user_deleted === null ? -1 : $this->user_deleted;
|
||||||
}
|
}
|
||||||
public function isDeleted(): bool {
|
public function isDeleted(): bool {
|
||||||
return $this->getDeletedTime() >= 0;
|
return $this->getDeletedTime() >= 0;
|
||||||
}
|
}
|
||||||
public function delete(): void {
|
|
||||||
if($this->isDeleted())
|
|
||||||
return;
|
|
||||||
$this->user_deleted = time();
|
|
||||||
DB::prepare('UPDATE `' . DB::PREFIX . self::TABLE . '` SET `user_deleted` = NOW() WHERE `user_id` = :user')
|
|
||||||
->bind('user', $this->user_id)
|
|
||||||
->execute();
|
|
||||||
}
|
|
||||||
public function restore(): void {
|
|
||||||
if(!$this->isDeleted())
|
|
||||||
return;
|
|
||||||
$this->user_deleted = null;
|
|
||||||
DB::prepare('UPDATE `' . DB::PREFIX . self::TABLE . '` SET `user_deleted` = NULL WHERE `user_id` = :user')
|
|
||||||
->bind('user', $this->user_id)
|
|
||||||
->execute();
|
|
||||||
}
|
|
||||||
public function canBeNuked(): bool {
|
|
||||||
return $this->isDeleted() && time() > $this->getDeletedTime() + self::NUKE_TIMEOUT;
|
|
||||||
}
|
|
||||||
public function nuke(): void {
|
|
||||||
if(!$this->canBeNuked())
|
|
||||||
return;
|
|
||||||
DB::prepare('DELETE FROM `' . DB::PREFIX . self::TABLE . '` WHERE `user_id` = :user')
|
|
||||||
->bind('user', $this->user_id)
|
|
||||||
->execute();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**********
|
/**********
|
||||||
* ASSETS *
|
* ASSETS *
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
<?php
|
<?php
|
||||||
namespace Misuzu\Users;
|
namespace Misuzu\Users;
|
||||||
|
|
||||||
|
use Misuzu\ClientInfo;
|
||||||
use Misuzu\DB;
|
use Misuzu\DB;
|
||||||
use Misuzu\Pagination;
|
use Misuzu\Pagination;
|
||||||
use WhichBrowser\Parser as UserAgentParser;
|
|
||||||
|
|
||||||
class UserLoginAttempt {
|
class UserLoginAttempt {
|
||||||
// Database fields
|
// Database fields
|
||||||
|
@ -16,7 +16,6 @@ class UserLoginAttempt {
|
||||||
|
|
||||||
private $user = null;
|
private $user = null;
|
||||||
private $userLookedUp = false;
|
private $userLookedUp = false;
|
||||||
private $uaInfo = null;
|
|
||||||
|
|
||||||
public const TABLE = 'login_attempts';
|
public const TABLE = 'login_attempts';
|
||||||
private const QUERY_SELECT = 'SELECT %1$s FROM `' . DB::PREFIX . self::TABLE . '` AS '. self::TABLE;
|
private const QUERY_SELECT = 'SELECT %1$s FROM `' . DB::PREFIX . self::TABLE . '` AS '. self::TABLE;
|
||||||
|
@ -59,10 +58,8 @@ class UserLoginAttempt {
|
||||||
public function getUserAgent(): string {
|
public function getUserAgent(): string {
|
||||||
return $this->attempt_user_agent;
|
return $this->attempt_user_agent;
|
||||||
}
|
}
|
||||||
public function getUserAgentInfo(): UserAgentParser {
|
public function getClientString(): string {
|
||||||
if($this->uaInfo === null)
|
return (string)ClientInfo::parse($this->attempt_user_agent);
|
||||||
$this->uaInfo = new UserAgentParser($this->getUserAgent());
|
|
||||||
return $this->uaInfo;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static function remaining(string $remoteAddr): int {
|
public static function remaining(string $remoteAddr): int {
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
<?php
|
<?php
|
||||||
namespace Misuzu\Users;
|
namespace Misuzu\Users;
|
||||||
|
|
||||||
|
use Misuzu\ClientInfo;
|
||||||
use Misuzu\DB;
|
use Misuzu\DB;
|
||||||
use Misuzu\Pagination;
|
use Misuzu\Pagination;
|
||||||
use WhichBrowser\Parser as UserAgentParser;
|
|
||||||
|
|
||||||
class UserSessionException extends UsersException {}
|
class UserSessionException extends UsersException {}
|
||||||
class UserSessionCreationFailedException extends UserSessionException {}
|
class UserSessionCreationFailedException extends UserSessionException {}
|
||||||
|
@ -27,7 +27,6 @@ class UserSession {
|
||||||
private $session_active = null;
|
private $session_active = null;
|
||||||
|
|
||||||
private $user = null;
|
private $user = null;
|
||||||
private $uaInfo = null;
|
|
||||||
|
|
||||||
private static $localSession = null;
|
private static $localSession = null;
|
||||||
|
|
||||||
|
@ -75,10 +74,8 @@ class UserSession {
|
||||||
public function getUserAgent(): string {
|
public function getUserAgent(): string {
|
||||||
return $this->session_user_agent;
|
return $this->session_user_agent;
|
||||||
}
|
}
|
||||||
public function getUserAgentInfo(): UserAgentParser {
|
public function getClientString(): string {
|
||||||
if($this->uaInfo === null)
|
return (string)ClientInfo::parse($this->session_user_agent);
|
||||||
$this->uaInfo = new UserAgentParser($this->getUserAgent());
|
|
||||||
return $this->uaInfo;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getCountry(): string {
|
public function getCountry(): string {
|
||||||
|
|
|
@ -73,7 +73,7 @@
|
||||||
<div class="flag flag--{{ session.country|lower }} settings__session__flag" title="{{ session.countryName }}">{{ session.country }}</div>
|
<div class="flag flag--{{ session.country|lower }} settings__session__flag" title="{{ session.countryName }}">{{ session.country }}</div>
|
||||||
|
|
||||||
<div class="settings__session__description">
|
<div class="settings__session__description">
|
||||||
{{ session.userAgentInfo.toString }}
|
{{ session.clientString }}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<form class="settings__session__actions" method="post" action="{{ url('settings-sessions') }}">
|
<form class="settings__session__actions" method="post" action="{{ url('settings-sessions') }}">
|
||||||
|
@ -160,7 +160,7 @@
|
||||||
<div class="flag flag--{{ attempt.country|lower }} settings__login-attempt__flag" title="{{ attempt.countryName }}">{{ attempt.country }}</div>
|
<div class="flag flag--{{ attempt.country|lower }} settings__login-attempt__flag" title="{{ attempt.countryName }}">{{ attempt.country }}</div>
|
||||||
|
|
||||||
<div class="settings__login-attempt__description">
|
<div class="settings__login-attempt__description">
|
||||||
{{ attempt.userAgentInfo.toString }}
|
{{ attempt.clientString }}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue