Ctrl K
ComunidadGuías…

internal/domain/privacy.go

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
package domain

import "errors"

// PrivacyKey identifies a Telegram account privacy setting without exposing tg.*.
type PrivacyKey string

const (
	PrivacyKeyStatusTimestamp   PrivacyKey = "status_timestamp"
	PrivacyKeyChatInvite        PrivacyKey = "chat_invite"
	PrivacyKeyPhoneCall         PrivacyKey = "phone_call"
	PrivacyKeyPhoneP2P          PrivacyKey = "phone_p2p"
	PrivacyKeyForwards          PrivacyKey = "forwards"
	PrivacyKeyProfilePhoto      PrivacyKey = "profile_photo"
	PrivacyKeyPhoneNumber       PrivacyKey = "phone_number"
	PrivacyKeyAddedByPhone      PrivacyKey = "added_by_phone"
	PrivacyKeyVoiceMessages     PrivacyKey = "voice_messages"
	PrivacyKeyAbout             PrivacyKey = "about"
	PrivacyKeyBirthday          PrivacyKey = "birthday"
	PrivacyKeyStarGiftsAutoSave PrivacyKey = "star_gifts_auto_save"
	PrivacyKeyNoPaidMessages    PrivacyKey = "no_paid_messages"
	PrivacyKeySavedMusic        PrivacyKey = "saved_music"
)

// PrivacyRuleKind mirrors Layer 225 privacy rule constructors.
type PrivacyRuleKind string

const (
	PrivacyRuleAllowContacts            PrivacyRuleKind = "allow_contacts"
	PrivacyRuleAllowAll                 PrivacyRuleKind = "allow_all"
	PrivacyRuleAllowUsers               PrivacyRuleKind = "allow_users"
	PrivacyRuleDisallowContacts         PrivacyRuleKind = "disallow_contacts"
	PrivacyRuleDisallowAll              PrivacyRuleKind = "disallow_all"
	PrivacyRuleDisallowUsers            PrivacyRuleKind = "disallow_users"
	PrivacyRuleAllowChatParticipants    PrivacyRuleKind = "allow_chat_participants"
	PrivacyRuleDisallowChatParticipants PrivacyRuleKind = "disallow_chat_participants"
	PrivacyRuleAllowCloseFriends        PrivacyRuleKind = "allow_close_friends"
	PrivacyRuleAllowPremium             PrivacyRuleKind = "allow_premium"
	PrivacyRuleAllowBots                PrivacyRuleKind = "allow_bots"
	PrivacyRuleDisallowBots             PrivacyRuleKind = "disallow_bots"
)

// PrivacyRule is a protocol-neutral privacy rule.
type PrivacyRule struct {
	Kind    PrivacyRuleKind `json:"kind"`
	UserIDs []int64         `json:"user_ids,omitempty"`
	ChatIDs []int64         `json:"chat_ids,omitempty"`
}

// PrivacyRules is one owner/key rule set.
type PrivacyRules struct {
	OwnerUserID int64         `json:"owner_user_id,omitempty"`
	Key         PrivacyKey    `json:"key"`
	Rules       []PrivacyRule `json:"rules"`
}

// PrivacyContext describes viewer facts needed for privacy evaluation.
type PrivacyContext struct {
	OwnerUserID       int64
	ViewerUserID      int64
	ViewerIsContact   bool
	ViewerIsBot       bool
	ViewerIsPremium   bool
	ViewerCloseFriend bool
	SharedChatIDs     []int64
}

var (
	ErrPrivacyKeyInvalid  = errors.New("privacy key invalid")
	ErrPrivacyRuleInvalid = errors.New("privacy rule invalid")
)

// DefaultPrivacyRules returns Telegram-like defaults used when no user setting exists.
func DefaultPrivacyRules(key PrivacyKey) []PrivacyRule {
	switch key {
	case PrivacyKeyPhoneNumber:
		return []PrivacyRule{{Kind: PrivacyRuleDisallowAll}}
	case PrivacyKeyNoPaidMessages:
		// This key is an allow-list of peers exempt from paid private
		// messages, not the base visibility of a profile field.
		return []PrivacyRule{{Kind: PrivacyRuleDisallowAll}}
	case PrivacyKeyBirthday:
		return []PrivacyRule{{Kind: PrivacyRuleAllowContacts}}
	case PrivacyKeyChatInvite:
		// By default only contacts may add the account to groups/channels, preventing strangers from adding it arbitrarily.
		return []PrivacyRule{{Kind: PrivacyRuleAllowContacts}}
	case PrivacyKeyPhoneP2P:
		// Safe default: a P2P call exposes both parties' real IPs, so by default only contacts connect directly,
		// and everything else falls back to the TURN relay (consistent with the rpc layer's mutual-contact hard gate).
		return []PrivacyRule{{Kind: PrivacyRuleAllowContacts}}
	default:
		return []PrivacyRule{{Kind: PrivacyRuleAllowAll}}
	}
}