Commit graph

188 commits

Author SHA1 Message Date
206bde18e0 channels: give kicked/banned/promoted/transferred users a real qts so their client applies it
updateChannelParticipant carries the account's qts per the MTProto spec, but
the server always sent Qts: 0, so real clients silently discarded it as a
stale duplicate -- the banned/kicked user's channel never vanished locally
and no correct "removed by admin" message showed, even though the update was
delivered successfully at the transport layer.

Add a durable per-device qts queue (channel_participant_event_queue) sharing
its qts number space with the existing secret-chat queue (one qts sequence
per device, per spec), and use it to stamp a correct, monotonically
increasing qts on the update for every device of the affected user -- for
channel bans/kicks, admin promotion/demotion, and ownership transfer. A
device offline when it happened can now recover the event via
updates.getDifference instead of missing it permanently.
2026-09-15 15:43:52 +01:00
33e22308c6 deps: bump github.com/iamxvbaba/td to v1.3.2
Matches upstream owpengram/owpengram-server's version. v1.3.2 collapses the
old per-kind KeyboardButtonClass sum type (KeyboardButton, KeyboardButtonURL,
KeyboardButtonCallback, KeyboardButtonRequestPeer, ...) into two unified
structs mirroring Telegram's actual current MTProto layer: KeyboardButton
(reply keyboards) and KeyboardInlineButton (inline keyboards), each carrying
a Text/Style pair plus a Type field (ButtonTypeClass / InlineButtonTypeClass)
that now holds what used to be the concrete Go type.

Migrated the two call sites (internal/rpc/convert_markup.go,
internal/rpc/bots_longtail.go) and their tests to the new shape. Behavior is
unchanged -- every button kind (callback, url, url_auth, web_view,
switch_inline, copy, request_phone, request_geo_location, request_poll,
request_peer, simple_web_view) still round-trips the same domain fields,
just read from/written to Type instead of the button's own concrete type.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-14 12:09:36 +01:00
4ca35d2000 users: never cache a deleted user's base row
redisstore.userBaseValue has no Deleted/DeletedAt/Status field, so caching a
deleted user silently reset Deleted back to false (and Status to the zero
UserStatusUnknown) on every round trip. That never self-healed: each later
cache miss reloaded the correctly tombstoned DB row and immediately
re-corrupted it on write, so once anyone looked a deleted account up, it kept
showing a blank name with "last seen recently" instead of "Deleted Account".

Keep deleted users off the base cache entirely so lookups always hit the
authoritative store, and stop presence overlay from touching a Deleted user's
Status at all as defense in depth.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-14 12:06:46 +01:00
f823b2cb74 rpc: return PASSWORD_MISSING for channel transfer without 2FA
messages.editChatCreator unconditionally returned PASSWORD_HASH_INVALID for
an account with no cloud password at all. Real Telegram Desktop's transfer-
ownership flow only recognizes the distinct PASSWORD_MISSING error to show
its "enable 2FA first" box; anything else falls through into the real
password-entry flow, which then has nothing to check against and crashes.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-14 12:05:28 +01:00
22846e340f botapi: getChatMemberCount, getChatMember, and a fuller getChat
- getChatMemberCount: channel/supergroup participant count (numeric chat_id).
- getChatMember: resolves a member via GetParticipant, projected to a Bot API
  ChatMember (creator/administrator/restricted/member/left/kicked with the
  matching rights); a user simply not in an accessible chat returns "left".
- getChat now uses the full channel view and adds permissions (from the default
  restrictions), slow_mode_delay, linked_chat_id and pinned_message.

Channel-only methods reject user chat_ids; private chats the bot cannot access
return CHAT_NOT_FOUND.
2026-09-14 12:00:03 +01:00
f5a0e770c7 botapi: implement getChat
Adds the getChat method to the HTTP Bot API gateway. Numeric chat_id only (no
@username). Resolution goes through the shared peer resolvers:

- user: ByID; unknown -> CHAT_NOT_FOUND
- channel/supergroup: ResolveChannel, so a public one resolves even when the bot
  is not a member (projected as a preview); a private one the bot cannot access
  -> CHAT_NOT_FOUND, a banned bot likewise

