/
auth.sendCodeLayer51_handler.go
executable file
·160 lines (142 loc) · 6.37 KB
/
auth.sendCodeLayer51_handler.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
/*
* Copyright (c) 2018, https://github.com/airwide-code/airwide.datacenter
* All rights reserved.
*
*
*
*/
package rpc
import (
"github.com/golang/glog"
"github.com/airwide-code/airwide.datacenter/baselib/logger"
"github.com/airwide-code/airwide.datacenter/baselib/grpc_util"
"github.com/airwide-code/airwide.datacenter/mtproto"
"golang.org/x/net/context"
"github.com/airwide-code/airwide.datacenter/biz/base"
"github.com/airwide-code/airwide.datacenter/biz/core/auth"
)
/*
Android client auth.sendCode#86aef0ec, handler error
1.
if (error->error_code == 303) {
uint32_t migrateToDatacenterId = DEFAULT_DATACENTER_ID;
static std::vector<std::string> migrateErrors;
if (migrateErrors.empty()) {
migrateErrors.push_back("NETWORK_MIGRATE_");
migrateErrors.push_back("PHONE_MIGRATE_");
migrateErrors.push_back("USER_MIGRATE_");
}
size_t count = migrateErrors.size();
for (uint32_t a = 0; a < count; a++) {
std::string &possibleError = migrateErrors[a];
if (error->error_message.find(possibleError) != std::string::npos) {
std::string num = error->error_message.substr(possibleError.size(), error->error_message.size() - possibleError.size());
uint32_t val = (uint32_t) atoi(num.c_str());
migrateToDatacenterId = val;
}
}
if (migrateToDatacenterId != DEFAULT_DATACENTER_ID) {
ignoreResult = true;
moveToDatacenter(migrateToDatacenterId);
}
}
2.
if (error.text != null) {
if (error.text.contains("PHONE_NUMBER_INVALID")) {
needShowInvalidAlert(req.phone_number, false);
} else if (error.text.contains("PHONE_NUMBER_FLOOD")) {
needShowAlert(LocaleController.getString("AppName", R.string.AppName), LocaleController.getString("PhoneNumberFlood", R.string.PhoneNumberFlood));
} else if (error.text.contains("PHONE_NUMBER_BANNED")) {
needShowInvalidAlert(req.phone_number, true);
} else if (error.text.contains("PHONE_CODE_EMPTY") || error.text.contains("PHONE_CODE_INVALID")) {
needShowAlert(LocaleController.getString("AppName", R.string.AppName), LocaleController.getString("InvalidCode", R.string.InvalidCode));
} else if (error.text.contains("PHONE_CODE_EXPIRED")) {
needShowAlert(LocaleController.getString("AppName", R.string.AppName), LocaleController.getString("CodeExpired", R.string.CodeExpired));
} else if (error.text.startsWith("FLOOD_WAIT")) {
needShowAlert(LocaleController.getString("AppName", R.string.AppName), LocaleController.getString("FloodWait", R.string.FloodWait));
} else if (error.code != -1000) {
needShowAlert(LocaleController.getString("AppName", R.string.AppName), error.text);
}
}
*/
// auth.sendCode#ccfd70cf flags:# allow_flashcall:flags.0?true phone_number:string current_number:flags.0?Bool api_id:int api_hash:string lang_code:string = auth.SentCode;
func (s *AuthServiceImpl) AuthSendCodeLayer51(ctx context.Context, request *mtproto.TLAuthSendCodeLayer51) (*mtproto.Auth_SentCode, error) {
md := grpc_util.RpcMetadataFromIncoming(ctx)
glog.Infof("auth.sendCode#ccfd70cf - metadata: %s, request: %s", logger.JsonDebugData(md), logger.JsonDebugData(request))
// TODO(@benqi): 接入telegram网络首先必须申请api_id和api_hash,验证api_id和api_hash是否合法
// 1. check api_id and api_hash
//// 3. check number
//// 客户端发送的手机号格式为: "+86 111 1111 1111",归一化
phoneNumber, err := base.CheckAndGetPhoneNumber(request.GetPhoneNumber())
if err != nil {
// PHONE_NUMBER_INVALID
glog.Error(err)
return nil, err
}
// 2. check allow_flashcall and current_number
// CurrentNumber: 是否为本机电话号码
// if allow_flashcall is true then current_number is true
var currentNumber bool
if request.GetCurrentNumber() == nil {
currentNumber = false
} else {
currentNumber = mtproto.FromBool(request.GetCurrentNumber())
}
//if !currentNumber && request.GetAllowFlashcall() {
// err = mtproto.NewRpcError(int32(mtproto.TLRpcErrorCodes_BAD_REQUEST), "auth.sendCode#86aef0ec: current_number is true but allow_flashcall is false.")
// glog.Error(err)
// return nil, err
//}
// TODO(@benqi): PHONE_NUMBER_FLOOD
// <string name="PhoneNumberFlood">Sorry, you have deleted and re-created your account too many times recently.
// Please wait for a few days before signing up again.</string>
//
// glog.Info("phoneNumber: ", phoneNumber)
// PHONE_NUMBER_BANNED: Banned phone number
banned := auth.CheckBannedByPhoneNumber(phoneNumber)
if banned {
err = mtproto.NewRpcError(int32(mtproto.TLRpcErrorCodes_PHONE_NUMBER_BANNED), "auth.sendCode#86aef0ec: phone number banned.")
glog.Error(err)
return nil, err
}
// TODO(@benqi): MIGRATE datacenter
// android client:
// migrateErrors.push_back("NETWORK_MIGRATE_");
// migrateErrors.push_back("PHONE_MIGRATE_");
// migrateErrors.push_back("USER_MIGRATE_");
//
// https://core.telegram.org/api/datacenter
// The auth.sendCode method is the basic entry point when registering a new user or authorizing an existing user.
// 95% of all redirection cases to a different DC will occure when invoking this method.
//
// The client does not yet know which DC it will be associated with; therefore,
// it establishes an encrypted connection to a random address and sends its query to that address.
// Having received a phone_number from a client,
// we can find out whether or not it is registered in the system.
// If it is, then, if necessary, instead of sending a text message,
// we request that it establish a connection with a different DC first (PHONE_MIGRATE_X error).
// If we do not yet have a user with this number, we examine its IP-address.
// We can use it to identify the closest DC.
// Again, if necessary, we redirect the user to a different DC (NETWORK_MIGRATE_X error).
//
//if userDO == nil {
// // phone registered
// // TODO(@benqi): 由phoneNumber和ip优选
//} else {
// // TODO(@benqi): 由userId优选
//}
code := auth.MakeCodeData(md.AuthId, phoneNumber)
// 检查phoneNumber是否异常
// TODO(@benqi): 定义sendCode限制规则
// PhoneNumberFlood
// FLOOD_WAIT
phoneRegistered := auth.CheckPhoneNumberExist(phoneNumber)
err = code.DoSendCode(phoneRegistered, request.AllowFlashcall, currentNumber, request.ApiId, request.ApiHash)
if err != nil {
glog.Error(err)
return nil, err
}
authSentCode := code.ToAuthSentCode(phoneRegistered)
glog.Infof("auth.sendCode#ccfd70cf - reply: %s", logger.JsonDebugData(authSentCode))
return authSentCode.To_Auth_SentCode(), nil
}