You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openmeetings.apache.org by so...@apache.org on 2015/08/12 12:39:40 UTC

svn commit: r1695468 - in /openmeetings: branches/3.0.x/src/db/java/org/apache/openmeetings/db/dao/user/ branches/3.0.x/src/install/java/org/apache/openmeetings/installation/ branches/3.0.x/src/main/java/org/apache/openmeetings/data/user/ branches/3.0....

Author: solomax
Date: Wed Aug 12 10:39:39 2015
New Revision: 1695468

URL: http://svn.apache.org/r1695468
Log:
[OPENMEETINGS-954] login via G+ is implemented

Modified:
    openmeetings/branches/3.0.x/src/db/java/org/apache/openmeetings/db/dao/user/IUserManager.java
    openmeetings/branches/3.0.x/src/install/java/org/apache/openmeetings/installation/ImportInitvalues.java
    openmeetings/branches/3.0.x/src/main/java/org/apache/openmeetings/data/user/UserManager.java
    openmeetings/branches/3.0.x/src/main/java/org/apache/openmeetings/remote/MobileService.java
    openmeetings/branches/3.0.x/src/util/java/org/apache/openmeetings/util/OpenmeetingsVariables.java
    openmeetings/branches/3.0.x/src/web/java/org/apache/openmeetings/web/app/WebSession.java
    openmeetings/branches/3.0.x/src/web/java/org/apache/openmeetings/web/pages/auth/SignInPage.java
    openmeetings/branches/3.0.x/src/web/java/org/apache/openmeetings/web/util/RecordingResourceReference.java
    openmeetings/trunk/singlewebapp/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/MobileService.java
    openmeetings/trunk/singlewebapp/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/user/IUserManager.java
    openmeetings/trunk/singlewebapp/openmeetings-install/src/main/java/org/apache/openmeetings/installation/ImportInitvalues.java
    openmeetings/trunk/singlewebapp/openmeetings-service/src/main/java/org/apache/openmeetings/service/user/UserManager.java
    openmeetings/trunk/singlewebapp/openmeetings-util/src/main/java/org/apache/openmeetings/util/OpenmeetingsVariables.java
    openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/WebSession.java
    openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/SignInPage.java

Modified: openmeetings/branches/3.0.x/src/db/java/org/apache/openmeetings/db/dao/user/IUserManager.java
URL: http://svn.apache.org/viewvc/openmeetings/branches/3.0.x/src/db/java/org/apache/openmeetings/db/dao/user/IUserManager.java?rev=1695468&r1=1695467&r2=1695468&view=diff
==============================================================================
--- openmeetings/branches/3.0.x/src/db/java/org/apache/openmeetings/db/dao/user/IUserManager.java (original)
+++ openmeetings/branches/3.0.x/src/db/java/org/apache/openmeetings/db/dao/user/IUserManager.java Wed Aug 12 10:39:39 2015
@@ -18,11 +18,17 @@
  */
 package org.apache.openmeetings.db.dao.user;
 
+import java.io.IOException;
+import java.security.NoSuchAlgorithmException;
 import java.util.Date;
 import java.util.List;
+import java.util.Locale;
+import java.util.Map;
 import java.util.Set;
 import java.util.TimeZone;
 
+import org.apache.openmeetings.db.entity.user.State;
+import org.apache.openmeetings.db.entity.user.User;
 import org.apache.openmeetings.db.entity.user.User.Right;
 
 //FIXME HACK to bypass cross project compilation
@@ -41,4 +47,8 @@ public interface IUserManager {
 			String street, String additionalname, String fax, String zip,
 			long states_id, String town, long language_id, String phone, boolean sendSMS, 
 			boolean generateSipUserData, String jNameTimeZone);
+	
+	Long getLanguage(Locale loc);
+	State getCountry(Locale loc);
+	User loginOAuth(Map<String, String> params, long serverId) throws IOException, NoSuchAlgorithmException;
 }

Modified: openmeetings/branches/3.0.x/src/install/java/org/apache/openmeetings/installation/ImportInitvalues.java
URL: http://svn.apache.org/viewvc/openmeetings/branches/3.0.x/src/install/java/org/apache/openmeetings/installation/ImportInitvalues.java?rev=1695468&r1=1695467&r2=1695468&view=diff
==============================================================================
--- openmeetings/branches/3.0.x/src/install/java/org/apache/openmeetings/installation/ImportInitvalues.java (original)
+++ openmeetings/branches/3.0.x/src/install/java/org/apache/openmeetings/installation/ImportInitvalues.java Wed Aug 12 10:39:39 2015
@@ -34,6 +34,7 @@ import static org.apache.openmeetings.ut
 import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_IGNORE_BAD_SSL;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_LOGIN_MIN_LENGTH_KEY;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_MAX_UPLOAD_SIZE_KEY;
