Skip to content

Commit 7a6b0c6

Browse files
committed
Add email authentication phase
1 parent 8338b52 commit 7a6b0c6

8 files changed

Lines changed: 273 additions & 35 deletions
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package it.tdlight.client;
2+
3+
import it.tdlight.ExceptionHandler;
4+
import it.tdlight.TelegramClient;
5+
import it.tdlight.jni.TdApi;
6+
import it.tdlight.jni.TdApi.AuthorizationStateWaitEmailAddress;
7+
import it.tdlight.jni.TdApi.CheckAuthenticationCode;
8+
import it.tdlight.jni.TdApi.CheckAuthenticationEmailCode;
9+
import it.tdlight.jni.TdApi.SetAuthenticationEmailAddress;
10+
import it.tdlight.jni.TdApi.UpdateAuthorizationState;
11+
12+
final class AuthorizationStateWaitEmailAddressHandler implements GenericUpdateHandler<UpdateAuthorizationState> {
13+
14+
private final TelegramClient client;
15+
private final ClientInteraction clientInteraction;
16+
private final ExceptionHandler exceptionHandler;
17+
18+
public AuthorizationStateWaitEmailAddressHandler(TelegramClient client,
19+
ClientInteraction clientInteraction,
20+
ExceptionHandler exceptionHandler) {
21+
this.client = client;
22+
this.clientInteraction = clientInteraction;
23+
this.exceptionHandler = exceptionHandler;
24+
}
25+
26+
@Override
27+
public void onUpdate(UpdateAuthorizationState update) {
28+
if (update.authorizationState.getConstructor() == AuthorizationStateWaitEmailAddress.CONSTRUCTOR) {
29+
AuthorizationStateWaitEmailAddress authorizationState = (AuthorizationStateWaitEmailAddress) update.authorizationState;
30+
ParameterInfo parameterInfo = new ParameterInfoEmailAddress(authorizationState.allowAppleId, authorizationState.allowGoogleId);
31+
clientInteraction.onParameterRequest(InputParameter.ASK_EMAIL_ADDRESS, parameterInfo).whenComplete((emailAddress, ex) -> {
32+
if (ex != null) {
33+
exceptionHandler.onException(ex);
34+
return;
35+
}
36+
sendEmailAddress(emailAddress);
37+
});
38+
}
39+
}
40+
41+
private void sendEmailAddress(String emailAddress) {
42+
SetAuthenticationEmailAddress response = new SetAuthenticationEmailAddress(emailAddress);
43+
client.send(response, ok -> {
44+
if (ok.getConstructor() == TdApi.Error.CONSTRUCTOR) {
45+
throw new TelegramError((TdApi.Error) ok);
46+
}
47+
}, exceptionHandler);
48+
}
49+
}
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package it.tdlight.client;
2+
3+
import it.tdlight.ExceptionHandler;
4+
import it.tdlight.TelegramClient;
5+
import it.tdlight.jni.TdApi;
6+
import java.util.Locale;
7+
8+
final class AuthorizationStateWaitEmailCodeHandler implements GenericUpdateHandler<TdApi.UpdateAuthorizationState> {
9+
10+
private final TelegramClient client;
11+
private final ClientInteraction clientInteraction;
12+
private final ExceptionHandler exceptionHandler;
13+
14+
public AuthorizationStateWaitEmailCodeHandler(TelegramClient client,
15+
ClientInteraction clientInteraction,
16+
ExceptionHandler exceptionHandler) {
17+
this.client = client;
18+
this.clientInteraction = clientInteraction;
19+
this.exceptionHandler = exceptionHandler;
20+
}
21+
22+
@Override
23+
public void onUpdate(TdApi.UpdateAuthorizationState update) {
24+
if (update.authorizationState.getConstructor() == TdApi.AuthorizationStateWaitEmailCode.CONSTRUCTOR) {
25+
TdApi.AuthorizationStateWaitEmailCode authorizationState = (TdApi.AuthorizationStateWaitEmailCode) update.authorizationState;
26+
ParameterInfo parameterInfo = new ParameterInfoEmailCode(authorizationState.allowAppleId,
27+
authorizationState.allowGoogleId,
28+
authorizationState.codeInfo.emailAddressPattern,
29+
authorizationState.codeInfo.length,
30+
EmailAddressResetState.valueOf(authorizationState.emailAddressResetState.getClass().getSimpleName().substring("EmailAddressResetState".length()).toUpperCase(Locale.ROOT))
31+
);
32+
clientInteraction.onParameterRequest(InputParameter.ASK_EMAIL_CODE, parameterInfo).whenComplete((emailAddress, ex) -> {
33+
if (ex != null) {
34+
exceptionHandler.onException(ex);
35+
return;
36+
}
37+
sendEmailCode(emailAddress);
38+
});
39+
}
40+
}
41+
42+
private void sendEmailCode(String code) {
43+
TdApi.CheckAuthenticationEmailCode response = new TdApi.CheckAuthenticationEmailCode(new TdApi.EmailAddressAuthenticationCode(code));
44+
client.send(response, ok -> {
45+
if (ok.getConstructor() == TdApi.Error.CONSTRUCTOR) {
46+
throw new TelegramError((TdApi.Error) ok);
47+
}
48+
}, exceptionHandler);
49+
}
50+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package it.tdlight.client;
2+
3+
public enum EmailAddressResetState {
4+
AVAILABLE,
5+
PENDING
6+
}
Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,12 @@
11
package it.tdlight.client;
22

33
public enum InputParameter {
4-
ASK_FIRST_NAME, ASK_LAST_NAME, ASK_CODE, ASK_PASSWORD, NOTIFY_LINK, TERMS_OF_SERVICE
4+
ASK_FIRST_NAME,
5+
ASK_LAST_NAME,
6+
ASK_CODE,
7+
ASK_PASSWORD,
8+
NOTIFY_LINK,
9+
TERMS_OF_SERVICE,
10+
ASK_EMAIL_ADDRESS,
11+
ASK_EMAIL_CODE
512
}
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package it.tdlight.client;
2+
3+
import it.tdlight.jni.TdApi.AuthenticationCodeType;
4+
import java.util.Objects;
5+
import java.util.StringJoiner;
6+
7+
public final class ParameterInfoEmailAddress implements ParameterInfo {
8+
9+
private final boolean allowGoogleId;
10+
private final boolean allowAppleId;
11+
12+
public ParameterInfoEmailAddress(boolean allowGoogleId,
13+
boolean allowAppleId) {
14+
this.allowGoogleId = allowGoogleId;
15+
this.allowAppleId = allowAppleId;
16+
}
17+
18+
public boolean isAllowGoogleId() {
19+
return allowGoogleId;
20+
}
21+
22+
public boolean isAllowAppleId() {
23+
return allowAppleId;
24+
}
25+
26+
@Override
27+
public boolean equals(Object o) {
28+
if (this == o) {
29+
return true;
30+
}
31+
if (o == null || getClass() != o.getClass()) {
32+
return false;
33+
}
34+
ParameterInfoEmailAddress that = (ParameterInfoEmailAddress) o;
35+
return allowGoogleId == that.allowGoogleId && allowAppleId == that.allowAppleId;
36+
}
37+
38+
@Override
39+
public int hashCode() {
40+
return Objects.hash(allowGoogleId, allowAppleId);
41+
}
42+
43+
@Override
44+
public String toString() {
45+
return new StringJoiner(", ", ParameterInfoEmailAddress.class.getSimpleName() + "[", "]")
46+
.add("allowGoogleId='" + allowGoogleId + "'")
47+
.add("allowAppleId=" + allowAppleId)
48+
.toString();
49+
}
50+
}
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
package it.tdlight.client;
2+
3+
import it.tdlight.jni.TdApi.EmailAddressAuthenticationCodeInfo;
4+
import it.tdlight.jni.TdApi.EmailAddressResetStateAvailable;
5+
import it.tdlight.jni.TdApi.EmailAddressResetStatePending;
6+
import java.util.Objects;
7+
import java.util.StringJoiner;
8+
9+
public final class ParameterInfoEmailCode implements ParameterInfo {
10+
11+
private final boolean allowGoogleId;
12+
private final boolean allowAppleId;
13+
private final String emailAddressPattern;
14+
private final int emailLength;
15+
private final EmailAddressResetState emailAddressResetState;
16+
17+
public ParameterInfoEmailCode(boolean allowGoogleId,
18+
boolean allowAppleId,
19+
String emailAddressPattern,
20+
int emailLength,
21+
EmailAddressResetState emailAddressResetState) {
22+
this.allowGoogleId = allowGoogleId;
23+
this.allowAppleId = allowAppleId;
24+
this.emailAddressPattern = emailAddressPattern;
25+
this.emailLength = emailLength;
26+
this.emailAddressResetState = emailAddressResetState;
27+
}
28+
29+
public boolean isAllowGoogleId() {
30+
return allowGoogleId;
31+
}
32+
33+
public boolean isAllowAppleId() {
34+
return allowAppleId;
35+
}
36+
37+
public String getEmailAddressPattern() {
38+
return emailAddressPattern;
39+
}
40+
41+
public int getEmailLength() {
42+
return emailLength;
43+
}
44+
45+
public EmailAddressResetState getEmailAddressResetState() {
46+
return emailAddressResetState;
47+
}
48+
49+
@Override
50+
public boolean equals(Object o) {
51+
if (this == o) {
52+
return true;
53+
}
54+
if (o == null || getClass() != o.getClass()) {
55+
return false;
56+
}
57+
ParameterInfoEmailCode that = (ParameterInfoEmailCode) o;
58+
return allowGoogleId == that.allowGoogleId && allowAppleId == that.allowAppleId && emailLength == that.emailLength
59+
&& Objects.equals(emailAddressPattern, that.emailAddressPattern)
60+
&& emailAddressResetState == that.emailAddressResetState;
61+
}
62+
63+
@Override
64+
public int hashCode() {
65+
return Objects.hash(allowGoogleId, allowAppleId, emailAddressPattern, emailLength, emailAddressResetState);
66+
}
67+
68+
@Override
69+
public String toString() {
70+
return new StringJoiner(", ", ParameterInfoEmailCode.class.getSimpleName() + "[", "]")
71+
.add("allowGoogleId=" + allowGoogleId)
72+
.add("allowAppleId=" + allowAppleId)
73+
.add("emailAddressPattern='" + emailAddressPattern + "'")
74+
.add("emailLength=" + emailLength)
75+
.add("emailAddressResetState=" + emailAddressResetState)
76+
.toString();
77+
}
78+
}

tdlight-java/src/main/java/it/tdlight/client/SimpleTelegramClient.java

Lines changed: 26 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -92,30 +92,33 @@ public final class SimpleTelegramClient implements Authenticable, MutableTelegra
9292
this.addUpdateHandler(TdApi.UpdateAuthorizationState.class,
9393
new AuthorizationStateWaitAuthenticationDataHandler(client, this, this::handleDefaultException)
9494
);
95-
this.addUpdateHandler(TdApi.UpdateAuthorizationState.class,
96-
new AuthorizationStateWaitRegistrationHandler(client,
97-
new SimpleTelegramClientInteraction(),
98-
this::handleDefaultException
99-
)
100-
);
101-
this.addUpdateHandler(TdApi.UpdateAuthorizationState.class,
102-
new AuthorizationStateWaitPasswordHandler(client,
103-
new SimpleTelegramClientInteraction(),
104-
this::handleDefaultException
105-
)
106-
);
107-
this.addUpdateHandler(TdApi.UpdateAuthorizationState.class,
108-
new AuthorizationStateWaitOtherDeviceConfirmationHandler(new SimpleTelegramClientInteraction(),
109-
this::handleDefaultException
110-
)
111-
);
112-
this.addUpdateHandler(TdApi.UpdateAuthorizationState.class,
113-
new AuthorizationStateWaitCodeHandler(client,
114-
new SimpleTelegramClientInteraction(),
115-
getTestCode(authenticationData),
95+
var updateHandlerInteraction = new SimpleTelegramClientInteraction();
96+
this.addUpdateHandler(TdApi.UpdateAuthorizationState.class, new AuthorizationStateWaitRegistrationHandler(client,
97+
updateHandlerInteraction,
98+
this::handleDefaultException
99+
));
100+
this.addUpdateHandler(TdApi.UpdateAuthorizationState.class, new AuthorizationStateWaitPasswordHandler(client,
101+
updateHandlerInteraction,
102+
this::handleDefaultException
103+
));
104+
this.addUpdateHandler(
105+
TdApi.UpdateAuthorizationState.class, new AuthorizationStateWaitOtherDeviceConfirmationHandler(
106+
updateHandlerInteraction,
116107
this::handleDefaultException
117-
)
118-
);
108+
));
109+
this.addUpdateHandler(TdApi.UpdateAuthorizationState.class, new AuthorizationStateWaitCodeHandler(client,
110+
updateHandlerInteraction,
111+
getTestCode(authenticationData),
112+
this::handleDefaultException
113+
));
114+
this.addUpdateHandler(TdApi.UpdateAuthorizationState.class, new AuthorizationStateWaitEmailAddressHandler(client,
115+
updateHandlerInteraction,
116+
this::handleDefaultException
117+
));
118+
this.addUpdateHandler(TdApi.UpdateAuthorizationState.class, new AuthorizationStateWaitEmailCodeHandler(client,
119+
updateHandlerInteraction,
120+
this::handleDefaultException
121+
));
119122
this.addUpdateHandler(TdApi.UpdateAuthorizationState.class, new AuthorizationStateWaitReady(this::onReady));
120123
this.addUpdateHandler(TdApi.UpdateAuthorizationState.class, new AuthorizationStateWaitForExit(this::onCloseUpdate));
121124
this.mainChatsLoader = new AuthorizationStateReadyLoadChats(client, new ChatListMain());
@@ -353,7 +356,6 @@ public <R extends TdApi.Object> void sendUnsafe(TdApi.Function<R> function, Gene
353356
* @param function The request to TDLib.
354357
* @throws NullPointerException if function is null.
355358
*/
356-
@SuppressWarnings("unchecked")
357359
public <R extends TdApi.Object> CompletableFuture<R> send(TdApi.Function<R> function) {
358360
CompletableFuture<Void> future = new CompletableFuture<>();
359361
if (shouldWaitForReadiness(function)) {

tdlight-java/src/main/java/it/tdlight/client/TemporaryMessageHandler.java

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,6 @@
11
package it.tdlight.client;
22

33
import it.tdlight.jni.TdApi;
4-
import it.tdlight.jni.TdApi.Message;
5-
import it.tdlight.jni.TdApi.Update;
6-
import it.tdlight.jni.TdApi.UpdateMessageSendFailed;
7-
import it.tdlight.jni.TdApi.UpdateMessageSendSucceeded;
84
import org.slf4j.Logger;
95
import org.slf4j.LoggerFactory;
106
import java.util.concurrent.CompletableFuture;
@@ -14,14 +10,14 @@ class TemporaryMessageHandler implements GenericUpdateHandler<TdApi.Update> {
1410

1511
private static final Logger LOG = LoggerFactory.getLogger(TemporaryMessageHandler.class);
1612

17-
private final ConcurrentMap<TemporaryMessageURL, CompletableFuture<Message>> temporaryMessages;
13+
private final ConcurrentMap<TemporaryMessageURL, CompletableFuture<TdApi.Message>> temporaryMessages;
1814

19-
public TemporaryMessageHandler(ConcurrentMap<TemporaryMessageURL, CompletableFuture<Message>> temporaryMessages) {
15+
public TemporaryMessageHandler(ConcurrentMap<TemporaryMessageURL, CompletableFuture<TdApi.Message>> temporaryMessages) {
2016
this.temporaryMessages = temporaryMessages;
2117
}
2218

2319
@Override
24-
public void onUpdate(Update update) {
20+
public void onUpdate(TdApi.Update update) {
2521
switch (update.getConstructor()) {
2622
case TdApi.UpdateMessageSendSucceeded.CONSTRUCTOR: onUpdateSuccess(((TdApi.UpdateMessageSendSucceeded) update));
2723
break;
@@ -30,7 +26,7 @@ public void onUpdate(Update update) {
3026
}
3127
}
3228

33-
private void onUpdateSuccess(UpdateMessageSendSucceeded updateMessageSendSucceeded) {
29+
private void onUpdateSuccess(TdApi.UpdateMessageSendSucceeded updateMessageSendSucceeded) {
3430
TemporaryMessageURL tempUrl
3531
= new TemporaryMessageURL(updateMessageSendSucceeded.message.chatId, updateMessageSendSucceeded.oldMessageId);
3632
CompletableFuture<TdApi.Message> future = temporaryMessages.remove(tempUrl);
@@ -41,14 +37,14 @@ private void onUpdateSuccess(UpdateMessageSendSucceeded updateMessageSendSucceed
4137
}
4238
}
4339

44-
private void onUpdateFailed(UpdateMessageSendFailed updateMessageSendFailed) {
40+
private void onUpdateFailed(TdApi.UpdateMessageSendFailed updateMessageSendFailed) {
4541
TemporaryMessageURL tempUrl
4642
= new TemporaryMessageURL(updateMessageSendFailed.message.chatId, updateMessageSendFailed.oldMessageId);
4743
CompletableFuture<TdApi.Message> future = temporaryMessages.remove(tempUrl);
4844
if (future == null) {
4945
logNotHandled(tempUrl);
5046
} else {
51-
TdApi.Error error = new TdApi.Error(updateMessageSendFailed.errorCode, updateMessageSendFailed.errorMessage);
47+
TdApi.Error error = updateMessageSendFailed.error;
5248
future.completeExceptionally(new TelegramError(error));
5349
}
5450
}

0 commit comments

Comments
 (0)