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());