+import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_OAUTH_REGISTER_KEY;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_PASS_MIN_LENGTH_KEY;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_REDIRECT_URL_FOR_EXTERNAL_KEY;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_RSS_FEED1_KEY;
@@ -290,6 +291,7 @@ public class ImportInitvalues {
 
 		cfgDao.add(CONFIG_FRONTEND_REGISTER_KEY, cfg.allowFrontendRegister, null, "Is user register available on login screen");
 		cfgDao.add(CONFIG_SOAP_REGISTER_KEY, "1", null, "Is user register available via SOAP/REST");
+		cfgDao.add(CONFIG_OAUTH_REGISTER_KEY, "1", null, "Is user register available via OAuth");
 		// this group_id is the Organisation of users who register through the frontend or SOAP
 		cfgDao.add(CONFIG_DEFAULT_GROUP_ID, "1", null, "");
 

Modified: openmeetings/branches/3.0.x/src/main/java/org/apache/openmeetings/data/user/UserManager.java
URL: http://svn.apache.org/viewvc/openmeetings/branches/3.0.x/src/main/java/org/apache/openmeetings/data/user/UserManager.java?rev=1695468&r1=1695467&r2=1695468&view=diff
==============================================================================
--- openmeetings/branches/3.0.x/src/main/java/org/apache/openmeetings/data/user/UserManager.java (original)
+++ openmeetings/branches/3.0.x/src/main/java/org/apache/openmeetings/data/user/UserManager.java Wed Aug 12 10:39:39 2015
@@ -20,15 +20,21 @@ package org.apache.openmeetings.data.use
 
 import static org.apache.openmeetings.db.util.UserHelper.getMinLoginLength;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_DEFAULT_GROUP_ID;
+import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_DEFAULT_LANG_KEY;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_SOAP_REGISTER_KEY;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.webAppRootKey;
 
+import java.io.IOException;
+import java.security.NoSuchAlgorithmException;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.Random;
 import java.util.Set;
 import java.util.TimeZone;
 
@@ -37,6 +43,7 @@ import javax.persistence.PersistenceCont
 import javax.persistence.TypedQuery;
 
 import org.apache.openmeetings.db.dao.basic.ConfigurationDao;
+import org.apache.openmeetings.db.dao.label.LabelDao;
 import org.apache.openmeetings.db.dao.server.ISessionManager;
 import org.apache.openmeetings.db.dao.server.SessiondataDao;
 import org.apache.openmeetings.db.dao.user.IUserManager;
@@ -49,8 +56,10 @@ import org.apache.openmeetings.db.entity
 import org.apache.openmeetings.db.entity.server.Sessiondata;
 import org.apache.openmeetings.db.entity.user.Address;
 import org.apache.openmeetings.db.entity.user.Organisation_Users;
+import org.apache.openmeetings.db.entity.user.State;
 import org.apache.openmeetings.db.entity.user.User;
 import org.apache.openmeetings.db.entity.user.User.Right;
+import org.apache.openmeetings.db.entity.user.User.Type;
 import org.apache.openmeetings.db.entity.user.Userdata;
 import org.apache.openmeetings.db.util.TimezoneUtil;
 import org.apache.openmeetings.mail.MailHandler;
@@ -81,15 +90,15 @@ public class UserManager implements IUse
 	@Autowired
 	private SessiondataDao sessiondataDao;
 	@Autowired
-	private ConfigurationDao configurationDao;
+	private ConfigurationDao cfgDao;
 	@Autowired
-	private StateDao statemanagement;
+	private StateDao stateDao;
 	@Autowired
 	private OrganisationDao orgDao;
 	@Autowired
 	private OrganisationUserDao orgUserDao;
 	@Autowired
-	private UserDao usersDao;
+	private UserDao userDao;
 	@Autowired
 	private EmailManager emailManagement;
 	@Autowired
@@ -106,7 +115,7 @@ public class UserManager implements IUse
 		try {
 			SearchResult<User> sresult = new SearchResult<User>();
 			sresult.setObjectName(User.class.getName());
-			sresult.setRecords(usersDao.count(search));
+			sresult.setRecords(userDao.count(search));
 
 			String sort = null;
 			if (orderby != null && orderby.length() > 0) {
@@ -149,7 +158,7 @@ public class UserManager implements IUse
 
 			if (sessionData != null) {
 
-				User u = usersDao.get(sessionData.getUser_id());
+				User u = userDao.get(sessionData.getUser_id());
 
 				sessiondataDao.updateUserWithoutSession(SID, u.getUser_id());
 
@@ -287,10 +296,10 @@ public class UserManager implements IUse
 			String additionalname, String fax, String zip, long states_id,
 			String town, long language_id, String phone, boolean sendSMS, boolean generateSipUserData, String jNameTimeZone) {
 		
-		String baseURL = configurationDao.getBaseUrl();
+		String baseURL = cfgDao.getBaseUrl();
 		boolean sendConfirmation = baseURL != null
 				&& !baseURL.isEmpty()
-				&& 1 == configurationDao.getConfValue("sendEmailWithVerficationCode", Integer.class, "0");
+				&& 1 == cfgDao.getConfValue("sendEmailWithVerficationCode", Integer.class, "0");
 		
 		return registerUser(login, Userpass, lastname, firstname, email, age,
 				street, additionalname, fax, zip, states_id, town, language_id,
@@ -315,14 +324,14 @@ public class UserManager implements IUse
 			boolean generateSipUserData, String jNameTimeZone, Boolean sendConfirmation) {
 		try {
 			// Checks if FrontEndUsers can register
-			if ("1".equals(configurationDao.getConfValue(CONFIG_SOAP_REGISTER_KEY, String.class, "0"))) {
+			if ("1".equals(cfgDao.getConfValue(CONFIG_SOAP_REGISTER_KEY, String.class, "0"))) {
 				
 				// TODO: Read and generate SIP-Data via RPC-Interface Issue 1098
 
 				Long user_id = registerUserInit(UserDao.getDefaultRights(), login,
 						Userpass, lastname, firstname, email, age, street,
 						additionalname, fax, zip, states_id, town, language_id,
-						true, Arrays.asList(configurationDao.getConfValue(CONFIG_DEFAULT_GROUP_ID, Long.class, null)), phone,
+						true, Arrays.asList(cfgDao.getConfValue(CONFIG_DEFAULT_GROUP_ID, Long.class, null)), phone,
 						sendSMS, sendConfirmation, timezoneUtil.getTimeZone(jNameTimeZone), false, "", "", false, true, null);
 
 				if (user_id > 0 && sendConfirmation) {
@@ -380,13 +389,13 @@ public class UserManager implements IUse
 			Boolean showContactDataToContacts, String activatedHash) throws Exception {
 		// TODO: make phone number persistent
 		// Check for required data
-		if (login.length() >= getMinLoginLength(configurationDao)) {
+		if (login.length() >= getMinLoginLength(cfgDao)) {
 			// Check for duplicates
-			boolean checkName = usersDao.checkLogin(login, User.Type.user, null, null);
-			boolean checkEmail = Strings.isEmpty(email) || usersDao.checkEmail(email, User.Type.user, null, null);
+			boolean checkName = userDao.checkLogin(login, User.Type.user, null, null);
+			boolean checkEmail = Strings.isEmpty(email) || userDao.checkEmail(email, User.Type.user, null, null);
 			if (checkName && checkEmail) {
 
-				String link = configurationDao.getBaseUrl();
+				String link = cfgDao.getBaseUrl();
 				String hash = activatedHash;
 				if (hash == null){
 					hash = ManageCryptStyle.getInstanceOfCrypt().createPassPhrase(login
@@ -400,7 +409,7 @@ public class UserManager implements IUse
 					if (!sendMail.equals("success"))
 						return -19L;
 				}
-				Address adr =  usersDao.getAddress(street, zip, town, states_id, additionalname, fax, phone, email);
+				Address adr =  userDao.getAddress(street, zip, town, states_id, additionalname, fax, phone, email);
 
 				// If this user needs first to click his E-Mail verification
 				// code then set the status to 0
@@ -412,7 +421,7 @@ public class UserManager implements IUse
 				for (Long id : organisations) {
 					orgList.add(new Organisation_Users(orgDao.get(id)));
 				}
-				User u = usersDao.addUser(rights, firstname, login, lastname, language_id,
+				User u = userDao.addUser(rights, firstname, login, lastname, language_id,
 						password, adr, sendSMS, age, hash, timezone,
 						forceTimeZoneCheck, userOffers, userSearchs, showContactData,
 						showContactDataToContacts, null, null, orgList, null);
@@ -453,7 +462,7 @@ public class UserManager implements IUse
 			Long users_id = sessiondataDao.checkSession(SID);
 
 			// admins only
-			if (AuthLevelUtil.hasAdminLevel(usersDao.getRights(users_id))) {
+			if (AuthLevelUtil.hasAdminLevel(userDao.getRights(users_id))) {
 
 				sessiondataDao.clearSessionByRoomId(room_id);
 
@@ -475,10 +484,8 @@ public class UserManager implements IUse
 							rcl.getStreamid(), currentScope);
 
 				}
-
 				return true;
 			}
-
 		} catch (Exception err) {
 			log.error("[kickUserByStreamId]", err);
 		}
@@ -490,7 +497,7 @@ public class UserManager implements IUse
 			Long users_id = sessiondataDao.checkSession(SID);
 
 			// admins only
-			if (AuthLevelUtil.hasWebServiceLevel(usersDao.getRights(users_id))) {
+			if (AuthLevelUtil.hasWebServiceLevel(userDao.getRights(users_id))) {
 
 				Client rcl = sessionManager
 						.getClientByPublicSID(publicSID, false, null);
@@ -515,10 +522,92 @@ public class UserManager implements IUse
 
 				return true;
 			}
-
 		} catch (Exception err) {
 			log.error("[kickUserByStreamId]", err);
 		}
 		return null;
 	}
+	
+	public Long getLanguage(Locale loc) {
+		if (loc != null) {
+			for (Map.Entry<Long, Locale> e : LabelDao.languages.entrySet()) {
+				if (loc.equals(e.getValue())) {
+					return e.getKey();
+				}
+			}
+		}
+		return cfgDao.getConfValue(CONFIG_DEFAULT_LANG_KEY, Long.class, "1");
+	}
+
+	public State getCountry(Locale loc) {
+		List<State> states = stateDao.getStates();
+		if (loc != null) {
+			String code = loc.getISO3Country().toUpperCase();
+			for (State s : states) {
+				if (s.getShortName().toUpperCase().equals(code)) {
+					return s;
+				}
+			}
+		}
+		return states.get(0);
+	}
+
+	public User loginOAuth(Map<String, String> params, long serverId) throws IOException, NoSuchAlgorithmException {
+		String login = params.get("login");
+		String email = params.get("email");
+		String lastname = params.get("lastname");
+		String firstname = params.get("firstname");
+		if (firstname == null) {
+			firstname = "";
+		}
+		if (lastname == null) {
+			lastname = "";
+		}
+		if (!userDao.validLogin(login)) {
+			log.error("Invalid login, please check parameters");
+			return null; //TODO FIXME need to be checked
+		}
+		User u = userDao.getByLogin(login, Type.oauth, serverId);
+		if (!userDao.checkEmail(email, Type.oauth, serverId, u == null ? null : u.getUser_id())) {
+			log.error("Another user with the same email exists");
+			return null; //TODO FIXME need to be checked
+		}
+		// generate random password
+		byte[] rawPass = new byte[25];
+		Random rnd = new Random();
+		for (int i = 0; i < rawPass.length; ++i) {
+			rawPass[i] = (byte) ('!' + rnd.nextInt(93));
+		}
+		String pass = new String(rawPass, "UTF-8");
+		// check if the user already exists and register new one if it's needed
+		if (u == null) {
+			u = userDao.getNewUserInstance(null);
+			u.setType(Type.oauth);
+			u.getRights().remove(Right.Login);;
+			u.setDomainId(serverId);
+			u.getOrganisation_users().add(new Organisation_Users(orgDao.get(cfgDao.getConfValue(CONFIG_DEFAULT_GROUP_ID, Long.class, "-1"))));
+			u.setLogin(login);
+			u.setShowContactDataToContacts(true);
+			u.setLastname(lastname);
+			u.setFirstname(firstname);
+			u.getAdresses().setEmail(email);
+			String picture = params.get("picture");
+			if (picture != null) {
+				u.setPictureuri(picture);
+			}
+			String locale = params.get("locale");
+			if (locale != null) {
+				Locale loc = Locale.forLanguageTag(locale);
+				if (loc != null) {
+					u.setLanguage_id(getLanguage(loc));
+					u.getAdresses().setStates(getCountry(loc));
+				}
+			}
+		}
+		//TODO FIXME should we update fields on login ????
+		u.setLastlogin(new Date());
+		u = userDao.update(u, pass, -1);
+		
+		return u;
+	}
 }

Modified: openmeetings/branches/3.0.x/src/main/java/org/apache/openmeetings/remote/MobileService.java
URL: http://svn.apache.org/viewvc/openmeetings/branches/3.0.x/src/main/java/org/apache/openmeetings/remote/MobileService.java?rev=1695468&r1=1695467&r2=1695468&view=diff
==============================================================================
--- openmeetings/branches/3.0.x/src/main/java/org/apache/openmeetings/remote/MobileService.java (original)
+++ openmeetings/branches/3.0.x/src/main/java/org/apache/openmeetings/remote/MobileService.java Wed Aug 12 10:39:39 2015
@@ -18,6 +18,9 @@
  */
 package org.apache.openmeetings.remote;
 
+import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_FRONTEND_REGISTER_KEY;
+import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_OAUTH_REGISTER_KEY;
+import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_SOAP_REGISTER_KEY;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.webAppRootKey;
 
 import java.util.ArrayList;
@@ -27,11 +30,13 @@ import java.util.Hashtable;
 import java.util.List;
 import java.util.Map;
 
+import org.apache.openmeetings.db.dao.basic.ConfigurationDao;
 import org.apache.openmeetings.db.dao.label.LabelDao;
 import org.apache.openmeetings.db.dao.room.IRoomManager;
 import org.apache.openmeetings.db.dao.room.RoomDao;
 import org.apache.openmeetings.db.dao.server.ISessionManager;
 import org.apache.openmeetings.db.dao.server.SessiondataDao;
+import org.apache.openmeetings.db.dao.user.IUserManager;
 import org.apache.openmeetings.db.dao.user.UserDao;
 import org.apache.openmeetings.db.entity.room.Client;
 import org.apache.openmeetings.db.entity.room.Room;
@@ -52,8 +57,12 @@ import org.springframework.beans.factory
 public class MobileService {
 	private static final Logger log = Red5LoggerFactory.getLogger(MainService.class, webAppRootKey);
 	@Autowired
+	private ConfigurationDao cfgDao;
+	@Autowired
 	private UserDao userDao;
 	@Autowired
+	private IUserManager userManager;
+	@Autowired
 	private SessiondataDao sessionDao;
 	@Autowired
 	private ISessionManager sessionManager;
@@ -70,51 +79,80 @@ public class MobileService {
 		m.put(key, v == null ? "" : v);
 	}
 	
+	public Map<String, Object> checkServer() {
+		Map<String, Object> result = new Hashtable<>();
+		result.put("allowSelfRegister",  "1".equals(cfgDao.getConfValue(CONFIG_FRONTEND_REGISTER_KEY, String.class, "0")));
+		result.put("allowSoapRegister",  "1".equals(cfgDao.getConfValue(CONFIG_SOAP_REGISTER_KEY, String.class, "0")));
+		result.put("allowOauthRegister",  "1".equals(cfgDao.getConfValue(CONFIG_OAUTH_REGISTER_KEY, String.class, "0")));
+		return result;
+	}
+	
+	public Map<String, Object> loginGoogle(Map<String, String> umap) {
+		Map<String, Object> result = getResult();
+		try {
+			User u = userManager.loginOAuth(umap, 2); //TODO hardcoded
+			result = login(u, result);
+		} catch (Exception e) {
+			log.error("[loginUser]", e);
+		}
+		return result;
+	}
+	
 	public Map<String, Object> loginUser(String login, String password) {
-		Map<String, Object> result = new Hashtable<String, Object>();
+		Map<String, Object> result = getResult();
 		try {
-			result.put("status", -1);
 			User u = userDao.login(login, password);
-			if (u != null) {
-				Sessiondata sd = sessionDao.startsession();
-				Boolean bool = sessionDao.updateUser(sd.getSession_id(), u.getUser_id(), false, u.getLanguage_id());
-				if (bool == null) {
-					// Exception
-				} else if (!bool) {
-					// invalid Session-Object
-					result.put("status", -35);
-				} else {
-					IConnection conn = Red5.getConnectionLocal();
-					String streamId = conn.getClient().getId();
-					Client c = sessionManager.getClientByStreamId(streamId, null);
-					if (c == null) {
-						c = sessionManager.addClientListItem(streamId, conn.getScope().getName(), conn.getRemotePort(),
-							conn.getRemoteAddress(), "", false, null);
-					}
-					
-					SessionVariablesUtil.initClient(conn.getClient(), false, c.getPublicSID());
-					c.setUser_id(u.getUser_id());
-					c.setFirstname(u.getFirstname());
-					c.setLastname(u.getLastname());
-					c.setMobile(true);
-					sessionManager.updateClientByStreamId(streamId, c, false, null);
-
-					add(result, "sid", sd.getSession_id());
-					add(result, "publicSid", c.getPublicSID());
-					add(result, "status", 0);
-					add(result, "userId", u.getUser_id());
-					add(result, "firstname", u.getFirstname());
-					add(result, "lastname", u.getLastname());
-					add(result, "login", u.getLogin());
-					add(result, "email", u.getAdresses() == null ? "" : u.getAdresses().getEmail());
-					add(result, "language", u.getLanguage_id()); //TODO rights
-				}
-			}
+			result = login(u, result);
 		} catch (Exception e) {
 			log.error("[loginUser]", e);
 		}
 		return result;
 	}
+	
+	private Map<String, Object> getResult() {
+		Map<String, Object> result = new Hashtable<>();
+		result.put("status", -1);
+		return result;
+	}
+	
+	private Map<String, Object> login(User u, Map<String, Object> result) {
+		if (u != null) {
+			Sessiondata sd = sessionDao.startsession();
+			Boolean bool = sessionDao.updateUser(sd.getSession_id(), u.getUser_id(), false, u.getLanguage_id());
+			if (bool == null) {
+				// Exception
+			} else if (!bool) {
+				// invalid Session-Object
+				result.put("status", -35);
+			} else {
+				IConnection conn = Red5.getConnectionLocal();
+				String streamId = conn.getClient().getId();
+				Client c = sessionManager.getClientByStreamId(streamId, null);
+				if (c == null) {
+					c = sessionManager.addClientListItem(streamId, conn.getScope().getName(), conn.getRemotePort(),
+						conn.getRemoteAddress(), "", false, null);
+				}
+				
+				SessionVariablesUtil.initClient(conn.getClient(), false, c.getPublicSID());
+				c.setUser_id(u.getUser_id());
+				c.setFirstname(u.getFirstname());
+				c.setLastname(u.getLastname());
+				c.setMobile(true);
+				sessionManager.updateClientByStreamId(streamId, c, false, null);
+
+				add(result, "sid", sd.getSession_id());
+				add(result, "publicSid", c.getPublicSID());
+				add(result, "status", 0);
+				add(result, "userId", u.getUser_id());
+				add(result, "firstname", u.getFirstname());
+				add(result, "lastname", u.getLastname());
+				add(result, "login", u.getLogin());
+				add(result, "email", u.getAdresses() == null ? "" : u.getAdresses().getEmail());
+				add(result, "language", u.getLanguage_id()); //TODO rights
+			}
+		}
+		return result;
+	}
 	
 	public List<Map<String, Object>> getVideoStreams() {
 		List<Map<String, Object>> result = new ArrayList<Map<String,Object>>();

Modified: openmeetings/branches/3.0.x/src/util/java/org/apache/openmeetings/util/OpenmeetingsVariables.java
URL: http://svn.apache.org/viewvc/openmeetings/branches/3.0.x/src/util/java/org/apache/openmeetings/util/OpenmeetingsVariables.java?rev=1695468&r1=1695467&r2=1695468&view=diff
==============================================================================
--- openmeetings/branches/3.0.x/src/util/java/org/apache/openmeetings/util/OpenmeetingsVariables.java (original)
+++ openmeetings/branches/3.0.x/src/util/java/org/apache/openmeetings/util/OpenmeetingsVariables.java Wed Aug 12 10:39:39 2015
@@ -25,6 +25,7 @@ public class OpenmeetingsVariables {
 	public static final String CONFIG_DEFAULT_LANG_KEY = "default_lang_id";
 	public static final String CONFIG_FRONTEND_REGISTER_KEY = "allow_frontend_register";
 	public static final String CONFIG_SOAP_REGISTER_KEY = "allow.soap.register";
+	public static final String CONFIG_OAUTH_REGISTER_KEY = "allow.oauth.register";
 	public static final String CONFIG_LOGIN_MIN_LENGTH_KEY = "user.login.minimum.length";
 	public static final String CONFIG_MAX_UPLOAD_SIZE_KEY = "max_upload_size";
 	public static final String CONFIG_PASS_MIN_LENGTH_KEY = "user.pass.minimum.length";

Modified: openmeetings/branches/3.0.x/src/web/java/org/apache/openmeetings/web/app/WebSession.java
URL: http://svn.apache.org/viewvc/openmeetings/branches/3.0.x/src/web/java/org/apache/openmeetings/web/app/WebSession.java?rev=1695468&r1=1695467&r2=1695468&view=diff
==============================================================================
--- openmeetings/branches/3.0.x/src/web/java/org/apache/openmeetings/web/app/WebSession.java (original)
+++ openmeetings/branches/3.0.x/src/web/java/org/apache/openmeetings/web/app/WebSession.java Wed Aug 12 10:39:39 2015
@@ -41,7 +41,6 @@ import java.util.Iterator;
 import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Locale;
-import java.util.Map;
 import java.util.Set;
 import java.util.TimeZone;
 
@@ -49,7 +48,7 @@ import org.apache.openmeetings.db.dao.ba
 import org.apache.openmeetings.db.dao.label.LabelDao;
 import org.apache.openmeetings.db.dao.server.SOAPLoginDao;
 import org.apache.openmeetings.db.dao.server.SessiondataDao;
-import org.apache.openmeetings.db.dao.user.StateDao;
+import org.apache.openmeetings.db.dao.user.IUserManager;
 import org.apache.openmeetings.db.dao.user.UserDao;
 import org.apache.openmeetings.db.entity.server.RemoteSessionObject;
 import org.apache.openmeetings.db.entity.server.SOAPLogin;
@@ -251,8 +250,6 @@ public class WebSession extends Abstract
 	}
 	
 	public boolean signIn(String login, String password, Type type, Long domainId) {
-		Sessiondata sessData = getBean(SessiondataDao.class).startsession();
-		SID = sessData.getSession_id();
 		try {
 			User u = null;
 			switch (type) {
@@ -273,7 +270,7 @@ public class WebSession extends Abstract
 			if (u == null) {
 				return false;
 			}
-			setUser(u);
+			signIn(u);
 			return true;
 		} catch (OmException oe) {
 			loginError = oe.getCode() == null ? -1L : oe.getCode();
@@ -281,6 +278,16 @@ public class WebSession extends Abstract
 		return false;
 	}
 	
+	public boolean signIn(User u) {
+		Sessiondata sessData = getBean(SessiondataDao.class).startsession();
+		SID = sessData.getSession_id();
+		if (u == null) {
+			return false;
+		}
+		setUser(u);
+		return true;
+	}
+	
 	public Long getLoginError() {
 		return loginError;
 	}
@@ -397,23 +404,11 @@ public class WebSession extends Abstract
 	}
 
 	public Long getLanguageByBrowserLocale() {
-		for (Map.Entry<Long, Locale> e : LabelDao.languages.entrySet()) {
-			if (getBrowserLocale().equals(e.getValue())) {
-				return e.getKey();
-			}
-		}
-		return getBean(ConfigurationDao.class).getConfValue(CONFIG_DEFAULT_LANG_KEY, Long.class, "1");
+		return getBean(IUserManager.class).getLanguage(getBrowserLocale());
 	}
 
 	public State getCountryByBrowserLocale() {
-		List<State> states = getBean(StateDao.class).getStates();
-		String code = getBrowserLocale().getISO3Country().toUpperCase();
-		for (State s : states) {
-			if (s.getShortName().toUpperCase().equals(code)){
-				return s;
-			}
-		}
-		return states.get(0);
+		return getBean(IUserManager.class).getCountry(getBrowserLocale());
 	}
 
 	public String getClientTZCode() {

Modified: openmeetings/branches/3.0.x/src/web/java/org/apache/openmeetings/web/pages/auth/SignInPage.java
URL: http://svn.apache.org/viewvc/openmeetings/branches/3.0.x/src/web/java/org/apache/openmeetings/web/pages/auth/SignInPage.java?rev=1695468&r1=1695467&r2=1695468&view=diff
==============================================================================
--- openmeetings/branches/3.0.x/src/web/java/org/apache/openmeetings/web/pages/auth/SignInPage.java (original)
+++ openmeetings/branches/3.0.x/src/web/java/org/apache/openmeetings/web/pages/auth/SignInPage.java Wed Aug 12 10:39:39 2015
@@ -18,7 +18,6 @@
  */
 package org.apache.openmeetings.web.pages.auth;
 
-import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_DEFAULT_GROUP_ID;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_FRONTEND_REGISTER_KEY;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_IGNORE_BAD_SSL;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.webAppRootKey;
@@ -36,10 +35,8 @@ import java.net.URLEncoder;
 import java.security.NoSuchAlgorithmException;
 import java.security.cert.CertificateException;
 import java.security.cert.X509Certificate;
-import java.util.Date;
 import java.util.HashMap;
 import java.util.Map;
-import java.util.Random;
 
 import javax.net.ssl.HostnameVerifier;
 import javax.net.ssl.HttpsURLConnection;
@@ -52,12 +49,9 @@ import javax.net.ssl.X509TrustManager;
 import org.apache.commons.io.IOUtils;
 import org.apache.openmeetings.db.dao.basic.ConfigurationDao;
 import org.apache.openmeetings.db.dao.server.OAuth2Dao;
-import org.apache.openmeetings.db.dao.user.OrganisationDao;
-import org.apache.openmeetings.db.dao.user.UserDao;
+import org.apache.openmeetings.db.dao.user.IUserManager;
 import org.apache.openmeetings.db.entity.server.OAuthServer;
-import org.apache.openmeetings.db.entity.user.Organisation_Users;
 import org.apache.openmeetings.db.entity.user.User;
-import org.apache.openmeetings.db.entity.user.User.Right;
 import org.apache.openmeetings.db.entity.user.User.Type;
 import org.apache.openmeetings.web.app.Application;
 import org.apache.openmeetings.web.app.WebSession;
@@ -339,51 +333,9 @@ public class SignInPage extends BaseInit
 	}
 	
 	private void loginViaOAuth2(Map<String, String> params, long serverId) throws IOException, NoSuchAlgorithmException {
-		UserDao userDao = getBean(UserDao.class);
-		ConfigurationDao cfgDao = getBean(ConfigurationDao.class);
-		String login = params.get("login");
-		String email = params.get("email");
-		String lastname = params.get("lastname");
-		String firstname = params.get("firstname");
-		if (firstname == null) {
-			firstname = "";
-		}
-		if (lastname == null) {
-			lastname = "";
-		}
-		if (!userDao.validLogin(login)) {
-			log.error("Invalid login, please check parameters");
-			return;
-		}
-		User u = userDao.getByLogin(login, Type.oauth, serverId);
-		if (!userDao.checkEmail(email, Type.oauth, serverId, u == null ? null : u.getUser_id())) {
-			log.error("Another user with the same email exists");
-			return;
-		}
-		// generate random password
-		byte[] rawPass = new byte[25];
-		Random rnd = new Random();
-		for (int i = 0; i < rawPass.length; ++i) {
-			rawPass[i] = (byte) ('!' + rnd.nextInt(93));
-		}
-		String pass = new String(rawPass, "UTF-8");
-		// check if the user already exists and register new one if it's needed
-		if (u == null) {
-			u = userDao.getNewUserInstance(null);
-			u.setType(Type.oauth);
-			u.getRights().remove(Right.Login);;
-			u.setDomainId(serverId);
-			u.getOrganisation_users().add(new Organisation_Users(getBean(OrganisationDao.class).get(cfgDao.getConfValue(CONFIG_DEFAULT_GROUP_ID, Long.class, "-1"))));
-			u.setLogin(login);
-			u.setShowContactDataToContacts(true);
-			u.setLastname(lastname);
-			u.setFirstname(firstname);
-			u.getAdresses().setEmail(email);
-		}
-		u.setLastlogin(new Date());
-		u = userDao.update(u, pass, -1);
+		User u = getBean(IUserManager.class).loginOAuth(params, serverId);
 		
-		if (WebSession.get().signIn(login, pass, Type.oauth, serverId)) {
+		if (u != null && WebSession.get().signIn(u)) {
  			setResponsePage(Application.get().getHomePage());
 		} else {
 			log.error("Failed to login via OAuth2!");

Modified: openmeetings/branches/3.0.x/src/web/java/org/apache/openmeetings/web/util/RecordingResourceReference.java
URL: http://svn.apache.org/viewvc/openmeetings/branches/3.0.x/src/web/java/org/apache/openmeetings/web/util/RecordingResourceReference.java?rev=1695468&r1=1695467&r2=1695468&view=diff
==============================================================================
--- openmeetings/branches/3.0.x/src/web/java/org/apache/openmeetings/web/util/RecordingResourceReference.java (original)
+++ openmeetings/branches/3.0.x/src/web/java/org/apache/openmeetings/web/util/RecordingResourceReference.java Wed Aug 12 10:39:39 2015
@@ -46,6 +46,7 @@ import org.apache.wicket.request.resourc
 import org.apache.wicket.request.resource.IResource;
 import org.apache.wicket.request.resource.IResource.Attributes;
 import org.apache.wicket.request.resource.ResourceReference;
+import org.apache.wicket.util.io.Streams;
 import org.apache.wicket.util.lang.Bytes;
 import org.apache.wicket.util.resource.FileResourceStream;
 import org.apache.wicket.util.resource.IResourceStream;
@@ -158,7 +159,8 @@ public abstract class RecordingResourceR
 						public void writeData(Attributes attributes) throws IOException {
 							IResourceStream rStream = getResourceStream();
 							try {
-								writeStream(attributes, rStream.getInputStream());
+								final Response response = attributes.getResponse();
+								Streams.copy(rStream.getInputStream(), response.getOutputStream());
 							} catch (ResourceStreamNotFoundException e1) {
 							} catch (ResponseIOException e) {
 								// in case of range operations we expecting such exceptions

Modified: openmeetings/trunk/singlewebapp/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/MobileService.java
URL: http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/MobileService.java?rev=1695468&r1=1695467&r2=1695468&view=diff
==============================================================================
--- openmeetings/trunk/singlewebapp/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/MobileService.java (original)
+++ openmeetings/trunk/singlewebapp/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/MobileService.java Wed Aug 12 10:39:39 2015
@@ -18,6 +18,9 @@
  */
 package org.apache.openmeetings.core.remote;
 
+import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_FRONTEND_REGISTER_KEY;
+import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_OAUTH_REGISTER_KEY;
+import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_SOAP_REGISTER_KEY;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.webAppRootKey;
 
 import java.util.ArrayList;
@@ -29,10 +32,12 @@ import java.util.Map;
 
 import org.apache.openmeetings.core.remote.red5.ScopeApplicationAdapter;
 import org.apache.openmeetings.core.remote.util.SessionVariablesUtil;
+import org.apache.openmeetings.db.dao.basic.ConfigurationDao;
 import org.apache.openmeetings.db.dao.label.LabelDao;
 import org.apache.openmeetings.db.dao.room.RoomDao;
 import org.apache.openmeetings.db.dao.server.ISessionManager;
 import org.apache.openmeetings.db.dao.server.SessiondataDao;
+import org.apache.openmeetings.db.dao.user.IUserManager;
 import org.apache.openmeetings.db.dao.user.UserDao;
 import org.apache.openmeetings.db.entity.room.Client;
 import org.apache.openmeetings.db.entity.room.Room;
@@ -51,8 +56,12 @@ import org.springframework.beans.factory
 public class MobileService {
 	private static final Logger log = Red5LoggerFactory.getLogger(MainService.class, webAppRootKey);
 	@Autowired
+	private ConfigurationDao cfgDao;
+	@Autowired
 	private UserDao userDao;
 	@Autowired
+	private IUserManager userManager;
+	@Autowired
 	private SessiondataDao sessionDao;
 	@Autowired
 	private ISessionManager sessionManager;
@@ -67,51 +76,80 @@ public class MobileService {
 		m.put(key, v == null ? "" : v);
 	}
 	
+	public Map<String, Object> checkServer() {
+		Map<String, Object> result = new Hashtable<>();
+		result.put("allowSelfRegister",  "1".equals(cfgDao.getConfValue(CONFIG_FRONTEND_REGISTER_KEY, String.class, "0")));
+		result.put("allowSoapRegister",  "1".equals(cfgDao.getConfValue(CONFIG_SOAP_REGISTER_KEY, String.class, "0")));
+		result.put("allowOauthRegister",  "1".equals(cfgDao.getConfValue(CONFIG_OAUTH_REGISTER_KEY, String.class, "0")));
+		return result;
+	}
+	
+	public Map<String, Object> loginGoogle(Map<String, String> umap) {
+		Map<String, Object> result = getResult();
+		try {
+			User u = userManager.loginOAuth(umap, 2); //TODO hardcoded
+			result = login(u, result);
+		} catch (Exception e) {
+			log.error("[loginUser]", e);
+		}
+		return result;
+	}
+	
 	public Map<String, Object> loginUser(String login, String password) {
-		Map<String, Object> result = new Hashtable<String, Object>();
+		Map<String, Object> result = getResult();
 		try {
-			result.put("status", -1);
 			User u = userDao.login(login, password);
-			if (u != null) {
-				Sessiondata sd = sessionDao.startsession();
-				Boolean bool = sessionDao.updateUser(sd.getSessionId(), u.getId(), false, u.getLanguageId());
-				if (bool == null) {
-					// Exception
-				} else if (!bool) {
-					// invalid Session-Object
-					result.put("status", -35);
-				} else {
-					IConnection conn = Red5.getConnectionLocal();
-					String streamId = conn.getClient().getId();
-					Client c = sessionManager.getClientByStreamId(streamId, null);
-					if (c == null) {
-						c = sessionManager.addClientListItem(streamId, conn.getScope().getName(), conn.getRemotePort(),
-							conn.getRemoteAddress(), "", false, null);
-					}
-					
-					SessionVariablesUtil.initClient(conn.getClient(), false, c.getPublicSID());
-					c.setUserId(u.getId());
-					c.setFirstname(u.getFirstname());
-					c.setLastname(u.getLastname());
-					c.setMobile(true);
-					sessionManager.updateClientByStreamId(streamId, c, false, null);
-
-					add(result, "sid", sd.getSessionId());
-					add(result, "publicSid", c.getPublicSID());
-					add(result, "status", 0);
-					add(result, "userId", u.getId());
-					add(result, "firstname", u.getFirstname());
-					add(result, "lastname", u.getLastname());
-					add(result, "login", u.getLogin());
-					add(result, "email", u.getAddress() == null ? "" : u.getAddress().getEmail());
-					add(result, "language", u.getLanguageId()); //TODO rights
-				}
-			}
+			result = login(u, result);
 		} catch (Exception e) {
 			log.error("[loginUser]", e);
 		}
 		return result;
 	}
+	
+	private Map<String, Object> getResult() {
+		Map<String, Object> result = new Hashtable<>();
+		result.put("status", -1);
+		return result;
+	}
+	
+	private Map<String, Object> login(User u, Map<String, Object> result) {
+		if (u != null) {
+			Sessiondata sd = sessionDao.startsession();
+			Boolean bool = sessionDao.updateUser(sd.getSessionId(), u.getId(), false, u.getLanguageId());
+			if (bool == null) {
+				// Exception
+			} else if (!bool) {
+				// invalid Session-Object
+				result.put("status", -35);
+			} else {
+				IConnection conn = Red5.getConnectionLocal();
+				String streamId = conn.getClient().getId();
+				Client c = sessionManager.getClientByStreamId(streamId, null);
+				if (c == null) {
+					c = sessionManager.addClientListItem(streamId, conn.getScope().getName(), conn.getRemotePort(),
+						conn.getRemoteAddress(), "", false, null);
+				}
+				
+				SessionVariablesUtil.initClient(conn.getClient(), false, c.getPublicSID());
+				c.setUserId(u.getId());
+				c.setFirstname(u.getFirstname());
+				c.setLastname(u.getLastname());
+				c.setMobile(true);
+				sessionManager.updateClientByStreamId(streamId, c, false, null);
+
+				add(result, "sid", sd.getSessionId());
+				add(result, "publicSid", c.getPublicSID());
+				add(result, "status", 0);
+				add(result, "userId", u.getId());
+				add(result, "firstname", u.getFirstname());
+				add(result, "lastname", u.getLastname());
+				add(result, "login", u.getLogin());
+				add(result, "email", u.getAddress() == null ? "" : u.getAddress().getEmail());
+				add(result, "language", u.getLanguageId()); //TODO rights
+			}
+		}
+		return result;
+	}
 	
 	public List<Map<String, Object>> getVideoStreams() {
 		List<Map<String, Object>> result = new ArrayList<Map<String,Object>>();

Modified: openmeetings/trunk/singlewebapp/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/user/IUserManager.java
URL: http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/user/IUserManager.java?rev=1695468&r1=1695467&r2=1695468&view=diff
==============================================================================
--- openmeetings/trunk/singlewebapp/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/user/IUserManager.java (original)
+++ openmeetings/trunk/singlewebapp/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/user/IUserManager.java Wed Aug 12 10:39:39 2015
@@ -18,11 +18,17 @@
  */
 package org.apache.openmeetings.db.dao.user;
 
+import java.io.IOException;
+import java.security.NoSuchAlgorithmException;
 import java.util.Date;
 import java.util.List;
+import java.util.Locale;
+import java.util.Map;
 import java.util.Set;
 import java.util.TimeZone;
 
+import org.apache.openmeetings.db.entity.user.State;
+import org.apache.openmeetings.db.entity.user.User;
 import org.apache.openmeetings.db.entity.user.User.Right;
 import org.apache.openmeetings.db.entity.user.Userdata;
 
@@ -44,6 +50,11 @@ public interface IUserManager {
 			String userOffers, String userSearchs, Boolean showContactData,
 			Boolean showContactDataToContacts, String activatedHash) throws Exception;
 
+	Long getLanguage(Locale loc);
+	State getCountry(Locale loc);
+	User loginOAuth(Map<String, String> params, long serverId) throws IOException, NoSuchAlgorithmException;
+
+	/** TODO FIXME seems to be unused **/
 	Boolean kickUserByStreamId(String SID, Long roomId);
 	
 	Boolean kickUserByPublicSID(String SID, String publicSID);

Modified: openmeetings/trunk/singlewebapp/openmeetings-install/src/main/java/org/apache/openmeetings/installation/ImportInitvalues.java
URL: http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/openmeetings-install/src/main/java/org/apache/openmeetings/installation/ImportInitvalues.java?rev=1695468&r1=1695467&r2=1695468&view=diff
==============================================================================
--- openmeetings/trunk/singlewebapp/openmeetings-install/src/main/java/org/apache/openmeetings/installation/ImportInitvalues.java (original)
+++ openmeetings/trunk/singlewebapp/openmeetings-install/src/main/java/org/apache/openmeetings/installation/ImportInitvalues.java Wed Aug 12 10:39:39 2015
@@ -37,6 +37,7 @@ import static org.apache.openmeetings.ut
 import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_IGNORE_BAD_SSL;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_LOGIN_MIN_LENGTH_KEY;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_MAX_UPLOAD_SIZE_KEY;
+import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_OAUTH_REGISTER_KEY;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_PASS_MIN_LENGTH_KEY;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_REDIRECT_URL_FOR_EXTERNAL_KEY;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_RSS_FEED1_KEY;
@@ -293,6 +294,7 @@ public class ImportInitvalues {
 
 		cfgDao.add(CONFIG_FRONTEND_REGISTER_KEY, cfg.allowFrontendRegister, null, "Is user register available on login screen");
 		cfgDao.add(CONFIG_SOAP_REGISTER_KEY, "1", null, "Is user register available via SOAP/REST");
+		cfgDao.add(CONFIG_OAUTH_REGISTER_KEY, "1", null, "Is user register available via OAuth");
 		// this group_id is the Organisation of users who register through the frontend or SOAP
 		cfgDao.add(CONFIG_DEFAULT_GROUP_ID, "1", null, "");
 

Modified: openmeetings/trunk/singlewebapp/openmeetings-service/src/main/java/org/apache/openmeetings/service/user/UserManager.java
URL: http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/openmeetings-service/src/main/java/org/apache/openmeetings/service/user/UserManager.java?rev=1695468&r1=1695467&r2=1695468&view=diff
==============================================================================
--- openmeetings/trunk/singlewebapp/openmeetings-service/src/main/java/org/apache/openmeetings/service/user/UserManager.java (original)
+++ openmeetings/trunk/singlewebapp/openmeetings-service/src/main/java/org/apache/openmeetings/service/user/UserManager.java Wed Aug 12 10:39:39 2015
@@ -19,16 +19,22 @@
 package org.apache.openmeetings.service.user;
 
 import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_DEFAULT_GROUP_ID;
+import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_DEFAULT_LANG_KEY;
 import static org.apache.openmeetings.db.util.UserHelper.getMinLoginLength;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_SOAP_REGISTER_KEY;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.webAppRootKey;
 
+import java.io.IOException;
+import java.security.NoSuchAlgorithmException;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.Random;
 import java.util.Set;
 import java.util.TimeZone;
 
@@ -39,6 +45,7 @@ import javax.persistence.TypedQuery;
 import org.apache.openmeetings.core.mail.MailHandler;
 import org.apache.openmeetings.core.remote.red5.ScopeApplicationAdapter;
 import org.apache.openmeetings.db.dao.basic.ConfigurationDao;
+import org.apache.openmeetings.db.dao.label.LabelDao;
 import org.apache.openmeetings.db.dao.server.ISessionManager;
 import org.apache.openmeetings.db.dao.server.SessiondataDao;
 import org.apache.openmeetings.db.dao.user.IUserManager;
@@ -51,8 +58,10 @@ import org.apache.openmeetings.db.entity
 import org.apache.openmeetings.db.entity.server.Sessiondata;
 import org.apache.openmeetings.db.entity.user.Address;
 import org.apache.openmeetings.db.entity.user.OrganisationUser;
+import org.apache.openmeetings.db.entity.user.State;
 import org.apache.openmeetings.db.entity.user.User;
 import org.apache.openmeetings.db.entity.user.User.Right;
+import org.apache.openmeetings.db.entity.user.User.Type;
 import org.apache.openmeetings.db.entity.user.Userdata;
 import org.apache.openmeetings.db.util.AuthLevelUtil;
 import org.apache.openmeetings.db.util.TimezoneUtil;
@@ -82,15 +91,15 @@ public class UserManager implements IUse
 	@Autowired
 	private SessiondataDao sessiondataDao;
 	@Autowired
-	private ConfigurationDao configurationDao;
+	private ConfigurationDao cfgDao;
 	@Autowired
-	private StateDao statemanagement;
+	private StateDao stateDao;
 	@Autowired
 	private OrganisationDao orgDao;
 	@Autowired
 	private OrganisationUserDao orgUserDao;
 	@Autowired
-	private UserDao usersDao;
+	private UserDao userDao;
 	@Autowired
 	private EmailManager emailManagement;
 	@Autowired
@@ -107,7 +116,7 @@ public class UserManager implements IUse
 		try {
 			SearchResult<User> sresult = new SearchResult<User>();
 			sresult.setObjectName(User.class.getName());
-			sresult.setRecords(usersDao.count(search));
+			sresult.setRecords(userDao.count(search));
 
 			String sort = null;
 			if (orderby != null && orderby.length() > 0) {
@@ -150,7 +159,7 @@ public class UserManager implements IUse
 
 			if (sessionData != null) {
 
-				User u = usersDao.get(sessionData.getUserId());
+				User u = userDao.get(sessionData.getUserId());
 
 				sessiondataDao.updateUserWithoutSession(SID, u.getId());
 
@@ -290,19 +299,19 @@ public class UserManager implements IUse
 			boolean generateSipUserData, String jNameTimeZone, Boolean sendConfirmation) {
 		try {
 			// Checks if FrontEndUsers can register
-			if ("1".equals(configurationDao.getConfValue(CONFIG_SOAP_REGISTER_KEY, String.class, "0"))) {
+			if ("1".equals(cfgDao.getConfValue(CONFIG_SOAP_REGISTER_KEY, String.class, "0"))) {
 				if (sendConfirmation == null) {
-					String baseURL = configurationDao.getBaseUrl();
+					String baseURL = cfgDao.getBaseUrl();
 					sendConfirmation = baseURL != null
 							&& !baseURL.isEmpty()
-							&& 1 == configurationDao.getConfValue("sendEmailWithVerficationCode", Integer.class, "0");
+							&& 1 == cfgDao.getConfValue("sendEmailWithVerficationCode", Integer.class, "0");
 				}
 				// TODO: Read and generate SIP-Data via RPC-Interface Issue 1098
 
 				Long userId = registerUserInit(UserDao.getDefaultRights(), login,
 						Userpass, lastname, firstname, email, age, street,
 						additionalname, fax, zip, stateId, town, languageId,
-						true, Arrays.asList(configurationDao.getConfValue(CONFIG_DEFAULT_GROUP_ID, Long.class, null)), phone,
+						true, Arrays.asList(cfgDao.getConfValue(CONFIG_DEFAULT_GROUP_ID, Long.class, null)), phone,
 						sendSMS, sendConfirmation, timezoneUtil.getTimeZone(jNameTimeZone), false, "", "", false, true, null);
 
 				if (userId > 0 && sendConfirmation) {
@@ -360,13 +369,13 @@ public class UserManager implements IUse
 			Boolean showContactDataToContacts, String activatedHash) throws Exception {
 		// TODO: make phone number persistent
 		// Check for required data
-		if (login.length() >= getMinLoginLength(configurationDao)) {
+		if (login.length() >= getMinLoginLength(cfgDao)) {
 			// Check for duplicates
-			boolean checkName = usersDao.checkLogin(login, User.Type.user, null, null);
-			boolean checkEmail = Strings.isEmpty(email) || usersDao.checkEmail(email, User.Type.user, null, null);
+			boolean checkName = userDao.checkLogin(login, User.Type.user, null, null);
+			boolean checkEmail = Strings.isEmpty(email) || userDao.checkEmail(email, User.Type.user, null, null);
 			if (checkName && checkEmail) {
 
-				String link = configurationDao.getBaseUrl();
+				String link = cfgDao.getBaseUrl();
 				String hash = activatedHash;
 				if (hash == null){
 					hash = ManageCryptStyle.getInstanceOfCrypt().createPassPhrase(login
@@ -380,7 +389,7 @@ public class UserManager implements IUse
 					if (!sendMail.equals("success"))
 						return -19L;
 				}
-				Address adr =  usersDao.getAddress(street, zip, town, stateId, additionalname, fax, phone, email);
+				Address adr =  userDao.getAddress(street, zip, town, stateId, additionalname, fax, phone, email);
 
 				// If this user needs first to click his E-Mail verification
 				// code then set the status to 0
@@ -392,7 +401,7 @@ public class UserManager implements IUse
 				for (Long id : organisations) {
 					orgList.add(new OrganisationUser(orgDao.get(id)));
 				}
-				User u = usersDao.addUser(rights, firstname, login, lastname, languageId,
+				User u = userDao.addUser(rights, firstname, login, lastname, languageId,
 						password, adr, sendSMS, age, hash, timezone,
 						forceTimeZoneCheck, userOffers, userSearchs, showContactData,
 						showContactDataToContacts, null, null, orgList, null);
@@ -427,7 +436,7 @@ public class UserManager implements IUse
 			Long users_id = sessiondataDao.checkSession(SID);
 
 			// admins only
-			if (AuthLevelUtil.hasAdminLevel(usersDao.getRights(users_id))) {
+			if (AuthLevelUtil.hasAdminLevel(userDao.getRights(users_id))) {
 
 				sessiondataDao.clearSessionByRoomId(room_id);
 
@@ -459,7 +468,7 @@ public class UserManager implements IUse
 			Long userId = sessiondataDao.checkSession(SID);
 
 			// admins only
-			if (AuthLevelUtil.hasWebServiceLevel(usersDao.getRights(userId))) {
+			if (AuthLevelUtil.hasWebServiceLevel(userDao.getRights(userId))) {
 				Client rcl = sessionManager.getClientByPublicSID(publicSID, false, null);
 
 				if (rcl == null) {
@@ -485,4 +494,87 @@ public class UserManager implements IUse
 		}
 		return null;
 	}
+	
+	public Long getLanguage(Locale loc) {
+		if (loc != null) {
+			for (Map.Entry<Long, Locale> e : LabelDao.languages.entrySet()) {
+				if (loc.equals(e.getValue())) {
+					return e.getKey();
+				}
+			}
+		}
+		return cfgDao.getConfValue(CONFIG_DEFAULT_LANG_KEY, Long.class, "1");
+	}
+
+	public State getCountry(Locale loc) {
+		List<State> states = stateDao.get();
+		if (loc != null) {
+			String code = loc.getISO3Country().toUpperCase();
+			for (State s : states) {
+				if (s.getShortName().toUpperCase().equals(code)) {
+					return s;
+				}
+			}
+		}
+		return states.get(0);
+	}
+
+	public User loginOAuth(Map<String, String> params, long serverId) throws IOException, NoSuchAlgorithmException {
+		String login = params.get("login");
+		String email = params.get("email");
+		String lastname = params.get("lastname");
+		String firstname = params.get("firstname");
+		if (firstname == null) {
+			firstname = "";
+		}
+		if (lastname == null) {
+			lastname = "";
+		}
+		if (!userDao.validLogin(login)) {
+			log.error("Invalid login, please check parameters");
+			return null; //TODO FIXME need to be checked
+		}
+		User u = userDao.getByLogin(login, Type.oauth, serverId);
+		if (!userDao.checkEmail(email, Type.oauth, serverId, u == null ? null : u.getId())) {
+			log.error("Another user with the same email exists");
+			return null; //TODO FIXME need to be checked
+		}
+		// generate random password
+		byte[] rawPass = new byte[25];
+		Random rnd = new Random();
+		for (int i = 0; i < rawPass.length; ++i) {
+			rawPass[i] = (byte) ('!' + rnd.nextInt(93));
+		}
+		String pass = new String(rawPass, "UTF-8");
+		// check if the user already exists and register new one if it's needed
+		if (u == null) {
+			u = userDao.getNewUserInstance(null);
+			u.setType(Type.oauth);
+			u.getRights().remove(Right.Login);;
+			u.setDomainId(serverId);
+			u.getOrganisationUsers().add(new OrganisationUser(orgDao.get(cfgDao.getConfValue(CONFIG_DEFAULT_GROUP_ID, Long.class, "-1"))));
+			u.setLogin(login);
+			u.setShowContactDataToContacts(true);
+			u.setLastname(lastname);
+			u.setFirstname(firstname);
+			u.getAddress().setEmail(email);
+			String picture = params.get("picture");
+			if (picture != null) {
+				u.setPictureuri(picture);
+			}
+			String locale = params.get("locale");
+			if (locale != null) {
+				Locale loc = Locale.forLanguageTag(locale);
+				if (loc != null) {
+					u.setLanguageId(getLanguage(loc));
+					u.getAddress().setState(getCountry(loc));
+				}
+			}
+		}
+		//TODO FIXME should we update fields on login ????
+		u.setLastlogin(new Date());
+		u = userDao.update(u, pass, -1);
+		
+		return u;
+	}
 }

Modified: openmeetings/trunk/singlewebapp/openmeetings-util/src/main/java/org/apache/openmeetings/util/OpenmeetingsVariables.java
URL: http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/openmeetings-util/src/main/java/org/apache/openmeetings/util/OpenmeetingsVariables.java?rev=1695468&r1=1695467&r2=1695468&view=diff
==============================================================================
--- openmeetings/trunk/singlewebapp/openmeetings-util/src/main/java/org/apache/openmeetings/util/OpenmeetingsVariables.java (original)
+++ openmeetings/trunk/singlewebapp/openmeetings-util/src/main/java/org/apache/openmeetings/util/OpenmeetingsVariables.java Wed Aug 12 10:39:39 2015
@@ -25,6 +25,7 @@ public class OpenmeetingsVariables {
 	public static final String CONFIG_DEFAULT_LANG_KEY = "default_lang_id";
 	public static final String CONFIG_FRONTEND_REGISTER_KEY = "allow_frontend_register";
 	public static final String CONFIG_SOAP_REGISTER_KEY = "allow.soap.register";
+	public static final String CONFIG_OAUTH_REGISTER_KEY = "allow.oauth.register";
 	public static final String CONFIG_LOGIN_MIN_LENGTH_KEY = "user.login.minimum.length";
 	public static final String CONFIG_MAX_UPLOAD_SIZE_KEY = "max_upload_size";
 	public static final String CONFIG_PASS_MIN_LENGTH_KEY = "user.pass.minimum.length";

Modified: openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/WebSession.java
URL: http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/WebSession.java?rev=1695468&r1=1695467&r2=1695468&view=diff
==============================================================================
--- openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/WebSession.java (original)
+++ openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/WebSession.java Wed Aug 12 10:39:39 2015
@@ -37,7 +37,6 @@ import java.util.Iterator;
 import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Locale;
-import java.util.Map;
 import java.util.Set;
 import java.util.TimeZone;
 
@@ -47,7 +46,7 @@ import org.apache.openmeetings.db.dao.ba
 import org.apache.openmeetings.db.dao.label.LabelDao;
 import org.apache.openmeetings.db.dao.server.SOAPLoginDao;
 import org.apache.openmeetings.db.dao.server.SessiondataDao;
-import org.apache.openmeetings.db.dao.user.StateDao;
+import org.apache.openmeetings.db.dao.user.IUserManager;
 import org.apache.openmeetings.db.dao.user.UserDao;
 import org.apache.openmeetings.db.entity.server.RemoteSessionObject;
 import org.apache.openmeetings.db.entity.server.SOAPLogin;
@@ -246,8 +245,6 @@ public class WebSession extends Abstract
 	}
 	
 	public boolean signIn(String login, String password, Type type, Long domainId) {
-		Sessiondata sessData = getBean(SessiondataDao.class).startsession();
-		SID = sessData.getSessionId();
 		try {
 			User u = null;
 			switch (type) {
@@ -268,7 +265,7 @@ public class WebSession extends Abstract
 			if (u == null) {
 				return false;
 			}
-			setUser(u);
+			signIn(u);
 			return true;
 		} catch (OmException oe) {
 			loginError = oe.getCode() == null ? -1L : oe.getCode();
@@ -276,6 +273,16 @@ public class WebSession extends Abstract
 		return false;
 	}
 	
+	public boolean signIn(User u) {
+		Sessiondata sessData = getBean(SessiondataDao.class).startsession();
+		SID = sessData.getSessionId();
+		if (u == null) {
+			return false;
+		}
+		setUser(u);
+		return true;
+	}
+	
 	public Long getLoginError() {
 		return loginError;
 	}
@@ -381,23 +388,11 @@ public class WebSession extends Abstract
 	}
 
 	public Long getLanguageByBrowserLocale() {
-		for (Map.Entry<Long, Locale> e : LabelDao.languages.entrySet()) {
-			if (getBrowserLocale().equals(e.getValue())) {
-				return e.getKey();
-			}
-		}
-		return getBean(ConfigurationDao.class).getConfValue(CONFIG_DEFAULT_LANG_KEY, Long.class, "1");
+		return getBean(IUserManager.class).getLanguage(getBrowserLocale());
 	}
 
 	public State getCountryByBrowserLocale() {
-		List<State> states = getBean(StateDao.class).get();
-		String code = getBrowserLocale().getISO3Country().toUpperCase();
-		for (State s : states) {
-			if (s.getShortName().toUpperCase().equals(code)){
-				return s;
-			}
-		}
-		return states.get(0);
+		return getBean(IUserManager.class).getCountry(getBrowserLocale());
 	}
 
 	public String getClientTZCode() {

Modified: openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/SignInPage.java
URL: http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/SignInPage.java?rev=1695468&r1=1695467&r2=1695468&view=diff
==============================================================================
--- openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/SignInPage.java (original)
+++ openmeetings/trunk/singlewebapp/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/SignInPage.java Wed Aug 12 10:39:39 2015
@@ -18,7 +18,6 @@
  */
 package org.apache.openmeetings.web.pages.auth;
 
-import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_DEFAULT_GROUP_ID;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_FRONTEND_REGISTER_KEY;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_IGNORE_BAD_SSL;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.webAppRootKey;
@@ -36,10 +35,8 @@ import java.net.URLEncoder;
 import java.security.NoSuchAlgorithmException;
 import java.security.cert.CertificateException;
 import java.security.cert.X509Certificate;
-import java.util.Date;
 import java.util.HashMap;
 import java.util.Map;
-import java.util.Random;
 
 import javax.net.ssl.HostnameVerifier;
 import javax.net.ssl.HttpsURLConnection;
@@ -52,12 +49,9 @@ import javax.net.ssl.X509TrustManager;
 import org.apache.commons.io.IOUtils;
 import org.apache.openmeetings.db.dao.basic.ConfigurationDao;
 import org.apache.openmeetings.db.dao.server.OAuth2Dao;
-import org.apache.openmeetings.db.dao.user.OrganisationDao;
-import org.apache.openmeetings.db.dao.user.UserDao;
+import org.apache.openmeetings.db.dao.user.IUserManager;
 import org.apache.openmeetings.db.entity.server.OAuthServer;
-import org.apache.openmeetings.db.entity.user.OrganisationUser;
 import org.apache.openmeetings.db.entity.user.User;
-import org.apache.openmeetings.db.entity.user.User.Right;
 import org.apache.openmeetings.db.entity.user.User.Type;
 import org.apache.openmeetings.web.app.Application;
 import org.apache.openmeetings.web.app.WebSession;
@@ -337,51 +331,9 @@ public class SignInPage extends BaseInit
 	}
 	
 	private void loginViaOAuth2(Map<String, String> params, long serverId) throws IOException, NoSuchAlgorithmException {
-		UserDao userDao = getBean(UserDao.class);
-		ConfigurationDao cfgDao = getBean(ConfigurationDao.class);
-		String login = params.get("login");
-		String email = params.get("email");
-		String lastname = params.get("lastname");
-		String firstname = params.get("firstname");
-		if (firstname == null) {
-			firstname = "";
-		}
-		if (lastname == null) {
-			lastname = "";
-		}
-		if (!userDao.validLogin(login)) {
-			log.error("Invalid login, please check parameters");
-			return;
-		}
-		User u = userDao.getByLogin(login, Type.oauth, serverId);
-		if (!userDao.checkEmail(email, Type.oauth, serverId, u == null ? null : u.getId())) {
-			log.error("Another user with the same email exists");
-			return;
-		}
-		// generate random password
-		byte[] rawPass = new byte[25];
-		Random rnd = new Random();
-		for (int i = 0; i < rawPass.length; ++i) {
-			rawPass[i] = (byte) ('!' + rnd.nextInt(93));
-		}
-		String pass = new String(rawPass, "UTF-8");
-		// check if the user already exists and register new one if it's needed
-		if (u == null) {
-			u = userDao.getNewUserInstance(null);
-			u.setType(Type.oauth);
-			u.getRights().remove(Right.Login);;
-			u.setDomainId(serverId);
-			u.getOrganisationUsers().add(new OrganisationUser(getBean(OrganisationDao.class).get(cfgDao.getConfValue(CONFIG_DEFAULT_GROUP_ID, Long.class, "-1"))));
-			u.setLogin(login);
-			u.setShowContactDataToContacts(true);
-			u.setLastname(lastname);
-			u.setFirstname(firstname);
-			u.getAddress().setEmail(email);
-		}
-		u.setLastlogin(new Date());
-		u = userDao.update(u, pass, -1);
+		User u = getBean(IUserManager.class).loginOAuth(params, serverId);
 		
-		if (WebSession.get().signIn(login, pass, Type.oauth, serverId)) {
+		if (u != null && WebSession.get().signIn(u)) {
  			setResponsePage(Application.get().getHomePage());
 		} else {
 			log.error("Failed to login via OAuth2!");