package net.whydah.admin.auth;
import net.whydah.admin.AuthenticationFailedException;
import net.whydah.admin.config.AppConfig;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.ws.rs.BadRequestException;
import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.Entity;
import javax.ws.rs.client.WebTarget;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
/**
* @author <a href="mailto:bard.lind@gmail.com">Bard Lind</a>
*/
@Component
public class UibAuthConnection {
private static final Logger log = LoggerFactory.getLogger(UibAuthConnection.class);
private static final int STATUS_BAD_REQUEST = 400; //Response.Status.BAD_REQUEST.getStatusCode();
public static final int FORBIDDEN = 403;
private static final int STATUS_OK = 200; //Response.Status.OK.getStatusCode();
private final WebTarget uib;
@Autowired
public UibAuthConnection(AppConfig appConfig) {
Client client = ClientBuilder.newClient();
String uibUrl = appConfig.getProperty("useridentitybackend");
log.info("Connection to UserIdentityBackend on {}" , uibUrl);
uib = client.target(uibUrl);
}
public String logonUser(String userAdminServiceTokenId, String userCredentialsXml) {
WebTarget logonUserResource = uib.path("/" + userAdminServiceTokenId).path("authenticate/user");
Response response = logonUserResource.request(MediaType.APPLICATION_XML).post(Entity.entity(userCredentialsXml, MediaType.APPLICATION_XML_TYPE));
int statusCode = response.getStatus();
String userXml = null;
switch (statusCode) {
case STATUS_OK:
userXml = response.readEntity(String.class);
break;
case STATUS_BAD_REQUEST:
//log.error("Response from UIB: {}: {}", response.getStatus(), response.readEntity(String.class));
log.error("logonUser failed (STATUS_BAD_REQUEST). url={}, body={}, Response from UIB: {}: {}",
logonUserResource.getUri(), userCredentialsXml, response.getStatus(), response.readEntity(String.class));
throw new BadRequestException("BadRequest for Json " + response.toString() + ", Status code " + response.getStatus());
case FORBIDDEN:
//log.trace("LogonUser failed, not allowed from UIB: {}: {}", response.getStatus(), response.readEntity(String.class));
log.trace("logonUser failed (FORBIDDEN). url={}, body={}, Response from UIB: {}: {}",
logonUserResource.getUri(), userCredentialsXml, response.getStatus(), response.readEntity(String.class));
throw new AuthenticationFailedException("LogonUser request not allowed.");
default:
log.error("logonUser failed. url={}, body={}, Response from UIB: {}: {}",
logonUserResource.getUri(), userCredentialsXml, response.getStatus(), response.readEntity(String.class));
throw new RuntimeException("LogonUser failed. Status code " + response.getStatus());
}
return userXml;
}
public String resetPassword(String userAdminServiceTokenId, String username) {
WebTarget resetPasswordResource = uib.path("password").path(userAdminServiceTokenId).path("reset/username").path(username);
Response response = resetPasswordResource.request(MediaType.APPLICATION_XML).post(Entity.entity("",MediaType.APPLICATION_XML_TYPE));
int statusCode = response.getStatus();
String output = response.readEntity(String.class);
switch (statusCode) {
case STATUS_OK:
log.info("Reset password request ok for username {}", username);
break;
case STATUS_BAD_REQUEST:
log.error("Response from UIB: {}: {}", response.getStatus(), output);
throw new BadRequestException("BadRequest for resetPassword " + response.toString() + ", Status code " + response.getStatus());
default:
log.error("Response from UIB: {}: {}", response.getStatus(), output);
throw new AuthenticationFailedException("ResetPassword failed. Status code " + response.getStatus());
}
return output;
}
public String setPasswordByToken(String userAdminServiceTokenId, String username,String passwordToken,String password) {
WebTarget resetPasswordResource = uib.path("password").path(userAdminServiceTokenId).path("reset/username").path(username).path("newpassword").path(passwordToken);
Response response = resetPasswordResource.request(MediaType.APPLICATION_XML).post(Entity.entity("{\"newpassword\":\"" + password + "\"}", MediaType.MULTIPART_FORM_DATA));
int statusCode = response.getStatus();
String output = response.readEntity(String.class);
switch (statusCode) {
case STATUS_OK:
log.info("Reset password request ok for username {}", username);
break;
case STATUS_BAD_REQUEST:
log.error("Response from UIB: {}: {}", response.getStatus(), output);
throw new BadRequestException("BadRequest for resetPassword " + response.toString() + ", Status code " + response.getStatus());
default:
log.error("Response from UIB: {}: {}", response.getStatus(), output);
throw new AuthenticationFailedException("ResetPassword failed. Status code " + response.getStatus());
}
return output;
}
}