The Chat projection returns id (bot-api encoded), type ("channel" for a
broadcast, "supergroup" for a megagroup, "private" for a user), title, username,
first/last name, description, is_forum, and the scam/fake/verified flags.
2026-09-14 12:00:03 +01:00
2014c98386 forum: let non-members preview topic replies in a public channel
ListChannelReplies used getChannelForMemberOrLinkedGuest, so messages.getReplies
was member-only. ListChannelHistory (flat history) uses getChannelForViewer and
already allows a public channel's non-members to preview it. The mismatch meant
that on a public forum you could preview the flat history but not the topics -
and after leaving, tdesktop's topic view got CHANNEL_PRIVATE and sat on
"Loading..." forever instead of rendering a preview.

Switch the primary channel lookup in ListChannelReplies (both stores) to the
viewer-scope path. Private channels still return CHANNEL_PRIVATE to non-members;
the broadcast comment-thread lookup is unchanged.
2026-09-14 11:58:47 +01:00
0991207802 forum: project the forum's own channel with member state in getForumTopics
messages.getForumTopics returned every chat via tgChannels -> tgChannelChatMin,
so the forum's own channel came back as a min object with left unset. A client
with no other object for that peer (a fresh account browsing a public forum by
username) then rendered the forum as already joined: topic list visible, no
Join button, but no messages.

Render the primary channel with tgChannelChatForView so a non-member preview
carries left=true; keep the other referenced channels as min.
2026-09-14 11:58:47 +01:00
c8380b4257 welcome message: point updates-channel mention at @ziodotsh
Rename the official updates channel mention from @zio to @ziodotsh in the
welcome message template and update the affected send-message test.
2026-09-14 11:58:47 +01:00
b047a90271 channels: drop stale membership caches on join/leave
After channels.leaveChannel, a client that polls channels.getFullChannel kept
receiving a projection that still showed it as an active member (left=false)
until the per-(viewer,channel) RPC projection cache and the store-level member
cache lapsed on their own or the async read-model NOTIFY landed. The client
therefore kept an open compose box while every send was already rejected with
CHANNEL_PRIVATE - most visible on public forum supergroups, where getFullChannel
keeps succeeding via the preview path instead of tearing the chat down.

Every other membership-mutating path already busts these caches synchronously;
join/leave/invite/request-approval did not. Add:

- store: invalidateChannelMembershipCaches (row + member + dialog caches),
  called post-commit from JoinChannel, LeaveChannel, ImportInvite,
  InviteToChannel.
- rpc: invalidateChannelMembershipProjection (channelFullProjectionCache pair),
  called from the join/leave/invite/hide-requests handlers for every user whose
  membership changed.
