Compare commits

...

1 Commits

Author SHA1 Message Date
Vasili Karaev 768558ec85 Add user agent parsing module 2022-09-26 23:10:12 +03:00
16 changed files with 67 additions and 10 deletions

View File

@ -74,6 +74,8 @@ subprojects {
dependency("software.amazon.awssdk:s3:2.10.11")
dependency("com.google.firebase:firebase-admin:9.0.0")
dependency("com.github.ua-parser:uap-java:1.5.3")
}
}

View File

@ -0,0 +1,7 @@
plugins {
id("kotlin")
}
dependencies {
implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8")
}

View File

@ -1,4 +1,4 @@
package ru.touchin.auth.core.device.dto.enums
package ru.touchin.common.devices.enums
enum class DevicePlatform {
Android, Huawei, Apple, Web

View File

@ -8,6 +8,7 @@ dependencies {
runtimeOnly("org.postgresql:postgresql")
api(project(":common"))
api(project(":common-device"))
api(project(":common-spring-jpa"))

View File

@ -1,6 +1,6 @@
package ru.touchin.auth.core.device.dto
import ru.touchin.auth.core.device.dto.enums.DevicePlatform
import ru.touchin.common.devices.enums.DevicePlatform
import java.util.*
data class Device(

View File

@ -1,8 +1,8 @@
package ru.touchin.auth.core.device.models
import ru.touchin.auth.core.configurations.AuthCoreDatabaseConfiguration.Companion.SCHEMA
import ru.touchin.auth.core.device.dto.enums.DevicePlatform
import ru.touchin.auth.core.user.models.UserEntity
import ru.touchin.common.devices.enums.DevicePlatform
import ru.touchin.common.spring.jpa.models.AuditableUuidIdEntity
import javax.persistence.Entity
import javax.persistence.JoinColumn

View File

@ -1,7 +1,7 @@
package ru.touchin.auth.core.device.services
import ru.touchin.auth.core.device.dto.Device
import ru.touchin.auth.core.device.dto.enums.DevicePlatform
import ru.touchin.common.devices.enums.DevicePlatform
import java.util.UUID
interface DeviceCoreService {

View File

@ -6,9 +6,9 @@ import org.springframework.transaction.annotation.Transactional
import ru.touchin.auth.core.device.converters.DeviceConverter.toDto
import ru.touchin.auth.core.device.dto.Device
import ru.touchin.auth.core.device.models.DeviceEntity
import ru.touchin.auth.core.device.dto.enums.DevicePlatform
import ru.touchin.auth.core.device.repository.DeviceRepository
import ru.touchin.auth.core.device.repository.findByIdOrThrow
import ru.touchin.common.devices.enums.DevicePlatform
import java.util.*
@Service

View File

@ -8,12 +8,12 @@ import org.springframework.beans.factory.annotation.Autowired
import org.springframework.dao.DataAccessException
import ru.touchin.auth.core.device.exceptions.DeviceNotFoundException
import ru.touchin.auth.core.device.models.DeviceEntity
import ru.touchin.auth.core.device.dto.enums.DevicePlatform
import ru.touchin.auth.core.device.repository.DeviceRepository
import ru.touchin.auth.core.device.repository.findByIdOrThrow
import ru.touchin.auth.core.device.repository.findByIdWithLockOrThrow
import ru.touchin.auth.core.user.models.UserEntity
import ru.touchin.auth.core.user.repositories.UserRepository
import ru.touchin.common.devices.enums.DevicePlatform
import ru.touchin.common.spring.test.jpa.repository.RepositoryTest
import java.time.Duration
import java.util.*

View File

@ -14,8 +14,8 @@ import org.springframework.test.context.ActiveProfiles
import ru.touchin.auth.core.device.dto.Device
import ru.touchin.auth.core.device.exceptions.DeviceNotFoundException
import ru.touchin.auth.core.device.models.DeviceEntity
import ru.touchin.auth.core.device.dto.enums.DevicePlatform
import ru.touchin.auth.core.device.repository.DeviceRepository
import ru.touchin.common.devices.enums.DevicePlatform
import java.util.*
@ActiveProfiles("test")

View File

@ -8,13 +8,13 @@ import org.junit.jupiter.api.Test
import org.mockito.internal.matchers.apachecommons.ReflectionEquals
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.dao.DataAccessException
import ru.touchin.auth.core.device.dto.enums.DevicePlatform
import ru.touchin.auth.core.device.models.DeviceEntity
import ru.touchin.auth.core.device.repository.DeviceRepository
import ru.touchin.auth.core.scope.models.ScopeEntity
import ru.touchin.auth.core.scope.repositories.ScopeRepository
import ru.touchin.auth.core.user.exceptions.UserNotFoundException
import ru.touchin.auth.core.user.models.UserEntity
import ru.touchin.common.devices.enums.DevicePlatform
import ru.touchin.common.spring.test.jpa.repository.RepositoryTest
import java.time.ZonedDateTime
import java.util.*

View File

@ -11,7 +11,6 @@ import org.junit.jupiter.api.assertThrows
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.security.crypto.password.PasswordEncoder
import ru.touchin.auth.core.device.dto.Device
import ru.touchin.auth.core.device.dto.enums.DevicePlatform
import ru.touchin.auth.core.device.repository.DeviceRepository
import ru.touchin.auth.core.device.repository.findByIdOrThrow
import ru.touchin.auth.core.device.services.DeviceCoreService
@ -30,6 +29,7 @@ import ru.touchin.auth.core.user.services.dto.NewUser
import ru.touchin.auth.core.user.services.dto.UserLogin
import ru.touchin.auth.core.user.services.dto.UserLogout
import ru.touchin.auth.core.user.services.dto.UserUpdatePassword
import ru.touchin.common.devices.enums.DevicePlatform
import ru.touchin.common.spring.test.jpa.repository.RepositoryTest
import java.util.*
import javax.persistence.EntityManager

View File

@ -16,7 +16,6 @@ import org.springframework.boot.test.context.SpringBootTest
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder
import org.springframework.test.context.ActiveProfiles
import ru.touchin.auth.core.device.converters.DeviceConverter.toDto
import ru.touchin.auth.core.device.dto.enums.DevicePlatform
import ru.touchin.auth.core.device.exceptions.DeviceAlreadyLinkedException
import ru.touchin.auth.core.device.models.DeviceEntity
import ru.touchin.auth.core.device.repository.DeviceRepository
@ -30,6 +29,7 @@ import ru.touchin.auth.core.user.repositories.UserAccountRepository
import ru.touchin.auth.core.user.repositories.UserRepository
import ru.touchin.auth.core.user.services.dto.NewAnonymousUser
import ru.touchin.auth.core.user.services.dto.NewUser
import ru.touchin.common.devices.enums.DevicePlatform
import java.util.*
@ActiveProfiles("test")

View File

@ -30,6 +30,7 @@ include("common-spring-test-jpa")
include("common-measure")
include("common-measure-spring")
include("common-territories")
include("common-device")
include("common-geo")
include("common-geo-spatial4j-spring")
include("common-messaging")
@ -56,3 +57,4 @@ include("security-jwt-common")
include("s3-storage")
include("server-info-spring-web")
include("geoip-core")
include("user-agent")

View File

@ -0,0 +1,11 @@
plugins {
id("kotlin")
}
dependencies {
implementation(project(":common-device"))
implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8")
implementation("com.github.ua-parser:uap-java")
}

View File

@ -0,0 +1,34 @@
package ru.touchin.ua.devices
import ru.touchin.common.devices.enums.DevicePlatform
import ua_parser.Parser as UaParser
class DevicePlatformFactory {
fun fromUserAgent(userAgent: String): DevicePlatform {
val client = UaParser().parse(userAgent)
if (client.device.family.matches(HUAWEI_DEVICE_FAMILY_REGEX)) {
return DevicePlatform.Huawei
}
return when (client.os.family) {
"iOS" -> DevicePlatform.Apple
"Android" -> DevicePlatform.Android
else -> DevicePlatform.Web
}
}
private companion object {
val HUAWEI_DEVICE_FAMILY_REGEX = Regex(
"ALP-|AMN-|ANA-|ANE-|ANG-|AQM-|ARS-|ART-|ATU-|BAC-|BLA-|BRQ-|CAG-|CAM-|CAN-|CAZ-|CDL-|CDY-|CLT-" +
"|CRO-|CUN-|DIG-|DRA-|DUA-|DUB-|DVC-|ELE-|ELS-|EML-|EVA-|EVR-|FIG-|FLA-|FRL-|GLK-|HMA-|HW-|HWI-|INE-" +
"|JAT-|JEF-|JER-|JKM-|JNY-|JSC-|LDN-|LIO-|LON-|LUA-|LYA-|LYO-|MAR-|MED-|MHA-|MLA-|MRD-|MYA-|NCE-|NEO-" +
"|NOH-|NOP-|OCE-|PAR-|PIC-|POT-|PPA-|PRA-|RNE-|SEA-|SLA-|SNE-|SPN-|STK-|TAH-|TAS-|TET-|TRT-|VCE-|VIE-" +
"|VKY-|VNS-|VOG-|VTR-|WAS-|WKG-|WLZ-|YAL"
)
}
}