package org.societies.webapp.controller;
import java.io.IOException;
import java.util.Arrays;
import org.societies.api.comm.xmpp.interfaces.ICommManager;
import org.societies.api.context.model.util.SerialisationHelper;
import org.societies.api.identity.IIdentity;
import org.societies.webapp.service.OpenfireLoginService;
import org.societies.webapp.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpServletResponse;
import javax.xml.bind.DatatypeConverter;
@Controller
@ManagedBean(name = "loginController") //required to access data from XHTML files
@SessionScoped // indicates the lifetime of this object
public class LoginController extends BasePageController {
@ManagedProperty(value = "#{userService}")
private UserService userService;
@ManagedProperty(value = "#{openfireLoginService}")
private OpenfireLoginService openfireLoginService;
@Autowired
private ICommManager commMngrRef;
private String loginDialogUsername;
private String loginDialogPassword;
public LoginController() {
log.debug("LoginController() ctor");
}
public String loginButtonAction() {
// NB actions should return a String object - it is used by faces-config.xml
// NB: use loginDialogUsername and loginDialogPassword - these are populated from the front end
// "username" field should be populated by this method, then the loginDialogUsername and loginDialogPassword cleared
if (isLoggedIn()) {
// log out before logging in again
logoutAction();
}
if (loginDialogUsername == null || loginDialogUsername.isEmpty()
|| loginDialogPassword == null || loginDialogPassword.isEmpty()) {
String summary = "Login failed";
String detail = "Username or password were blank";
addGlobalMessage(summary, detail, FacesMessage.SEVERITY_WARN);
return "false";
}
String currentNodeId = openfireLoginService.getCommManager().getIdManager().getThisNetworkNode().getIdentifier();
if (!loginDialogUsername.trim().equals(currentNodeId)) {
String summary = "Login failed";
String detail = "Username or password were wrong";
addGlobalMessage(summary, detail, FacesMessage.SEVERITY_WARN);
return "false";
}
String result = openfireLoginService.doLogin(loginDialogUsername, loginDialogPassword);
if (result == null) {
String summary = "Login failed";
String detail = "Incorrect username or password";
addGlobalMessage(summary, detail, FacesMessage.SEVERITY_WARN);
return "false";
}
userService.login();
// String summary = "User " + getUsername() + " logged in";
// String detail = "User successfully logged in";
// addGlobalMessage(summary, detail, FacesMessage.SEVERITY_INFO);
// clean up
setLoginDialogUsername("");
setLoginDialogPassword("");
return "true";
}
public String logoutAction() {
log.debug("logoutAction()");
if (!isLoggedIn())
return "false";
String summary = "User " + getUsername() + " logged out";
String detail = "User logged out";
userService.logout();
addGlobalMessage(summary, detail, FacesMessage.SEVERITY_INFO);
return "true";
}
public boolean isLoggedIn() {
if (userService == null) {
log.error("userService is null - cannot determine login state");
return false;
}
return userService.isUserLoggedIn();
}
public String getUsername() {
return userService.getUsername();
}
@SuppressWarnings("UnusedDeclaration")
public String getUserID() {
return userService.getUserID();
}
public IIdentity getIdentity() {
return userService.getIdentity();
}
public void setLoginDialogUsername(String username) {
this.loginDialogUsername = username;
}
public String getLoginDialogUsername() {
return loginDialogUsername;
}
public void setLoginDialogPassword(String password) {
this.loginDialogPassword = password;
}
public String getLoginDialogPassword() {
return loginDialogPassword;
}
public String restLogin(String username, String serializedPassword) {
return restLogin(username, serializedPassword, false);
}
public String restLogin(String username, String serializedPassword, boolean redirect) {
String result;
// Check credentiels
try {
result = openfireLoginService.doLogin(username, fromBytesString(serializedPassword));
} catch (Exception e) {
result = null;
}
// Login to the T6.5 webapp
if (null != result) {
userService.login();
}
// Redirect
if (redirect) {
FacesContext context = FacesContext.getCurrentInstance();
HttpServletResponse response = (HttpServletResponse)context.getExternalContext().getResponse();
try {
response.sendRedirect("index.xhtml");
} catch (IOException e) {
return "Error...";
}
return "";
}
// Or display result number
if (null == result) {
return "401";
}
return "200";
}
private String fromBytesString(String bytesStr) {
String[] byteValues = bytesStr.split(":");
byte[] bytes = new byte[byteValues.length];
for (int i=0, len=bytes.length; i<len; i++) {
bytes[i] = Byte.valueOf(byteValues[i].trim());
}
return new String(bytes);
}
public UserService getUserService() {
return userService;
}
public void setUserService(UserService userService) {
log.debug("setUserService() has been called with " + userService);
this.userService = userService;
}
public OpenfireLoginService getOpenfireLoginService() {
return openfireLoginService;
}
public void setOpenfireLoginService(OpenfireLoginService openfireLoginService) {
log.debug("setOpenfireLoginService() has been called with " + openfireLoginService);
this.openfireLoginService = openfireLoginService;
}
public ICommManager getCommManager() {
return commMngrRef;
}
public void setCommManager(ICommManager commManager) {
log.info("#############setCommManager() has been called with");
this.commMngrRef = commMngrRef;
}
}