2026-09-14 11:58:11 +01:00
c7a77c23c8 forum: fix reply_to_top_id for replies inside a forum
resolveChannelReply applied discussion-thread logic (reply_to_top_id =
the replied-to message's own id) to forum replies. Replying to a General
message produced reply_to_top_id = <that id>, a topic no client can
resolve: the reply vanished from every topic view and reply-jump on
strict clients said "message doesn't exist".

Forum replies now inherit the target's topic via domain.ForumReplyTopicID
(target's topic, or its own id if it's a topic-create, else General), and
General (topic 1) is accepted as a valid virtual topic everywhere, so
sends carrying top_msg_id: 1 are no longer rejected. Non-forum discussion
threads are unchanged.
2026-09-14 11:55:23 +01:00
f0bf315bf3 forum: let non-members browse a public forum's topic list
ListForumTopics / GetForumTopicsByID / GeneralForumTopic gated on
membership while channel history uses the public-preview path, so a
public forum's topics (General included) were invisible until you joined.
Switch them to getChannelForViewer / channelForViewerLocked; private
forums and write paths keep the membership gate.
2026-09-14 11:55:23 +01:00
57b7829a9e media: never project zero image/video dimensions (crashes Telegram Desktop on reactions) 2026-09-14 11:55:23 +01:00
4d781a52bb payments: stub getStarGifts / getSavedStarGifts to stop tdesktop 500 retry storm 2026-09-14 11:53:43 +01:00
09e2d24a4a Don't 500 on channel sends with an unresolvable @mention
A channel post containing an @token that is not a syntactically valid
username (too short, leading digit, etc.) made messages.sendMessage return
500 INTERNAL_SERVER_ERROR: mentionedUserIDsFromMessage turned every
ResolveUsername error into internalErr().

Skip tokens that fail with ErrUsernameInvalid / ErrUsernameNotOccupied
instead, matching real Telegram (the message sends, the client renders the
mention and only fails to open it on tap). Only unexpected storage errors
still abort. Same fix applied to the bot send path.
2026-09-14 11:52:52 +01:00
onysd
7c0639cf6a fix for comments in groups 2026-09-12 19:14:53 +03:00
onysd
2f1818d656 merged with fixes 2026-09-09 02:49:30 +03:00
onysd
87cebec9bd fix for muting an account 2026-09-07 09:31:06 +03:00
onysd
a00f6ad814 fix for avatar updates 2026-09-03 09:50:15 +03:00
onysd
863ae2e990 files for previous commit 2026-09-03 08:33:27 +03:00
onysd
e6bfe2d444 fix for retention logic 2026-09-03 05:00:42 +03:00
onysd
70c0ba44f0 adding more functions to media managament system 2026-09-03 00:54:09 +03:00
onysd
21a0856587 merged from gramsrv upstream 2026-09-01 12:06:31 +03:00
onysd
5e18bd3830 fix for gif and emojies categories 2026-08-24 22:42:40 +03:00
onysd
ff1d5ae361 fix 2026-08-07 10:13:42 +03:00
onysd
354128c106 added full gifts support 2026-08-07 10:13:11 +03:00
onysd
21d8e91756 removed all "paid" features - no more stars, gifts, or grams 2026-08-07 01:50:10 +03:00
onysd
03f10b66ee s3 support 2026-08-04 23:09:11 +03:00
onysd
ac6a50c5ff Merge remote-tracking branch 'upstream/main' into merge-gramsrv-9106877 2026-08-03 23:29:20 +03:00
iamxvbaba
656b01dba7 perf(rpc): sync eliminate upload preflight allocations 2026-08-03 17:33:49 +08:00
iamxvbaba
e70bb0f167 sync: # file upload improve 2026-08-03 17:33:49 +08:00
iamxvbaba
9041abd3d3 fix: sync correct collectible username projection 2026-08-02 19:32:18 +08:00
iamxvbaba
8356989e01 fix: sync streamline self username cache convergence 2026-08-02 19:32:18 +08:00
iamxvbaba
8bc1560c16 fix: sync drive TDLib username cache convergence 2026-08-02 19:32:17 +08:00
iamxvbaba
f67e87689c fix: sync refresh complete self profile on session ready 2026-08-02 19:32:17 +08:00
iamxvbaba
2512eab51d fix: sync harden auth, privacy, and PTS state 2026-08-02 14:12:04 +08:00
iamxvbaba
141f2f20c4 feat(loadtest): sync add real 500-session capacity harness 2026-08-02 12:05:00 +08:00
iamxvbaba
7e0f9d1e62 feat(stars): sync implement unified purchase flow 2026-08-02 01:51:03 +08:00
iamxvbaba
c854fc7b94 feat: sync implement Stars friend gift packages 2026-08-02 01:51:02 +08:00
iamxvbaba
3a123f38db fix(stars): sync filter transaction history by direction 2026-08-02 01:51:02 +08:00
iamxvbaba
94f3843d23 fix(appearance): sync close Android theme wallpaper fallback
Public projection of telesrv 2c8b7cb4c20692d00017bd84f68dd11d7915ec33 with neutral appearance seed naming. Covers gramsrv#29.
2026-08-01 15:22:31 +08:00
onysd
d7fd75e487 fixes for loading issues 2026-07-31 22:33:08 +03:00
iamxvbaba
c9371c6048 fix(messages): sync recognize configured app link entities 2026-08-01 00:12:02 +08:00
iamxvbaba
35d3908660 fix: sync harden star gift upgrade projections 2026-08-01 00:12:01 +08:00
onysd
84063d75fc better fix 2026-07-31 16:57:57 +03:00
iamxvbaba
ee74d941bb fix(rpc): sync preserve complete username projections 2026-07-31 20:42:25 +08:00
onysd
58ca71f0b7 fix for security bug 2026-07-31 15:29:04 +03:00
iamxvbaba
e756b0f9f9 fix(mtprotoedge): sync admit nested gzip RPC envelopes 2026-07-31 15:35:10 +08:00
iamxvbaba
0d917ef87e fix: sync Android default theme installs 2026-07-30 20:13:22 +08:00
iamxvbaba
80c36a8ab4 fix: sync authorize monoforum message views 2026-07-30 20:09:47 +08:00