7a04f298d2
- update to latest telegram layer - remove some references to fields in tg.Entities that don't exist in the schema - originally added here: https://github.com/beeper/td/commit/820929062a2ba0104397bc01235ab58a9cff780e - referenced here - https://github.com/mautrix/telegramgo/commit/124f0967ed195b5a380c9bd02e170ada9710dde3 - https://github.com/mautrix/telegramgo/commit/4205047aab2e0639217148b5d125bfaab668bd8e
85 lines
1.7 KiB
Go
85 lines
1.7 KiB
Go
package mtproxy
|
|
|
|
import (
|
|
"github.com/go-faster/errors"
|
|
|
|
"go.mau.fi/mautrix-telegram/pkg/gotd/proto/codec"
|
|
)
|
|
|
|
// SecretType represents MTProxy secret type.
|
|
type SecretType int
|
|
|
|
const (
|
|
// Simple is a basic MTProxy secret.
|
|
Simple SecretType = iota + 1
|
|
// Secured is dd-secret.
|
|
Secured
|
|
// TLS is fakeTLS MTProxy secret.
|
|
// First byte should be ee.
|
|
TLS
|
|
)
|
|
|
|
// Secret represents MTProxy secret.
|
|
type Secret struct {
|
|
Secret []byte
|
|
Tag byte
|
|
CloakHost string
|
|
Type SecretType
|
|
}
|
|
|
|
// ExpectedCodec returns codec from secret tag if it exists.
|
|
func (s Secret) ExpectedCodec() (cdc codec.Codec, _ bool) {
|
|
switch s.Tag {
|
|
case codec.AbridgedClientStart[0]:
|
|
cdc = codec.Abridged{}
|
|
case codec.IntermediateClientStart[0]:
|
|
cdc = codec.Intermediate{}
|
|
case codec.PaddedIntermediateClientStart[0]:
|
|
cdc = codec.PaddedIntermediate{}
|
|
default:
|
|
return nil, false
|
|
}
|
|
|
|
return cdc, true
|
|
}
|
|
|
|
// ParseSecret checks and parses secret.
|
|
func ParseSecret(secret []byte) (Secret, error) {
|
|
r := Secret{
|
|
Secret: secret,
|
|
}
|
|
const simpleLength = 16
|
|
|
|
switch {
|
|
case len(secret) == 1+simpleLength:
|
|
r.Type = Secured
|
|
|
|
r.Tag = secret[0]
|
|
secret = secret[1:]
|
|
r.Secret = secret[:simpleLength]
|
|
case len(secret) > simpleLength:
|
|
r.Type = TLS
|
|
|
|
r.Tag = secret[0]
|
|
secret = secret[1:]
|
|
r.Secret = secret[:simpleLength]
|
|
r.CloakHost = string(secret[simpleLength:])
|
|
case len(secret) == simpleLength:
|
|
r.Type = Simple
|
|
default:
|
|
return Secret{}, errors.Errorf("invalid secret %q", string(secret))
|
|
}
|
|
|
|
if r.Type != Simple {
|
|
switch r.Tag {
|
|
case codec.AbridgedClientStart[0],
|
|
codec.IntermediateClientStart[0],
|
|
codec.PaddedIntermediateClientStart[0]:
|
|
default:
|
|
return Secret{}, errors.Errorf("unknown tag %+x", r.Tag)
|
|
}
|
|
}
|
|
|
|
return r, nil
|
|
}
|