Skip to content

Commit

Permalink
Add email authentication phase
Browse files Browse the repository at this point in the history
  • Loading branch information
cavallium committed Nov 5, 2023
1 parent 8338b52 commit 7a6b0c6
Show file tree
Hide file tree
Showing 8 changed files with 273 additions and 35 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
package it.tdlight.client;

import it.tdlight.ExceptionHandler;
import it.tdlight.TelegramClient;
import it.tdlight.jni.TdApi;
import it.tdlight.jni.TdApi.AuthorizationStateWaitEmailAddress;
import it.tdlight.jni.TdApi.CheckAuthenticationCode;
import it.tdlight.jni.TdApi.CheckAuthenticationEmailCode;
import it.tdlight.jni.TdApi.SetAuthenticationEmailAddress;
import it.tdlight.jni.TdApi.UpdateAuthorizationState;

final class AuthorizationStateWaitEmailAddressHandler implements GenericUpdateHandler<UpdateAuthorizationState> {

private final TelegramClient client;
private final ClientInteraction clientInteraction;
private final ExceptionHandler exceptionHandler;

public AuthorizationStateWaitEmailAddressHandler(TelegramClient client,
ClientInteraction clientInteraction,
ExceptionHandler exceptionHandler) {
this.client = client;
this.clientInteraction = clientInteraction;
this.exceptionHandler = exceptionHandler;
}

@Override
public void onUpdate(UpdateAuthorizationState update) {
if (update.authorizationState.getConstructor() == AuthorizationStateWaitEmailAddress.CONSTRUCTOR) {
AuthorizationStateWaitEmailAddress authorizationState = (AuthorizationStateWaitEmailAddress) update.authorizationState;
ParameterInfo parameterInfo = new ParameterInfoEmailAddress(authorizationState.allowAppleId, authorizationState.allowGoogleId);
clientInteraction.onParameterRequest(InputParameter.ASK_EMAIL_ADDRESS, parameterInfo).whenComplete((emailAddress, ex) -> {
if (ex != null) {
exceptionHandler.onException(ex);
return;
}
sendEmailAddress(emailAddress);
});
}
}

private void sendEmailAddress(String emailAddress) {
SetAuthenticationEmailAddress response = new SetAuthenticationEmailAddress(emailAddress);
client.send(response, ok -> {
if (ok.getConstructor() == TdApi.Error.CONSTRUCTOR) {
throw new TelegramError((TdApi.Error) ok);
}
}, exceptionHandler);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
package it.tdlight.client;

import it.tdlight.ExceptionHandler;
import it.tdlight.TelegramClient;
import it.tdlight.jni.TdApi;
import java.util.Locale;

final class AuthorizationStateWaitEmailCodeHandler implements GenericUpdateHandler<TdApi.UpdateAuthorizationState> {

private final TelegramClient client;
private final ClientInteraction clientInteraction;
private final ExceptionHandler exceptionHandler;

public AuthorizationStateWaitEmailCodeHandler(TelegramClient client,
ClientInteraction clientInteraction,
ExceptionHandler exceptionHandler) {
this.client = client;
this.clientInteraction = clientInteraction;
this.exceptionHandler = exceptionHandler;
}

@Override
public void onUpdate(TdApi.UpdateAuthorizationState update) {
if (update.authorizationState.getConstructor() == TdApi.AuthorizationStateWaitEmailCode.CONSTRUCTOR) {
TdApi.AuthorizationStateWaitEmailCode authorizationState = (TdApi.AuthorizationStateWaitEmailCode) update.authorizationState;
ParameterInfo parameterInfo = new ParameterInfoEmailCode(authorizationState.allowAppleId,
authorizationState.allowGoogleId,
authorizationState.codeInfo.emailAddressPattern,
authorizationState.codeInfo.length,
EmailAddressResetState.valueOf(authorizationState.emailAddressResetState.getClass().getSimpleName().substring("EmailAddressResetState".length()).toUpperCase(Locale.ROOT))
);
clientInteraction.onParameterRequest(InputParameter.ASK_EMAIL_CODE, parameterInfo).whenComplete((emailAddress, ex) -> {
if (ex != null) {
exceptionHandler.onException(ex);
return;
}
sendEmailCode(emailAddress);
});
}
}

private void sendEmailCode(String code) {
TdApi.CheckAuthenticationEmailCode response = new TdApi.CheckAuthenticationEmailCode(new TdApi.EmailAddressAuthenticationCode(code));
client.send(response, ok -> {
if (ok.getConstructor() == TdApi.Error.CONSTRUCTOR) {
throw new TelegramError((TdApi.Error) ok);
}
}, exceptionHandler);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package it.tdlight.client;

public enum EmailAddressResetState {
AVAILABLE,
PENDING
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,12 @@
package it.tdlight.client;

public enum InputParameter {
ASK_FIRST_NAME, ASK_LAST_NAME, ASK_CODE, ASK_PASSWORD, NOTIFY_LINK, TERMS_OF_SERVICE
ASK_FIRST_NAME,
ASK_LAST_NAME,
ASK_CODE,
ASK_PASSWORD,
NOTIFY_LINK,
TERMS_OF_SERVICE,
ASK_EMAIL_ADDRESS,
ASK_EMAIL_CODE
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
package it.tdlight.client;

import it.tdlight.jni.TdApi.AuthenticationCodeType;
import java.util.Objects;
import java.util.StringJoiner;

public final class ParameterInfoEmailAddress implements ParameterInfo {

private final boolean allowGoogleId;
private final boolean allowAppleId;

public ParameterInfoEmailAddress(boolean allowGoogleId,
boolean allowAppleId) {
this.allowGoogleId = allowGoogleId;
this.allowAppleId = allowAppleId;
}

public boolean isAllowGoogleId() {
return allowGoogleId;
}

public boolean isAllowAppleId() {
return allowAppleId;
}

@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
ParameterInfoEmailAddress that = (ParameterInfoEmailAddress) o;
return allowGoogleId == that.allowGoogleId && allowAppleId == that.allowAppleId;
}

@Override
public int hashCode() {
return Objects.hash(allowGoogleId, allowAppleId);
}

@Override
public String toString() {
return new StringJoiner(", ", ParameterInfoEmailAddress.class.getSimpleName() + "[", "]")
.add("allowGoogleId='" + allowGoogleId + "'")
.add("allowAppleId=" + allowAppleId)
.toString();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
package it.tdlight.client;

import it.tdlight.jni.TdApi.EmailAddressAuthenticationCodeInfo;
import it.tdlight.jni.TdApi.EmailAddressResetStateAvailable;
import it.tdlight.jni.TdApi.EmailAddressResetStatePending;
import java.util.Objects;
import java.util.StringJoiner;

public final class ParameterInfoEmailCode implements ParameterInfo {

private final boolean allowGoogleId;
private final boolean allowAppleId;
private final String emailAddressPattern;
private final int emailLength;
private final EmailAddressResetState emailAddressResetState;

public ParameterInfoEmailCode(boolean allowGoogleId,
boolean allowAppleId,
String emailAddressPattern,
int emailLength,
EmailAddressResetState emailAddressResetState) {
this.allowGoogleId = allowGoogleId;
this.allowAppleId = allowAppleId;
this.emailAddressPattern = emailAddressPattern;
this.emailLength = emailLength;
this.emailAddressResetState = emailAddressResetState;
}

public boolean isAllowGoogleId() {
return allowGoogleId;
}

public boolean isAllowAppleId() {
return allowAppleId;
}

public String getEmailAddressPattern() {
return emailAddressPattern;
}

public int getEmailLength() {
return emailLength;
}

public EmailAddressResetState getEmailAddressResetState() {
return emailAddressResetState;
}

@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
ParameterInfoEmailCode that = (ParameterInfoEmailCode) o;
return allowGoogleId == that.allowGoogleId && allowAppleId == that.allowAppleId && emailLength == that.emailLength
&& Objects.equals(emailAddressPattern, that.emailAddressPattern)
&& emailAddressResetState == that.emailAddressResetState;
}

@Override
public int hashCode() {
return Objects.hash(allowGoogleId, allowAppleId, emailAddressPattern, emailLength, emailAddressResetState);
}

@Override
public String toString() {
return new StringJoiner(", ", ParameterInfoEmailCode.class.getSimpleName() + "[", "]")
.add("allowGoogleId=" + allowGoogleId)
.add("allowAppleId=" + allowAppleId)
.add("emailAddressPattern='" + emailAddressPattern + "'")
.add("emailLength=" + emailLength)
.add("emailAddressResetState=" + emailAddressResetState)
.toString();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -92,30 +92,33 @@ public final class SimpleTelegramClient implements Authenticable, MutableTelegra
this.addUpdateHandler(TdApi.UpdateAuthorizationState.class,
new AuthorizationStateWaitAuthenticationDataHandler(client, this, this::handleDefaultException)
);
this.addUpdateHandler(TdApi.UpdateAuthorizationState.class,
new AuthorizationStateWaitRegistrationHandler(client,
new SimpleTelegramClientInteraction(),
this::handleDefaultException
)
);
this.addUpdateHandler(TdApi.UpdateAuthorizationState.class,
new AuthorizationStateWaitPasswordHandler(client,
new SimpleTelegramClientInteraction(),
this::handleDefaultException
)
);
this.addUpdateHandler(TdApi.UpdateAuthorizationState.class,
new AuthorizationStateWaitOtherDeviceConfirmationHandler(new SimpleTelegramClientInteraction(),
this::handleDefaultException
)
);
this.addUpdateHandler(TdApi.UpdateAuthorizationState.class,
new AuthorizationStateWaitCodeHandler(client,
new SimpleTelegramClientInteraction(),
getTestCode(authenticationData),
var updateHandlerInteraction = new SimpleTelegramClientInteraction();
this.addUpdateHandler(TdApi.UpdateAuthorizationState.class, new AuthorizationStateWaitRegistrationHandler(client,
updateHandlerInteraction,
this::handleDefaultException
));
this.addUpdateHandler(TdApi.UpdateAuthorizationState.class, new AuthorizationStateWaitPasswordHandler(client,
updateHandlerInteraction,
this::handleDefaultException
));
this.addUpdateHandler(
TdApi.UpdateAuthorizationState.class, new AuthorizationStateWaitOtherDeviceConfirmationHandler(
updateHandlerInteraction,
this::handleDefaultException
)
);
));
this.addUpdateHandler(TdApi.UpdateAuthorizationState.class, new AuthorizationStateWaitCodeHandler(client,
updateHandlerInteraction,
getTestCode(authenticationData),
this::handleDefaultException
));
this.addUpdateHandler(TdApi.UpdateAuthorizationState.class, new AuthorizationStateWaitEmailAddressHandler(client,
updateHandlerInteraction,
this::handleDefaultException
));
this.addUpdateHandler(TdApi.UpdateAuthorizationState.class, new AuthorizationStateWaitEmailCodeHandler(client,
updateHandlerInteraction,
this::handleDefaultException
));
this.addUpdateHandler(TdApi.UpdateAuthorizationState.class, new AuthorizationStateWaitReady(this::onReady));
this.addUpdateHandler(TdApi.UpdateAuthorizationState.class, new AuthorizationStateWaitForExit(this::onCloseUpdate));
this.mainChatsLoader = new AuthorizationStateReadyLoadChats(client, new ChatListMain());
Expand Down Expand Up @@ -353,7 +356,6 @@ public <R extends TdApi.Object> void sendUnsafe(TdApi.Function<R> function, Gene
* @param function The request to TDLib.
* @throws NullPointerException if function is null.
*/
@SuppressWarnings("unchecked")
public <R extends TdApi.Object> CompletableFuture<R> send(TdApi.Function<R> function) {
CompletableFuture<Void> future = new CompletableFuture<>();
if (shouldWaitForReadiness(function)) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,6 @@
package it.tdlight.client;

import it.tdlight.jni.TdApi;
import it.tdlight.jni.TdApi.Message;
import it.tdlight.jni.TdApi.Update;
import it.tdlight.jni.TdApi.UpdateMessageSendFailed;
import it.tdlight.jni.TdApi.UpdateMessageSendSucceeded;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.concurrent.CompletableFuture;
Expand All @@ -14,14 +10,14 @@ class TemporaryMessageHandler implements GenericUpdateHandler<TdApi.Update> {

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

private final ConcurrentMap<TemporaryMessageURL, CompletableFuture<Message>> temporaryMessages;
private final ConcurrentMap<TemporaryMessageURL, CompletableFuture<TdApi.Message>> temporaryMessages;

public TemporaryMessageHandler(ConcurrentMap<TemporaryMessageURL, CompletableFuture<Message>> temporaryMessages) {
public TemporaryMessageHandler(ConcurrentMap<TemporaryMessageURL, CompletableFuture<TdApi.Message>> temporaryMessages) {
this.temporaryMessages = temporaryMessages;
}

@Override
public void onUpdate(Update update) {
public void onUpdate(TdApi.Update update) {
switch (update.getConstructor()) {
case TdApi.UpdateMessageSendSucceeded.CONSTRUCTOR: onUpdateSuccess(((TdApi.UpdateMessageSendSucceeded) update));
break;
Expand All @@ -30,7 +26,7 @@ public void onUpdate(Update update) {
}
}

private void onUpdateSuccess(UpdateMessageSendSucceeded updateMessageSendSucceeded) {
private void onUpdateSuccess(TdApi.UpdateMessageSendSucceeded updateMessageSendSucceeded) {
TemporaryMessageURL tempUrl
= new TemporaryMessageURL(updateMessageSendSucceeded.message.chatId, updateMessageSendSucceeded.oldMessageId);
CompletableFuture<TdApi.Message> future = temporaryMessages.remove(tempUrl);
Expand All @@ -41,14 +37,14 @@ private void onUpdateSuccess(UpdateMessageSendSucceeded updateMessageSendSucceed
}
}

private void onUpdateFailed(UpdateMessageSendFailed updateMessageSendFailed) {
private void onUpdateFailed(TdApi.UpdateMessageSendFailed updateMessageSendFailed) {
TemporaryMessageURL tempUrl
= new TemporaryMessageURL(updateMessageSendFailed.message.chatId, updateMessageSendFailed.oldMessageId);
CompletableFuture<TdApi.Message> future = temporaryMessages.remove(tempUrl);
if (future == null) {
logNotHandled(tempUrl);
} else {
TdApi.Error error = new TdApi.Error(updateMessageSendFailed.errorCode, updateMessageSendFailed.errorMessage);
TdApi.Error error = updateMessageSendFailed.error;
future.completeExceptionally(new TelegramError(error));
}
}
Expand Down

0 comments on commit 7a6b0c6

Please sign in to comment.