diff --git a/src/Admin/src/Service/AdminLoginService.php b/src/Admin/src/Service/AdminLoginService.php
index 0da33ec..ffd0c6e 100644
--- a/src/Admin/src/Service/AdminLoginService.php
+++ b/src/Admin/src/Service/AdminLoginService.php
@@ -14,8 +14,11 @@
use Dot\DependencyInjection\Attribute\Inject;
use Dot\GeoIP\Service\LocationService;
use Exception;
+use stdClass;
+use function get_browser;
use function in_array;
+use function ini_get;
class AdminLoginService implements AdminLoginServiceInterface
{
@@ -49,16 +52,12 @@ public function getAdminLogins(array $params): array
'login.continent',
'login.organization',
'login.deviceType',
- 'login.deviceBrand',
- 'login.deviceModel',
'login.isMobile',
'login.osName',
'login.osVersion',
- 'login.osPlatform',
'login.clientType',
'login.clientName',
- 'login.clientEngine',
- 'login.clientVersion',
+ 'login.isCrawler',
'login.loginStatus',
'login.identity',
'login.created',
@@ -99,35 +98,37 @@ public function logSuccessfulLogin(array $serverParams, string $name): AdminLogi
*/
private function logAdminVisit(array $serverParams, string $name, SuccessFailureEnum $status): AdminLogin
{
- /**
- * For device information
- *
- * @see https://github.com/dotkernel/dot-user-agent-sniffer
- */
-
$ipAddress = IpService::getUserIp($serverParams);
$country = $this->locationService->getCountry($ipAddress)->getName();
$continent = $this->locationService->getContinent($ipAddress)->getName();
$organization = $this->locationService->getOrganization($ipAddress)->getName();
+ /**
+ * For browscap information
+ *
+ * @see https://www.php.net/manual/en/function.get-browser.php
+ */
+ $browser = new stdClass();
+ if (ini_get('browscap')) {
+ $browser = get_browser($_SERVER['HTTP_USER_AGENT']);
+ }
+
$adminLogin = (new AdminLogin())
->setAdminIp($this->locationService->obfuscateIpAddress($ipAddress))
->setContinent($continent)
->setCountry($country)
->setOrganization($organization)
- ->setDeviceType(null)
- ->setDeviceBrand(null)
- ->setDeviceModel(null)
- ->setIsMobile(YesNoEnum::No)
- ->setOsName(null)
- ->setOsVersion(null)
- ->setOsPlatform(null)
- ->setClientType(null)
- ->setClientName(null)
- ->setClientEngine(null)
- ->setClientVersion(null)
+ ->setDeviceType(! empty($browser->device_type) ? $browser->device_type : null)
+ ->setIsMobile(
+ ! empty($browser->ismobiledevice) ? YesNoEnum::Yes : YesNoEnum::No
+ )
+ ->setOsName(! empty($browser->platform) ? $browser->platform : null)
+ ->setOsVersion(! empty($browser->platform_version) ? $browser->platform_version : null)
+ ->setClientType(! empty($browser->browser_type) ? $browser->browser_type : null)
+ ->setClientName(! empty($browser->browser) ? $browser->browser : null)
->setLoginStatus($status)
+ ->setIsCrawler(! empty($browser->crawler) ? YesNoEnum::Yes : YesNoEnum::No)
->setIdentity($name);
$this->adminLoginRepository->saveResource($adminLogin);
diff --git a/src/Admin/templates/admin/list-admin-login.html.twig b/src/Admin/templates/admin/list-admin-login.html.twig
index 6e66a7e..cab7aa7 100644
--- a/src/Admin/templates/admin/list-admin-login.html.twig
+++ b/src/Admin/templates/admin/list-admin-login.html.twig
@@ -76,12 +76,6 @@
{{ sortableColumn('admin::list-admin-login', {}, pagination.queryParams, 'login.deviceType', 'Device Type') }}
|
-
- {{ sortableColumn('admin::list-admin-login', {}, pagination.queryParams, 'login.deviceBrand', 'Device Brand') }}
- |
-
- {{ sortableColumn('admin::list-admin-login', {}, pagination.queryParams, 'login.deviceModel', 'Device Model') }}
- |
{{ sortableColumn('admin::list-admin-login', {}, pagination.queryParams, 'login.isMobile', 'Is Mobile') }}
|
@@ -91,20 +85,14 @@
{{ sortableColumn('admin::list-admin-login', {}, pagination.queryParams, 'login.osVersion', 'Os Version') }}
|
-
- {{ sortableColumn('admin::list-admin-login', {}, pagination.queryParams, 'login.osPlatform', 'Os Platform') }}
- |
{{ sortableColumn('admin::list-admin-login', {}, pagination.queryParams, 'login.clientType', 'Client Type') }}
|
{{ sortableColumn('admin::list-admin-login', {}, pagination.queryParams, 'login.clientName', 'Client Name') }}
|
-
- {{ sortableColumn('admin::list-admin-login', {}, pagination.queryParams, 'login.clientEngine', 'Client Engine') }}
- |
-
- {{ sortableColumn('admin::list-admin-login', {}, pagination.queryParams, 'login.clientVersion', 'Client Version') }}
+ |
+ {{ sortableColumn('admin::list-admin-login', {}, pagination.queryParams, 'login.isCrawler', 'Is Crawler') }}
|
{{ sortableColumn('admin::list-admin-login', {}, pagination.queryParams, 'login.created', 'Created') }}
@@ -127,8 +115,6 @@
| {{ login.continent }} |
{{ login.organization }} |
{{ login.deviceType }} |
- {{ login.deviceBrand }} |
- {{ login.deviceModel }} |
{% if login.isMobile.value == 'yes' %}
Yes
@@ -138,11 +124,15 @@
|
{{ login.osName }} |
{{ login.osVersion }} |
- {{ login.osPlatform }} |
{{ login.clientType }} |
{{ login.clientName }} |
- {{ login.clientEngine }} |
- {{ login.clientVersion }} |
+
+ {% if login.isCrawler.value == 'yes' %}
+ Yes
+ {% else %}
+ No
+ {% endif %}
+ |
{{ login.getCreated()|date('Y-m-d H:i:s') }} |
{% endfor %}
diff --git a/src/Core/src/Admin/src/Entity/AdminLogin.php b/src/Core/src/Admin/src/Entity/AdminLogin.php
index 1ced9af..d530479 100644
--- a/src/Core/src/Admin/src/Entity/AdminLogin.php
+++ b/src/Core/src/Admin/src/Entity/AdminLogin.php
@@ -39,12 +39,6 @@ class AdminLogin extends AbstractEntity
#[ORM\Column(name: 'deviceType', type: 'string', length: 191, nullable: true)]
protected ?string $deviceType = null;
- #[ORM\Column(name: 'deviceBrand', type: 'string', length: 191, nullable: true)]
- protected ?string $deviceBrand = null;
-
- #[ORM\Column(name: 'deviceModel', type: 'string', length: 40, nullable: true)]
- protected ?string $deviceModel = null;
-
#[ORM\Column(type: 'yes_no_enum', nullable: true, enumType: YesNoEnum::class)]
protected YesNoEnum $isMobile = YesNoEnum::No;
@@ -54,20 +48,14 @@ class AdminLogin extends AbstractEntity
#[ORM\Column(name: 'osVersion', type: 'string', length: 191, nullable: true)]
protected ?string $osVersion = null;
- #[ORM\Column(name: 'osPlatform', type: 'string', length: 191, nullable: true)]
- protected ?string $osPlatform = null;
-
#[ORM\Column(name: 'clientType', type: 'string', length: 191, nullable: true)]
protected ?string $clientType = null;
#[ORM\Column(name: 'clientName', type: 'string', length: 191, nullable: true)]
protected ?string $clientName = null;
- #[ORM\Column(name: 'clientEngine', type: 'string', length: 191, nullable: true)]
- protected ?string $clientEngine = null;
-
- #[ORM\Column(name: 'clientVersion', type: 'string', length: 191, nullable: true)]
- protected ?string $clientVersion = null;
+ #[ORM\Column(type: 'yes_no_enum', nullable: true, enumType: YesNoEnum::class)]
+ protected YesNoEnum $isCrawler = YesNoEnum::No;
#[ORM\Column(type: 'success_failure_enum', nullable: true, enumType: SuccessFailureEnum::class)]
protected SuccessFailureEnum $loginStatus = SuccessFailureEnum::Fail;
@@ -144,30 +132,6 @@ public function setDeviceType(?string $deviceType): self
return $this;
}
- public function getDeviceBrand(): ?string
- {
- return $this->deviceBrand;
- }
-
- public function setDeviceBrand(?string $deviceBrand): self
- {
- $this->deviceBrand = $deviceBrand;
-
- return $this;
- }
-
- public function getDeviceModel(): ?string
- {
- return $this->deviceModel;
- }
-
- public function setDeviceModel(?string $deviceModel): self
- {
- $this->deviceModel = $deviceModel;
-
- return $this;
- }
-
public function getIsMobile(): ?YesNoEnum
{
return $this->isMobile;
@@ -204,18 +168,6 @@ public function setOsVersion(?string $osVersion): self
return $this;
}
- public function getOsPlatform(): ?string
- {
- return $this->osPlatform;
- }
-
- public function setOsPlatform(?string $osPlatform): self
- {
- $this->osPlatform = $osPlatform;
-
- return $this;
- }
-
public function getClientType(): ?string
{
return $this->clientType;
@@ -240,26 +192,14 @@ public function setClientName(?string $clientName): self
return $this;
}
- public function getClientEngine(): ?string
- {
- return $this->clientEngine;
- }
-
- public function setClientEngine(?string $clientEngine): self
- {
- $this->clientEngine = $clientEngine;
-
- return $this;
- }
-
- public function getClientVersion(): ?string
+ public function getIsCrawler(): ?YesNoEnum
{
- return $this->clientVersion;
+ return $this->isCrawler;
}
- public function setClientVersion(?string $clientVersion): self
+ public function setIsCrawler(YesNoEnum $isCrawler): self
{
- $this->clientVersion = $clientVersion;
+ $this->isCrawler = $isCrawler;
return $this;
}
@@ -285,16 +225,12 @@ public function setLoginStatus(SuccessFailureEnum $loginStatus): self
* continent: string|null,
* organization: string|null,
* deviceType: string|null,
- * deviceBrand: string|null,
- * deviceModel: string|null,
- * isMobile: string,
+ * isMobile: 'no'|'yes',
* osName: string|null,
* osVersion: string|null,
- * osPlatform: string|null,
* clientType: string|null,
* clientName: string|null,
- * clientEngine: string|null,
- * clientVersion: string|null,
+ * isCrawler: 'no'|'yes',
* loginStatus: string,
* created: DateTimeImmutable|null,
* updated: DateTimeImmutable|null,
@@ -303,26 +239,22 @@ public function setLoginStatus(SuccessFailureEnum $loginStatus): self
public function getArrayCopy(): array
{
return [
- 'id' => $this->id->toString(),
- 'identity' => $this->identity,
- 'adminIp' => $this->adminIp,
- 'country' => $this->country,
- 'continent' => $this->continent,
- 'organization' => $this->organization,
- 'deviceType' => $this->deviceType,
- 'deviceBrand' => $this->deviceBrand,
- 'deviceModel' => $this->deviceModel,
- 'isMobile' => $this->isMobile->value,
- 'osName' => $this->osName,
- 'osVersion' => $this->osVersion,
- 'osPlatform' => $this->osPlatform,
- 'clientType' => $this->clientType,
- 'clientName' => $this->clientName,
- 'clientEngine' => $this->clientEngine,
- 'clientVersion' => $this->clientVersion,
- 'loginStatus' => $this->loginStatus->value,
- 'created' => $this->created,
- 'updated' => $this->updated,
+ 'id' => $this->id->toString(),
+ 'identity' => $this->identity,
+ 'adminIp' => $this->adminIp,
+ 'country' => $this->country,
+ 'continent' => $this->continent,
+ 'organization' => $this->organization,
+ 'deviceType' => $this->deviceType,
+ 'isMobile' => $this->isMobile->value,
+ 'osName' => $this->osName,
+ 'osVersion' => $this->osVersion,
+ 'clientType' => $this->clientType,
+ 'clientName' => $this->clientName,
+ 'isCrawler' => $this->isCrawler->value,
+ 'loginStatus' => $this->loginStatus->value,
+ 'created' => $this->created,
+ 'updated' => $this->updated,
];
}
}
diff --git a/test/Unit/Admin/Entity/AdminLoginTest.php b/test/Unit/Admin/Entity/AdminLoginTest.php
index a43831d..3dfce8b 100644
--- a/test/Unit/Admin/Entity/AdminLoginTest.php
+++ b/test/Unit/Admin/Entity/AdminLoginTest.php
@@ -67,16 +67,6 @@ public function testAccessors(): void
$this->assertSame(AdminLogin::class, $adminLogin::class);
$this->assertSame('test', $adminLogin->getDeviceType());
- $this->assertNull($adminLogin->getDeviceBrand());
- $adminLogin = $adminLogin->setDeviceBrand('test');
- $this->assertSame(AdminLogin::class, $adminLogin::class);
- $this->assertSame('test', $adminLogin->getDeviceBrand());
-
- $this->assertNull($adminLogin->getDeviceModel());
- $adminLogin = $adminLogin->setDeviceModel('test');
- $this->assertSame(AdminLogin::class, $adminLogin::class);
- $this->assertSame('test', $adminLogin->getDeviceModel());
-
$this->assertSame(YesNoEnum::No, $adminLogin->getIsMobile());
$adminLogin = $adminLogin->setIsMobile(YesNoEnum::Yes);
$this->assertSame(AdminLogin::class, $adminLogin::class);
@@ -93,11 +83,6 @@ public function testAccessors(): void
$this->assertSame(AdminLogin::class, $adminLogin::class);
$this->assertSame('test', $adminLogin->getOsVersion());
- $this->assertNull($adminLogin->getOsPlatform());
- $adminLogin = $adminLogin->setOsPlatform('test');
- $this->assertSame(AdminLogin::class, $adminLogin::class);
- $this->assertSame('test', $adminLogin->getOsPlatform());
-
$this->assertNull($adminLogin->getClientType());
$adminLogin = $adminLogin->setClientType('test');
$this->assertSame(AdminLogin::class, $adminLogin::class);
@@ -108,15 +93,11 @@ public function testAccessors(): void
$this->assertSame(AdminLogin::class, $adminLogin::class);
$this->assertSame('test', $adminLogin->getClientName());
- $this->assertNull($adminLogin->getClientEngine());
- $adminLogin = $adminLogin->setClientEngine('test');
- $this->assertSame(AdminLogin::class, $adminLogin::class);
- $this->assertSame('test', $adminLogin->getClientEngine());
-
- $this->assertNull($adminLogin->getClientVersion());
- $adminLogin = $adminLogin->setClientVersion('test');
+ $this->assertSame(YesNoEnum::No, $adminLogin->getIsCrawler());
+ $adminLogin = $adminLogin->setIsCrawler(YesNoEnum::Yes);
$this->assertSame(AdminLogin::class, $adminLogin::class);
- $this->assertSame('test', $adminLogin->getClientVersion());
+ $this->assertNotNull($adminLogin->getIsCrawler());
+ $this->assertSame('yes', $adminLogin->getIsCrawler()->value);
$this->assertSame(SuccessFailureEnum::Fail, $adminLogin->getLoginStatus());
$adminLogin = $adminLogin->setLoginStatus(SuccessFailureEnum::Success);