move gotd fork into repo. (#111)
- 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
This commit is contained in:
@@ -0,0 +1,84 @@
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user