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 2017/10/23 09:14:12 UTC

openmeetings git commit: [OPENMEETINGS-1727] parsing for VK json is added

Repository: openmeetings
Updated Branches:
  refs/heads/master 49e95402b -> 737df6e87


[OPENMEETINGS-1727] parsing for VK json is added


Project: http://git-wip-us.apache.org/repos/asf/openmeetings/repo
Commit: http://git-wip-us.apache.org/repos/asf/openmeetings/commit/737df6e8
Tree: http://git-wip-us.apache.org/repos/asf/openmeetings/tree/737df6e8
Diff: http://git-wip-us.apache.org/repos/asf/openmeetings/diff/737df6e8

Branch: refs/heads/master
Commit: 737df6e873aac5f4968f280e29502df9b6a5c37e
Parents: 49e9540
Author: Maxim Solodovnik <so...@gmail.com>
Authored: Mon Oct 23 16:14:03 2017 +0700
Committer: Maxim Solodovnik <so...@gmail.com>
Committed: Mon Oct 23 16:14:03 2017 +0700

----------------------------------------------------------------------
 .../openmeetings/core/remote/MobileService.java |   3 +-
 .../openmeetings/db/dao/user/IUserManager.java  |   5 +-
 .../openmeetings/db/dto/user/OAuthUser.java     | 140 +++++++++++++++++++
 .../openmeetings/db/dto/user/TestOAuthUser.java |  74 ++++++++++
 .../openmeetings/service/user/UserManager.java  |  31 ++--
 .../openmeetings/web/pages/auth/SignInPage.java |  32 +----
 6 files changed, 236 insertions(+), 49 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/openmeetings/blob/737df6e8/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/MobileService.java
----------------------------------------------------------------------
diff --git a/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/MobileService.java b/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/MobileService.java
index 2ac3c13..53b6685 100644
--- a/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/MobileService.java
+++ b/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/MobileService.java
@@ -53,6 +53,7 @@ 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.dto.user.OAuthUser;
 import org.apache.openmeetings.db.entity.basic.ChatMessage;
 import org.apache.openmeetings.db.entity.basic.Client;
 import org.apache.openmeetings.db.entity.room.Room;
