001/* 002 * (C) Copyright 2006-2013 Nuxeo SA (http://nuxeo.com/) and others. 003 * 004 * Licensed under the Apache License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.apache.org/licenses/LICENSE-2.0 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013 * See the License for the specific language governing permissions and 014 * limitations under the License. 015 * 016 * Contributors: 017 * Nelson Silva <[email protected]> 018 */ 019package org.nuxeo.ecm.platform.oauth2.openid.auth; 020 021import java.io.Serializable; 022import java.util.HashMap; 023import java.util.Map; 024 025import org.apache.commons.logging.Log; 026import org.apache.commons.logging.LogFactory; 027import org.nuxeo.ecm.core.api.DocumentModel; 028import org.nuxeo.ecm.core.api.DocumentModelList; 029import org.nuxeo.ecm.core.api.model.PropertyNotFoundException; 030import org.nuxeo.ecm.directory.DirectoryException; 031import org.nuxeo.ecm.directory.Session; 032import org.nuxeo.ecm.directory.api.DirectoryService; 033import org.nuxeo.runtime.api.Framework; 034 035public class OpenIDUserInfoStoreImpl implements OpenIDUserInfoStore { 036 037 protected static final Log log = LogFactory.getLog(OpenIDUserInfoStoreImpl.class); 038 039 public static final String DIRECTORY_NAME = "openIdUserInfos"; 040 041 public static final String SCHEMA_NAME = "openIdUserInfo"; 042 043 public static final String NUXEO_LOGIN_KEY = "nuxeoLogin"; 044 045 public static final String OPENID_SUBJECT_KEY = "subject"; 046 047 public static final String OPENID_PROVIDER_KEY = "provider"; 048 049 public static final String ID = "id"; 050 051 private String providerName; 052 053 public OpenIDUserInfoStoreImpl(String providerName) { 054 this.providerName = providerName; 055 } 056 057 @Override 058 public void storeUserInfo(String userId, OpenIDUserInfo userInfo) { 059 DirectoryService ds = Framework.getService(DirectoryService.class); 060 try (Session session = ds.open(DIRECTORY_NAME)) { 061 Map<String, Object> data = new HashMap<String, Object>(); 062 063 // Generate an ID 064 String userInfoId = getID(providerName, userInfo.getSubject()); 065 066 data.put(NUXEO_LOGIN_KEY, userId); 067 data.put(OPENID_PROVIDER_KEY, providerName); 068 069 // Copy the standard fields 070 data.put(OPENID_SUBJECT_KEY, userInfo.getSubject()); 071 data.put("name", userInfo.getName()); 072 data.put("given_name", userInfo.getGivenName()); 073 data.put("family_name", userInfo.getFamilyName()); 074 data.put("middle_name", userInfo.getMiddleName()); 075 data.put("nickname", userInfo.getNickname()); 076 data.put("preferred_username", userInfo.getPreferredUsername()); 077 data.put("profile", userInfo.getProfile()); 078 data.put("picture", userInfo.getPicture()); 079 data.put("website", userInfo.getWebsite()); 080 data.put("email", userInfo.getEmail()); 081 data.put("email_verified", userInfo.isEmailVerified()); 082 data.put("gender", userInfo.getGender()); 083 data.put("birthdate", userInfo.getBirthdate()); 084 data.put("zoneinfo", userInfo.getZoneInfo()); 085 data.put("locale", userInfo.getLocale()); 086 data.put("phone_number", userInfo.getPhoneNumber()); 087 data.put("address", userInfo.getAddress()); 088 data.put("updated_time", userInfo.getUpdatedTime()); 089 090 if (session.hasEntry(userInfoId)) { 091 DocumentModel userInfoDoc = session.getEntry(userInfoId); 092 userInfoDoc.setProperties(SCHEMA_NAME, data); 093 session.updateEntry(userInfoDoc); 094 } else { 095 data.put(ID, userInfoId); 096 session.createEntry(data); 097 } 098 099 } catch (DirectoryException e) { 100 log.error("Error during token storage", e); 101 } 102 } 103 104 @Override 105 public String getNuxeoLogin(OpenIDUserInfo userInfo) { 106 DirectoryService ds = Framework.getService(DirectoryService.class); 107 try (Session session = ds.open(DIRECTORY_NAME)) { 108 DocumentModel entry = session.getEntry(getID(providerName, userInfo.getSubject())); 109 if (entry == null) { 110 return null; 111 } 112 return (String) entry.getPropertyValue(SCHEMA_NAME + ":" + NUXEO_LOGIN_KEY); 113 } catch (PropertyNotFoundException e) { 114 log.error("Error retrieving OpenID user info", e); 115 return null; 116 } 117 } 118 119 @Override 120 public OpenIDUserInfo getUserInfo(String nuxeoLogin) { 121 DirectoryService ds = Framework.getService(DirectoryService.class); 122 try (Session session = ds.open(DIRECTORY_NAME)) { 123 Map<String, Serializable> filter = new HashMap<String, Serializable>(); 124 filter.put(OPENID_PROVIDER_KEY, providerName); 125 filter.put(NUXEO_LOGIN_KEY, nuxeoLogin); 126 DocumentModelList entries = session.query(filter); 127 if (entries.size() == 0) { 128 return null; 129 } 130 DocumentModel entry = entries.get(0); 131 DefaultOpenIDUserInfo userInfo = new DefaultOpenIDUserInfo(); 132 userInfo.putAll(entry.getProperties(SCHEMA_NAME)); 133 return userInfo; 134 } catch (DirectoryException e) { 135 log.error("Error retrieving OpenID user info", e); 136 return null; 137 } 138 } 139 140 protected String getID(String provider, String subject) { 141 return subject + "@" + provider; 142 } 143 144}