package org.qrone.r7.script.browser; import java.util.HashMap; import java.util.Map; import java.util.UUID; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import net.arnx.jsonic.JSON; import org.mozilla.javascript.Scriptable; import org.openid4java.discovery.Identifier; import org.openid4java.message.AuthSuccess; import org.openid4java.message.MessageException; import org.openid4java.message.ax.AxMessage; import org.openid4java.message.ax.FetchResponse; import org.qrone.database.DatabaseCursor; import org.qrone.database.DatabaseService; import org.qrone.database.DatabaseTable; import org.qrone.kvs.KeyValueStore; import org.qrone.login.AccessToken; import org.qrone.login.ID; import org.qrone.r7.PortingService; import org.qrone.r7.script.Scriptables; import org.qrone.r7.script.ext.ScriptableMap; import org.qrone.util.QrONEUtils; import org.qrone.util.Token; public class User{ private HttpServletRequest request = null; private HttpServletResponse response = null; private PortingService service = null; private AccessToken userToken = null; private AccessToken browserToken = null; private Map<String, String> cookies = new HashMap<String, String>(); private String initialstore = null; private Map store = null; private boolean opened = false; private DatabaseService db; public User(HttpServletRequest request, HttpServletResponse response, PortingService service){ this.request = request; this.response = response; this.service = service; UUID key = service.getConsumerSecret(); Cookie[] ck = request.getCookies(); if(cookies != null){ for (int i = 0; i < ck.length; i++) { cookies.put(ck[i].getName(), ck[i].getValue()); } } AccessToken rcookie = AccessToken.parse(cookies.get(AccessToken.READ)); if(rcookie != null && rcookie.validate(key, AccessToken.READ)){ if(userToken == null){ userToken = rcookie; } } browserToken = AccessToken.parse(cookies.get(AccessToken.BROWSER)); if(browserToken == null || !browserToken.validate(key, AccessToken.BROWSER)){ browserToken = new AccessToken(ID.encryptOpenID(UUID.randomUUID(),service.getConsumerID(),key), AccessToken.BROWSER); browserToken.sign(key); Cookie bck = new Cookie(AccessToken.BROWSER, browserToken.toString()); bck.setMaxAge(60*60*24*256*20); bck.setPath("/"); response.addCookie(bck); } if(userToken == null){ userToken = browserToken; } } public boolean validateTicket(String pt) { return validateTicket(pt, AccessToken.WRITE); } public boolean validateTicket(String pt, String permittion) { if(pt != null){ AccessToken ticket = AccessToken.parse(pt); if(ticket != null && ticket.validate(service.getConsumerSecret(), permittion)){ return true; } } return false; } public UUID getUUID(){ if(userToken != null) return ID.decryptOpenID(userToken.getId(), service.getConsumerSecret()); return null; } public String getId(){ if(userToken != null) return getUUID().toString(); return null; } public String getBrowserId(){ if(userToken != null) return ID.decryptOpenID(browserToken.getId(), service.getConsumerSecret()).toString(); return null; } public String getTicket(){ return getTicket(AccessToken.WRITE); } public String getTicket(String permittion){ AccessToken ticket = new AccessToken(ID.encryptOpenID(getUUID(),service.getConsumerID(),service.getConsumerSecret()), permittion); ticket.sign(service.getConsumerSecret()); return ticket.toString(); } public void openidLogin(Identifier verified, AuthSuccess authSuccess) { // TODO Not implemented yet. String name = null; if (authSuccess.hasExtension(AxMessage.OPENID_NS_AX)){ try { FetchResponse fetchResp = (FetchResponse) authSuccess.getExtension(AxMessage.OPENID_NS_AX); name = fetchResp.getAttributeValue("login"); //updateNCookie(new Token(key, "N", name)); } catch (MessageException e) {} } //updateQCookie(new Token(key, "Q", "openid:" + verified.getIdentifier())); } public void login(String id){ userToken = new AccessToken(ID.encryptOpenID(UUID.fromString(id),service.getConsumerID(),service.getConsumerSecret()), AccessToken.READ); userToken.sign(service.getConsumerSecret()); Cookie uck = new Cookie(AccessToken.READ, userToken.toString()); uck.setMaxAge(60*60*24*256*20); uck.setPath("/"); response.addCookie(uck); } public void logout(){ Cookie uck = new Cookie(AccessToken.READ, ""); uck.setMaxAge(0); uck.setPath("/"); userToken = browserToken; response.addCookie(uck); } public Object getStore(){ if(!opened){ opened = true; KeyValueStore kvs = service.getKeyValueStoreService().getKeyValueStore("qrone.user"); initialstore = (String)kvs.get("l." + getId()); if(initialstore != null){ store = JSON.decode(initialstore); }else{ store = new HashMap(); } } return store; } public void setStore(Object s){ opened = true; if(s instanceof Scriptable){ store = Scriptables.asMap(s); }else if(s instanceof Map){ store = (Map)s; }else{ throw new IllegalArgumentException(); } } public void close() { if(store != null && opened){ String currentstore = JSON.encode(store); if(!currentstore.equals(initialstore)){ KeyValueStore kvs = service.getKeyValueStoreService().getKeyValueStore("qrone.user"); kvs.set("l." + getId(), currentstore); } } } }