Первый
This commit is contained in:
35
.gitignore
vendored
Normal file
35
.gitignore
vendored
Normal file
@ -0,0 +1,35 @@
|
||||
HELP.md
|
||||
target/
|
||||
!.mvn/wrapper/maven-wrapper.jar
|
||||
!**/src/main/**/target/
|
||||
!**/src/test/**/target/
|
||||
|
||||
### STS ###
|
||||
.apt_generated
|
||||
.classpath
|
||||
.factorypath
|
||||
.project
|
||||
.settings
|
||||
.springBeans
|
||||
.sts4-cache
|
||||
|
||||
### IntelliJ IDEA ###
|
||||
.idea
|
||||
*.iws
|
||||
*.iml
|
||||
*.ipr
|
||||
|
||||
### NetBeans ###
|
||||
/nbproject/private/
|
||||
/nbbuild/
|
||||
/dist/
|
||||
/nbdist/
|
||||
/.nb-gradle/
|
||||
build/
|
||||
!**/src/main/**/build/
|
||||
!**/src/test/**/build/
|
||||
|
||||
### VS Code ###
|
||||
.vscode/
|
||||
/logs
|
||||
/temporary.sqlite
|
||||
BIN
.mvn/wrapper/maven-wrapper.jar
vendored
Normal file
BIN
.mvn/wrapper/maven-wrapper.jar
vendored
Normal file
Binary file not shown.
2
.mvn/wrapper/maven-wrapper.properties
vendored
Normal file
2
.mvn/wrapper/maven-wrapper.properties
vendored
Normal file
@ -0,0 +1,2 @@
|
||||
distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.5/apache-maven-3.9.5-bin.zip
|
||||
wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar
|
||||
248
README.md
Normal file
248
README.md
Normal file
@ -0,0 +1,248 @@
|
||||
# Описание функций авторизации
|
||||
____
|
||||
#### Алгоритм
|
||||
Refresh token токен действует 12 часов и за эти 12 часов не реже чем раз в 3 часа нужно обновить Refresh token ну и заодно Access token обновиться.
|
||||
Аccess token действует 20 минут (позже уменьшу до 10 минут) и его можно обновить в любое время, если будет просрочен выдаст 401 ошибку. Чтобы время от времени по расписанию не запрашивать обновление токена,
|
||||
можно сделать обвёртку для 2й отправки запроса, в случае выявления просрочки токена чтобы эта обвёртка отправляла запрос Refresh, а потом обратно в нужное место отправляла запрос.
|
||||
____
|
||||
## Оглавление
|
||||
1. [Получить список разрешений для пользователя по Access token](#получить-список-разрешений-для-пользователя-по-Access-token)
|
||||
2. [Получить CAPTCHA с проверочным токеном](#получить-captcha-с-проверочным-токеном)
|
||||
3. [Создать нового пользователя](#создать-нового-пользователя)
|
||||
4. [Получить информацию о пользователе по его Access token ](#получить-информацию-о-пользователе-по-его-access-token )
|
||||
5. [Авторизоваться](#авторизоваться)
|
||||
6. [Обновить токен доступа (а также обновить рефреш токен)](#обновить-токен-доступа-а-также-обновить-рефреш-токен)
|
||||
7. [Ссылка для подтверждения смены пароля (переходят на неё из почты)](#ссылка-для-подтверждения-смены-пароля-переходят-на-неё-из-почты)
|
||||
8. [Принять капчу и код для инициализации процедуры восстановления пароля](#принять-капчу-и-код-для-инициализации-процедуры-восстановления-пароля)
|
||||
9. [Обновить пароль по логину и старому паролю](#обновить-пароль-по-логину-и-старому-паролю)
|
||||
10. [Проверить валидность токена](#проверить-валидность-токена)
|
||||
|
||||
____
|
||||
|
||||
### Получить список разрешений для пользователя по Access token
|
||||
https://istransit.kz/api/authorization/v02/access/
|
||||
|
||||
Запрос может содержать параметры фильтрации для поиска частичного совпадения названия (действия), если параметров фильтрации нет или он равен null то вернёт все записи.
|
||||
|
||||
Пример запроса:
|
||||
```json
|
||||
{
|
||||
"action_name":"arm_"
|
||||
}
|
||||
```
|
||||
|
||||
Пример ответа:
|
||||
```json
|
||||
{
|
||||
"error_code": 0,
|
||||
"error_message": "",
|
||||
"data": [
|
||||
"arm_accounting",
|
||||
"arm_carrier",
|
||||
"arm_hr"]
|
||||
}
|
||||
```
|
||||
|
||||
### Получить CAPTCHA с проверочным токеном
|
||||
https://istransit.kz/api/authorization/v02/captcha/
|
||||
|
||||
Пример запроса:
|
||||
```json
|
||||
{
|
||||
"email":"test@mail.ru"
|
||||
}
|
||||
```
|
||||
Пример ответа:
|
||||
```json
|
||||
{
|
||||
"image":"тут gif в base64",
|
||||
"token":"ZUROMC9xQVpRNjVGZGZBSWdrSGk5NHlPK2JXcHJMHVlbWVBPT0=.ywHb5zzI+ARK3XDRpgVkC1fdlqEQWWOXLuVIu\/rRMho="
|
||||
}
|
||||
```
|
||||
Где "image" это рисунок в base64
|
||||
|
||||
А "token" это токен для последующей проверки введённого кода "code":"XXXXXX".
|
||||
|
||||
По умолчанию токен captcha действует 10 минут.
|
||||
|
||||
### Создать нового пользователя
|
||||
https://istransit.kz/api/authorization/v02/create/
|
||||
|
||||
Письмо с паролем придёт на почту
|
||||
|
||||
Пример запроса:
|
||||
```json5
|
||||
{
|
||||
"country_id": "1",
|
||||
"company_name": "ТОО 'Тестовая компания'",
|
||||
"position": "Менеджер",
|
||||
"name": "Берик",
|
||||
"surname": "Султанов",
|
||||
"patronymic": "Серикович",
|
||||
"phone": "+7777123456",
|
||||
"email": "test@test.kz",
|
||||
"code":"11111", //Код с CAPTCHA
|
||||
"token":"ZUROMC9xQVpRNjVGZGZBSdyc2JIV0ZueHdDMHVlbWVBPT0=.ywHb5zzI+ARK3XDRpgVkC1fdlqEQWWOXLuVIu\/rRMho=" //Токен с CAPTCHA
|
||||
}
|
||||
```
|
||||
Пример ответа:
|
||||
```json
|
||||
{
|
||||
"error_code": "0",
|
||||
"error_message":""
|
||||
}
|
||||
```
|
||||
|
||||
### Получить информацию о пользователе по его Access token
|
||||
https://istransit.kz/api/authorization/v02/info/
|
||||
|
||||
Запрос:
|
||||
```
|
||||
Cookie: jwt_a = Access token
|
||||
```
|
||||
Пример ответа:
|
||||
```json5
|
||||
{
|
||||
"error_code": "0",
|
||||
"error_message": "",
|
||||
"name": "Igor",
|
||||
"surname": "M",
|
||||
"patronymic": "I",
|
||||
"roles": "Кассир, Кладовщик",
|
||||
"time": "1703838784", //Время с сервера
|
||||
"expiration": "1696924443", //Когда "протухнет" пароль
|
||||
"appid": "postman",
|
||||
"arm": "monitoring"
|
||||
}
|
||||
```
|
||||
### Авторизоваться
|
||||
https://istransit.kz/api/authorization/v02/login/
|
||||
|
||||
Пример запроса:
|
||||
```json
|
||||
{
|
||||
"login" : "test@istt.kz",
|
||||
"password" : "test",
|
||||
"totp": "123456",
|
||||
"appid" : "postman"
|
||||
}
|
||||
```
|
||||
В ответ:
|
||||
```json5
|
||||
{
|
||||
"error_code": "0",
|
||||
"error_message": "",
|
||||
"name": "Igor",
|
||||
"surname": "M",
|
||||
"patronymic": "I",
|
||||
"roles": "Кассир, Кладовщик",
|
||||
"time": "1703838784", //Время с сервера
|
||||
"expiration": "1696924443", //Когда протухает пароль
|
||||
"appid": "postman",
|
||||
"arm": "monitoring"
|
||||
}
|
||||
```
|
||||
Также в ответ Cookie:
|
||||
```
|
||||
Cookie: jwt_a = Access token
|
||||
Cookie: jwt_r = Refresh token
|
||||
```
|
||||
|
||||
### Обновить токен доступа (а также обновить рефреш токен)
|
||||
https://istransit.kz/api/authorization/v02/refresh/
|
||||
|
||||
В запросе Cookie:
|
||||
```
|
||||
Cookie: jwt_a = Access token
|
||||
Cookie: jwt_r = Refresh token
|
||||
```
|
||||
Пример ответа:
|
||||
```json
|
||||
{
|
||||
"error_code": "0",
|
||||
"error_message":""
|
||||
}
|
||||
```
|
||||
Также в ответе Cookie:
|
||||
```
|
||||
Cookie: jwt_a = Access token
|
||||
Cookie: jwt_r = Refresh token
|
||||
```
|
||||
|
||||
### Ссылка для подтверждения смены пароля (переходят на неё из почты)
|
||||
https://istransit.kz/api/authorization/v02/reset/
|
||||
|
||||
Пример запроса:
|
||||
```html
|
||||
https://istransit.kz/api/authorization/v02/reset/?token=xxxxx&lng=1
|
||||
```
|
||||
|
||||
В ответ HTML страница с результатом на 7 секунд, с переходом на главную страницу:
|
||||
```html
|
||||
<!DOCTYPE html>
|
||||
<html lang="ru">
|
||||
<head>
|
||||
<title></title>
|
||||
<meta http-equiv="refresh" content="7; url='https://aistransit.kz'" />
|
||||
</head>
|
||||
<body>
|
||||
<h1>Описание результата</h1>
|
||||
</body>
|
||||
</html>
|
||||
```
|
||||
|
||||
### Принять капчу и код для инициализации процедуры восстановления пароля
|
||||
https://istransit.kz/api/authorization/v02/restore/
|
||||
|
||||
Пример запроса:
|
||||
```json
|
||||
{
|
||||
"code":"11111",
|
||||
"token":"ZUROMC9xQVpRNjVGZGZBSdyc2JIV0ZueHdDMHVlbWVBPT0=.ywHb5zzI+ARK3XDRpgVkC1fdlqEQWWOXLuVIu\/rRMho="
|
||||
}
|
||||
```
|
||||
Код и токен из captcha
|
||||
|
||||
Пример ответа:
|
||||
```json
|
||||
{
|
||||
"error_code": "0",
|
||||
"error_message":""
|
||||
}
|
||||
```
|
||||
|
||||
### Обновить пароль по логину и старому паролю
|
||||
https://istransit.kz/api/authorization/v02/update/
|
||||
|
||||
Для этой функции авторизация пользователя не обязательна, а значит пользователя можно не авторизовывать если у него просрочен пароль.
|
||||
|
||||
В новом пароле должно быть цифра, большая латинская буква, маленькая латинская буква, один спец символ и длина не менее 6 символов.
|
||||
|
||||
Пример запроса:
|
||||
```json
|
||||
{
|
||||
"login":"test@mail.ru",
|
||||
"password":"12345",
|
||||
"password_new":"54321"
|
||||
}
|
||||
```
|
||||
Пример ответа:
|
||||
```json
|
||||
{
|
||||
"error_code": "0",
|
||||
"error_message":""
|
||||
}
|
||||
```
|
||||
|
||||
### Проверить валидность токена
|
||||
https://istransit.kz/api/authorization/v02/alive/
|
||||
|
||||
На вход Cookie с jwt_a токеном, на выход код ошибки.
|
||||
|
||||
Пример ответа:
|
||||
```json
|
||||
{
|
||||
"error_code": "0",
|
||||
"error_message":""
|
||||
}
|
||||
```
|
||||
38
kg_gpti_transit_jwt.properties
Normal file
38
kg_gpti_transit_jwt.properties
Normal file
@ -0,0 +1,38 @@
|
||||
spring.application.name=kg_gpti_jwt
|
||||
server.port=8082
|
||||
issuer.name=transit
|
||||
|
||||
logging.level.com.zaxxer.hikari=DEBUG
|
||||
|
||||
spring.datasource.url=jdbc:postgresql://192.168.6.25:5432/transit?ApplicationName=transit_jwt
|
||||
spring.datasource.username=postgres
|
||||
spring.datasource.password=lelPfAtgQWhHYfy1SsHk
|
||||
spring.datasource.driver-class-name=org.postgresql.Driver
|
||||
|
||||
spring.datasource.hikari.maximum-pool-size=10
|
||||
spring.datasource.hikari.minimum-idle=5
|
||||
spring.datasource.hikari.max-lifetime=1700000
|
||||
spring.datasource.hikari.idle-timeout=600000
|
||||
spring.datasource.hikari.connection-timeout=30000
|
||||
spring.datasource.hikari.connection-test-query=SELECT now()
|
||||
spring.datasource.hikari.validation-timeout=60000
|
||||
|
||||
private.key=MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQD1GHVopvcvpJyU/ha7+R9IDC6EoZyZKZ14XBGu95ikEUSPkIoxE8n6TbF8Srj95OxrowHhOejtMrUhF+NBJNR59evR9ZT1JO2yo/QvvfA834wiDpNzCDFQbGO5emuN9KoinZIpFSyMtjGNlaj7zf01wYIglSqr3kzpTYlF3zlVlW/6oGECA3swKnz9eiNEMg7WEHCIZx+HureHySSJi4MZLizH4EzAW8geUB7Vi5rJLfg5fPcXkJfOcP6PoSnfHqXkSw2DFEoM+hz3vrS/rj05YlkmTTKarnr+GOAc4IhE36zbSx93BaZ4d59Hsk5CuS4qk/sI9dn7IQYJKuypKJiFAgMBAAECggEBAI2AwoBaLUofYpuOmveJm+rPxaejWrL+2MBdf4QhxMmsgoXUcERnZWwSoQ7eYTGMkoaORQ6QjY8sgHCLxxOcPOPw/GZqv8ZMvMMvb1KE+YdblR8whSabq0UAXw79w8zgXb3AdVsss1zF75QLvNUsFy2K/CLtnAZAQO1Na5yghQyIKjKd8YXSP8Ylk15Nz942jbo71h980Uk3mr8tV/PqJ1x7cs1Z5femhQHNFDsuJMRh6TpPDSqEir3ziZs9jVQMR4pAMm5bCvfcsnOPaltomRymUKOTdvHBVv1LCTWNipQgqNPMitmcWtJnC48j62M5ADtnF1p30VezMQnylLS+3kECgYEA+rXZQdbndKHaROTE1bDAmthxgrOBW5wrzZ7B9Z0zDnrsuOa8bk8Dc0WNGd8/mzKz1t4fAfA7W9c/748erhwUFhBlzpv8COOcEJwWSL4dV0mCLBqMuhmb4yJRYwv2kVEdFvbWPjKRhr7WcnIV7rrbc/jr3kdr/aKSXzxt7J0BaDUCgYEA+kRIb8/0XC6YJL84v8NlkpgaGx7BDGqIsjVYrWAfTWtS01HxT+39QG6T5tT6rgkIN1FBxkvSvvuz2/mwSpAvVktCuZyIHoAutJUuowwwT9yYy0zaLyrhX44zoXZiHmZAHObxo1oYogtH64yhiC3X+uLtScW0g5Z7SFxjDOTFmRECgYEAxVNnwjhhSB0z7FGa0w4hKj79aH/carxKhbZUtvqZeuYpd4az/KZX8txlKF3cdEy923pMMXxhW/HZMrYU0bjr3kndt3ZyMpTi+ve/WlW4RkFnIUtsQ/VwCp+yKyD5WnrbSH3TNnUasVF2+/DrblDH9UmQbA0O5DyWtDqd0kPpHZkCgYEAs95rqWDuoWojkxWUNc67q9aBvMgnu0K+KEbLCyCwnrXp+1NDekzz3WEcD6U23epD624NNfW86+J/bDRSjeR/AShqNnjYJAPAja1CrZDPEDbd4g/EKG5LOKA9X2h0MKEQpzUcqmjQl3ZAJH0Yg4VfW0PJg2IC0ShQRruPvO6XTeECgYA54eQya6sEIpE7aIKXwitRMV3VE8jMP5cQHTLK841pFPKiC2iMQDrgJqjYuMJUdhx2WRhoHQwy76XvLMWzLmD+k2U4DwzSq3APc6r+m4EesUdhsmt8/DFyR29OT0r7OuVVppQbQ+SPHrtNxVrAVuwhpnfW8rTdZRdbPHAnwgs/lg==
|
||||
public.key=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA9Rh1aKb3L6SclP4Wu/kfSAwuhKGcmSmdeFwRrveYpBFEj5CKMRPJ+k2xfEq4/eTsa6MB4Tno7TK1IRfjQSTUefXr0fWU9STtsqP0L73wPN+MIg6TcwgxUGxjuXprjfSqIp2SKRUsjLYxjZWo+839NcGCIJUqq95M6U2JRd85VZVv+qBhAgN7MCp8/XojRDIO1hBwiGcfh7q3h8kkiYuDGS4sx+BMwFvIHlAe1YuayS34OXz3F5CXznD+j6Ep3x6l5EsNgxRKDPoc9760v649OWJZJk0ymq56/hjgHOCIRN+s20sfdwWmeHefR7JOQrkuKpP7CPXZ+yEGCSrsqSiYhQIDAQAB
|
||||
access.time=600
|
||||
refresh.time=43200
|
||||
|
||||
captcha.key=PPExpv36jk4Vzda3NpYnXLfuHCLYXqaNrxlOH/Jr/1M=
|
||||
captcha.time=600
|
||||
|
||||
mail.host=mail.gpti.kg
|
||||
mail.port=587
|
||||
mail.login=noreply@gpti.kg
|
||||
mail.password=PasW#vc!a24
|
||||
|
||||
url.reset=https://transit.gpti.kg/api/authorization/v02/reset
|
||||
url.main=https://transit.gpti.kg/
|
||||
|
||||
spring.redis.host=192.168.6.25
|
||||
spring.redis.port=6379
|
||||
spring.redis.password=9F3/NKWeOjd815vkadT2DcgVHf6fEpVQXw==
|
||||
40
kz_istransit_jwt.properties
Normal file
40
kz_istransit_jwt.properties
Normal file
@ -0,0 +1,40 @@
|
||||
spring.application.name=kz_istransit_jwt
|
||||
server.port=8082
|
||||
issuer.name=istransit
|
||||
|
||||
logging.level.com.zaxxer.hikari=DEBUG
|
||||
|
||||
spring.datasource.url=jdbc:postgresql://10.101.1.6:5432/transit_2024_09_03?ApplicationName=kz_istransit_jwt
|
||||
spring.datasource.username=postgres
|
||||
spring.datasource.password=PasSecrKey1
|
||||
spring.datasource.driver-class-name=org.postgresql.Driver
|
||||
|
||||
spring.datasource.hikari.maximum-pool-size=10
|
||||
spring.datasource.hikari.minimum-idle=5
|
||||
spring.datasource.hikari.max-lifetime=1700000
|
||||
spring.datasource.hikari.idle-timeout=600000
|
||||
spring.datasource.hikari.connection-timeout=30000
|
||||
spring.datasource.hikari.connection-test-query=SELECT now()
|
||||
spring.datasource.hikari.validation-timeout=60000
|
||||
|
||||
|
||||
private.key=MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCsrV60WgOCbFDz7mrr5Ade4wSrKjgB4PX+Y2zzttc87FKILzZswpQv2XLRZXEbkgpAViV99BsKDSd0f46FTynTH3SqbAJ4KfhsVPqfMD2yNjJBJSRyLZ19QAFdyyveRI/b4oQ+dOl0ZhlAUQ5Hfg5G34cE/AyfoVaHRol2ZOpkf5XL90/dPKxPsAaWw+LwgD2PdqzINl1L17EspVUjNiRsclQqkodhzhP/brRhq5S03KKNtPnDhlZJsep67NX8cZQJgil8BnIzGHMqdFF+NBZoLPy/+r4U/Vr6O1oPZ7RK3ontY6fJPHY/bI17KxwQusk8C3tPJNwg2U3mhkJ3mF93AgMBAAECggEAE9nCX11RtfaZv9ESvZdzOXdDnCG4Wo7v+JSZe9LzH2/TdRBoY0xjGLUYu/W7cP3y6757hOVBDoDAnmXjjnOxTTH6iXTtO78nbdy/CvnSvd/5GwAYFoAj8Lgg8BVhL6YWG6MIrN1n0RfDo18uEw3suj0MGoiXMuqrNdXoC5JCV9cajVSDhABw761sNrwBgYCOxk28KrfTRLh6QsQGSf8stLDDwgfImWXJTLzKacFAemNRFuBqp+pQdVuBtorN9rYoGyiswVBTWIA06uUYZqK1uIRLh7wHf2cFARm5rREDwYmG8EHe8JXYeOU2JUF/Rd0V4EQVZHFB4VLwYYumwq2XUQKBgQDcyrmpaA7xjt7ilIV50CtzrY8hAJST2bbdnl/aMm7JI/ZjNFVXbTDHxUen0IvyHmpPS1Z3K8XJ2IR07L7vO3E96OJcYsU2dJ9/HZ5Vg+Q+f3TrscbNRc6Dn6knG9Vr/D/x3pJoyRR7VoWQXs6y87Df5eVtdjmzTTKtY/tmMhEyrQKBgQDINnvwg9vxhhaqflQmNCxGoAkImrYsyGBVlhOy3qbqnMVSQGW8ub/MChpNPrOBTNq6Nb7kK4dzYGSa7lK3vjX+9bc/8vUY69DpV9yZpp370UXTnrKkPUIgrVHiQfjfOXDXeHcpCNQD7E+cDM+DtPtgjtPV966HipFMSvOBmohDMwKBgQDY3Ro9ZeL/qpgLr1vnCOwVBA1ImhxVmIt/5FY7qDuevv778+Q7Khm2rnQyRamfl/ZNii8UgF8WYd/AROVJb3ZMG9lyauVQFn6uyXXCgviF1oUOGCCvcPhl2kW4DyOynCJmvHnMCG1gs9wesLCPnsJFOLb/rBcCoTm8iy7b8yNnRQKBgCeDSTaQb2ndMr/3KphXl51gnCfMkMOJ0ClT8xNMCdknk3HGL83tQsL8A3DXPQn5pvk0/jV9ub+1eGVzP3Pv4CwvRjkis+h1Mce7hVf1oBxAku1O1qa/SDu2uQBUUM+NQI3lwm6gxWb4zkVX6eRuZWYLCheiSBmL6V0LNb+QRfAtAoGBAJ4tM34ovk0Ag/fRjxgEYqo7FcMplBs3nymGV/zS9QQA4gorGq5mBiQX0n8wR68UpKz7u1NXNXc7hJGvP0uHK+/GCQd9i1Csow641TIdMv+4XhQl2/ZO0NuJb/NVB6qJ93WlnhWJP3s1a1zVlRyF3+Zn0D8nbBp+tkCbET0+XGuB
|
||||
public.key=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArK1etFoDgmxQ8+5q6+QHXuMEqyo4AeD1/mNs87bXPOxSiC82bMKUL9ly0WVxG5IKQFYlffQbCg0ndH+OhU8p0x90qmwCeCn4bFT6nzA9sjYyQSUkci2dfUABXcsr3kSP2+KEPnTpdGYZQFEOR34ORt+HBPwMn6FWh0aJdmTqZH+Vy/dP3TysT7AGlsPi8IA9j3asyDZdS9exLKVVIzYkbHJUKpKHYc4T/260YauUtNyijbT5w4ZWSbHqeuzV/HGUCYIpfAZyMxhzKnRRfjQWaCz8v/q+FP1a+jtaD2e0St6J7WOnyTx2P2yNeyscELrJPAt7TyTcINlN5oZCd5hfdwIDAQAB
|
||||
access.time=600
|
||||
refresh.time=43200
|
||||
|
||||
|
||||
captcha.key=PPExpv36jk4Vzda3NpYnXLfuHCLYXqaNrxlOH/Jr/1M=
|
||||
captcha.time=600
|
||||
|
||||
mail.host=92.46.51.29
|
||||
mail.port=465
|
||||
mail.login=no-reply@istt.kz
|
||||
mail.password=je6&HHCEmJ
|
||||
|
||||
url.reset=http://127.0.0.1:8088/reset
|
||||
url.main=http://127.0.0.1:8088/
|
||||
|
||||
spring.redis.host=10.101.1.6
|
||||
spring.redis.port=6379
|
||||
spring.redis.password=9F3/NKWeOjd815vkadT2DcgVHf6fEpVQXw==
|
||||
43
kz_mcp_jwt.properties
Normal file
43
kz_mcp_jwt.properties
Normal file
@ -0,0 +1,43 @@
|
||||
spring.application.name=kz_mcp_jwt
|
||||
server.port=8082
|
||||
issuer.name=geovizor
|
||||
|
||||
logging.level.com.zaxxer.hikari=DEBUG
|
||||
|
||||
#spring.datasource.url=jdbc:postgresql://geovizor.com:5432/monitoring_new
|
||||
#spring.datasource.username=postgres
|
||||
#spring.datasource.password=y7HMHi0ATxx1VC3UU5WG
|
||||
#spring.datasource.driver-class-name=org.postgresql.Driver
|
||||
|
||||
spring.datasource.url=jdbc:postgresql://mcp.kz:5432/mcp
|
||||
spring.datasource.username=igor
|
||||
spring.datasource.password=VnzbUdcePSLtg22ktz13
|
||||
spring.datasource.driver-class-name=org.postgresql.Driver
|
||||
|
||||
spring.datasource.hikari.maximum-pool-size=10
|
||||
spring.datasource.hikari.minimum-idle=5
|
||||
spring.datasource.hikari.max-lifetime=600000
|
||||
spring.datasource.hikari.idle-timeout=60000
|
||||
spring.datasource.hikari.connection-timeout=30000
|
||||
spring.datasource.hikari.connection-test-query=SELECT 1
|
||||
spring.datasource.hikari.validation-timeout=30000
|
||||
|
||||
public.key=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA30j+pSoKFHSdSulIGzdFtg+z+ANJPOSVFJ6jvehj1sonOqQsI2rz539+FgIrsDZE8iydFAlQNxS8vqYtWiQSksAUId7aOY/eq7mFkGW+U5xIA2OPgIvN0uhW1Edm85jS7aAg/P/c+lLHnPzQIFdsgVrAh4esFvVS10Pj6TjJVprDj0jOraIw84GVt0gYXZTudcvZavWcmGV1mQJf0jDIHQsCRcMJAE2lzBIKpJGPPZke9xs25lm8feTFR0NNjDNvCG4dYAimyAH36UslXa/zIfRB/7r4AB9KPBFxGe8szK1EcXbJY+paq+TazZJ8Lo8nEmpehCdHUNdD9iWtiYRjNQIDAQAB
|
||||
private.key=MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQDfSP6lKgoUdJ1K6UgbN0W2D7P4A0k85JUUnqO96GPWyic6pCwjavPnf34WAiuwNkTyLJ0UCVA3FLy+pi1aJBKSwBQh3to5j96ruYWQZb5TnEgDY4+Ai83S6FbUR2bzmNLtoCD8/9z6Usec/NAgV2yBWsCHh6wW9VLXQ+PpOMlWmsOPSM6tojDzgZW3SBhdlO51y9lq9ZyYZXWZAl/SMMgdCwJFwwkATaXMEgqkkY89mR73GzbmWbx95MVHQ02MM28Ibh1gCKbIAffpSyVdr/Mh9EH/uvgAH0o8EXEZ7yzMrURxdslj6lqr5NrNknwujycSal6EJ0dQ10P2Ja2JhGM1AgMBAAECggEAPWsLuIzOxv+owJFYpzvV7hV1sJPe0mQh6dEVQ0ioJc3naob8KSXjP1tfaFhigg77eg3xizBgozYOEPcO5IulnD4/i22MY2cCngPjDGwgJUmIuX3qXDaYgBouwCd/1yPDaV+xk0YiF60rgTA9Y5gInbBD40Pbf1kt106yY1WedDaMaogilC6nZwde7H6UQrjoxQ3fSyw9brH04Vma7awcaEYQ6C0NM4uMJFws9jnwDXkYh0QnPW5eIIf9gmr2a+FtKtqlQyZiCjrQOJuU2TQo9wgKiOkVRIfmivXbt5I1O7SkPPUl2mtQAjbZxtHqooLC6It9svO/4rRJY0egjvsGZQKBgQDwCTGhExOahz/UH0I58Ksq44Zz6c6wt7Pt8U2S9L4Sfgjt4Gxu5XcdgMchZHu+xQtONpd7HWO4d9zK1IIHgJ/4IBMA2Lcp7EglHsnuc9II31EU9uP6Ar3yD3UC3zP/lszQs7t3Tagpq3I0bUuSnKH+SMW+mKztg5Xiu4x72HeIGwKBgQDuIpryaOhCEuwN6VguTSStNJe6fxI1NlHLF0anacuT43MotsRXYWRKWdu2nkupB3SqY+Lxipibu8I5CkWoKV8pbGYSqW8YDSzxoSPocTrbkuai7mczMSBCtFZ3nDFx1J3O2IJZaBT4OA+HEVaj+rzeyEYrwACmtSAl+YBNXE4W7wKBgH4ohuIe0aXdQgnuJ/Ol74DKNueDUnQFCVedBOWhJqk3ft/vnW4nwpRKE98UHgnlLIz+Gl3F05ynuu8MBA+HZgyWZwaB4LrzCfQgm4dtbk3leYsoPCgx+r1XrGtG/uBt1NY4MOaCdUj5aDvv2dGD64xnmS8UtYbcKxIQ+sQ4wJJTAoGAVOcVo3Pvyw8ABn25qNhsSSzFJAMGNN6nDue/kxTPNm0Ts+Jl4lmg7jlXcqbBhwRXfiCa20901aF9v+R/rVMC0LwLMIAkUcjwyz2OleM4/uxDOrgRJ1lOjTnK0l5n6pPJp+PdpY7MWytxrdBquZA+Ipf5HMQZ91YAnkl0iyBr3xUCgYBNBIb0fVTlAf7KJ4urjOE+305oRmEU5eHK2KiAViPDj16BuPy/hE11BnZE5HT4AMfuAm6AmLdrdiyb2iROMrsEQ8AFsGaFsY/njXqV75nNWceLpqrMk1FcYmnAEv0X/RhvsPzv79RzEf9jyjZlQ1XMfBfuuwwjWaUTLBcQhGFOqQ==
|
||||
access.time=600
|
||||
refresh.time=43200
|
||||
|
||||
captcha.key=PPExpv36jk4Vzda3NpYnXLfuHCLYXqaNrxlOH/Jr/1M=
|
||||
captcha.time=600
|
||||
|
||||
mail.host=smtp.yandex.ru
|
||||
mail.port=465
|
||||
mail.login=info@ccalm.org
|
||||
mail.password=fu2lpsoGPGiq1xlRm8ag
|
||||
|
||||
url.reset=https://mcp.test/api/authorization/login/reset
|
||||
url.main=https://mcp.test/
|
||||
|
||||
spring.redis.host=127.0.0.1
|
||||
spring.redis.port=6379
|
||||
spring.redis.password=9F3/NKWeOjd815vkadT2DcgVHf6fEpVQXw==
|
||||
308
mvnw
vendored
Normal file
308
mvnw
vendored
Normal file
@ -0,0 +1,308 @@
|
||||
#!/bin/sh
|
||||
# ----------------------------------------------------------------------------
|
||||
# Licensed to the Apache Software Foundation (ASF) under one
|
||||
# or more contributor license agreements. See the NOTICE file
|
||||
# distributed with this work for additional information
|
||||
# regarding copyright ownership. The ASF licenses this file
|
||||
# to you under the Apache License, Version 2.0 (the
|
||||
# "License"); you may not use this file except in compliance
|
||||
# with the License. You may obtain a copy of the License at
|
||||
#
|
||||
# https://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing,
|
||||
# software distributed under the License is distributed on an
|
||||
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
# KIND, either express or implied. See the License for the
|
||||
# specific language governing permissions and limitations
|
||||
# under the License.
|
||||
# ----------------------------------------------------------------------------
|
||||
|
||||
# ----------------------------------------------------------------------------
|
||||
# Apache Maven Wrapper startup batch script, version 3.2.0
|
||||
#
|
||||
# Required ENV vars:
|
||||
# ------------------
|
||||
# JAVA_HOME - location of a JDK home dir
|
||||
#
|
||||
# Optional ENV vars
|
||||
# -----------------
|
||||
# MAVEN_OPTS - parameters passed to the Java VM when running Maven
|
||||
# e.g. to debug Maven itself, use
|
||||
# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
|
||||
# MAVEN_SKIP_RC - flag to disable loading of mavenrc files
|
||||
# ----------------------------------------------------------------------------
|
||||
|
||||
if [ -z "$MAVEN_SKIP_RC" ] ; then
|
||||
|
||||
if [ -f /usr/local/etc/mavenrc ] ; then
|
||||
. /usr/local/etc/mavenrc
|
||||
fi
|
||||
|
||||
if [ -f /etc/mavenrc ] ; then
|
||||
. /etc/mavenrc
|
||||
fi
|
||||
|
||||
if [ -f "$HOME/.mavenrc" ] ; then
|
||||
. "$HOME/.mavenrc"
|
||||
fi
|
||||
|
||||
fi
|
||||
|
||||
# OS specific support. $var _must_ be set to either true or false.
|
||||
cygwin=false;
|
||||
darwin=false;
|
||||
mingw=false
|
||||
case "$(uname)" in
|
||||
CYGWIN*) cygwin=true ;;
|
||||
MINGW*) mingw=true;;
|
||||
Darwin*) darwin=true
|
||||
# Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home
|
||||
# See https://developer.apple.com/library/mac/qa/qa1170/_index.html
|
||||
if [ -z "$JAVA_HOME" ]; then
|
||||
if [ -x "/usr/libexec/java_home" ]; then
|
||||
JAVA_HOME="$(/usr/libexec/java_home)"; export JAVA_HOME
|
||||
else
|
||||
JAVA_HOME="/Library/Java/Home"; export JAVA_HOME
|
||||
fi
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
|
||||
if [ -z "$JAVA_HOME" ] ; then
|
||||
if [ -r /etc/gentoo-release ] ; then
|
||||
JAVA_HOME=$(java-config --jre-home)
|
||||
fi
|
||||
fi
|
||||
|
||||
# For Cygwin, ensure paths are in UNIX format before anything is touched
|
||||
if $cygwin ; then
|
||||
[ -n "$JAVA_HOME" ] &&
|
||||
JAVA_HOME=$(cygpath --unix "$JAVA_HOME")
|
||||
[ -n "$CLASSPATH" ] &&
|
||||
CLASSPATH=$(cygpath --path --unix "$CLASSPATH")
|
||||
fi
|
||||
|
||||
# For Mingw, ensure paths are in UNIX format before anything is touched
|
||||
if $mingw ; then
|
||||
[ -n "$JAVA_HOME" ] && [ -d "$JAVA_HOME" ] &&
|
||||
JAVA_HOME="$(cd "$JAVA_HOME" || (echo "cannot cd into $JAVA_HOME."; exit 1); pwd)"
|
||||
fi
|
||||
|
||||
if [ -z "$JAVA_HOME" ]; then
|
||||
javaExecutable="$(which javac)"
|
||||
if [ -n "$javaExecutable" ] && ! [ "$(expr "\"$javaExecutable\"" : '\([^ ]*\)')" = "no" ]; then
|
||||
# readlink(1) is not available as standard on Solaris 10.
|
||||
readLink=$(which readlink)
|
||||
if [ ! "$(expr "$readLink" : '\([^ ]*\)')" = "no" ]; then
|
||||
if $darwin ; then
|
||||
javaHome="$(dirname "\"$javaExecutable\"")"
|
||||
javaExecutable="$(cd "\"$javaHome\"" && pwd -P)/javac"
|
||||
else
|
||||
javaExecutable="$(readlink -f "\"$javaExecutable\"")"
|
||||
fi
|
||||
javaHome="$(dirname "\"$javaExecutable\"")"
|
||||
javaHome=$(expr "$javaHome" : '\(.*\)/bin')
|
||||
JAVA_HOME="$javaHome"
|
||||
export JAVA_HOME
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ -z "$JAVACMD" ] ; then
|
||||
if [ -n "$JAVA_HOME" ] ; then
|
||||
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
|
||||
# IBM's JDK on AIX uses strange locations for the executables
|
||||
JAVACMD="$JAVA_HOME/jre/sh/java"
|
||||
else
|
||||
JAVACMD="$JAVA_HOME/bin/java"
|
||||
fi
|
||||
else
|
||||
JAVACMD="$(\unset -f command 2>/dev/null; \command -v java)"
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ ! -x "$JAVACMD" ] ; then
|
||||
echo "Error: JAVA_HOME is not defined correctly." >&2
|
||||
echo " We cannot execute $JAVACMD" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ -z "$JAVA_HOME" ] ; then
|
||||
echo "Warning: JAVA_HOME environment variable is not set."
|
||||
fi
|
||||
|
||||
# traverses directory structure from process work directory to filesystem root
|
||||
# first directory with .mvn subdirectory is considered project base directory
|
||||
find_maven_basedir() {
|
||||
if [ -z "$1" ]
|
||||
then
|
||||
echo "Path not specified to find_maven_basedir"
|
||||
return 1
|
||||
fi
|
||||
|
||||
basedir="$1"
|
||||
wdir="$1"
|
||||
while [ "$wdir" != '/' ] ; do
|
||||
if [ -d "$wdir"/.mvn ] ; then
|
||||
basedir=$wdir
|
||||
break
|
||||
fi
|
||||
# workaround for JBEAP-8937 (on Solaris 10/Sparc)
|
||||
if [ -d "${wdir}" ]; then
|
||||
wdir=$(cd "$wdir/.." || exit 1; pwd)
|
||||
fi
|
||||
# end of workaround
|
||||
done
|
||||
printf '%s' "$(cd "$basedir" || exit 1; pwd)"
|
||||
}
|
||||
|
||||
# concatenates all lines of a file
|
||||
concat_lines() {
|
||||
if [ -f "$1" ]; then
|
||||
# Remove \r in case we run on Windows within Git Bash
|
||||
# and check out the repository with auto CRLF management
|
||||
# enabled. Otherwise, we may read lines that are delimited with
|
||||
# \r\n and produce $'-Xarg\r' rather than -Xarg due to word
|
||||
# splitting rules.
|
||||
tr -s '\r\n' ' ' < "$1"
|
||||
fi
|
||||
}
|
||||
|
||||
log() {
|
||||
if [ "$MVNW_VERBOSE" = true ]; then
|
||||
printf '%s\n' "$1"
|
||||
fi
|
||||
}
|
||||
|
||||
BASE_DIR=$(find_maven_basedir "$(dirname "$0")")
|
||||
if [ -z "$BASE_DIR" ]; then
|
||||
exit 1;
|
||||
fi
|
||||
|
||||
MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"}; export MAVEN_PROJECTBASEDIR
|
||||
log "$MAVEN_PROJECTBASEDIR"
|
||||
|
||||
##########################################################################################
|
||||
# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
|
||||
# This allows using the maven wrapper in projects that prohibit checking in binary data.
|
||||
##########################################################################################
|
||||
wrapperJarPath="$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar"
|
||||
if [ -r "$wrapperJarPath" ]; then
|
||||
log "Found $wrapperJarPath"
|
||||
else
|
||||
log "Couldn't find $wrapperJarPath, downloading it ..."
|
||||
|
||||
if [ -n "$MVNW_REPOURL" ]; then
|
||||
wrapperUrl="$MVNW_REPOURL/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar"
|
||||
else
|
||||
wrapperUrl="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar"
|
||||
fi
|
||||
while IFS="=" read -r key value; do
|
||||
# Remove '\r' from value to allow usage on windows as IFS does not consider '\r' as a separator ( considers space, tab, new line ('\n'), and custom '=' )
|
||||
safeValue=$(echo "$value" | tr -d '\r')
|
||||
case "$key" in (wrapperUrl) wrapperUrl="$safeValue"; break ;;
|
||||
esac
|
||||
done < "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.properties"
|
||||
log "Downloading from: $wrapperUrl"
|
||||
|
||||
if $cygwin; then
|
||||
wrapperJarPath=$(cygpath --path --windows "$wrapperJarPath")
|
||||
fi
|
||||
|
||||
if command -v wget > /dev/null; then
|
||||
log "Found wget ... using wget"
|
||||
[ "$MVNW_VERBOSE" = true ] && QUIET="" || QUIET="--quiet"
|
||||
if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then
|
||||
wget $QUIET "$wrapperUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath"
|
||||
else
|
||||
wget $QUIET --http-user="$MVNW_USERNAME" --http-password="$MVNW_PASSWORD" "$wrapperUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath"
|
||||
fi
|
||||
elif command -v curl > /dev/null; then
|
||||
log "Found curl ... using curl"
|
||||
[ "$MVNW_VERBOSE" = true ] && QUIET="" || QUIET="--silent"
|
||||
if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then
|
||||
curl $QUIET -o "$wrapperJarPath" "$wrapperUrl" -f -L || rm -f "$wrapperJarPath"
|
||||
else
|
||||
curl $QUIET --user "$MVNW_USERNAME:$MVNW_PASSWORD" -o "$wrapperJarPath" "$wrapperUrl" -f -L || rm -f "$wrapperJarPath"
|
||||
fi
|
||||
else
|
||||
log "Falling back to using Java to download"
|
||||
javaSource="$MAVEN_PROJECTBASEDIR/.mvn/wrapper/MavenWrapperDownloader.java"
|
||||
javaClass="$MAVEN_PROJECTBASEDIR/.mvn/wrapper/MavenWrapperDownloader.class"
|
||||
# For Cygwin, switch paths to Windows format before running javac
|
||||
if $cygwin; then
|
||||
javaSource=$(cygpath --path --windows "$javaSource")
|
||||
javaClass=$(cygpath --path --windows "$javaClass")
|
||||
fi
|
||||
if [ -e "$javaSource" ]; then
|
||||
if [ ! -e "$javaClass" ]; then
|
||||
log " - Compiling MavenWrapperDownloader.java ..."
|
||||
("$JAVA_HOME/bin/javac" "$javaSource")
|
||||
fi
|
||||
if [ -e "$javaClass" ]; then
|
||||
log " - Running MavenWrapperDownloader.java ..."
|
||||
("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$wrapperUrl" "$wrapperJarPath") || rm -f "$wrapperJarPath"
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
##########################################################################################
|
||||
# End of extension
|
||||
##########################################################################################
|
||||
|
||||
# If specified, validate the SHA-256 sum of the Maven wrapper jar file
|
||||
wrapperSha256Sum=""
|
||||
while IFS="=" read -r key value; do
|
||||
case "$key" in (wrapperSha256Sum) wrapperSha256Sum=$value; break ;;
|
||||
esac
|
||||
done < "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.properties"
|
||||
if [ -n "$wrapperSha256Sum" ]; then
|
||||
wrapperSha256Result=false
|
||||
if command -v sha256sum > /dev/null; then
|
||||
if echo "$wrapperSha256Sum $wrapperJarPath" | sha256sum -c > /dev/null 2>&1; then
|
||||
wrapperSha256Result=true
|
||||
fi
|
||||
elif command -v shasum > /dev/null; then
|
||||
if echo "$wrapperSha256Sum $wrapperJarPath" | shasum -a 256 -c > /dev/null 2>&1; then
|
||||
wrapperSha256Result=true
|
||||
fi
|
||||
else
|
||||
echo "Checksum validation was requested but neither 'sha256sum' or 'shasum' are available."
|
||||
echo "Please install either command, or disable validation by removing 'wrapperSha256Sum' from your maven-wrapper.properties."
|
||||
exit 1
|
||||
fi
|
||||
if [ $wrapperSha256Result = false ]; then
|
||||
echo "Error: Failed to validate Maven wrapper SHA-256, your Maven wrapper might be compromised." >&2
|
||||
echo "Investigate or delete $wrapperJarPath to attempt a clean download." >&2
|
||||
echo "If you updated your Maven version, you need to update the specified wrapperSha256Sum property." >&2
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS"
|
||||
|
||||
# For Cygwin, switch paths to Windows format before running java
|
||||
if $cygwin; then
|
||||
[ -n "$JAVA_HOME" ] &&
|
||||
JAVA_HOME=$(cygpath --path --windows "$JAVA_HOME")
|
||||
[ -n "$CLASSPATH" ] &&
|
||||
CLASSPATH=$(cygpath --path --windows "$CLASSPATH")
|
||||
[ -n "$MAVEN_PROJECTBASEDIR" ] &&
|
||||
MAVEN_PROJECTBASEDIR=$(cygpath --path --windows "$MAVEN_PROJECTBASEDIR")
|
||||
fi
|
||||
|
||||
# Provide a "standardized" way to retrieve the CLI args that will
|
||||
# work with both Windows and non-Windows executions.
|
||||
MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $*"
|
||||
export MAVEN_CMD_LINE_ARGS
|
||||
|
||||
WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
|
||||
|
||||
# shellcheck disable=SC2086 # safe args
|
||||
exec "$JAVACMD" \
|
||||
$MAVEN_OPTS \
|
||||
$MAVEN_DEBUG_OPTS \
|
||||
-classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \
|
||||
"-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \
|
||||
${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@"
|
||||
205
mvnw.cmd
vendored
Normal file
205
mvnw.cmd
vendored
Normal file
@ -0,0 +1,205 @@
|
||||
@REM ----------------------------------------------------------------------------
|
||||
@REM Licensed to the Apache Software Foundation (ASF) under one
|
||||
@REM or more contributor license agreements. See the NOTICE file
|
||||
@REM distributed with this work for additional information
|
||||
@REM regarding copyright ownership. The ASF licenses this file
|
||||
@REM to you under the Apache License, Version 2.0 (the
|
||||
@REM "License"); you may not use this file except in compliance
|
||||
@REM with the License. You may obtain a copy of the License at
|
||||
@REM
|
||||
@REM https://www.apache.org/licenses/LICENSE-2.0
|
||||
@REM
|
||||
@REM Unless required by applicable law or agreed to in writing,
|
||||
@REM software distributed under the License is distributed on an
|
||||
@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
@REM KIND, either express or implied. See the License for the
|
||||
@REM specific language governing permissions and limitations
|
||||
@REM under the License.
|
||||
@REM ----------------------------------------------------------------------------
|
||||
|
||||
@REM ----------------------------------------------------------------------------
|
||||
@REM Apache Maven Wrapper startup batch script, version 3.2.0
|
||||
@REM
|
||||
@REM Required ENV vars:
|
||||
@REM JAVA_HOME - location of a JDK home dir
|
||||
@REM
|
||||
@REM Optional ENV vars
|
||||
@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands
|
||||
@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending
|
||||
@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven
|
||||
@REM e.g. to debug Maven itself, use
|
||||
@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
|
||||
@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files
|
||||
@REM ----------------------------------------------------------------------------
|
||||
|
||||
@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on'
|
||||
@echo off
|
||||
@REM set title of command window
|
||||
title %0
|
||||
@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on'
|
||||
@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO%
|
||||
|
||||
@REM set %HOME% to equivalent of $HOME
|
||||
if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%")
|
||||
|
||||
@REM Execute a user defined script before this one
|
||||
if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre
|
||||
@REM check for pre script, once with legacy .bat ending and once with .cmd ending
|
||||
if exist "%USERPROFILE%\mavenrc_pre.bat" call "%USERPROFILE%\mavenrc_pre.bat" %*
|
||||
if exist "%USERPROFILE%\mavenrc_pre.cmd" call "%USERPROFILE%\mavenrc_pre.cmd" %*
|
||||
:skipRcPre
|
||||
|
||||
@setlocal
|
||||
|
||||
set ERROR_CODE=0
|
||||
|
||||
@REM To isolate internal variables from possible post scripts, we use another setlocal
|
||||
@setlocal
|
||||
|
||||
@REM ==== START VALIDATION ====
|
||||
if not "%JAVA_HOME%" == "" goto OkJHome
|
||||
|
||||
echo.
|
||||
echo Error: JAVA_HOME not found in your environment. >&2
|
||||
echo Please set the JAVA_HOME variable in your environment to match the >&2
|
||||
echo location of your Java installation. >&2
|
||||
echo.
|
||||
goto error
|
||||
|
||||
:OkJHome
|
||||
if exist "%JAVA_HOME%\bin\java.exe" goto init
|
||||
|
||||
echo.
|
||||
echo Error: JAVA_HOME is set to an invalid directory. >&2
|
||||
echo JAVA_HOME = "%JAVA_HOME%" >&2
|
||||
echo Please set the JAVA_HOME variable in your environment to match the >&2
|
||||
echo location of your Java installation. >&2
|
||||
echo.
|
||||
goto error
|
||||
|
||||
@REM ==== END VALIDATION ====
|
||||
|
||||
:init
|
||||
|
||||
@REM Find the project base dir, i.e. the directory that contains the folder ".mvn".
|
||||
@REM Fallback to current working directory if not found.
|
||||
|
||||
set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR%
|
||||
IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir
|
||||
|
||||
set EXEC_DIR=%CD%
|
||||
set WDIR=%EXEC_DIR%
|
||||
:findBaseDir
|
||||
IF EXIST "%WDIR%"\.mvn goto baseDirFound
|
||||
cd ..
|
||||
IF "%WDIR%"=="%CD%" goto baseDirNotFound
|
||||
set WDIR=%CD%
|
||||
goto findBaseDir
|
||||
|
||||
:baseDirFound
|
||||
set MAVEN_PROJECTBASEDIR=%WDIR%
|
||||
cd "%EXEC_DIR%"
|
||||
goto endDetectBaseDir
|
||||
|
||||
:baseDirNotFound
|
||||
set MAVEN_PROJECTBASEDIR=%EXEC_DIR%
|
||||
cd "%EXEC_DIR%"
|
||||
|
||||
:endDetectBaseDir
|
||||
|
||||
IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig
|
||||
|
||||
@setlocal EnableExtensions EnableDelayedExpansion
|
||||
for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a
|
||||
@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS%
|
||||
|
||||
:endReadAdditionalConfig
|
||||
|
||||
SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe"
|
||||
set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar"
|
||||
set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
|
||||
|
||||
set WRAPPER_URL="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar"
|
||||
|
||||
FOR /F "usebackq tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO (
|
||||
IF "%%A"=="wrapperUrl" SET WRAPPER_URL=%%B
|
||||
)
|
||||
|
||||
@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
|
||||
@REM This allows using the maven wrapper in projects that prohibit checking in binary data.
|
||||
if exist %WRAPPER_JAR% (
|
||||
if "%MVNW_VERBOSE%" == "true" (
|
||||
echo Found %WRAPPER_JAR%
|
||||
)
|
||||
) else (
|
||||
if not "%MVNW_REPOURL%" == "" (
|
||||
SET WRAPPER_URL="%MVNW_REPOURL%/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar"
|
||||
)
|
||||
if "%MVNW_VERBOSE%" == "true" (
|
||||
echo Couldn't find %WRAPPER_JAR%, downloading it ...
|
||||
echo Downloading from: %WRAPPER_URL%
|
||||
)
|
||||
|
||||
powershell -Command "&{"^
|
||||
"$webclient = new-object System.Net.WebClient;"^
|
||||
"if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^
|
||||
"$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^
|
||||
"}"^
|
||||
"[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%WRAPPER_URL%', '%WRAPPER_JAR%')"^
|
||||
"}"
|
||||
if "%MVNW_VERBOSE%" == "true" (
|
||||
echo Finished downloading %WRAPPER_JAR%
|
||||
)
|
||||
)
|
||||
@REM End of extension
|
||||
|
||||
@REM If specified, validate the SHA-256 sum of the Maven wrapper jar file
|
||||
SET WRAPPER_SHA_256_SUM=""
|
||||
FOR /F "usebackq tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO (
|
||||
IF "%%A"=="wrapperSha256Sum" SET WRAPPER_SHA_256_SUM=%%B
|
||||
)
|
||||
IF NOT %WRAPPER_SHA_256_SUM%=="" (
|
||||
powershell -Command "&{"^
|
||||
"$hash = (Get-FileHash \"%WRAPPER_JAR%\" -Algorithm SHA256).Hash.ToLower();"^
|
||||
"If('%WRAPPER_SHA_256_SUM%' -ne $hash){"^
|
||||
" Write-Output 'Error: Failed to validate Maven wrapper SHA-256, your Maven wrapper might be compromised.';"^
|
||||
" Write-Output 'Investigate or delete %WRAPPER_JAR% to attempt a clean download.';"^
|
||||
" Write-Output 'If you updated your Maven version, you need to update the specified wrapperSha256Sum property.';"^
|
||||
" exit 1;"^
|
||||
"}"^
|
||||
"}"
|
||||
if ERRORLEVEL 1 goto error
|
||||
)
|
||||
|
||||
@REM Provide a "standardized" way to retrieve the CLI args that will
|
||||
@REM work with both Windows and non-Windows executions.
|
||||
set MAVEN_CMD_LINE_ARGS=%*
|
||||
|
||||
%MAVEN_JAVA_EXE% ^
|
||||
%JVM_CONFIG_MAVEN_PROPS% ^
|
||||
%MAVEN_OPTS% ^
|
||||
%MAVEN_DEBUG_OPTS% ^
|
||||
-classpath %WRAPPER_JAR% ^
|
||||
"-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" ^
|
||||
%WRAPPER_LAUNCHER% %MAVEN_CONFIG% %*
|
||||
if ERRORLEVEL 1 goto error
|
||||
goto end
|
||||
|
||||
:error
|
||||
set ERROR_CODE=1
|
||||
|
||||
:end
|
||||
@endlocal & set ERROR_CODE=%ERROR_CODE%
|
||||
|
||||
if not "%MAVEN_SKIP_RC%"=="" goto skipRcPost
|
||||
@REM check for post script, once with legacy .bat ending and once with .cmd ending
|
||||
if exist "%USERPROFILE%\mavenrc_post.bat" call "%USERPROFILE%\mavenrc_post.bat"
|
||||
if exist "%USERPROFILE%\mavenrc_post.cmd" call "%USERPROFILE%\mavenrc_post.cmd"
|
||||
:skipRcPost
|
||||
|
||||
@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on'
|
||||
if "%MAVEN_BATCH_PAUSE%"=="on" pause
|
||||
|
||||
if "%MAVEN_TERMINATE_CMD%"=="on" exit %ERROR_CODE%
|
||||
|
||||
cmd /C exit /B %ERROR_CODE%
|
||||
38
org_ccalm_jwt.properties
Normal file
38
org_ccalm_jwt.properties
Normal file
@ -0,0 +1,38 @@
|
||||
spring.application.name=org_ccalm_jwt
|
||||
server.port=8082
|
||||
issuer.name=ccalm
|
||||
|
||||
logging.level.com.zaxxer.hikari=DEBUG
|
||||
|
||||
spring.datasource.url=jdbc:postgresql://91.201.214.156:5432/CCALM?ApplicationName=org_ccalm_jwt
|
||||
spring.datasource.username=postgres
|
||||
spring.datasource.password=PasSecrKey1
|
||||
spring.datasource.driver-class-name=org.postgresql.Driver
|
||||
|
||||
spring.datasource.hikari.maximum-pool-size=10
|
||||
spring.datasource.hikari.minimum-idle=5
|
||||
spring.datasource.hikari.max-lifetime=1700000
|
||||
spring.datasource.hikari.idle-timeout=600000
|
||||
spring.datasource.hikari.connection-timeout=30000
|
||||
spring.datasource.hikari.connection-test-query=SELECT now()
|
||||
spring.datasource.hikari.validation-timeout=60000
|
||||
|
||||
private.key=MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQDNgtaCfu5QlhWfU8bJAooLoX+bo/ARsvoWUJf5NodkGOivze5Lqtu5eq6ptT+gVKK+IEsjpmDsFPMCE2CW7xLZfgbtrWmTPd+fiRb2Z/fMudedo166H5WEgS3+TDWKt7WkLA/3kqvIqdBotuL4BENwZj6CIjGNdG01RNsCaDA/vxTkzx9njz6kfgAda/+wbdOJNwjNRgIb9AyedQT5OKvqRXequzrrOKD9wrm1O4nv8lA6WFg5YEMSW7T6WRIeArZsQr1aHv6qkiu47YreApfdFIWHxd9QinA9WrLPYdWXONr7+xyvqS4MHSJh9ZmCvMsc/HcF3RHJgEwgiC8E6hiZAgMBAAECggEAByZOICwaTmNqTSi0+blE5DKyJdAGQhdf6/bR0rG69BiJv9QCPk+rZUCHYxATLpjDMKoe8xaOuKfh7GiQK7AVj8t6ojouOhkk9n/mdJwZWt38Slesq/z9TqbP2tD769+ISjXeOFa58zk1Lu9t5gL/9aEY+54E607pnbjPhb3qL819/7absLbY1y3GKw2Cwd7RfP8nOWj0ViwnalFjfg6YZS1BL5c9NSg41FzZolwPruZ/bBGbc3nMW2khpuK7CtRk1pRJHUNYuVCsaBU4M4sf3tlZQPOdB6eYmQ3xmPtdnHYB13s588KialXKFlAuO4zG0CFa8DfIKsWDv6xTC1cMgQKBgQD6CjJuu715oKob7ohDTfrSppk4PY/kxWhUkKyKVW1Y1jXQOcd4BwVSyH6s7N8pCSWMwWmoF/t/l2kIcAWNZnsbzAQ8TYOhp1THstXMVb6c7JOL3SQC5RjbgW1RWCalh7/4QVE0xYeEL3qv5I2t9215zKR87Z6LIdJkxxAsHgMSbQKBgQDSaOp0kJZPkQH/75ltaI9exczyoaf+5U/OrnqT2lpRwa+5wqUTPWpTFTCDcJdu8OKCgrKPOQ6NACuX4PbIW/jR+70w7nbC46Tx3JdDYxBlm+6MuHUs5RXufFDJyGoN8lJzoPGax3uxY1kxWwSaSIB0sVXV/P3PIE31I5DbarWjXQKBgQCrRyLm4anYUCtWuN4UpK0lcUPR17Hi9ysRioz2sbAWw53XRk0SNlT6MSc9E4GGnaJgOflDUTJRY4lqYzoac1HvZ6CbIkoCCRq1NRbpQu8wlYo4q8JITWDqtE0LBMRsbYId77hN2uWKse9r37cBrVULsxgWD7uj+QYjTI0Se3iFPQJ/SSYwXFXn68F98Hxb2q1/KnOZzMBmpzcRh8kg1EYVIFc1wF7rBMVVMY0sUIXUH72fAcBuU1yCsoJcpXCQWxeeaWIbY+eDYj3CGlOWQtct3CVZyZJXKkR6W27cp0oFlNOp1okddbHkTsc7Ou1prDmIbwk3zi0mD9wrPg4fTijK/QKBgQDrYEWT77dQLPcN3RTVn3Ua2d9aj/IWwC330I4qZq2SFKOaB/olnPA6fLNYToTWO70A2ZlsMtVepdThIeYFidkA7Lj7lTVYFdQQzREsO5908A1YWE4sgMEEdMc7n5xKT85vpkPOjBOLZYQ6JjDeWBMDxnXR9/txwbau4bsq3/QFuQ==
|
||||
public.key=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzYLWgn7uUJYVn1PGyQKKC6F/m6PwEbL6FlCX+TaHZBjor83uS6rbuXquqbU/oFSiviBLI6Zg7BTzAhNglu8S2X4G7a1pkz3fn4kW9mf3zLnXnaNeuh+VhIEt/kw1ire1pCwP95KryKnQaLbi+ARDcGY+giIxjXRtNUTbAmgwP78U5M8fZ48+pH4AHWv/sG3TiTcIzUYCG/QMnnUE+Tir6kV3qrs66zig/cK5tTuJ7/JQOlhYOWBDElu0+lkSHgK2bEK9Wh7+qpIruO2K3gKX3RSFh8XfUIpwPVqyz2HVlzja+/scr6kuDB0iYfWZgrzLHPx3Bd0RyYBMIIgvBOoYmQIDAQAB
|
||||
access.time=600
|
||||
refresh.time=43200
|
||||
|
||||
captcha.key=PPExpv36jk4Vzda3NpYnXLfuHCLYXqaNrxlOH/Jr/1M=
|
||||
captcha.time=600
|
||||
|
||||
mail.host=smtp.yandex.ru
|
||||
mail.port=465
|
||||
mail.login=info@ccalm.org
|
||||
mail.password=fu2lpsoGPGiq1xlRm8ag
|
||||
|
||||
url.reset=https://ccalm.org/api/authorization/v02/reset
|
||||
url.main=https://ccalm.org/
|
||||
|
||||
spring.redis.host=127.0.0.1
|
||||
spring.redis.port=6379
|
||||
spring.redis.password=9F3/NKWeOjd815vkadT2DcgVHf6fEpVQXw==
|
||||
135
pom.xml
Normal file
135
pom.xml
Normal file
@ -0,0 +1,135 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<parent>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-parent</artifactId>
|
||||
<version>3.3.3</version>
|
||||
<relativePath/> <!-- lookup parent from repository -->
|
||||
</parent>
|
||||
<groupId>org.ccalm</groupId>
|
||||
<artifactId>jwt</artifactId>
|
||||
<version>0.0.1-SNAPSHOT</version>
|
||||
<name>jwt</name>
|
||||
<description>jwt</description>
|
||||
<properties>
|
||||
<java.version>21</java.version>
|
||||
</properties>
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-data-redis</artifactId>
|
||||
<version>3.3.3</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-web</artifactId>
|
||||
<version>3.3.3</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-test</artifactId>
|
||||
<scope>test</scope>
|
||||
<version>3.3.3</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-data-jpa</artifactId>
|
||||
<version>3.3.3</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.postgresql</groupId>
|
||||
<artifactId>postgresql</artifactId>
|
||||
<version>42.7.4</version>
|
||||
<scope>runtime</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.json</groupId>
|
||||
<artifactId>json</artifactId>
|
||||
<version>20231013</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>io.jsonwebtoken</groupId>
|
||||
<artifactId>jjwt-api</artifactId>
|
||||
<version>0.11.2</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>io.jsonwebtoken</groupId>
|
||||
<artifactId>jjwt-impl</artifactId>
|
||||
<version>0.11.2</version>
|
||||
<scope>runtime</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>io.jsonwebtoken</groupId>
|
||||
<artifactId>jjwt-jackson</artifactId>
|
||||
<version>0.11.2</version>
|
||||
<scope>runtime</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>redis.clients</groupId>
|
||||
<artifactId>jedis</artifactId>
|
||||
<version>3.7.0</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>net.logicsquad</groupId>
|
||||
<artifactId>nanocaptcha</artifactId>
|
||||
<version>2.1</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>ch.qos.logback</groupId>
|
||||
<artifactId>logback-classic</artifactId>
|
||||
<version>1.5.6</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>net.logstash.logback</groupId>
|
||||
<artifactId>logstash-logback-encoder</artifactId>
|
||||
<version>6.6</version> <!-- Замените на актуальную версию -->
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>javax.mail</groupId>
|
||||
<artifactId>mail</artifactId>
|
||||
<version>1.4</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.xerial</groupId>
|
||||
<artifactId>sqlite-jdbc</artifactId>
|
||||
<version>3.36.0.1</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.fasterxml.jackson.datatype</groupId>
|
||||
<artifactId>jackson-datatype-jsr310</artifactId>
|
||||
<version>2.18.0</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.commons</groupId>
|
||||
<artifactId>commons-text</artifactId>
|
||||
<version>1.12.0</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.warrenstrange</groupId>
|
||||
<artifactId>googleauth</artifactId>
|
||||
<version>1.5.0</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-maven-plugin</artifactId>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-surefire-plugin</artifactId>
|
||||
<version>2.22.2</version>
|
||||
<configuration>
|
||||
<systemPropertyVariables>
|
||||
<spring.config.location>file:kz_mcp_jwt.properties</spring.config.location>
|
||||
</systemPropertyVariables>
|
||||
</configuration>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
|
||||
</project>
|
||||
3
run.sh
Normal file
3
run.sh
Normal file
@ -0,0 +1,3 @@
|
||||
#!/bin/bash
|
||||
cd target
|
||||
java -jar jwt-0.0.1-SNAPSHOT.jar
|
||||
20
src/main/java/org/ccalm/jwt/JwtApplication.java
Normal file
20
src/main/java/org/ccalm/jwt/JwtApplication.java
Normal file
@ -0,0 +1,20 @@
|
||||
package org.ccalm.jwt;
|
||||
|
||||
import org.apache.logging.log4j.LogManager;
|
||||
import org.apache.logging.log4j.Logger;
|
||||
import org.springframework.boot.SpringApplication;
|
||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||
import org.springframework.context.annotation.ComponentScan;
|
||||
|
||||
@SpringBootApplication
|
||||
@ComponentScan(basePackages = {"org.ccalm.jwt"})
|
||||
public class JwtApplication {
|
||||
|
||||
private static final Logger logger = LogManager.getLogger(JwtApplication.class);
|
||||
|
||||
public static void main(String[] args) {
|
||||
logger.info("Start JwtApplication");
|
||||
SpringApplication.run(JwtApplication.class, args);
|
||||
}
|
||||
|
||||
}
|
||||
1478
src/main/java/org/ccalm/jwt/MainController.java
Normal file
1478
src/main/java/org/ccalm/jwt/MainController.java
Normal file
File diff suppressed because it is too large
Load Diff
60
src/main/java/org/ccalm/jwt/Translation.java
Normal file
60
src/main/java/org/ccalm/jwt/Translation.java
Normal file
@ -0,0 +1,60 @@
|
||||
package org.ccalm.jwt;
|
||||
|
||||
import org.ccalm.jwt.tools.DBTools;
|
||||
import org.json.JSONArray;
|
||||
import org.json.JSONObject;
|
||||
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
|
||||
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class Translation {
|
||||
public int language_id;
|
||||
public NamedParameterJdbcTemplate jdbcTemplate;
|
||||
Translation(String lng, NamedParameterJdbcTemplate jdbcTemplate){
|
||||
language_id=1;
|
||||
switch (lng) {
|
||||
case "kz":
|
||||
case "kk":
|
||||
language_id = 2;
|
||||
break;
|
||||
case "en":
|
||||
language_id = 3;
|
||||
break;
|
||||
case "uz":
|
||||
language_id = 4;
|
||||
break;
|
||||
case "ru":
|
||||
default:
|
||||
language_id = 1;
|
||||
break;
|
||||
}
|
||||
this.jdbcTemplate = jdbcTemplate;
|
||||
}
|
||||
|
||||
String trt(String text){
|
||||
String sql = """
|
||||
select
|
||||
translation
|
||||
from
|
||||
main._translations
|
||||
where
|
||||
del=false
|
||||
and language_id=:language_id
|
||||
and identifier=:identifier;
|
||||
""";
|
||||
MapSqlParameterSource parameters = new MapSqlParameterSource();
|
||||
parameters.addValue("language_id", language_id);
|
||||
parameters.addValue("identifier", text);
|
||||
List<String> ret = jdbcTemplate.query(sql, parameters, new DBTools.JsonRowMapper());
|
||||
int i = 0;
|
||||
for (i = 0; i < ret.size(); i++) {
|
||||
JSONObject json = new JSONObject(ret.get(i));
|
||||
text = json.getString("translation");
|
||||
}
|
||||
if(i==0){
|
||||
text = text.replace("_", " ");
|
||||
}
|
||||
return text;
|
||||
}
|
||||
}
|
||||
16
src/main/java/org/ccalm/jwt/models/ActionName.java
Normal file
16
src/main/java/org/ccalm/jwt/models/ActionName.java
Normal file
@ -0,0 +1,16 @@
|
||||
package org.ccalm.jwt.models;
|
||||
|
||||
//import jakarta.persistence.Column;
|
||||
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||
|
||||
public class ActionName {
|
||||
//@Column(name = "action_name", nullable = true)
|
||||
@JsonProperty("action_name")
|
||||
private String action_name;
|
||||
public String getActionName() {
|
||||
return action_name;
|
||||
}
|
||||
public void setActionName(String action_name) {
|
||||
this.action_name = action_name;
|
||||
}
|
||||
}
|
||||
14
src/main/java/org/ccalm/jwt/models/EmailModel.java
Normal file
14
src/main/java/org/ccalm/jwt/models/EmailModel.java
Normal file
@ -0,0 +1,14 @@
|
||||
package org.ccalm.jwt.models;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||
|
||||
public class EmailModel {
|
||||
@JsonProperty("email")
|
||||
String email;
|
||||
public String getEmail() {
|
||||
return email;
|
||||
}
|
||||
public void setEmail(String email) {
|
||||
this.email = email;
|
||||
}
|
||||
}
|
||||
19
src/main/java/org/ccalm/jwt/models/ErrorModel.java
Normal file
19
src/main/java/org/ccalm/jwt/models/ErrorModel.java
Normal file
@ -0,0 +1,19 @@
|
||||
package org.ccalm.jwt.models;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||
|
||||
public class ErrorModel {
|
||||
@JsonProperty("timestamp")
|
||||
private String timestamp;
|
||||
|
||||
@JsonProperty("status")
|
||||
private int status;
|
||||
|
||||
@JsonProperty("error")
|
||||
private String error;
|
||||
|
||||
@JsonProperty("path")
|
||||
private String path;
|
||||
|
||||
// Конструктор, геттеры и сеттеры
|
||||
}
|
||||
36
src/main/java/org/ccalm/jwt/models/LoginModel.java
Normal file
36
src/main/java/org/ccalm/jwt/models/LoginModel.java
Normal file
@ -0,0 +1,36 @@
|
||||
package org.ccalm.jwt.models;
|
||||
|
||||
public class LoginModel {
|
||||
//@JsonProperty("login")
|
||||
private String login;
|
||||
//@JsonProperty("password")
|
||||
private String password;
|
||||
//@JsonProperty("appid")
|
||||
private String totp;
|
||||
private String appid;
|
||||
public String getLogin() {
|
||||
return login;
|
||||
}
|
||||
public void setLogin(String login) {
|
||||
this.login = login;
|
||||
}
|
||||
public String getPassword() {
|
||||
return password;
|
||||
}
|
||||
public void setPassword(String password) {
|
||||
this.password = password;
|
||||
}
|
||||
public String getTotp() { return totp; }
|
||||
public void setTotp(String totp) {
|
||||
this.totp = totp;
|
||||
}
|
||||
public String getAppid() {
|
||||
return appid;
|
||||
}
|
||||
public void setAppid(String appid) {
|
||||
this.appid = appid;
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
47
src/main/java/org/ccalm/jwt/models/NewUserModel.java
Normal file
47
src/main/java/org/ccalm/jwt/models/NewUserModel.java
Normal file
@ -0,0 +1,47 @@
|
||||
package org.ccalm.jwt.models;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||
|
||||
public class NewUserModel {
|
||||
|
||||
@JsonProperty("name")
|
||||
private String name;
|
||||
@JsonProperty("email")
|
||||
private String email;
|
||||
@JsonProperty("code")
|
||||
private String code;
|
||||
@JsonProperty("token")
|
||||
private String token;
|
||||
|
||||
public String getName() {
|
||||
if(name==null) return "";
|
||||
else return name;
|
||||
}
|
||||
public void setName(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
public String getEmail() {
|
||||
if(email==null) return "";
|
||||
else return email;
|
||||
}
|
||||
public void setEmail(String email) {
|
||||
this.email = email;
|
||||
}
|
||||
|
||||
public String getCode() {
|
||||
if(code==null) return "";
|
||||
else return code;
|
||||
}
|
||||
public void setCode(String code) {
|
||||
this.code = code;
|
||||
}
|
||||
|
||||
public String getToken() {
|
||||
if(token==null) return "";
|
||||
else return token;
|
||||
}
|
||||
public void setToken(String token) {
|
||||
this.token = token;
|
||||
}
|
||||
}
|
||||
25
src/main/java/org/ccalm/jwt/models/RestoreModel.java
Normal file
25
src/main/java/org/ccalm/jwt/models/RestoreModel.java
Normal file
@ -0,0 +1,25 @@
|
||||
package org.ccalm.jwt.models;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||
|
||||
public class RestoreModel {
|
||||
|
||||
@JsonProperty("code")
|
||||
String code;
|
||||
@JsonProperty("token")
|
||||
String token;
|
||||
|
||||
public String getCode() {
|
||||
return code;
|
||||
}
|
||||
public void setCode(String code) {
|
||||
this.code = code;
|
||||
}
|
||||
|
||||
public String getToken() {
|
||||
return token;
|
||||
}
|
||||
public void setToken(String token) {
|
||||
this.token = token;
|
||||
}
|
||||
}
|
||||
28
src/main/java/org/ccalm/jwt/models/SettingModel.java
Normal file
28
src/main/java/org/ccalm/jwt/models/SettingModel.java
Normal file
@ -0,0 +1,28 @@
|
||||
package org.ccalm.jwt.models;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||
|
||||
public class SettingModel {
|
||||
@JsonProperty("identifier")
|
||||
private String identifier;
|
||||
@JsonProperty("value")
|
||||
private String value;
|
||||
|
||||
public String getIdentifier() {
|
||||
return identifier;
|
||||
}
|
||||
|
||||
public void setIdentifier(String identifier) {
|
||||
this.identifier = identifier;
|
||||
}
|
||||
|
||||
public String getValue() {
|
||||
return value;
|
||||
}
|
||||
|
||||
public void setValue(String value) {
|
||||
this.value = value;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
42
src/main/java/org/ccalm/jwt/models/UpdateModel.java
Normal file
42
src/main/java/org/ccalm/jwt/models/UpdateModel.java
Normal file
@ -0,0 +1,42 @@
|
||||
package org.ccalm.jwt.models;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||
|
||||
public class UpdateModel {
|
||||
|
||||
@JsonProperty("login")
|
||||
private String login;
|
||||
@JsonProperty("password")
|
||||
private String password;
|
||||
@JsonProperty("password_new")
|
||||
private String passwordNew;
|
||||
|
||||
// Геттеры и сеттеры для полей
|
||||
|
||||
public String getLogin() {
|
||||
if(login==null) return "";
|
||||
else return login;
|
||||
}
|
||||
|
||||
public void setLogin(String login) {
|
||||
this.login = login;
|
||||
}
|
||||
|
||||
public String getPassword() {
|
||||
if(password==null) return "";
|
||||
else return password;
|
||||
}
|
||||
|
||||
public void setPassword(String password) {
|
||||
this.password = password;
|
||||
}
|
||||
|
||||
public String getPasswordNew() {
|
||||
if(passwordNew==null) return "";
|
||||
else return passwordNew;
|
||||
}
|
||||
|
||||
public void setPasswordNew(String passwordNew) {
|
||||
this.passwordNew = passwordNew;
|
||||
}
|
||||
}
|
||||
96
src/main/java/org/ccalm/jwt/models/UserModel.java
Normal file
96
src/main/java/org/ccalm/jwt/models/UserModel.java
Normal file
@ -0,0 +1,96 @@
|
||||
package org.ccalm.jwt.models;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||
|
||||
public class UserModel {
|
||||
@JsonProperty("country_id")
|
||||
private Long countryId;
|
||||
@JsonProperty("company_name")
|
||||
private String companyName;
|
||||
@JsonProperty("position")
|
||||
private String position;
|
||||
@JsonProperty("name")
|
||||
private String name;
|
||||
@JsonProperty("surname")
|
||||
private String surname;
|
||||
@JsonProperty("patronymic")
|
||||
private String patronymic;
|
||||
@JsonProperty("phone")
|
||||
private String phone;
|
||||
@JsonProperty("email")
|
||||
private String email;
|
||||
@JsonProperty("password")
|
||||
private String password;
|
||||
|
||||
public Long getCountryId() {
|
||||
return countryId;
|
||||
}
|
||||
|
||||
public void setCountryId(Long countryId) {
|
||||
this.countryId = countryId;
|
||||
}
|
||||
|
||||
public String getCompanyName() {
|
||||
return companyName;
|
||||
}
|
||||
|
||||
public void setCompanyName(String companyName) {
|
||||
this.companyName = companyName;
|
||||
}
|
||||
|
||||
public String getPosition() {
|
||||
return position;
|
||||
}
|
||||
|
||||
public void setPosition(String position) {
|
||||
this.position = position;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public void setName(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
public String getSurname() {
|
||||
return surname;
|
||||
}
|
||||
|
||||
public void setSurname(String surname) {
|
||||
this.surname = surname;
|
||||
}
|
||||
|
||||
public String getPatronymic() {
|
||||
return patronymic;
|
||||
}
|
||||
|
||||
public void setPatronymic(String patronymic) {
|
||||
this.patronymic = patronymic;
|
||||
}
|
||||
|
||||
public String getPhone() {
|
||||
return phone;
|
||||
}
|
||||
|
||||
public void setPhone(String phone) {
|
||||
this.phone = phone;
|
||||
}
|
||||
|
||||
public String getEmail() {
|
||||
return email;
|
||||
}
|
||||
|
||||
public void setEmail(String email) {
|
||||
this.email = email;
|
||||
}
|
||||
|
||||
public String getPassword() {
|
||||
return password;
|
||||
}
|
||||
|
||||
public void setPassword(String password) {
|
||||
this.password = password;
|
||||
}
|
||||
}
|
||||
63
src/main/java/org/ccalm/jwt/tools/Cache.java
Normal file
63
src/main/java/org/ccalm/jwt/tools/Cache.java
Normal file
@ -0,0 +1,63 @@
|
||||
package org.ccalm.jwt.tools;
|
||||
|
||||
import org.ccalm.jwt.MainController;
|
||||
import org.apache.logging.log4j.LogManager;
|
||||
import org.apache.logging.log4j.Logger;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.stereotype.Component;
|
||||
import redis.clients.jedis.Jedis;
|
||||
|
||||
import java.io.FileInputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.util.Properties;
|
||||
|
||||
|
||||
public class Cache implements AutoCloseable {
|
||||
|
||||
private static final Logger logger = LogManager.getLogger(Cache.class);
|
||||
private Jedis jedis = null;
|
||||
|
||||
String host = null;
|
||||
int port = 0;
|
||||
String password = null;
|
||||
|
||||
public Cache(String host,int port,String password) {
|
||||
this.host=host;
|
||||
this.port=port;
|
||||
this.password=password;
|
||||
}
|
||||
|
||||
public boolean open(){
|
||||
try {
|
||||
jedis = new Jedis(host, port);
|
||||
jedis.auth(password);
|
||||
}catch (Exception e)
|
||||
{
|
||||
logger.error(e);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void close() throws Exception {
|
||||
if(jedis!=null)
|
||||
jedis.close();
|
||||
}
|
||||
|
||||
public String get(String key) {
|
||||
return jedis.get(key);
|
||||
}
|
||||
|
||||
public boolean set(String key,String data,int ttl){
|
||||
jedis.set(key, data);
|
||||
long currentTimeMillis = System.currentTimeMillis();
|
||||
long expireTimeMillis = currentTimeMillis + ttl * 1000;
|
||||
jedis.expireAt(key, expireTimeMillis / 1000);
|
||||
return true;
|
||||
}
|
||||
|
||||
public void delete(String key) {
|
||||
jedis.del(key.getBytes());
|
||||
}
|
||||
}
|
||||
30
src/main/java/org/ccalm/jwt/tools/CustomException.java
Normal file
30
src/main/java/org/ccalm/jwt/tools/CustomException.java
Normal file
@ -0,0 +1,30 @@
|
||||
package org.ccalm.jwt.tools;
|
||||
|
||||
import org.json.JSONObject;
|
||||
|
||||
public class CustomException extends Exception {
|
||||
private int errorCode;
|
||||
private String marker;
|
||||
|
||||
public CustomException(int errorCode,String message,String marker) {
|
||||
super(message);
|
||||
this.errorCode = errorCode;
|
||||
this.marker = marker;
|
||||
}
|
||||
|
||||
public int getErrorCode() {
|
||||
return errorCode;
|
||||
}
|
||||
|
||||
public String getErrorMarker() {
|
||||
return marker;
|
||||
}
|
||||
|
||||
public JSONObject getJson() {
|
||||
JSONObject json = new JSONObject();
|
||||
json.put("error_code", getErrorCode());
|
||||
json.put("error_message", getMessage());
|
||||
json.put("error_marker", getErrorMarker());
|
||||
return json;
|
||||
}
|
||||
}
|
||||
40
src/main/java/org/ccalm/jwt/tools/DBTools.java
Normal file
40
src/main/java/org/ccalm/jwt/tools/DBTools.java
Normal file
@ -0,0 +1,40 @@
|
||||
package org.ccalm.jwt.tools;
|
||||
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import org.springframework.jdbc.core.RowMapper;
|
||||
|
||||
import java.sql.Connection;
|
||||
import java.sql.PreparedStatement;
|
||||
import java.sql.ResultSet;
|
||||
import java.sql.SQLException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
public class DBTools {
|
||||
|
||||
public static class JsonRowMapper implements RowMapper<String> {
|
||||
|
||||
@Override
|
||||
public String mapRow(ResultSet rs, int rowNum) throws SQLException {
|
||||
ObjectMapper objectMapper = new ObjectMapper();
|
||||
Map<String, Object> resultMap = new HashMap<>();
|
||||
|
||||
// Получаем метаданные ResultSet для получения названий столбцов
|
||||
int columnCount = rs.getMetaData().getColumnCount();
|
||||
for (int i = 1; i <= columnCount; i++) {
|
||||
String columnName = rs.getMetaData().getColumnName(i);
|
||||
Object columnValue = rs.getObject(i);
|
||||
resultMap.put(columnName, columnValue);
|
||||
}
|
||||
|
||||
// Преобразовываем Map в JSON строку
|
||||
try {
|
||||
return objectMapper.writeValueAsString(resultMap);
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException("Failed to convert Map to JSON", e);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
65
src/main/java/org/ccalm/jwt/tools/EmailUtility.java
Normal file
65
src/main/java/org/ccalm/jwt/tools/EmailUtility.java
Normal file
@ -0,0 +1,65 @@
|
||||
//From: http://www.codejava.net/java-ee/jsp/sending-e-mail-with-jsp-servlet-and-javamail
|
||||
package org.ccalm.jwt.tools;
|
||||
|
||||
import java.util.Date;
|
||||
import java.util.Properties;
|
||||
|
||||
import javax.mail.Authenticator;
|
||||
import javax.mail.Message;
|
||||
import javax.mail.MessagingException;
|
||||
import javax.mail.PasswordAuthentication;
|
||||
import javax.mail.Session;
|
||||
import javax.mail.Transport;
|
||||
import javax.mail.internet.AddressException;
|
||||
import javax.mail.internet.InternetAddress;
|
||||
import javax.mail.internet.MimeMessage;
|
||||
|
||||
/**
|
||||
* A utility class for sending e-mail messages
|
||||
* @author www.codejava.net
|
||||
*
|
||||
*/
|
||||
public class EmailUtility {
|
||||
|
||||
public static void sendEmail(String host, String port,
|
||||
final String userName, final String password, String toAddress,
|
||||
String subject, String message) throws AddressException,
|
||||
MessagingException
|
||||
{
|
||||
// sets SMTP server properties
|
||||
Properties properties = new Properties();
|
||||
|
||||
properties.put("mail.smtp.host", host);
|
||||
properties.put("mail.smtp.port", port);
|
||||
properties.put("mail.smtp.auth", "true");
|
||||
//properties.put("mail.smtp.starttls.enable","true"); STARTTLS requested but already using SSL
|
||||
properties.put("mail.smtp.EnableSSL.enable","true");
|
||||
properties.put("mail.smtp.socketFactory.port", port);
|
||||
properties.put("mail.smtp.socketFactory.class","javax.net.ssl.SSLSocketFactory");
|
||||
//properties.put("mail.debug", "true");
|
||||
|
||||
|
||||
// creates a new session with an authenticator
|
||||
Authenticator auth = new Authenticator() {
|
||||
public PasswordAuthentication getPasswordAuthentication() {
|
||||
return new PasswordAuthentication(userName, password);
|
||||
}
|
||||
};
|
||||
|
||||
Session session = Session.getInstance(properties, auth);
|
||||
|
||||
//creates a new e-mail message
|
||||
Message msg = new MimeMessage(session);
|
||||
|
||||
msg.setFrom(new InternetAddress(userName));
|
||||
InternetAddress[] toAddresses = { new InternetAddress(toAddress) };
|
||||
msg.setRecipients(Message.RecipientType.TO, toAddresses);
|
||||
msg.setSubject(subject);
|
||||
msg.setSentDate(new Date());
|
||||
//msg.setText(message);
|
||||
msg.setContent(message, "text/html; charset=utf-8");
|
||||
|
||||
// sends the e-mail
|
||||
Transport.send(msg);
|
||||
}
|
||||
}
|
||||
167
src/main/java/org/ccalm/jwt/tools/Storage.java
Normal file
167
src/main/java/org/ccalm/jwt/tools/Storage.java
Normal file
@ -0,0 +1,167 @@
|
||||
package org.ccalm.jwt.tools;
|
||||
|
||||
import org.ccalm.jwt.MainController;
|
||||
import org.apache.logging.log4j.LogManager;
|
||||
import org.apache.logging.log4j.Logger;
|
||||
import org.json.JSONObject;
|
||||
|
||||
import java.sql.*;
|
||||
|
||||
public class Storage implements AutoCloseable {
|
||||
|
||||
private static final Logger logger = LogManager.getLogger(Storage.class);
|
||||
private Connection conn = null;
|
||||
|
||||
public Storage(){
|
||||
String url = "jdbc:sqlite:temporary.sqlite";
|
||||
try {
|
||||
conn = DriverManager.getConnection(url);
|
||||
Statement stmt = conn.createStatement();
|
||||
String sql= """
|
||||
CREATE TABLE IF NOT EXISTS _users (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
email TEXT NOT NULL, --Email пользователя
|
||||
key TEXT NOT NULL, --Ключ для токена обновления (refresh token)
|
||||
jwt_r TEXT NOT NULL, --Сам ключ обновления
|
||||
jwt_a TEXT NOT NULL, --Сам ключ доступа
|
||||
time_r INTEGER, --Unix time в секундах, когда заканчивается токен обновления
|
||||
time_a INTEGER --Unix time в секундах, когда заканчивается токен доступа
|
||||
);
|
||||
""";
|
||||
stmt.execute(sql);
|
||||
stmt.close();
|
||||
} catch (SQLException e) {
|
||||
logger.error("Error connecting or executing SQL query in SQLite", e);
|
||||
}
|
||||
}
|
||||
|
||||
//Для выполнения: try-with-resources
|
||||
@Override
|
||||
public void close() throws Exception {
|
||||
if(conn!=null) {
|
||||
try {
|
||||
conn.close();
|
||||
conn=null;
|
||||
} catch (SQLException e) {
|
||||
logger.error("SQLite close error", e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// В коде не надеюсь на finalize, использую try-with-resources из AutoCloseable
|
||||
@Override
|
||||
protected void finalize() throws Throwable {
|
||||
if(conn!=null) {
|
||||
try {
|
||||
conn.close();
|
||||
conn=null;
|
||||
} catch (SQLException e) {
|
||||
logger.error("SQLite close error", e);
|
||||
}
|
||||
}
|
||||
super.finalize();
|
||||
}
|
||||
|
||||
//Получаю поля из базы email пользователя
|
||||
public JSONObject getJWT(String email){
|
||||
JSONObject result = new JSONObject();
|
||||
try {
|
||||
PreparedStatement pstmt = conn.prepareStatement("SELECT * FROM _users WHERE email=?");
|
||||
pstmt.setString(1, email);
|
||||
ResultSet rs = pstmt.executeQuery();
|
||||
if (rs.next()) {
|
||||
result.put("id", rs.getInt("id"));
|
||||
result.put("email", rs.getString("email"));
|
||||
result.put("key", rs.getString("key"));
|
||||
result.put("jwt_r", rs.getString("jwt_r"));
|
||||
result.put("jwt_a", rs.getString("jwt_a"));
|
||||
result.put("time_r", rs.getLong("time_r"));
|
||||
result.put("time_a", rs.getLong("time_a"));
|
||||
}
|
||||
} catch (SQLException e) {
|
||||
logger.error("An error occurred", e);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
//Сохранить либо обновить Refresh токен
|
||||
public boolean setJWT(String email,String key,String jwt_r,String jwt_a,long time_r,long time_a){
|
||||
try {
|
||||
// Проверка существует ли запись с данным email
|
||||
PreparedStatement selectStmt = conn.prepareStatement("SELECT * FROM _users WHERE email=?");
|
||||
selectStmt.setString(1, email);
|
||||
ResultSet rs = selectStmt.executeQuery();
|
||||
boolean exists = rs.next();
|
||||
selectStmt.close();
|
||||
if (exists) {
|
||||
String updateSql = "UPDATE _users SET key=?, jwt_r=?, jwt_a=?, time_r=?, time_a=? WHERE email=?";
|
||||
PreparedStatement updateStmt = conn.prepareStatement(updateSql);
|
||||
updateStmt.setString(1, key);
|
||||
updateStmt.setString(2, jwt_r);
|
||||
updateStmt.setString(3, jwt_a);
|
||||
updateStmt.setLong(4, time_r); // Время в секундах
|
||||
updateStmt.setLong(5, time_a); // Время в секундах
|
||||
updateStmt.setString(6, email);
|
||||
updateStmt.executeUpdate();
|
||||
updateStmt.close();
|
||||
} else {
|
||||
String insertSql = "INSERT INTO _users(email, key, jwt_r, jwt_a, time_r, time_a) VALUES (?, ?, ?, ?, ?, ?)";
|
||||
PreparedStatement insertStmt = conn.prepareStatement(insertSql);
|
||||
insertStmt.setString(1, email);
|
||||
insertStmt.setString(2, key);
|
||||
insertStmt.setString(3, jwt_r);
|
||||
insertStmt.setString(4, jwt_a);
|
||||
insertStmt.setLong(5, time_r); // Время в секундах
|
||||
insertStmt.setLong(6, time_a); // Время в секундах
|
||||
insertStmt.executeUpdate();
|
||||
insertStmt.close();
|
||||
}
|
||||
return true;
|
||||
} catch (SQLException e) {
|
||||
logger.error("SQLite query execution error", e);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
//Получаю пароль для токена обновления из базы
|
||||
public String getKey(String email){
|
||||
String key="";
|
||||
try {
|
||||
PreparedStatement pstmt = conn.prepareStatement("SELECT key FROM _users WHERE email=?");
|
||||
pstmt.setString(1, email);
|
||||
ResultSet rs = pstmt.executeQuery();
|
||||
if (rs.next()) {
|
||||
key = rs.getString("key");
|
||||
}
|
||||
} catch (SQLException e) {
|
||||
logger.error("SQLite query execution error", e);
|
||||
}
|
||||
return key;
|
||||
}
|
||||
//Получаю время когда Refresh token "протухнет"
|
||||
public long getTime(String email){
|
||||
long time = 1;
|
||||
try {
|
||||
PreparedStatement pstmt = conn.prepareStatement("SELECT time_r FROM _users WHERE email=?");
|
||||
pstmt.setString(1, email);
|
||||
ResultSet rs = pstmt.executeQuery();
|
||||
if (rs.next()) {
|
||||
time = rs.getLong("time_r");
|
||||
}
|
||||
} catch (SQLException e) {
|
||||
logger.error("SQLite query execution error", e);
|
||||
}
|
||||
return time;
|
||||
}
|
||||
//Удалить токен обновления из базы данных
|
||||
public boolean delToken(String email){
|
||||
try {
|
||||
PreparedStatement pstmt = conn.prepareStatement("DELETE FROM _users WHERE email=?");
|
||||
pstmt.setString(1, email);
|
||||
pstmt.executeUpdate();
|
||||
return true;
|
||||
} catch (SQLException e) {
|
||||
logger.error("SQLite query execution error", e);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
148
src/main/java/org/ccalm/jwt/tools/Tools.java
Normal file
148
src/main/java/org/ccalm/jwt/tools/Tools.java
Normal file
@ -0,0 +1,148 @@
|
||||
package org.ccalm.jwt.tools;
|
||||
|
||||
import io.jsonwebtoken.SignatureAlgorithm;
|
||||
import io.jsonwebtoken.security.Keys;
|
||||
import org.json.JSONException;
|
||||
import org.json.JSONObject;
|
||||
|
||||
import javax.crypto.*;
|
||||
import javax.crypto.spec.IvParameterSpec;
|
||||
import javax.crypto.spec.SecretKeySpec;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.security.*;
|
||||
import java.util.Base64;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
public class Tools {
|
||||
|
||||
//Зашифровать
|
||||
public static String encryptText(String pass,String data){
|
||||
String encryptedBase64="";
|
||||
String encryptionIV = "jazz_tyt_net_111"; // Ваш вектор инициализации
|
||||
try {
|
||||
Cipher cipher = Cipher.getInstance("AES/CTR/NoPadding");
|
||||
SecretKeySpec key = new SecretKeySpec(Base64.getDecoder().decode(pass), "AES");
|
||||
IvParameterSpec iv = new IvParameterSpec(encryptionIV.getBytes()); // Создание объекта IvParameterSpec для вектора инициализации
|
||||
cipher.init(Cipher.ENCRYPT_MODE, key, iv); // Инициализация шифра с ключом и вектором инициализации
|
||||
byte[] encrypted = cipher.doFinal(data.getBytes()); // Шифрование строки
|
||||
encryptedBase64 = Base64.getEncoder().encodeToString(encrypted); // Преобразование зашифрованных данных в base64
|
||||
} catch (InvalidKeyException e) {
|
||||
throw new RuntimeException(e);
|
||||
} catch (InvalidAlgorithmParameterException e) {
|
||||
throw new RuntimeException(e);
|
||||
} catch (NoSuchPaddingException e) {
|
||||
throw new RuntimeException(e);
|
||||
} catch (IllegalBlockSizeException e) {
|
||||
throw new RuntimeException(e);
|
||||
} catch (NoSuchAlgorithmException e) {
|
||||
throw new RuntimeException(e);
|
||||
} catch (BadPaddingException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
return encryptedBase64;
|
||||
}
|
||||
|
||||
public static String decryptText(String pass,String data){
|
||||
String encryptionIV = "jazz_tyt_net_111"; // Ваш вектор инициализации
|
||||
String decryptedText= "";
|
||||
try {
|
||||
Cipher cipher = Cipher.getInstance("AES/CTR/NoPadding");
|
||||
SecretKeySpec key = new SecretKeySpec(Base64.getDecoder().decode(pass), "AES");
|
||||
IvParameterSpec iv = new IvParameterSpec(encryptionIV.getBytes()); // Создание объекта IvParameterSpec для вектора инициализации
|
||||
cipher.init(Cipher.DECRYPT_MODE, key, iv); // Инициализация шифра с ключом и вектором инициализации
|
||||
|
||||
byte[] decrypted = cipher.doFinal(Base64.getDecoder().decode(data)); // Расшифровка данных
|
||||
decryptedText = new String(decrypted); // Преобразование расшифрованных данных в строку
|
||||
} catch (NoSuchAlgorithmException | NoSuchPaddingException | InvalidKeyException |
|
||||
InvalidAlgorithmParameterException | IllegalBlockSizeException | BadPaddingException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return decryptedText;
|
||||
}
|
||||
|
||||
public static String generateSignature(String pass,String input) {
|
||||
try {
|
||||
SecretKey secretKey = new SecretKeySpec(Base64.getDecoder().decode(pass), "HmacSHA256");
|
||||
|
||||
MessageDigest digest = MessageDigest.getInstance("SHA-256");
|
||||
byte[] encodedInput = digest.digest(input.getBytes(StandardCharsets.UTF_8));
|
||||
byte[] encodedKey = secretKey.getEncoded();
|
||||
|
||||
// Создание HMAC-подписи
|
||||
javax.crypto.spec.SecretKeySpec keySpec = new javax.crypto.spec.SecretKeySpec(encodedKey, "HmacSHA256");
|
||||
javax.crypto.Mac mac = javax.crypto.Mac.getInstance("HmacSHA256");
|
||||
mac.init(keySpec);
|
||||
byte[] rawHmac = mac.doFinal(encodedInput);
|
||||
|
||||
// Кодирование подписи в base64
|
||||
return Base64.getEncoder().encodeToString(rawHmac);
|
||||
} catch (NoSuchAlgorithmException | java.security.InvalidKeyException e) {
|
||||
e.printStackTrace();
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public static boolean isValidEmail(String email) {
|
||||
String EMAIL_REGEX = "^[a-zA-Z0-9_+&*-]+(?:\\.[a-zA-Z0-9_+&*-]+)*@(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,7}$";
|
||||
Pattern pattern = Pattern.compile(EMAIL_REGEX);
|
||||
Matcher matcher = pattern.matcher(email);
|
||||
return matcher.matches();
|
||||
}
|
||||
|
||||
public static boolean isInteger(String str) {
|
||||
if (str == null || str.isEmpty()) {
|
||||
return false;
|
||||
}
|
||||
try {
|
||||
Integer.parseInt(str);
|
||||
return true;
|
||||
} catch (NumberFormatException e) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public static String genKey(){
|
||||
SecretKey key = Keys.secretKeyFor(SignatureAlgorithm.HS256);
|
||||
byte[] keyBytes = key.getEncoded();
|
||||
return Base64.getEncoder().encodeToString(keyBytes);
|
||||
}
|
||||
|
||||
public static String generatePassword(int length) {
|
||||
String CHARACTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
|
||||
SecureRandom random = new SecureRandom();
|
||||
StringBuilder sb = new StringBuilder(length);
|
||||
for (int i = 0; i < length; i++) {
|
||||
int randomIndex = random.nextInt(CHARACTERS.length());
|
||||
sb.append(CHARACTERS.charAt(randomIndex));
|
||||
}
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
// Метод для извлечения подписи из JWT токена
|
||||
public static String extractSignature(String jwtToken) {
|
||||
String[] jwtParts = jwtToken.split("\\.");
|
||||
if (jwtParts.length != 3) {
|
||||
return null;
|
||||
}
|
||||
return jwtParts[2];
|
||||
}
|
||||
|
||||
//Для извлечения содержимого токена
|
||||
public static JSONObject extractToken(String jwtToken) {
|
||||
String[] jwtParts = jwtToken.split("\\.");
|
||||
if (jwtParts.length != 3) {
|
||||
return null;
|
||||
}
|
||||
String payloadJson = new String(Base64.getUrlDecoder().decode(jwtParts[1]));
|
||||
JSONObject payload=null;
|
||||
try {
|
||||
payload = new JSONObject(payloadJson);
|
||||
} catch (JSONException e) {
|
||||
return null;
|
||||
}
|
||||
return payload;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
33
src/main/resources/logback-spring.xml
Normal file
33
src/main/resources/logback-spring.xml
Normal file
@ -0,0 +1,33 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<configuration>
|
||||
|
||||
<!-- Please check if the user has access to the directory from which the application is being executed -->
|
||||
<property name="LOGS" value="logs" />
|
||||
<springProperty scope="context" name="appName" source="spring.application.name"/>
|
||||
|
||||
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
|
||||
<file>${LOGS}/${appName}.log</file>
|
||||
<encoder>
|
||||
<pattern>{"timestamp":"%d{yyyy-MM-dd'T'HH:mm:ss.SSS'Z'}","thread":"[%thread]","level":"%level","logger":"%logger{36}","marker":"%X{marker}","message":"%msg"}%n</pattern>
|
||||
</encoder>
|
||||
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
|
||||
<fileNamePattern>${LOGS}/${appName}.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
|
||||
<maxHistory>30</maxHistory>
|
||||
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
|
||||
<maxFileSize>100MB</maxFileSize>
|
||||
</timeBasedFileNamingAndTriggeringPolicy>
|
||||
</rollingPolicy>
|
||||
</appender>
|
||||
|
||||
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
|
||||
<encoder>
|
||||
<pattern>%d{yyyy-MM-dd'T'HH:mm:ss.SSS'Z'} | %level | %logger{36} | %X{marker} | %msg%n</pattern>
|
||||
</encoder>
|
||||
</appender>
|
||||
|
||||
<root level="info">
|
||||
<appender-ref ref="FILE" />
|
||||
<appender-ref ref="CONSOLE" />
|
||||
</root>
|
||||
|
||||
</configuration>
|
||||
13
src/test/java/com/geovizor/jwt/JwtApplicationTests.java
Normal file
13
src/test/java/com/geovizor/jwt/JwtApplicationTests.java
Normal file
@ -0,0 +1,13 @@
|
||||
package org.ccalm.jwt;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.springframework.boot.test.context.SpringBootTest;
|
||||
|
||||
@SpringBootTest
|
||||
class JwtApplicationTests {
|
||||
|
||||
@Test
|
||||
void contextLoads() {
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user