package com.mozu.api.security;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.commons.lang.NotImplementedException;
import org.joda.time.DateTime;
import com.mozu.api.ApiException;
import com.mozu.api.Headers;
import com.mozu.api.MozuClient;
import com.mozu.api.MozuClientFactory;
import com.mozu.api.MozuConfig;
import com.mozu.api.contracts.adminuser.DeveloperAccount;
import com.mozu.api.contracts.adminuser.DeveloperAdminUserAuthTicket;
import com.mozu.api.contracts.adminuser.TenantAdminUserAuthTicket;
import com.mozu.api.contracts.core.UserAuthInfo;
import com.mozu.api.contracts.tenant.Tenant;
import com.mozu.api.urls.platform.adminuser.TenantAdminUserAuthTicketUrl;
import com.mozu.api.urls.platform.developer.DeveloperAdminUserAuthTicketUrl;
public class UserAuthenticator {
public static AuthenticationProfile setActiveScope(AuthTicket authTicket, Scope scope) {
return refreshUserAuthTicket(authTicket, scope.getId());
}
public static AuthTicket ensureAuthTicket(AuthTicket authTicket) {
DateTime accessTokenDateTime = new DateTime(authTicket.getAccessTokenExpiration()).minus(180000);
if (accessTokenDateTime.isBeforeNow())
return refreshUserAuthTicket(authTicket).getAuthTicket();
return null;
}
public static AuthenticationProfile refreshUserAuthTicket(AuthTicket authTicket) {
return refreshUserAuthTicket(authTicket, null);
}
@SuppressWarnings("unchecked")
public static AuthenticationProfile refreshUserAuthTicket(AuthTicket authTicket, Integer id)
throws ApiException {
String resourceUrl = MozuConfig.getBaseUrl()
+ getResourceRefreshUrl(authTicket, id);
AuthenticationProfile userProfile = null;
Map<String, String> headers = new HashMap<String, String>();
switch (authTicket.getScope()) {
case Tenant:
TenantAdminUserAuthTicket tenantAdminUserAuthTicket = null;
MozuClient<TenantAdminUserAuthTicket> tenantClient;
try {
tenantClient = (MozuClient<TenantAdminUserAuthTicket>) MozuClientFactory.getInstance(TenantAdminUserAuthTicket.class);
} catch (Exception ioe) {
throw new ApiException("Exception occurred while authenticating application: "
+ ioe.getMessage());
}
headers.put(Headers.X_VOL_APP_CLAIMS, AppAuthenticator.addAuthHeader());
tenantAdminUserAuthTicket = tenantClient.executePutRequest(authTicket, resourceUrl.toString(), headers);
userProfile = getTenantUserProfile(tenantAdminUserAuthTicket, authTicket.getScope());
break;
case Developer:
DeveloperAdminUserAuthTicket developerAdminUserAuthTicket = null;
MozuClient<DeveloperAdminUserAuthTicket> devClient;
try {
devClient = (MozuClient<DeveloperAdminUserAuthTicket>) MozuClientFactory.getInstance(DeveloperAdminUserAuthTicket.class);
} catch (Exception ioe) {
throw new ApiException("Exception occurred while authenticating application: "
+ ioe.getMessage());
}
headers.put(Headers.X_VOL_APP_CLAIMS, AppAuthenticator.addAuthHeader());
developerAdminUserAuthTicket = devClient.executePutRequest(authTicket, resourceUrl.toString(), headers);
userProfile = getDeveloperUserProfile(developerAdminUserAuthTicket, authTicket.getScope());
break;
default:
break;
}
AuthenticationProfile userInfo = setUserAuth(userProfile, authTicket.getScope(), null);
return userInfo;
}
public static AuthenticationProfile authenticate(UserAuthInfo userAuthInfo, AuthenticationScope scope) {
return authenticate(userAuthInfo, scope, null);
}
public static AuthenticationProfile authenticate(UserAuthInfo userAuthInfo, AuthenticationScope scope, Integer id) {
return authenticate(userAuthInfo, scope, id, null);
}
@SuppressWarnings("unchecked")
public static AuthenticationProfile authenticate(UserAuthInfo userAuthInfo, AuthenticationScope scope, Integer id, Integer siteId) {
String resourceUrl = MozuConfig.getBaseUrl()
+ getResourceUrl(scope, id); // AuthTicketUrl.AuthenticateAppUrl();
AuthenticationProfile userProfile = null;
Map<String, String> headers = new HashMap<String, String>();
switch (scope) {
case Tenant:
TenantAdminUserAuthTicket tenantAdminUserAuthTicket = null;
MozuClient<TenantAdminUserAuthTicket> tenantClient;
try {
tenantClient = (MozuClient<TenantAdminUserAuthTicket>) MozuClientFactory.getInstance(TenantAdminUserAuthTicket.class);
} catch (Exception ioe) {
throw new ApiException("Exception occurred while authenticating application: "
+ ioe.getMessage());
}
headers.put(Headers.X_VOL_APP_CLAIMS, AppAuthenticator.addAuthHeader());
if (siteId != null) {
headers.put(Headers.X_VOL_SITE, siteId.toString());
}
tenantAdminUserAuthTicket = tenantClient.executePostRequest(userAuthInfo, resourceUrl.toString(), headers);
userProfile = getTenantUserProfile(tenantAdminUserAuthTicket, scope);
break;
case Developer:
DeveloperAdminUserAuthTicket developerAdminUserAuthTicket = null;
MozuClient<DeveloperAdminUserAuthTicket> devClient;
try {
devClient = (MozuClient<DeveloperAdminUserAuthTicket>) MozuClientFactory.getInstance(DeveloperAdminUserAuthTicket.class);
} catch (Exception ioe) {
throw new ApiException("Exception occurred while authenticating application: "
+ ioe.getMessage());
}
headers.put(Headers.X_VOL_APP_CLAIMS, AppAuthenticator.addAuthHeader());
if (siteId != null) {
headers.put(Headers.X_VOL_SITE, siteId.toString());
}
developerAdminUserAuthTicket = devClient.executePostRequest(userAuthInfo, resourceUrl.toString(), headers);
userProfile = getDeveloperUserProfile(developerAdminUserAuthTicket, scope);
break;
default:
break;
}
AuthenticationProfile userInfo = setUserAuth(userProfile, scope, siteId);
return userInfo;
}
public static void logout(AuthTicket authTicket) {
String resourceUrl = MozuConfig.getBaseUrl()
+ getLogoutUrl(authTicket);
Map<String, String> headers = new HashMap<String, String>();
MozuClient<?> client;
try {
client = MozuClientFactory.getInstance();
} catch (Exception ioe) {
throw new ApiException("Exception occurred while authenticating application: "
+ ioe.getMessage());
}
headers.put(Headers.X_VOL_APP_CLAIMS, AppAuthenticator.addAuthHeader());
client.executeDeleteRequest(resourceUrl, headers);
}
private static AuthenticationProfile setUserAuth(AuthenticationProfile userProfile, AuthenticationScope userScope, Integer siteId) {
if (userProfile!=null) {
AuthTicket authTicket = userProfile.getAuthTicket();
if (authTicket!=null) {
authTicket.setSiteId(siteId);
} else {
throw new ApiException("Exception setting user auth, auth ticket not found");
}
}
return userProfile;
}
private static AuthenticationProfile getTenantUserProfile(TenantAdminUserAuthTicket tenantAdminUserAuthTicket, AuthenticationScope userScope) {
Scope activeScope = null;
if (tenantAdminUserAuthTicket.getTenant() != null) {
activeScope = new Scope(tenantAdminUserAuthTicket.getTenant().getId(),
tenantAdminUserAuthTicket.getTenant().getName());
}
AuthTicket authTicket = new AuthTicket(tenantAdminUserAuthTicket.getAccessToken(),tenantAdminUserAuthTicket.getAccessTokenExpiration(),
tenantAdminUserAuthTicket.getRefreshToken(), tenantAdminUserAuthTicket
.getRefreshTokenExpiration(), userScope);
List<Scope> availableScopes = new ArrayList<Scope>();
if (tenantAdminUserAuthTicket.getAvailableTenants() != null) {
for (Tenant tenant : tenantAdminUserAuthTicket.getAvailableTenants()) {
availableScopes.add(new Scope(tenant.getId(), tenant.getName()));
}
}
return new AuthenticationProfile(authTicket, availableScopes, activeScope, tenantAdminUserAuthTicket.getUser());
}
private static AuthenticationProfile getDeveloperUserProfile(DeveloperAdminUserAuthTicket developerAdminUserAuthTicket, AuthenticationScope userScope) {
Scope activeScope = null;
if (developerAdminUserAuthTicket.getAccount() != null) {
activeScope = new Scope(developerAdminUserAuthTicket.getAccount().getId(),
developerAdminUserAuthTicket.getAccount().getName());
}
AuthTicket authTicket = new AuthTicket(developerAdminUserAuthTicket.getAccessToken(),
developerAdminUserAuthTicket.getAccessTokenExpiration(),
developerAdminUserAuthTicket.getRefreshToken(), developerAdminUserAuthTicket.getRefreshTokenExpiration(),
userScope);
List<Scope> availableScopes = new ArrayList<Scope>();
if (developerAdminUserAuthTicket.getAvailableAccounts() != null) {
for (DeveloperAccount devAcct : developerAdminUserAuthTicket.getAvailableAccounts()) {
availableScopes.add(new Scope(devAcct.getId(), devAcct.getName()));
}
}
return new AuthenticationProfile(authTicket, availableScopes, activeScope, developerAdminUserAuthTicket.getUser());
}
private static String getResourceRefreshUrl(AuthTicket authTicket, Integer id) {
switch (authTicket.getScope()) {
case Tenant:
return TenantAdminUserAuthTicketUrl.refreshAuthTicketUrl(null, id).getUrl();
case Developer:
return DeveloperAdminUserAuthTicketUrl.refreshDeveloperAuthTicketUrl(id, null).getUrl();
default:
throw new NotImplementedException("Invalid User Scope.");
}
}
private static String getResourceUrl(AuthenticationScope scope, Integer id) {
switch (scope) {
case Tenant:
return TenantAdminUserAuthTicketUrl.createUserAuthTicketUrl(null, id).getUrl();
case Developer:
return DeveloperAdminUserAuthTicketUrl.createDeveloperUserAuthTicketUrl(id, null).getUrl();
default:
throw new NotImplementedException("Invalid User Scope.");
}
}
private static String getLogoutUrl(AuthTicket ticket)
{
switch (ticket.getScope())
{
case Tenant:
return TenantAdminUserAuthTicketUrl.deleteUserAuthTicketUrl(ticket.getRefreshToken()).getUrl();
case Developer:
return DeveloperAdminUserAuthTicketUrl.deleteUserAuthTicketUrl(ticket.getRefreshToken()).getUrl();
default:
throw new NotImplementedException("Invalid User Scope.");
}
}
}