добаил автозаполнение тестовых пользователей
This commit is contained in:
parent
9cbff47194
commit
d9e61e7c5b
@ -5,9 +5,9 @@
|
|||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover" />
|
<meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover" />
|
||||||
<link rel="manifest" href="./manifest.webmanifest" />
|
<link rel="manifest" href="./manifest.webmanifest" />
|
||||||
<title>Shine UI Demo</title>
|
<title>Shine UI Demo</title>
|
||||||
<link rel="stylesheet" href="./styles/main.css?v=20260403081123" />
|
<link rel="stylesheet" href="./styles/main.css?v=20260405171816" />
|
||||||
<link rel="stylesheet" href="./styles/layout.css?v=20260403081123" />
|
<link rel="stylesheet" href="./styles/layout.css?v=20260405171816" />
|
||||||
<link rel="stylesheet" href="./styles/components.css?v=20260403081123" />
|
<link rel="stylesheet" href="./styles/components.css?v=20260405171816" />
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div class="app-shell">
|
<div class="app-shell">
|
||||||
@ -27,6 +27,6 @@
|
|||||||
};
|
};
|
||||||
window.__SHINE_FIREBASE_VAPID_KEY__ = '';
|
window.__SHINE_FIREBASE_VAPID_KEY__ = '';
|
||||||
</script>
|
</script>
|
||||||
<script type="module" src="./js/app.js?v=20260403081123"></script>
|
<script type="module" src="./js/app.js?v=20260405171816"></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
import { navigate, getRoute, PRE_AUTH_PAGES } from './router.js?v=20260403081123';
|
import { navigate, getRoute, PRE_AUTH_PAGES } from './router.js?v=20260405171816';
|
||||||
import { renderToolbar } from './components/toolbar.js?v=20260403081123';
|
import { renderToolbar } from './components/toolbar.js?v=20260405171816';
|
||||||
import { captureClientError, setClientErrorTransport } from './services/client-error-reporter.js?v=20260403081123';
|
import { captureClientError, setClientErrorTransport } from './services/client-error-reporter.js?v=20260405171816';
|
||||||
import { initPwaPush } from './services/pwa-push-service.js?v=20260403081123';
|
import { initPwaPush } from './services/pwa-push-service.js?v=20260405171816';
|
||||||
import {
|
import {
|
||||||
authService,
|
authService,
|
||||||
authorizeSession,
|
authorizeSession,
|
||||||
@ -12,38 +12,38 @@ import {
|
|||||||
terminateCurrentSession,
|
terminateCurrentSession,
|
||||||
addIncomingMessage,
|
addIncomingMessage,
|
||||||
setContacts,
|
setContacts,
|
||||||
} from './state.js?v=20260403081123';
|
} from './state.js?v=20260405171816';
|
||||||
|
|
||||||
import * as startView from './pages/start-view.js?v=20260403081123';
|
import * as startView from './pages/start-view.js?v=20260405171816';
|
||||||
import * as entrySettingsView from './pages/entry-settings-view.js?v=20260403081123';
|
import * as entrySettingsView from './pages/entry-settings-view.js?v=20260405171816';
|
||||||
import * as registerView from './pages/register-view.js?v=20260403081123';
|
import * as registerView from './pages/register-view.js?v=20260405171816';
|
||||||
import * as registrationPaymentView from './pages/registration-payment-view.js?v=20260403081123';
|
import * as registrationPaymentView from './pages/registration-payment-view.js?v=20260405171816';
|
||||||
import * as registrationKeysView from './pages/registration-keys-view.js?v=20260403081123';
|
import * as registrationKeysView from './pages/registration-keys-view.js?v=20260405171816';
|
||||||
import * as topupView from './pages/topup-view.js?v=20260403081123';
|
import * as topupView from './pages/topup-view.js?v=20260405171816';
|
||||||
import * as loginView from './pages/login-view.js?v=20260403081123';
|
import * as loginView from './pages/login-view.js?v=20260405171816';
|
||||||
import * as loginCameraView from './pages/login-camera-view.js?v=20260403081123';
|
import * as loginCameraView from './pages/login-camera-view.js?v=20260405171816';
|
||||||
import * as loginPasswordView from './pages/login-password-view.js?v=20260403081123';
|
import * as loginPasswordView from './pages/login-password-view.js?v=20260405171816';
|
||||||
import * as keyStorageView from './pages/key-storage-view.js?v=20260403081123';
|
import * as keyStorageView from './pages/key-storage-view.js?v=20260405171816';
|
||||||
|
|
||||||
import * as profileView from './pages/profile-view.js?v=20260403081123';
|
import * as profileView from './pages/profile-view.js?v=20260405171816';
|
||||||
import * as walletView from './pages/wallet-view.js?v=20260403081123';
|
import * as walletView from './pages/wallet-view.js?v=20260405171816';
|
||||||
import * as settingsView from './pages/settings-view.js?v=20260403081123';
|
import * as settingsView from './pages/settings-view.js?v=20260405171816';
|
||||||
import * as serverSettingsView from './pages/server-settings-view.js?v=20260403081123';
|
import * as serverSettingsView from './pages/server-settings-view.js?v=20260405171816';
|
||||||
import * as deviceView from './pages/device-view.js?v=20260403081123';
|
import * as deviceView from './pages/device-view.js?v=20260405171816';
|
||||||
import * as connectDeviceView from './pages/connect-device-view.js?v=20260403081123';
|
import * as connectDeviceView from './pages/connect-device-view.js?v=20260405171816';
|
||||||
import * as deviceQrView from './pages/device-qr-view.js?v=20260403081123';
|
import * as deviceQrView from './pages/device-qr-view.js?v=20260405171816';
|
||||||
import * as deviceCameraView from './pages/device-camera-view.js?v=20260403081123';
|
import * as deviceCameraView from './pages/device-camera-view.js?v=20260405171816';
|
||||||
import * as showKeysView from './pages/show-keys-view.js?v=20260403081123';
|
import * as showKeysView from './pages/show-keys-view.js?v=20260405171816';
|
||||||
import * as deviceSessionView from './pages/device-session-view.js?v=20260403081123';
|
import * as deviceSessionView from './pages/device-session-view.js?v=20260405171816';
|
||||||
import * as languageView from './pages/language-view.js?v=20260403081123';
|
import * as languageView from './pages/language-view.js?v=20260405171816';
|
||||||
import * as messagesList from './pages/messages-list.js?v=20260403081123';
|
import * as messagesList from './pages/messages-list.js?v=20260405171816';
|
||||||
import * as contactSearchView from './pages/contact-search-view.js?v=20260403081123';
|
import * as contactSearchView from './pages/contact-search-view.js?v=20260405171816';
|
||||||
import * as chatView from './pages/chat-view.js?v=20260403081123';
|
import * as chatView from './pages/chat-view.js?v=20260405171816';
|
||||||
import * as channelsList from './pages/channels-list.js?v=20260403081123';
|
import * as channelsList from './pages/channels-list.js?v=20260405171816';
|
||||||
import * as channelView from './pages/channel-view.js?v=20260403081123';
|
import * as channelView from './pages/channel-view.js?v=20260405171816';
|
||||||
import * as addChannelView from './pages/add-channel-view.js?v=20260403081123';
|
import * as addChannelView from './pages/add-channel-view.js?v=20260405171816';
|
||||||
import * as networkView from './pages/network-view.js?v=20260403081123';
|
import * as networkView from './pages/network-view.js?v=20260405171816';
|
||||||
import * as notificationsView from './pages/notifications-view.js?v=20260403081123';
|
import * as notificationsView from './pages/notifications-view.js?v=20260405171816';
|
||||||
|
|
||||||
const routes = {
|
const routes = {
|
||||||
'start-view': startView,
|
'start-view': startView,
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
import { resolveToolbarActive } from '../router.js?v=20260403081123';
|
import { resolveToolbarActive } from '../router.js?v=20260405171816';
|
||||||
|
|
||||||
const ITEMS = [
|
const ITEMS = [
|
||||||
{ pageId: 'messages-list', label: 'Личные сообщения', icon: '💬' },
|
{ pageId: 'messages-list', label: 'Личные сообщения', icon: '💬' },
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
import { renderHeader } from '../components/header.js?v=20260403081123';
|
import { renderHeader } from '../components/header.js?v=20260405171816';
|
||||||
|
|
||||||
export const pageMeta = { id: 'add-channel-view', title: 'Добавить канал' };
|
export const pageMeta = { id: 'add-channel-view', title: 'Добавить канал' };
|
||||||
|
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
import { renderHeader } from '../components/header.js?v=20260403081123';
|
import { renderHeader } from '../components/header.js?v=20260405171816';
|
||||||
import { channelPosts, channels } from '../mock-data.js?v=20260403081123';
|
import { channelPosts, channels } from '../mock-data.js?v=20260405171816';
|
||||||
import { addLocalChannelPost, authService, getLocalChannelPosts, state } from '../state.js?v=20260403081123';
|
import { addLocalChannelPost, authService, getLocalChannelPosts, state } from '../state.js?v=20260405171816';
|
||||||
|
|
||||||
export const pageMeta = { id: 'channel-view', title: 'Канал' };
|
export const pageMeta = { id: 'channel-view', title: 'Канал' };
|
||||||
|
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
import { renderHeader } from '../components/header.js?v=20260403081123';
|
import { renderHeader } from '../components/header.js?v=20260405171816';
|
||||||
import { channels as mockChannels } from '../mock-data.js?v=20260403081123';
|
import { channels as mockChannels } from '../mock-data.js?v=20260405171816';
|
||||||
import { authService, setChannelsFeed, state } from '../state.js?v=20260403081123';
|
import { authService, setChannelsFeed, state } from '../state.js?v=20260405171816';
|
||||||
|
|
||||||
export const pageMeta = { id: 'channels-list', title: 'Каналы' };
|
export const pageMeta = { id: 'channels-list', title: 'Каналы' };
|
||||||
|
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
import { renderHeader } from '../components/header.js?v=20260403081123';
|
import { renderHeader } from '../components/header.js?v=20260405171816';
|
||||||
import { directMessages } from '../mock-data.js?v=20260403081123';
|
import { directMessages } from '../mock-data.js?v=20260405171816';
|
||||||
import { addChatMessage, getChatMessages, authService, state } from '../state.js?v=20260403081123';
|
import { addChatMessage, getChatMessages, authService, state } from '../state.js?v=20260405171816';
|
||||||
|
|
||||||
export const pageMeta = { id: 'chat-view', title: 'Чат' };
|
export const pageMeta = { id: 'chat-view', title: 'Чат' };
|
||||||
|
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
import { renderHeader } from '../components/header.js?v=20260403081123';
|
import { renderHeader } from '../components/header.js?v=20260405171816';
|
||||||
import { state } from '../state.js?v=20260403081123';
|
import { state } from '../state.js?v=20260405171816';
|
||||||
|
|
||||||
export const pageMeta = { id: 'connect-device-view', title: 'Подключить устройство' };
|
export const pageMeta = { id: 'connect-device-view', title: 'Подключить устройство' };
|
||||||
|
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
import { renderHeader } from '../components/header.js?v=20260403081123';
|
import { renderHeader } from '../components/header.js?v=20260405171816';
|
||||||
import { directMessages } from '../mock-data.js?v=20260403081123';
|
import { directMessages } from '../mock-data.js?v=20260405171816';
|
||||||
import { authService, ensureChat, setContacts, state } from '../state.js?v=20260403081123';
|
import { authService, ensureChat, setContacts, state } from '../state.js?v=20260405171816';
|
||||||
|
|
||||||
export const pageMeta = { id: 'contact-search-view', title: 'Поиск контактов' };
|
export const pageMeta = { id: 'contact-search-view', title: 'Поиск контактов' };
|
||||||
|
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
import { renderHeader } from '../components/header.js?v=20260403081123';
|
import { renderHeader } from '../components/header.js?v=20260405171816';
|
||||||
|
|
||||||
export const pageMeta = { id: 'device-camera-view', title: 'Подключить через камеру' };
|
export const pageMeta = { id: 'device-camera-view', title: 'Подключить через камеру' };
|
||||||
|
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
import { renderHeader } from '../components/header.js?v=20260403081123';
|
import { renderHeader } from '../components/header.js?v=20260405171816';
|
||||||
import { profile } from '../mock-data.js?v=20260403081123';
|
import { profile } from '../mock-data.js?v=20260405171816';
|
||||||
import { state } from '../state.js?v=20260403081123';
|
import { state } from '../state.js?v=20260405171816';
|
||||||
|
|
||||||
export const pageMeta = { id: 'device-qr-view', title: 'Показать QR-код' };
|
export const pageMeta = { id: 'device-qr-view', title: 'Показать QR-код' };
|
||||||
|
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
import { renderHeader } from '../components/header.js?v=20260403081123';
|
import { renderHeader } from '../components/header.js?v=20260405171816';
|
||||||
import {
|
import {
|
||||||
authService,
|
authService,
|
||||||
isSessionInvalidError,
|
isSessionInvalidError,
|
||||||
@ -6,7 +6,7 @@ import {
|
|||||||
setAuthError,
|
setAuthError,
|
||||||
state,
|
state,
|
||||||
terminateCurrentSession,
|
terminateCurrentSession,
|
||||||
} from '../state.js?v=20260403081123';
|
} from '../state.js?v=20260405171816';
|
||||||
|
|
||||||
export const pageMeta = { id: 'device-session-view', title: 'Сеанс устройства' };
|
export const pageMeta = { id: 'device-session-view', title: 'Сеанс устройства' };
|
||||||
|
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
import { renderHeader } from '../components/header.js?v=20260403081123';
|
import { renderHeader } from '../components/header.js?v=20260405171816';
|
||||||
import {
|
import {
|
||||||
authService,
|
authService,
|
||||||
isSessionInvalidError,
|
isSessionInvalidError,
|
||||||
@ -7,7 +7,7 @@ import {
|
|||||||
setAuthInfo,
|
setAuthInfo,
|
||||||
state,
|
state,
|
||||||
terminateCurrentSession,
|
terminateCurrentSession,
|
||||||
} from '../state.js?v=20260403081123';
|
} from '../state.js?v=20260405171816';
|
||||||
|
|
||||||
export const pageMeta = { id: 'device-view', title: 'Устройства' };
|
export const pageMeta = { id: 'device-view', title: 'Устройства' };
|
||||||
|
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
import { renderHeader } from '../components/header.js?v=20260403081123';
|
import { renderHeader } from '../components/header.js?v=20260405171816';
|
||||||
import { checkServerAvailability, saveEntrySettings, state } from '../state.js?v=20260403081123';
|
import { checkServerAvailability, saveEntrySettings, state } from '../state.js?v=20260405171816';
|
||||||
|
|
||||||
export const pageMeta = { id: 'entry-settings-view', title: 'Настройки входа', showAppChrome: false };
|
export const pageMeta = { id: 'entry-settings-view', title: 'Настройки входа', showAppChrome: false };
|
||||||
|
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
import { renderHeader } from '../components/header.js?v=20260403081123';
|
import { renderHeader } from '../components/header.js?v=20260405171816';
|
||||||
import { authorizeSession, state } from '../state.js?v=20260403081123';
|
import { authorizeSession, state } from '../state.js?v=20260405171816';
|
||||||
|
|
||||||
export const pageMeta = { id: 'key-storage-view', title: 'Какие ключи сохранить', showAppChrome: false };
|
export const pageMeta = { id: 'key-storage-view', title: 'Какие ключи сохранить', showAppChrome: false };
|
||||||
|
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
import { renderHeader } from '../components/header.js?v=20260403081123';
|
import { renderHeader } from '../components/header.js?v=20260405171816';
|
||||||
import { state } from '../state.js?v=20260403081123';
|
import { state } from '../state.js?v=20260405171816';
|
||||||
|
|
||||||
export const pageMeta = { id: 'language-view', title: 'Язык' };
|
export const pageMeta = { id: 'language-view', title: 'Язык' };
|
||||||
|
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
import { renderHeader } from '../components/header.js?v=20260403081123';
|
import { renderHeader } from '../components/header.js?v=20260405171816';
|
||||||
|
|
||||||
export const pageMeta = { id: 'login-camera-view', title: 'Войти по камере', showAppChrome: false };
|
export const pageMeta = { id: 'login-camera-view', title: 'Войти по камере', showAppChrome: false };
|
||||||
|
|
||||||
|
|||||||
@ -1,11 +1,11 @@
|
|||||||
import { renderHeader } from '../components/header.js?v=20260403081123';
|
import { renderHeader } from '../components/header.js?v=20260405171816';
|
||||||
import {
|
import {
|
||||||
authService,
|
authService,
|
||||||
clearAuthMessages,
|
clearAuthMessages,
|
||||||
setAuthBusy,
|
setAuthBusy,
|
||||||
setAuthError,
|
setAuthError,
|
||||||
state,
|
state,
|
||||||
} from '../state.js?v=20260403081123';
|
} from '../state.js?v=20260405171816';
|
||||||
|
|
||||||
export const pageMeta = { id: 'login-password-view', title: 'Войти по логину', showAppChrome: false };
|
export const pageMeta = { id: 'login-password-view', title: 'Войти по логину', showAppChrome: false };
|
||||||
|
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
import { renderHeader } from '../components/header.js?v=20260405091124';
|
import { renderHeader } from '../components/header.js?v=20260405171816';
|
||||||
|
|
||||||
export const pageMeta = { id: 'login-view', title: 'Войти', showAppChrome: false };
|
export const pageMeta = { id: 'login-view', title: 'Войти', showAppChrome: false };
|
||||||
|
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
import { renderHeader } from '../components/header.js?v=20260403081123';
|
import { renderHeader } from '../components/header.js?v=20260405171816';
|
||||||
import { directMessages } from '../mock-data.js?v=20260403081123';
|
import { directMessages } from '../mock-data.js?v=20260405171816';
|
||||||
|
|
||||||
export const pageMeta = { id: 'messages-list', title: 'Личные сообщения' };
|
export const pageMeta = { id: 'messages-list', title: 'Личные сообщения' };
|
||||||
|
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
import { renderHeader } from '../components/header.js?v=20260403081123';
|
import { renderHeader } from '../components/header.js?v=20260405171816';
|
||||||
import { authService, state } from '../state.js?v=20260403081123';
|
import { authService, state } from '../state.js?v=20260405171816';
|
||||||
|
|
||||||
export const pageMeta = { id: 'network-view', title: 'Связи' };
|
export const pageMeta = { id: 'network-view', title: 'Связи' };
|
||||||
|
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
import { renderHeader } from '../components/header.js?v=20260403081123';
|
import { renderHeader } from '../components/header.js?v=20260405171816';
|
||||||
import { notifications } from '../mock-data.js?v=20260403081123';
|
import { notifications } from '../mock-data.js?v=20260405171816';
|
||||||
import { state } from '../state.js?v=20260403081123';
|
import { state } from '../state.js?v=20260405171816';
|
||||||
|
|
||||||
export const pageMeta = { id: 'notifications-view', title: 'Уведомления' };
|
export const pageMeta = { id: 'notifications-view', title: 'Уведомления' };
|
||||||
|
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
import { renderHeader } from '../components/header.js?v=20260403081123';
|
import { renderHeader } from '../components/header.js?v=20260405171816';
|
||||||
import { profile } from '../mock-data.js?v=20260403081123';
|
import { profile } from '../mock-data.js?v=20260405171816';
|
||||||
import { state } from '../state.js?v=20260403081123';
|
import { state } from '../state.js?v=20260405171816';
|
||||||
|
|
||||||
export const pageMeta = { id: 'profile-view', title: 'Профиль' };
|
export const pageMeta = { id: 'profile-view', title: 'Профиль' };
|
||||||
|
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
import { renderHeader } from '../components/header.js?v=20260403081123';
|
import { renderHeader } from '../components/header.js?v=20260405171816';
|
||||||
import { authService, clearAuthMessages, state } from '../state.js?v=20260403081123';
|
import { authService, clearAuthMessages, state } from '../state.js?v=20260405171816';
|
||||||
|
|
||||||
export const pageMeta = { id: 'register-view', title: 'Зарегистрироваться', showAppChrome: false };
|
export const pageMeta = { id: 'register-view', title: 'Зарегистрироваться', showAppChrome: false };
|
||||||
|
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
import { renderHeader } from '../components/header.js?v=20260403081123';
|
import { renderHeader } from '../components/header.js?v=20260405171816';
|
||||||
import {
|
import {
|
||||||
authService,
|
authService,
|
||||||
authorizeSession,
|
authorizeSession,
|
||||||
@ -6,7 +6,7 @@ import {
|
|||||||
setAuthError,
|
setAuthError,
|
||||||
setAuthInfo,
|
setAuthInfo,
|
||||||
state,
|
state,
|
||||||
} from '../state.js?v=20260403081123';
|
} from '../state.js?v=20260405171816';
|
||||||
|
|
||||||
export const pageMeta = { id: 'registration-keys-view', title: 'Сохранение ключей', showAppChrome: false };
|
export const pageMeta = { id: 'registration-keys-view', title: 'Сохранение ключей', showAppChrome: false };
|
||||||
|
|
||||||
|
|||||||
@ -1,11 +1,11 @@
|
|||||||
import { renderHeader } from '../components/header.js?v=20260403081123';
|
import { renderHeader } from '../components/header.js?v=20260405171816';
|
||||||
import {
|
import {
|
||||||
authService,
|
authService,
|
||||||
refreshRegistrationBalance,
|
refreshRegistrationBalance,
|
||||||
setAuthError,
|
setAuthError,
|
||||||
setAuthInfo,
|
setAuthInfo,
|
||||||
state,
|
state,
|
||||||
} from '../state.js?v=20260403081123';
|
} from '../state.js?v=20260405171816';
|
||||||
|
|
||||||
export const pageMeta = { id: 'registration-payment-view', title: 'Оплата регистрации', showAppChrome: false };
|
export const pageMeta = { id: 'registration-payment-view', title: 'Оплата регистрации', showAppChrome: false };
|
||||||
|
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
import { renderHeader } from '../components/header.js?v=20260403081123';
|
import { renderHeader } from '../components/header.js?v=20260405171816';
|
||||||
import { checkServerAvailability, saveEntrySettings, state } from '../state.js?v=20260403081123';
|
import { checkServerAvailability, saveEntrySettings, state } from '../state.js?v=20260405171816';
|
||||||
|
|
||||||
export const pageMeta = { id: 'server-settings-view', title: 'Настройки серверов' };
|
export const pageMeta = { id: 'server-settings-view', title: 'Настройки серверов' };
|
||||||
|
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
import { renderHeader } from '../components/header.js?v=20260403081123';
|
import { renderHeader } from '../components/header.js?v=20260405171816';
|
||||||
|
|
||||||
export const pageMeta = { id: 'settings-view', title: 'Настройки' };
|
export const pageMeta = { id: 'settings-view', title: 'Настройки' };
|
||||||
|
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
import { renderHeader } from '../components/header.js?v=20260403081123';
|
import { renderHeader } from '../components/header.js?v=20260405171816';
|
||||||
import { state } from '../state.js?v=20260403081123';
|
import { state } from '../state.js?v=20260405171816';
|
||||||
import { loadEncryptedUserSecrets } from '../services/key-vault.js?v=20260403081123';
|
import { loadEncryptedUserSecrets } from '../services/key-vault.js?v=20260405171816';
|
||||||
|
|
||||||
export const pageMeta = { id: 'show-keys-view', title: 'Показать ключи' };
|
export const pageMeta = { id: 'show-keys-view', title: 'Показать ключи' };
|
||||||
|
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
import { clearStartHint, state } from '../state.js?v=20260403081123';
|
import { clearStartHint, state } from '../state.js?v=20260405171816';
|
||||||
|
|
||||||
export const pageMeta = { id: 'start-view', title: 'Старт', showAppChrome: false };
|
export const pageMeta = { id: 'start-view', title: 'Старт', showAppChrome: false };
|
||||||
|
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
import { renderHeader } from '../components/header.js?v=20260403081123';
|
import { renderHeader } from '../components/header.js?v=20260405171816';
|
||||||
import { state } from '../state.js?v=20260403081123';
|
import { state } from '../state.js?v=20260405171816';
|
||||||
|
|
||||||
export const pageMeta = { id: 'topup-view', title: 'Пополнение счета', showAppChrome: false };
|
export const pageMeta = { id: 'topup-view', title: 'Пополнение счета', showAppChrome: false };
|
||||||
|
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
import { renderHeader } from '../components/header.js?v=20260403081123';
|
import { renderHeader } from '../components/header.js?v=20260405171816';
|
||||||
import { wallet } from '../mock-data.js?v=20260403081123';
|
import { wallet } from '../mock-data.js?v=20260405171816';
|
||||||
|
|
||||||
export const pageMeta = { id: 'wallet-view', title: 'Кошелёк' };
|
export const pageMeta = { id: 'wallet-view', title: 'Кошелёк' };
|
||||||
|
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
import { WsJsonClient } from './ws-client.js?v=20260403081123';
|
import { WsJsonClient } from './ws-client.js?v=20260405171816';
|
||||||
import {
|
import {
|
||||||
deriveEd25519FromPassword,
|
deriveEd25519FromPassword,
|
||||||
exportEd25519PublicKeyB64,
|
exportEd25519PublicKeyB64,
|
||||||
@ -7,8 +7,8 @@ import {
|
|||||||
importPkcs8Ed25519,
|
importPkcs8Ed25519,
|
||||||
randomBase64,
|
randomBase64,
|
||||||
signBase64,
|
signBase64,
|
||||||
} from './crypto-utils.js?v=20260403081123';
|
} from './crypto-utils.js?v=20260405171816';
|
||||||
import { loadSessionMaterial, saveEncryptedUserSecrets, saveSessionMaterial } from './key-vault.js?v=20260403081123';
|
import { loadSessionMaterial, saveEncryptedUserSecrets, saveSessionMaterial } from './key-vault.js?v=20260405171816';
|
||||||
|
|
||||||
const BCH_SUFFIX = '001';
|
const BCH_SUFFIX = '001';
|
||||||
|
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
import {
|
import {
|
||||||
decryptJsonWithStoragePwd,
|
decryptJsonWithStoragePwd,
|
||||||
encryptJsonWithStoragePwd,
|
encryptJsonWithStoragePwd,
|
||||||
} from './crypto-utils.js?v=20260403081123';
|
} from './crypto-utils.js?v=20260405171816';
|
||||||
|
|
||||||
const DB_NAME = 'shine-ui-auth';
|
const DB_NAME = 'shine-ui-auth';
|
||||||
const DB_VERSION = 1;
|
const DB_VERSION = 1;
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
import { captureClientError } from './client-error-reporter.js?v=20260403081123';
|
import { captureClientError } from './client-error-reporter.js?v=20260405171816';
|
||||||
|
|
||||||
const DEFAULT_TIMEOUT_MS = 12000;
|
const DEFAULT_TIMEOUT_MS = 12000;
|
||||||
|
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
import { chatMessages, wallet } from './mock-data.js?v=20260403081123';
|
import { chatMessages, wallet } from './mock-data.js?v=20260405171816';
|
||||||
import { AuthService } from './services/auth-service.js?v=20260403081123';
|
import { AuthService } from './services/auth-service.js?v=20260405171816';
|
||||||
import { clearClientAuthData } from './services/key-vault.js?v=20260403081123';
|
import { clearClientAuthData } from './services/key-vault.js?v=20260405171816';
|
||||||
|
|
||||||
const clone = (value) => JSON.parse(JSON.stringify(value));
|
const clone = (value) => JSON.parse(JSON.stringify(value));
|
||||||
const SESSION_STORAGE_KEY = 'shine-ui-current-session-v1';
|
const SESSION_STORAGE_KEY = 'shine-ui-current-session-v1';
|
||||||
|
|||||||
@ -129,7 +129,7 @@ public final class ActiveSessionsDAO {
|
|||||||
client_info_from_request,
|
client_info_from_request,
|
||||||
user_language
|
user_language
|
||||||
FROM active_sessions
|
FROM active_sessions
|
||||||
WHERE login = ?
|
WHERE login = ? COLLATE NOCASE
|
||||||
""";
|
""";
|
||||||
|
|
||||||
List<ActiveSessionEntry> result = new ArrayList<>();
|
List<ActiveSessionEntry> result = new ArrayList<>();
|
||||||
@ -267,4 +267,4 @@ public final class ActiveSessionsDAO {
|
|||||||
userLanguage
|
userLanguage
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -89,7 +89,7 @@ public final class UserParamsDAO {
|
|||||||
device_key,
|
device_key,
|
||||||
signature
|
signature
|
||||||
FROM users_params
|
FROM users_params
|
||||||
WHERE login = ? AND param = ?
|
WHERE login = ? COLLATE NOCASE AND param = ?
|
||||||
LIMIT 1
|
LIMIT 1
|
||||||
""";
|
""";
|
||||||
|
|
||||||
@ -120,7 +120,7 @@ public final class UserParamsDAO {
|
|||||||
device_key,
|
device_key,
|
||||||
signature
|
signature
|
||||||
FROM users_params
|
FROM users_params
|
||||||
WHERE login = ?
|
WHERE login = ? COLLATE NOCASE
|
||||||
ORDER BY time_ms DESC
|
ORDER BY time_ms DESC
|
||||||
""";
|
""";
|
||||||
|
|
||||||
@ -159,4 +159,4 @@ public final class UserParamsDAO {
|
|||||||
|
|
||||||
return e;
|
return e;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -3,6 +3,7 @@ package server.logic.ws_protocol.JSON;
|
|||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import java.util.Locale;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.concurrent.ConcurrentHashMap;
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
import java.util.concurrent.CopyOnWriteArraySet;
|
import java.util.concurrent.CopyOnWriteArraySet;
|
||||||
@ -27,7 +28,7 @@ public final class ActiveConnectionsRegistry {
|
|||||||
// sessionId (String) -> ConnectionContext
|
// sessionId (String) -> ConnectionContext
|
||||||
private final ConcurrentHashMap<String, ConnectionContext> bySessionId = new ConcurrentHashMap<>();
|
private final ConcurrentHashMap<String, ConnectionContext> bySessionId = new ConcurrentHashMap<>();
|
||||||
|
|
||||||
// login (String) -> множество ConnectionContext для этого пользователя
|
// lowercase(login) -> множество ConnectionContext для этого пользователя
|
||||||
private final ConcurrentHashMap<String, Set<ConnectionContext>> byLogin = new ConcurrentHashMap<>();
|
private final ConcurrentHashMap<String, Set<ConnectionContext>> byLogin = new ConcurrentHashMap<>();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -50,11 +51,12 @@ public final class ActiveConnectionsRegistry {
|
|||||||
if (prev != null && prev != ctx) {
|
if (prev != null && prev != ctx) {
|
||||||
String prevLogin = prev.getLogin();
|
String prevLogin = prev.getLogin();
|
||||||
if (prevLogin != null && !prevLogin.isBlank()) {
|
if (prevLogin != null && !prevLogin.isBlank()) {
|
||||||
Set<ConnectionContext> prevSet = byLogin.get(prevLogin);
|
String prevKey = toLoginKey(prevLogin);
|
||||||
|
Set<ConnectionContext> prevSet = byLogin.get(prevKey);
|
||||||
if (prevSet != null) {
|
if (prevSet != null) {
|
||||||
prevSet.remove(prev);
|
prevSet.remove(prev);
|
||||||
if (prevSet.isEmpty()) {
|
if (prevSet.isEmpty()) {
|
||||||
byLogin.remove(prevLogin);
|
byLogin.remove(prevKey);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -63,7 +65,7 @@ public final class ActiveConnectionsRegistry {
|
|||||||
}
|
}
|
||||||
|
|
||||||
byLogin
|
byLogin
|
||||||
.computeIfAbsent(login, id -> new CopyOnWriteArraySet<>())
|
.computeIfAbsent(toLoginKey(login), id -> new CopyOnWriteArraySet<>())
|
||||||
.add(ctx);
|
.add(ctx);
|
||||||
|
|
||||||
log.debug("registered ctx (login={}, sessionId={})", login, sessionId);
|
log.debug("registered ctx (login={}, sessionId={})", login, sessionId);
|
||||||
@ -89,11 +91,12 @@ public final class ActiveConnectionsRegistry {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (login != null && !login.isBlank()) {
|
if (login != null && !login.isBlank()) {
|
||||||
Set<ConnectionContext> set = byLogin.get(login);
|
String key = toLoginKey(login);
|
||||||
|
Set<ConnectionContext> set = byLogin.get(key);
|
||||||
if (set != null) {
|
if (set != null) {
|
||||||
set.remove(ctx);
|
set.remove(ctx);
|
||||||
if (set.isEmpty()) {
|
if (set.isEmpty()) {
|
||||||
byLogin.remove(login);
|
byLogin.remove(key);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -112,11 +115,12 @@ public final class ActiveConnectionsRegistry {
|
|||||||
|
|
||||||
String login = ctx.getLogin();
|
String login = ctx.getLogin();
|
||||||
if (login != null && !login.isBlank()) {
|
if (login != null && !login.isBlank()) {
|
||||||
Set<ConnectionContext> set = byLogin.get(login);
|
String key = toLoginKey(login);
|
||||||
|
Set<ConnectionContext> set = byLogin.get(key);
|
||||||
if (set != null) {
|
if (set != null) {
|
||||||
set.remove(ctx);
|
set.remove(ctx);
|
||||||
if (set.isEmpty()) {
|
if (set.isEmpty()) {
|
||||||
byLogin.remove(login);
|
byLogin.remove(key);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -137,7 +141,11 @@ public final class ActiveConnectionsRegistry {
|
|||||||
*/
|
*/
|
||||||
public Set<ConnectionContext> getByLogin(String login) {
|
public Set<ConnectionContext> getByLogin(String login) {
|
||||||
if (login == null || login.isBlank()) return Set.of();
|
if (login == null || login.isBlank()) return Set.of();
|
||||||
Set<ConnectionContext> set = byLogin.get(login);
|
Set<ConnectionContext> set = byLogin.get(toLoginKey(login));
|
||||||
return (set == null) ? Set.of() : set; // CopyOnWriteArraySet можно отдавать как есть
|
return (set == null) ? Set.of() : set; // CopyOnWriteArraySet можно отдавать как есть
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
private static String toLoginKey(String login) {
|
||||||
|
return login.trim().toLowerCase(Locale.ROOT);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@ -75,8 +75,8 @@ public class Net_CreateAuthSession__Handler implements JsonMessageHandler {
|
|||||||
|
|
||||||
SolanaUserEntry userFromContext = ctx.getSolanaUser();
|
SolanaUserEntry userFromContext = ctx.getSolanaUser();
|
||||||
String loginFromContext = userFromContext.getLogin();
|
String loginFromContext = userFromContext.getLogin();
|
||||||
String login = req.getLogin();
|
String loginFromReq = req.getLogin();
|
||||||
if (login == null || login.isBlank()) {
|
if (loginFromReq == null || loginFromReq.isBlank()) {
|
||||||
Net_Response err = NetExceptionResponseFactory.error(
|
Net_Response err = NetExceptionResponseFactory.error(
|
||||||
req,
|
req,
|
||||||
WireCodes.Status.BAD_REQUEST,
|
WireCodes.Status.BAD_REQUEST,
|
||||||
@ -86,7 +86,8 @@ public class Net_CreateAuthSession__Handler implements JsonMessageHandler {
|
|||||||
closeConnectionAfterErrorResponse(ctx, 4001, "Auth failed: empty login");
|
closeConnectionAfterErrorResponse(ctx, 4001, "Auth failed: empty login");
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
if (!login.equals(loginFromContext)) {
|
loginFromReq = loginFromReq.trim();
|
||||||
|
if (!loginFromReq.equalsIgnoreCase(loginFromContext)) {
|
||||||
Net_Response err = NetExceptionResponseFactory.error(
|
Net_Response err = NetExceptionResponseFactory.error(
|
||||||
req,
|
req,
|
||||||
WireCodes.Status.BAD_REQUEST,
|
WireCodes.Status.BAD_REQUEST,
|
||||||
@ -99,7 +100,7 @@ public class Net_CreateAuthSession__Handler implements JsonMessageHandler {
|
|||||||
|
|
||||||
SolanaUserEntry user;
|
SolanaUserEntry user;
|
||||||
try {
|
try {
|
||||||
user = SolanaUsersDAO.getInstance().getByLogin(login);
|
user = SolanaUsersDAO.getInstance().getByLogin(loginFromContext);
|
||||||
} catch (SQLException e) {
|
} catch (SQLException e) {
|
||||||
Net_Response err = NetExceptionResponseFactory.error(
|
Net_Response err = NetExceptionResponseFactory.error(
|
||||||
req,
|
req,
|
||||||
@ -121,7 +122,8 @@ public class Net_CreateAuthSession__Handler implements JsonMessageHandler {
|
|||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (login == null || login.isBlank()) {
|
String canonicalLogin = user.getLogin();
|
||||||
|
if (canonicalLogin == null || canonicalLogin.isBlank()) {
|
||||||
Net_Response err = NetExceptionResponseFactory.error(
|
Net_Response err = NetExceptionResponseFactory.error(
|
||||||
req,
|
req,
|
||||||
WireCodes.Status.SERVER_DATA_ERROR,
|
WireCodes.Status.SERVER_DATA_ERROR,
|
||||||
@ -273,7 +275,7 @@ public class Net_CreateAuthSession__Handler implements JsonMessageHandler {
|
|||||||
boolean sigOk;
|
boolean sigOk;
|
||||||
try {
|
try {
|
||||||
sigOk = verifyCreateSessionSignature(
|
sigOk = verifyCreateSessionSignature(
|
||||||
login,
|
loginFromReq,
|
||||||
sessionKey,
|
sessionKey,
|
||||||
storagePwd,
|
storagePwd,
|
||||||
authNonce,
|
authNonce,
|
||||||
@ -342,7 +344,7 @@ public class Net_CreateAuthSession__Handler implements JsonMessageHandler {
|
|||||||
try {
|
try {
|
||||||
activeSessionEntry = new ActiveSessionEntry(
|
activeSessionEntry = new ActiveSessionEntry(
|
||||||
sessionId,
|
sessionId,
|
||||||
login,
|
canonicalLogin,
|
||||||
sessionKey, // session_key (pubkey string as-is)
|
sessionKey, // session_key (pubkey string as-is)
|
||||||
storagePwd,
|
storagePwd,
|
||||||
now,
|
now,
|
||||||
@ -358,7 +360,7 @@ public class Net_CreateAuthSession__Handler implements JsonMessageHandler {
|
|||||||
|
|
||||||
dao.insert(activeSessionEntry);
|
dao.insert(activeSessionEntry);
|
||||||
} catch (SQLException e) {
|
} catch (SQLException e) {
|
||||||
log.error("Ошибка БД при создании новой сессии для login={}", login, e);
|
log.error("Ошибка БД при создании новой сессии для login={}", canonicalLogin, e);
|
||||||
Net_Response err = NetExceptionResponseFactory.error(
|
Net_Response err = NetExceptionResponseFactory.error(
|
||||||
req,
|
req,
|
||||||
WireCodes.Status.SERVER_DATA_ERROR,
|
WireCodes.Status.SERVER_DATA_ERROR,
|
||||||
|
|||||||
@ -74,7 +74,7 @@ public class Net_AddCloseFriend_Handler implements JsonMessageHandler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private String findPrimaryBlockchain(Connection c, String login) throws Exception {
|
private String findPrimaryBlockchain(Connection c, String login) throws Exception {
|
||||||
String sql = "SELECT blockchain_name FROM blockchain_state WHERE login=? ORDER BY blockchain_name LIMIT 1";
|
String sql = "SELECT blockchain_name FROM blockchain_state WHERE login = ? COLLATE NOCASE ORDER BY blockchain_name LIMIT 1";
|
||||||
try (PreparedStatement ps = c.prepareStatement(sql)) {
|
try (PreparedStatement ps = c.prepareStatement(sql)) {
|
||||||
ps.setString(1, login);
|
ps.setString(1, login);
|
||||||
try (ResultSet rs = ps.executeQuery()) {
|
try (ResultSet rs = ps.executeQuery()) {
|
||||||
|
|||||||
@ -12,6 +12,8 @@ import shine.db.MsgSubType;
|
|||||||
import shine.db.dao.ConnectionsStateDAO;
|
import shine.db.dao.ConnectionsStateDAO;
|
||||||
|
|
||||||
import java.sql.Connection;
|
import java.sql.Connection;
|
||||||
|
import java.sql.PreparedStatement;
|
||||||
|
import java.sql.ResultSet;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
public class Net_GetUserConnectionsGraph_Handler implements JsonMessageHandler {
|
public class Net_GetUserConnectionsGraph_Handler implements JsonMessageHandler {
|
||||||
@ -21,20 +23,35 @@ public class Net_GetUserConnectionsGraph_Handler implements JsonMessageHandler {
|
|||||||
if (ctx == null || !ctx.isAuthenticatedUser()) {
|
if (ctx == null || !ctx.isAuthenticatedUser()) {
|
||||||
return NetExceptionResponseFactory.error(req, WireCodes.Status.UNVERIFIED, "NOT_AUTHENTICATED", "Требуется авторизация");
|
return NetExceptionResponseFactory.error(req, WireCodes.Status.UNVERIFIED, "NOT_AUTHENTICATED", "Требуется авторизация");
|
||||||
}
|
}
|
||||||
String login = (req.getLogin() == null || req.getLogin().isBlank()) ? ctx.getLogin() : req.getLogin().trim();
|
String requestedLogin = (req.getLogin() == null || req.getLogin().isBlank()) ? ctx.getLogin() : req.getLogin().trim();
|
||||||
|
|
||||||
try (Connection c = shine.db.SqliteDbController.getInstance().getConnection()) {
|
try (Connection c = shine.db.SqliteDbController.getInstance().getConnection()) {
|
||||||
List<String> out = ConnectionsStateDAO.getInstance().listOutgoingByRelTypeCanonical(c, login, MsgSubType.CONNECTION_FRIEND);
|
String canonicalLogin = findCanonicalLogin(c, requestedLogin);
|
||||||
List<String> in = ConnectionsStateDAO.getInstance().listIncomingByRelTypeCanonical(c, login, MsgSubType.CONNECTION_FRIEND);
|
if (canonicalLogin == null) {
|
||||||
|
return NetExceptionResponseFactory.error(req, 404, "USER_NOT_FOUND", "Пользователь не найден");
|
||||||
|
}
|
||||||
|
|
||||||
|
List<String> out = ConnectionsStateDAO.getInstance().listOutgoingByRelTypeCanonical(c, canonicalLogin, MsgSubType.CONNECTION_FRIEND);
|
||||||
|
List<String> in = ConnectionsStateDAO.getInstance().listIncomingByRelTypeCanonical(c, canonicalLogin, MsgSubType.CONNECTION_FRIEND);
|
||||||
|
|
||||||
Net_GetUserConnectionsGraph_Response resp = new Net_GetUserConnectionsGraph_Response();
|
Net_GetUserConnectionsGraph_Response resp = new Net_GetUserConnectionsGraph_Response();
|
||||||
resp.setOp(req.getOp());
|
resp.setOp(req.getOp());
|
||||||
resp.setRequestId(req.getRequestId());
|
resp.setRequestId(req.getRequestId());
|
||||||
resp.setStatus(WireCodes.Status.OK);
|
resp.setStatus(WireCodes.Status.OK);
|
||||||
resp.setLogin(login);
|
resp.setLogin(canonicalLogin);
|
||||||
resp.setOutFriends(out);
|
resp.setOutFriends(out);
|
||||||
resp.setInFriends(in);
|
resp.setInFriends(in);
|
||||||
return resp;
|
return resp;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private String findCanonicalLogin(Connection c, String loginAnyCase) throws Exception {
|
||||||
|
String sql = "SELECT login FROM solana_users WHERE login = ? COLLATE NOCASE LIMIT 1";
|
||||||
|
try (PreparedStatement ps = c.prepareStatement(sql)) {
|
||||||
|
ps.setString(1, loginAnyCase);
|
||||||
|
try (ResultSet rs = ps.executeQuery()) {
|
||||||
|
return rs.next() ? rs.getString("login") : null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -11,7 +11,9 @@ import server.logic.ws_protocol.JSON.handlers.userParams.entyties.Net_ListUserPa
|
|||||||
import server.logic.ws_protocol.JSON.utils.NetExceptionResponseFactory;
|
import server.logic.ws_protocol.JSON.utils.NetExceptionResponseFactory;
|
||||||
import server.logic.ws_protocol.WireCodes;
|
import server.logic.ws_protocol.WireCodes;
|
||||||
import shine.db.SqliteDbController;
|
import shine.db.SqliteDbController;
|
||||||
|
import shine.db.dao.SolanaUsersDAO;
|
||||||
import shine.db.dao.UserParamsDAO;
|
import shine.db.dao.UserParamsDAO;
|
||||||
|
import shine.db.entities.SolanaUserEntry;
|
||||||
import shine.db.entities.UserParamEntry;
|
import shine.db.entities.UserParamEntry;
|
||||||
|
|
||||||
import java.sql.Connection;
|
import java.sql.Connection;
|
||||||
@ -61,7 +63,8 @@ public class Net_ListUserParams_Handler implements JsonMessageHandler {
|
|||||||
resp.setRequestId(req.getRequestId());
|
resp.setRequestId(req.getRequestId());
|
||||||
resp.setStatus(WireCodes.Status.OK);
|
resp.setStatus(WireCodes.Status.OK);
|
||||||
|
|
||||||
resp.setLogin(login);
|
SolanaUserEntry user = SolanaUsersDAO.getInstance().getByLogin(login);
|
||||||
|
resp.setLogin(user != null && user.getLogin() != null ? user.getLogin() : login);
|
||||||
|
|
||||||
List<Net_ListUserParams_Response.Item> items = new ArrayList<>();
|
List<Net_ListUserParams_Response.Item> items = new ArrayList<>();
|
||||||
for (UserParamEntry e : entries) {
|
for (UserParamEntry e : entries) {
|
||||||
|
|||||||
@ -16,8 +16,10 @@ import server.logic.ws_protocol.JSON.utils.NetIdGenerator;
|
|||||||
import server.logic.ws_protocol.WireCodes;
|
import server.logic.ws_protocol.WireCodes;
|
||||||
import shine.db.dao.DirectMessagesDAO;
|
import shine.db.dao.DirectMessagesDAO;
|
||||||
import shine.db.dao.PushTokensDAO;
|
import shine.db.dao.PushTokensDAO;
|
||||||
|
import shine.db.dao.SolanaUsersDAO;
|
||||||
import shine.db.entities.DirectMessageEntry;
|
import shine.db.entities.DirectMessageEntry;
|
||||||
import shine.db.entities.PushTokenEntry;
|
import shine.db.entities.PushTokenEntry;
|
||||||
|
import shine.db.entities.SolanaUserEntry;
|
||||||
|
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@ -39,9 +41,15 @@ public class Net_SendDirectMessage_Handler implements JsonMessageHandler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
String from = ctx.getLogin();
|
String from = ctx.getLogin();
|
||||||
String to = req.getToLogin().trim();
|
String toRequest = req.getToLogin().trim();
|
||||||
String text = req.getText().trim();
|
String text = req.getText().trim();
|
||||||
|
|
||||||
|
SolanaUserEntry targetUser = SolanaUsersDAO.getInstance().getByLogin(toRequest);
|
||||||
|
if (targetUser == null) {
|
||||||
|
return NetExceptionResponseFactory.error(req, 404, "USER_NOT_FOUND", "Пользователь не найден");
|
||||||
|
}
|
||||||
|
String to = targetUser.getLogin();
|
||||||
|
|
||||||
if (!canSend(from, to)) {
|
if (!canSend(from, to)) {
|
||||||
return NetExceptionResponseFactory.error(req, WireCodes.Status.UNVERIFIED, "NO_PERMISSION", "Можно писать только контактам или тем, кто уже писал вам");
|
return NetExceptionResponseFactory.error(req, WireCodes.Status.UNVERIFIED, "NO_PERMISSION", "Можно писать только контактам или тем, кто уже писал вам");
|
||||||
}
|
}
|
||||||
@ -120,4 +128,3 @@ public class Net_SendDirectMessage_Handler implements JsonMessageHandler {
|
|||||||
return from != null && !from.isBlank() && to != null && !to.isBlank();
|
return from != null && !from.isBlank() && to != null && !to.isBlank();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user