From 1dddb5fb3c1979c01c3d49b00822cc6676cb1a43666b7b4550f622a2754d1483 Mon Sep 17 00:00:00 2001 From: AidarKC Date: Sat, 25 Jul 2026 21:16:15 +0400 Subject: [PATCH] =?UTF-8?q?=D0=A1=D0=B5=D1=80=D0=B2=D0=B5=D1=80:=20=D1=83?= =?UTF-8?q?=D1=82=D0=BE=D1=87=D0=BD=D0=B8=D1=82=D1=8C=20=D0=BF=D1=80=D0=B0?= =?UTF-8?q?=D0=B2=D0=B8=D0=BB=D0=B0=20=D0=B8=D0=BC=D1=91=D0=BD=20=D0=BA?= =?UTF-8?q?=D0=B0=D0=BD=D0=B0=D0=BB=D0=BE=D0=B2=20=D0=B8=20=D0=BF=D0=BE?= =?UTF-8?q?=D0=B8=D1=81=D0=BA=20=D1=82=D1=80=D0=B5=D0=B4=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../shine/db/channels/ChannelNameRules.java | 15 ++++++++++++++ .../blockchain/Net_AddBlock_Handler.java | 9 +++++---- .../Net_GetMessageThread_Handler.java | 20 ------------------- VERSION.properties | 2 +- shine-UI/js/pages/add-channel-view.js | 7 ++++--- shine-UI/js/services/channel-name-rules.js | 13 ++++++------ shine-UI/js/services/ui-error-texts.js | 3 ++- 7 files changed, 34 insertions(+), 35 deletions(-) diff --git a/SHiNE-server/shine-server-db/src/main/java/shine/db/channels/ChannelNameRules.java b/SHiNE-server/shine-server-db/src/main/java/shine/db/channels/ChannelNameRules.java index ee5aa2e9..c810da2c 100644 --- a/SHiNE-server/shine-server-db/src/main/java/shine/db/channels/ChannelNameRules.java +++ b/SHiNE-server/shine-server-db/src/main/java/shine/db/channels/ChannelNameRules.java @@ -8,6 +8,10 @@ public final class ChannelNameRules { private static final int MAX_DISPLAY_NAME_LENGTH = 32; private static final Pattern DISPLAY_ALLOWED_PATTERN = Pattern.compile("^[A-Za-z0-9_-]+$"); + private static final Pattern PUBLIC_CHANNEL_ALLOWED_PATTERN = + Pattern.compile("^[A-Za-z0-9_-]+$"); + private static final Pattern DIGITS_ONLY_PATTERN = + Pattern.compile("^[0-9]+$"); private ChannelNameRules() {} @@ -34,6 +38,17 @@ public final class ChannelNameRules { return normalized; } + public static String requireValidPublicDisplayNameForCreate(String rawName) { + String normalized = requireValidDisplayNameForCreate(rawName); + if (!PUBLIC_CHANNEL_ALLOWED_PATTERN.matcher(normalized).matches()) { + throw new IllegalArgumentException("channelName contains unsupported characters"); + } + if (DIGITS_ONLY_PATTERN.matcher(normalized).matches()) { + throw new IllegalArgumentException("channelName must not contain only digits"); + } + return normalized; + } + public static String toCanonicalSlug(String rawName) { String normalized = normalizeDisplayName(rawName); if (normalized.isEmpty()) { diff --git a/SHiNE-server/shine-server-net-protocol/src/main/java/server/logic/ws_protocol/JSON/handlers/blockchain/Net_AddBlock_Handler.java b/SHiNE-server/shine-server-net-protocol/src/main/java/server/logic/ws_protocol/JSON/handlers/blockchain/Net_AddBlock_Handler.java index 2333f7a0..2ffc971d 100644 --- a/SHiNE-server/shine-server-net-protocol/src/main/java/server/logic/ws_protocol/JSON/handlers/blockchain/Net_AddBlock_Handler.java +++ b/SHiNE-server/shine-server-net-protocol/src/main/java/server/logic/ws_protocol/JSON/handlers/blockchain/Net_AddBlock_Handler.java @@ -279,18 +279,19 @@ public final class Net_AddBlock_Handler implements JsonMessageHandler { ChannelNameStateEntry channelNameStateEntry = null; Chat200CreateSeed chat200CreateSeed = null; if (block.body instanceof CreateChannelBody createChannelBody) { + int channelTypeCode = Short.toUnsignedInt(createChannelBody.channelTypeCode); + int channelTypeVersion = Short.toUnsignedInt(createChannelBody.channelTypeVersion); final String normalizedName; final String slug; try { - normalizedName = ChannelNameRules.requireValidDisplayNameForCreate(createChannelBody.channelName); + normalizedName = channelTypeCode == (CreateChannelBody.CHANNEL_TYPE_PERSONAL & 0xFFFF) + ? ChannelNameRules.requireValidDisplayNameForCreate(createChannelBody.channelName) + : ChannelNameRules.requireValidPublicDisplayNameForCreate(createChannelBody.channelName); slug = ChannelNameRules.toCanonicalSlug(normalizedName); } catch (IllegalArgumentException badName) { return new AddBlockResult(WireCodes.Status.BAD_REQUEST, "bad_channel_name", serverLastNum, serverLastHashHex); } - int channelTypeCode = Short.toUnsignedInt(createChannelBody.channelTypeCode); - int channelTypeVersion = Short.toUnsignedInt(createChannelBody.channelTypeVersion); - try { if (channelNameStateDAO.existsByOwnerTypeAndSlug(blockchainName, channelTypeCode, slug)) { return new AddBlockResult(409, "channel_name_already_exists", serverLastNum, serverLastHashHex); diff --git a/SHiNE-server/shine-server-net-protocol/src/main/java/server/logic/ws_protocol/JSON/handlers/channels/Net_GetMessageThread_Handler.java b/SHiNE-server/shine-server-net-protocol/src/main/java/server/logic/ws_protocol/JSON/handlers/channels/Net_GetMessageThread_Handler.java index 6c3e7ffe..243ea507 100644 --- a/SHiNE-server/shine-server-net-protocol/src/main/java/server/logic/ws_protocol/JSON/handlers/channels/Net_GetMessageThread_Handler.java +++ b/SHiNE-server/shine-server-net-protocol/src/main/java/server/logic/ws_protocol/JSON/handlers/channels/Net_GetMessageThread_Handler.java @@ -84,11 +84,6 @@ public class Net_GetMessageThread_Handler implements JsonMessageHandler { PostRow byNumber = findByNumber(c, blockchainName, blockNumber); if (byNumber != null) return byNumber; - if (blockHash != null) { - PostRow byHash = findByHash(c, blockHash); - if (byHash != null) return byHash; - } - return null; } @@ -161,21 +156,6 @@ public class Net_GetMessageThread_Handler implements JsonMessageHandler { } } - private PostRow findByHash(Connection c, byte[] blockHash) throws Exception { - String sql = """ - SELECT login,bch_name,block_number,block_hash,block_bytes,to_bch_name,to_block_number,to_block_hash,line_code,msg_sub_type,this_line_number - FROM blocks - WHERE block_hash=? - LIMIT 1 - """; - try (PreparedStatement ps = c.prepareStatement(sql)) { - ps.setBytes(1, blockHash); - try (ResultSet rs = ps.executeQuery()) { - return rs.next() ? mapRow(rs) : null; - } - } - } - private byte[] parseOptionalHash(String hex) { String value = String.valueOf(hex == null ? "" : hex).trim(); if (value.isEmpty()) return null; diff --git a/VERSION.properties b/VERSION.properties index 7068baa2..0e58dedd 100644 --- a/VERSION.properties +++ b/VERSION.properties @@ -1,2 +1,2 @@ client.version=1.2.354 -server.version=1.2.328 +server.version=1.2.329 diff --git a/shine-UI/js/pages/add-channel-view.js b/shine-UI/js/pages/add-channel-view.js index d4b3c70b..a073aa3c 100644 --- a/shine-UI/js/pages/add-channel-view.js +++ b/shine-UI/js/pages/add-channel-view.js @@ -45,12 +45,13 @@ export function render({ navigate }) { form.className = 'card stack'; form.innerHTML = ` Создание канала -

Можно использовать только латиницу, цифры, _ и -.

-

Длина названия: от 1 до 32 символов.

+

Разрешены только латинские буквы, цифры, _ и -.

+

Длина названия: от 3 до 32 символов. Название не должно состоять только из цифр.

+

Можно использовать большие и маленькие буквы, но уникальность проверяется без учёта регистра.

Тип канала фиксирован: публичный (1).
- +
diff --git a/shine-UI/js/services/channel-name-rules.js b/shine-UI/js/services/channel-name-rules.js index e5d7abec..e1248cf7 100644 --- a/shine-UI/js/services/channel-name-rules.js +++ b/shine-UI/js/services/channel-name-rules.js @@ -1,6 +1,7 @@ -const MIN_LEN = 1; +const MIN_LEN = 3; const MAX_LEN = 32; const ALLOWED_CHARS_RE = /^[A-Za-z0-9_-]+$/; +const DIGITS_ONLY_RE = /^[0-9]+$/; export function normalizeChannelDisplayName(value) { if (value == null) return ''; @@ -37,8 +38,8 @@ export function validateChannelDisplayName(value) { if (!ALLOWED_CHARS_RE.test(normalized)) { return { ok: false, code: 'bad_chars', normalized, slug: '' }; } - if (normalized === '0') { - return { ok: false, code: 'reserved', normalized, slug: '' }; + if (DIGITS_ONLY_RE.test(normalized)) { + return { ok: false, code: 'digits_only', normalized, slug: '' }; } const slug = toCanonicalChannelSlug(normalized); @@ -54,13 +55,13 @@ export function channelNameErrorText(code) { case 'blank': return 'Введите название канала.'; case 'too_short': - return 'Название слишком короткое: минимум 1 символ.'; + return 'Название слишком короткое: минимум 3 символа.'; case 'too_long': return 'Название слишком длинное: максимум 32 символа.'; case 'bad_chars': return 'Разрешены только латиница, цифры, _ и -.'; - case 'reserved': - return 'Название "0" зарезервировано.'; + case 'digits_only': + return 'Название канала не должно состоять только из цифр.'; default: return 'Некорректное название канала.'; } diff --git a/shine-UI/js/services/ui-error-texts.js b/shine-UI/js/services/ui-error-texts.js index a5fb39fd..6e46c19e 100644 --- a/shine-UI/js/services/ui-error-texts.js +++ b/shine-UI/js/services/ui-error-texts.js @@ -86,11 +86,12 @@ export function toUserMessage(error, fallback = 'Действие не выпо code === 'BAD_CHANNEL_NAME' || text.includes('channel name must match') || text.includes('channelname contains unsupported') || + text.includes('channelname must not contain only digits') || text.includes('channelname length must be 3..32') || text.includes('channelname length must be 1..32') || text.includes('bad_channel_name') ) { - return 'Некорректное название канала. Разрешены кириллица, латиница, цифры, пробел, _ и - (1..32 символа).'; + return 'Некорректное название канала. Разрешены только латинские буквы, цифры, _ и -. Длина: 3..32. Название не должно состоять только из цифр.'; } if (text.includes('channel name is required') || text.includes('введите имя канала')) {