package org.apereo.cas.adaptors.authy;
import com.authy.AuthyApiClient;
import com.authy.api.Tokens;
import com.authy.api.User;
import com.authy.api.Users;
import com.google.common.base.Throwables;
import org.apache.commons.lang3.StringUtils;
import org.apereo.cas.authentication.principal.Principal;
import java.net.URL;
/**
* This is {@link AuthyClientInstance}.
*
* @author Misagh Moayyed
* @since 5.0.0
*/
public class AuthyClientInstance {
private final AuthyApiClient authyClient;
private final Users authyUsers;
private final Tokens authyTokens;
private String mailAttribute = "mail";
private String phoneAttribute = "phone";
private String countryCode = "1";
public AuthyClientInstance(final String apiKey, final String apiUrl,
final String mailAttribute, final String phoneAttribute,
final String countryCode) {
try {
this.mailAttribute = mailAttribute;
this.phoneAttribute = phoneAttribute;
this.countryCode = countryCode;
final String authyUrl = StringUtils.defaultIfBlank(apiUrl, AuthyApiClient.DEFAULT_API_URI);
final URL url = new URL(authyUrl);
final boolean testFlag = url.getProtocol().equals("http");
this.authyClient = new AuthyApiClient(apiKey, authyUrl, testFlag);
this.authyUsers = this.authyClient.getUsers();
this.authyTokens = this.authyClient.getTokens();
} catch (final Exception e) {
throw Throwables.propagate(e);
}
}
public Users getAuthyUsers() {
return authyUsers;
}
public Tokens getAuthyTokens() {
return authyTokens;
}
/**
* Gets authy error message.
*
* @param err the err
* @return the authy error message
*/
public static String getErrorMessage(final com.authy.api.Error err) {
final StringBuilder builder = new StringBuilder();
if (err != null) {
builder.append("Authy Error");
if (StringUtils.isNotBlank(err.getCountryCode())) {
builder.append(": Country Code: ").append(err.getCountryCode());
}
if (StringUtils.isNotBlank(err.getMessage())) {
builder.append(": Message: ").append(err.getMessage());
}
} else {
builder.append("An unknown error has occurred. Check your API key and URL settings.");
}
return builder.toString();
}
/**
* Gets or create user.
*
* @param principal the principal
* @return the or create user
*/
public User getOrCreateUser(final Principal principal) {
final String email = (String) principal.getAttributes().get(this.mailAttribute);
if (StringUtils.isBlank(email)) {
throw new IllegalArgumentException("No email address found for " + principal.getId());
}
final String phone = (String) principal.getAttributes().get(this.phoneAttribute);
if (StringUtils.isBlank(phone)) {
throw new IllegalArgumentException("No phone number found for " + principal.getId());
}
return this.authyUsers.createUser(email, phone, this.countryCode);
}
}