package org.societies.webapp.service; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.societies.api.comm.xmpp.interfaces.ICommManager; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.w3c.dom.Document; import org.xml.sax.InputSource; import javax.faces.bean.ApplicationScoped; import javax.faces.bean.ManagedBean; import javax.faces.bean.ManagedProperty; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import java.io.*; import java.net.URL; import java.net.URLConnection; import java.net.URLEncoder; import java.util.LinkedHashMap; import java.util.Map; /** * @author Maria Mannion */ @Service @ApplicationScoped // JSF @ManagedBean // JSF public class OpenfireLoginService implements Serializable { private enum MethodType { ADD, DELETE, ENABLE, DISABLE, UPDATE, LOGIN } private static final String OPENFIRE_PLUGIN = "http://%s:9090/plugins/societies/societies"; private static Logger log = LoggerFactory.getLogger(OpenfireLoginService.class); @Autowired @ManagedProperty(value = "#{commMngrRef}") private ICommManager commManager; private String xmppDomain; public OpenfireLoginService() { log.info("OpenfireLoginService constructor"); } public ICommManager getCommManager() { return commManager; } @SuppressWarnings("UnusedDeclaration") public void setCommManager(ICommManager commManager) { log.debug("setCommManager() has been called with " + commManager); this.commManager = commManager; } public String doLogin(String username, String password) { if (xmppDomain == null) { log.debug("xmppDomain is null - populating"); if (getCommManager() == null) { log.error("getCommManager() is null"); return "false"; } if (getCommManager().getIdManager() == null) { log.error("getCommManager().getIdManager() is null"); return "false"; } if (getCommManager().getIdManager().getDomainAuthorityNode() == null) { log.error("getCommManager().getIdManager().getDomainAuthorityNode() is null"); return "false"; } if (getCommManager().getIdManager().getDomainAuthorityNode().getDomain() == null) { log.error("getCommManager().getIdManager().getDomainAuthorityNode().getDomain() is null"); return "false"; } xmppDomain = getCommManager().getIdManager().getDomainAuthorityNode().getDomain(); } log.info("Loging on to upfire account with details : Username :" + username + "passsword" + password); ////////////////LOGIN //////////////// // AUTHENTICATE JABBER ID Map<String, String> params = new LinkedHashMap<String, String>(); params.put("username", username); params.put("password", password); params.put("secret", "defaultSecret"); String xmppUrl = String.format(OPENFIRE_PLUGIN, xmppDomain); String resp = postData(MethodType.LOGIN, xmppUrl, params); try { if (resp.isEmpty()) { //model.put("loginError", "Error logging onto openfire Account. Please try again"); //return new ModelAndView("pilot", model); log.info("Error logging onto openfire Account : Empty Response: Url was " + xmppUrl); return null; } //CHECK RESPONSE - DOES ACCOUNT ALREADY EXIST Document respDoc = loadXMLFromString(resp); if (respDoc.getDocumentElement().getNodeName().equals("error")) { // model.put("loginError", "Username/password incorrect. Please try again"); // return new ModelAndView("pilot", model); log.info("Username/password incorrect"); return null; } } catch (Exception e) { log.info("Error logging onto openfire Account", e); return null; } log.info("Logged on succesffuly"); return "logged"; } private static String postData(MethodType method, String openfireUrl, Map<String, String> params) { try { StringBuilder data = new StringBuilder(); for (String s : params.keySet()) { String tmp = URLEncoder.encode(s, "UTF-8") + "=" + URLEncoder.encode(params.get(s), "UTF-8") + "&"; data.append(tmp); } //ADD METHOD String methodStr = URLEncoder.encode("type", "UTF-8") + "=" + URLEncoder.encode(method.toString().toLowerCase(), "UTF-8"); data.append(methodStr); // Send data URL url = new URL(openfireUrl); URLConnection conn = url.openConnection(); conn.setDoOutput(true); OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream()); wr.write(data.toString()); wr.flush(); // Get the response BufferedReader rd = new BufferedReader(new InputStreamReader(conn.getInputStream())); StringBuilder sb = new StringBuilder(); String line; while ((line = rd.readLine()) != null) { sb.append(line); } wr.close(); rd.close(); //RESPONSE CODE return sb.toString(); } catch (Exception e) { e.printStackTrace(); } return ""; } private static Document loadXMLFromString(String xml) throws Exception { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); InputSource is = new InputSource(new StringReader(xml)); return builder.parse(is); } }