Синхронизировать регистр логинов и доработать UI каналов

This commit is contained in:
AidarKC
2026-08-19 14:30:29 +04:00
parent e8a4713f6e
commit ce30b77328
29 changed files with 6729 additions and 815 deletions
+50 -19
View File
@@ -1022,6 +1022,18 @@ export class AuthService {
return response.payload || {};
}
async resolveCanonicalDisplayLogin(login) {
const cleanLogin = String(login || '').trim();
if (!cleanLogin) return '';
try {
const user = await this.getUser(cleanLogin);
const canonicalLogin = String(user?.login || '').trim();
return canonicalLogin || cleanLogin;
} catch {
return cleanLogin;
}
}
async ensureLoginFree(login) {
const payload = await this.getUser(login);
return payload.exists !== true;
@@ -1127,8 +1139,10 @@ export class AuthService {
const sessionId = createResp?.payload?.sessionId;
if (!sessionId) throw new Error('CreateAuthSession: не вернулся sessionId');
const canonicalLogin = await this.resolveCanonicalDisplayLogin(cleanLogin);
return {
login: cleanLogin,
login: canonicalLogin,
sessionId,
storagePwd,
sessionMaterial: {
@@ -1213,8 +1227,10 @@ export class AuthService {
const sessionId = createResp?.payload?.sessionId;
if (!sessionId) throw new Error('CreateAuthSession: не вернулся sessionId');
const canonicalLogin = await tempAuth.resolveCanonicalDisplayLogin(cleanLogin);
return {
login: cleanLogin,
login: canonicalLogin,
sessionId,
storagePwd,
sessionKey: cleanSessionKey,
@@ -1287,8 +1303,10 @@ export class AuthService {
const storagePwd = loginResp?.payload?.storagePwd;
if (!storagePwd) throw new Error('SessionLogin: не вернулся storagePwd');
const canonicalLogin = await this.resolveCanonicalDisplayLogin(cleanLogin);
return {
login: cleanLogin,
login: canonicalLogin,
sessionId: targetSessionId,
storagePwd,
};
@@ -2476,6 +2494,10 @@ export class AuthService {
return response.payload || {};
}
normalizeDmLogin(login) {
return String(login || '').trim().toLowerCase();
}
async buildSignedDmBlock({
signerLogin,
fromLogin,
@@ -2488,9 +2510,9 @@ export class AuthService {
reencryptedAtMs = 0,
bodyBytes = new Uint8Array(0),
}) {
const cleanSignerLogin = String(signerLogin || '').trim();
const cleanFromLogin = String(fromLogin || '').trim();
const cleanToLogin = String(toLogin || '').trim();
const cleanSignerLogin = this.normalizeDmLogin(signerLogin);
const cleanFromLogin = this.normalizeDmLogin(fromLogin);
const cleanToLogin = this.normalizeDmLogin(toLogin);
if (!cleanSignerLogin || !cleanFromLogin || !cleanToLogin) throw new Error('Не передан signerLogin/fromLogin/toLogin');
if (!storagePwd) throw new Error('Не передан storagePwd для подписи');
if (!(bodyBytes instanceof Uint8Array) || bodyBytes.length > DM_MAX_ENCRYPTED_BODY_BYTES) {
@@ -2590,8 +2612,8 @@ export class AuthService {
revisionTimeMs = 0,
reencryptedAtMs = 0,
}) {
const cleanFromLogin = String(login || '').trim();
const cleanToLogin = String(toLogin || '').trim();
const cleanFromLogin = this.normalizeDmLogin(login);
const cleanToLogin = this.normalizeDmLogin(toLogin);
const cleanText = String(text || '');
if (!cleanFromLogin || !cleanToLogin) throw new Error('Не передан login/toLogin');
const normalizedTimeMs = Number(timeMs);
@@ -2674,8 +2696,8 @@ export class AuthService {
}
async deleteDirectMessage({ login, toLogin, storagePwd, timeMs, nonce, revisionTimeMs, deleteByRecipient = false }) {
const cleanLogin = String(login || '').trim();
const cleanPeerLogin = String(toLogin || '').trim();
const cleanLogin = this.normalizeDmLogin(login);
const cleanPeerLogin = this.normalizeDmLogin(toLogin);
if (!cleanLogin || !cleanPeerLogin) throw new Error('Не передан login/toLogin');
const normalizedTimeMs = Number(timeMs);
const normalizedNonce = Number(nonce);
@@ -2706,14 +2728,23 @@ export class AuthService {
}
async sendReadReceipt({ login, toLogin, storagePwd, refToLogin, refFromLogin, refTimeMs, refNonce }) {
const cleanLogin = this.normalizeDmLogin(login);
const cleanToLogin = this.normalizeDmLogin(toLogin);
const cleanRefToLogin = this.normalizeDmLogin(refToLogin);
const cleanRefFromLogin = this.normalizeDmLogin(refFromLogin);
const timeMs = Date.now();
const nonce = Math.floor(Math.random() * 0x100000000);
const payload = buildReadReceiptPayloadBytes({ refToLogin, refFromLogin, refTimeMs, refNonce });
const payload = buildReadReceiptPayloadBytes({
refToLogin: cleanRefToLogin,
refFromLogin: cleanRefFromLogin,
refTimeMs,
refNonce,
});
const type3 = await this.buildSignedDmBlock({
signerLogin: login,
fromLogin: login,
toLogin,
signerLogin: cleanLogin,
fromLogin: cleanLogin,
toLogin: cleanToLogin,
storagePwd,
timeMs,
nonce,
@@ -2721,9 +2752,9 @@ export class AuthService {
bodyBytes: payload,
});
const type4 = await this.buildSignedDmBlock({
signerLogin: login,
fromLogin: login,
toLogin,
signerLogin: cleanLogin,
fromLogin: cleanLogin,
toLogin: cleanToLogin,
storagePwd,
timeMs,
nonce,
@@ -2737,8 +2768,8 @@ export class AuthService {
}
async deleteConversation({ login, toLogin, storagePwd, deleteByRecipient = false, timeMs = Date.now(), nonce = Math.floor(Math.random() * 0x100000000) }) {
const cleanLogin = String(login || '').trim();
const cleanPeerLogin = String(toLogin || '').trim();
const cleanLogin = this.normalizeDmLogin(login);
const cleanPeerLogin = this.normalizeDmLogin(toLogin);
if (!cleanLogin || !cleanPeerLogin) throw new Error('Не передан login/toLogin');
const normalizedTimeMs = Number(timeMs);
const normalizedNonce = Number(nonce);