@@ -139,7 +140,7 @@ public class MobileService {
 		Map<String, Object> result = getResult();
 		try {
 			if (cfgDao.getBool(CONFIG_REGISTER_OAUTH, false)) {
-				User u = userManager.loginOAuth(umap, 2); //TODO hardcoded
+				User u = userManager.loginOAuth(new OAuthUser(umap), 2); //TODO hardcoded
 				result = login(u, result);
 			}
 		} catch (Exception e) {

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/737df6e8/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/user/IUserManager.java
----------------------------------------------------------------------
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/user/IUserManager.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/user/IUserManager.java
index 93d420a..9109612 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/user/IUserManager.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/user/IUserManager.java
@@ -23,17 +23,16 @@ 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.dto.user.OAuthUser;
 import org.apache.openmeetings.db.entity.user.User;
 import org.apache.openmeetings.db.entity.user.User.Right;
 import org.apache.openmeetings.util.OmException;
 
 //HACK to bypass cross project compilation
 public interface IUserManager {
-
 	Object registerUser(String login, String userpass, String lastname,
 			String firstname, String email, Date age, String street,
 			String additionalname, String fax, String zip, String country,
@@ -50,7 +49,7 @@ public interface IUserManager {
 			Boolean showContactDataToContacts, String activatedHash) throws OmException, NoSuchAlgorithmException;
 
 	Long getLanguage(Locale loc);
-	User loginOAuth(Map<String, String> params, long serverId) throws IOException, NoSuchAlgorithmException;
+	User loginOAuth(OAuthUser user, long serverId) throws IOException, NoSuchAlgorithmException;
 
 	boolean kickById(String uid);
 	boolean kickUsersByRoomId(Long roomId);

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/737df6e8/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/user/OAuthUser.java
----------------------------------------------------------------------
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/user/OAuthUser.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/user/OAuthUser.java
new file mode 100644
index 0000000..faf51b1
--- /dev/null
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/user/OAuthUser.java
@@ -0,0 +1,140 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License") +  you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.openmeetings.db.dto.user;
+
+import static org.apache.openmeetings.util.OpenmeetingsVariables.getWebAppRootKey;
+
+import java.io.Serializable;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.Map;
+
+import org.apache.openmeetings.db.entity.server.OAuthServer;
+import org.red5.logging.Red5LoggerFactory;
+import org.slf4j.Logger;
+
+import com.github.openjson.JSONArray;
+import com.github.openjson.JSONException;
+import com.github.openjson.JSONObject;
+
+public class OAuthUser implements Serializable {
+	private static final long serialVersionUID = 1L;
+	private static final Logger log = Red5LoggerFactory.getLogger(OAuthUser.class, getWebAppRootKey());
+	private final String uid;
+	private String email;
+	private String firstName;
+	private String lastName;
+	private String picture;
+	private String locale;
+
+	/**
+	 * OAuth constructor
+	 *
+	 * @param jsonStr - json data from server as string
+	 * @param server - {@link OAuthServer} to get mapping
+	 */
+	public OAuthUser(String jsonStr, OAuthServer server) {
+		// get attributes names
+		String email = server.getEmailParamName();
+		String firstname = server.getFirstnameParamName();
+		String lastname = server.getLastnameParamName();
+		JSONObject json = getJSON(jsonStr, server.getLoginParamName());
+		String login = json.getString(server.getLoginParamName());
+
+		this.uid = login;
+		try {
+			this.email = json.has(email)
+					? json.getString(email)
+					: String.format("%s@%s", login, new URL(server.getIconUrl()).getHost());
+		} catch (JSONException | MalformedURLException e) {
+			this.email = null;
+			// no-op, bad user
+			log.error("Failed to get user from JSON: {}", json);
+		}
+		if (json.has(firstname)) {
+			this.firstName = json.getString(firstname);
+		}
+		if (json.has(lastname)) {
+			this.lastName = json.getString(lastname);
+		}
+	}
+
+	/**
+	 * constructor for mobile service
+	 *
+	 * @param umap - google data
+	 */
+	public OAuthUser(Map<String, String> umap) {
+		this.uid = umap.get("login");
+		this.email = umap.get("email");
+		this.firstName = umap.get("firstname");
+		this.lastName = umap.get("lastname");
+	}
+
+	public String getUid() {
+		return uid;
+	}
+
+	public String getEmail() {
+		return email;
+	}
+
+	public String getFirstName() {
+		return firstName;
+	}
+
+	public String getLastName() {
+		return lastName;
+	}
+
+	public String getPicture() {
+		return picture;
+	}
+
+	public String getLocale() {
+		return locale;
+	}
+
+	private static JSONObject getJSON(String str, String prop) {
+		JSONObject json = new JSONObject(str);
+		if (json.has(prop)) {
+			return json;
+		}
+		// will only check 1 additional level
+		for (String key : json.keySet()) {
+			Object o = json.get(key);
+			if (o instanceof JSONObject) {
+				JSONObject jo = (JSONObject)o;
+				if (jo.has(prop)) {
+					return jo;
+				}
+			} else if (o instanceof JSONArray) {
+				JSONArray ja = (JSONArray)o;
+				//Assuming here array consist of objects
+				for (int i = 0; i < ja.length(); ++i) {
+					JSONObject jao = ja.getJSONObject(i);
+					if (jao.has(prop)) {
+						return jao;
+					}
+				}
+			}
+		}
+		return new JSONObject();
+	}
+}

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/737df6e8/openmeetings-db/src/test/java/org/apache/openmeetings/db/dto/user/TestOAuthUser.java
----------------------------------------------------------------------
diff --git a/openmeetings-db/src/test/java/org/apache/openmeetings/db/dto/user/TestOAuthUser.java b/openmeetings-db/src/test/java/org/apache/openmeetings/db/dto/user/TestOAuthUser.java
new file mode 100644
index 0000000..2354bd0
--- /dev/null
+++ b/openmeetings-db/src/test/java/org/apache/openmeetings/db/dto/user/TestOAuthUser.java
@@ -0,0 +1,74 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * 'License') +  you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * 'AS IS' BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.openmeetings.db.dto.user;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+
+import org.apache.openmeetings.db.entity.server.OAuthServer;
+import org.junit.Test;
+
+public class TestOAuthUser {
+	@Test
+	public void firstLevel() {
+		OAuthServer server = new OAuthServer();
+		server.setLoginParamName("id");
+		server.setEmailParamName("email");
+		server.setFirstnameParamName("given_name");
+		server.setLastnameParamName("family_name");
+		OAuthUser user = new OAuthUser(
+				"{'id': '11klahjsfwehf5', 'email': 'alsfkvslvmclqwkdsm@gmail.com', 'verified_email': true, 'name': 'John Doe', 'given_name': 'John', 'family_name': 'Doe', 'link': 'https://plus.google.com/+JohnDoe', 'picture': 'https://lh3.googleusercontent.com/somehash/photo.jpg', 'gender': 'male', 'locale': 'en'}"
+				, server
+				);
+		assertEquals("UID should be correct", "11klahjsfwehf5", user.getUid());
+		assertEquals("Email should be correct", "alsfkvslvmclqwkdsm@gmail.com", user.getEmail());
+		assertEquals("Firstname should be correct", "John", user.getFirstName());
+		assertEquals("Lastname should be correct", "Doe", user.getLastName());
+	}
+
+	@Test
+	public void secondLevel() {
+		OAuthServer server = new OAuthServer();
+		server.setLoginParamName("uid");
+		server.setEmailParamName("email");
+		server.setFirstnameParamName("first_name");
+		server.setLastnameParamName("last_name");
+		OAuthUser user = new OAuthUser(
+				"{'response':[{'uid':4uidhere4,'first_name':'John','last_name':'Doe'}]}"
+				, server
+				);
+		assertEquals("UID should be correct", "4uidhere4", user.getUid());
+		assertNull("Email should be empty", user.getEmail());
+		assertEquals("Firstname should be correct", "John", user.getFirstName());
+		assertEquals("Lastname should be correct", "Doe", user.getLastName());
+
+		server.setIconUrl("https://goo.gl/images/q23g7Y");
+		user = new OAuthUser(
+				"{'response':[{'uid':4uidhere4,'first_name':'John','last_name':'Doe'}]}"
+				, server
+				);
+		assertEquals("Email should be constructed", "4uidhere4@goo.gl", user.getEmail());
+	}
+	/*
+{'id': '11klahjsfwehf5', 'email': 'alsfkvslvmclqwkdsm@gmail.com', 'verified_email': true, 'name': 'John Doe', 'given_name': 'John', 'family_name': 'Doe', 'link': 'https://plus.google.com/+JohnDoe', 'picture': 'https://lh3.googleusercontent.com/somehash/photo.jpg', 'gender': 'male', 'locale': 'en'}
+*/
+/*
+{'response':[{'uid':4uidhere4,'first_name':'John','last_name':'Doe'}]}
+*/
+}

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/737df6e8/openmeetings-service/src/main/java/org/apache/openmeetings/service/user/UserManager.java
----------------------------------------------------------------------
diff --git a/openmeetings-service/src/main/java/org/apache/openmeetings/service/user/UserManager.java b/openmeetings-service/src/main/java/org/apache/openmeetings/service/user/UserManager.java
index a30c769..dbe9a72 100644
--- a/openmeetings-service/src/main/java/org/apache/openmeetings/service/user/UserManager.java
+++ b/openmeetings-service/src/main/java/org/apache/openmeetings/service/user/UserManager.java
@@ -50,6 +50,7 @@ import org.apache.openmeetings.db.dao.server.SessiondataDao;
 import org.apache.openmeetings.db.dao.user.GroupDao;
 import org.apache.openmeetings.db.dao.user.IUserManager;
 import org.apache.openmeetings.db.dao.user.UserDao;
+import org.apache.openmeetings.db.dto.user.OAuthUser;
 import org.apache.openmeetings.db.entity.room.StreamClient;
 import org.apache.openmeetings.db.entity.user.Address;
 import org.apache.openmeetings.db.entity.user.GroupUser;
@@ -342,23 +343,13 @@ public class UserManager implements IUserManager {
 	}
 
 	@Override
-	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)) {
+	public User loginOAuth(OAuthUser user, long serverId) throws IOException, NoSuchAlgorithmException {
+		if (!userDao.validLogin(user.getUid())) {
 			log.error("Invalid login, please check parameters");
 			return null;
 		}
-		User u = userDao.getByLogin(login, Type.oauth, serverId);
-		if (!userDao.checkEmail(email, Type.oauth, serverId, u == null ? null : u.getId())) {
+		User u = userDao.getByLogin(user.getUid(), Type.oauth, serverId);
+		if (!userDao.checkEmail(user.getEmail(), Type.oauth, serverId, u == null ? null : u.getId())) {
 			log.error("Another user with the same email exists");
 			return null;
 		}
@@ -374,16 +365,16 @@ public class UserManager implements IUserManager {
 			u.getRights().remove(Right.Login);
 			u.setDomainId(serverId);
 			u.getGroupUsers().add(new GroupUser(groupDao.get(cfgDao.getLong(CONFIG_DEFAULT_GROUP_ID, null)), u));
-			u.setLogin(login);
+			u.setLogin(user.getUid());
 			u.setShowContactDataToContacts(true);
-			u.setLastname(lastname);
-			u.setFirstname(firstname);
-			u.getAddress().setEmail(email);
-			String picture = params.get("picture");
+			u.setLastname(user.getLastName());
+			u.setFirstname(user.getFirstName());
+			u.getAddress().setEmail(user.getEmail());
+			String picture = user.getPicture();
 			if (picture != null) {
 				u.setPictureuri(picture);
 			}
-			String locale = params.get("locale");
+			String locale = user.getLocale();
 			if (locale != null) {
 				Locale loc = Locale.forLanguageTag(locale);
 				if (loc != null) {

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/737df6e8/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/SignInPage.java
----------------------------------------------------------------------
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/SignInPage.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/SignInPage.java
index df0b412..920f3e9 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/SignInPage.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/SignInPage.java
@@ -36,8 +36,6 @@ import java.net.URLEncoder;
 import java.security.NoSuchAlgorithmException;
 import java.security.cert.CertificateException;
 import java.security.cert.X509Certificate;
-import java.util.HashMap;
-import java.util.Map;
 
 import javax.net.ssl.HttpsURLConnection;
 import javax.net.ssl.SSLContext;
@@ -49,6 +47,7 @@ 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.IUserManager;
+import org.apache.openmeetings.db.dto.user.OAuthUser;
 import org.apache.openmeetings.db.entity.server.OAuthServer;
 import org.apache.openmeetings.db.entity.user.User;
 import org.apache.openmeetings.db.entity.user.User.Type;
@@ -99,8 +98,8 @@ public class SignInPage extends BaseInitedPage {
 						return;
 					}
 					log.debug("OAuthInfo={}", authInfo);
-					Map<String, String> authParams = getAuthParams(authInfo.accessToken, code, server);
-					loginViaOAuth2(authParams, serverId);
+					OAuthUser user = getAuthParams(authInfo.accessToken, code, server);
+					loginViaOAuth2(user, serverId);
 				} else { // redirect to get code
 					showAuth(server);
 				}
@@ -266,11 +265,7 @@ public class SignInPage extends BaseInitedPage {
 		return result;
 	}
 
-	private static Map<String, String> getAuthParams(String token, String code, OAuthServer server) throws IOException {
-		// get attributes names
-		String email = server.getEmailParamName();
-		String firstname = server.getFirstnameParamName();
-		String lastname = server.getLastnameParamName();
+	private static OAuthUser getAuthParams(String token, String code, OAuthServer server) throws IOException {
 		// prepare url
 		String requestInfoUrl = server.getRequestInfoUrl();
 		requestInfoUrl = prepareUrlParams(requestInfoUrl, server.getClientId(), getRedirectUri(server)
@@ -280,24 +275,11 @@ public class SignInPage extends BaseInitedPage {
 		prepareConnection(connection);
 		String sourceResponse = IOUtils.toString(connection.getInputStream(), UTF_8);
 		// parse json result
-		Map<String, String> result = new HashMap<>();
-		JSONObject json = new JSONObject(sourceResponse);
-		String login = json.getString(server.getLoginParamName());
-		result.put("login", login);
-		result.put("email", json.has(email)
-				? json.getString(email)
-				: String.format("%s@%s", login, new URL(server.getIconUrl()).getHost()));
-		if (json.has(firstname)) {
-			result.put("firstname", json.getString(firstname));
-		}
-		if (json.has(lastname)) {
-			result.put("lastname", json.getString(lastname));
-		}
-		return result;
+		return new OAuthUser(sourceResponse, server);
 	}
 
-	private void loginViaOAuth2(Map<String, String> params, long serverId) throws IOException, NoSuchAlgorithmException {
-		User u = getBean(IUserManager.class).loginOAuth(params, serverId);
+	private void loginViaOAuth2(OAuthUser user, long serverId) throws IOException, NoSuchAlgorithmException {
+		User u = getBean(IUserManager.class).loginOAuth(user, serverId);
 
 		if (u != null && WebSession.get().signIn(u)) {
 			setResponsePage(Application.get().getHomePage());