/*
* (C) Copyright 2006-2013 Nuxeo SA (http://nuxeo.com/) and others.
*
* Licensed 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.
*
* Contributors:
* Nelson Silva <nelson.silva@inevo.pt>
*/
package org.nuxeo.ecm.platform.oauth2.openid.auth;
import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.nuxeo.ecm.core.api.DocumentModel;
import org.nuxeo.ecm.core.api.DocumentModelList;
import org.nuxeo.ecm.core.api.model.PropertyNotFoundException;
import org.nuxeo.ecm.directory.DirectoryException;
import org.nuxeo.ecm.directory.Session;
import org.nuxeo.ecm.directory.api.DirectoryService;
import org.nuxeo.runtime.api.Framework;
public class OpenIDUserInfoStoreImpl implements OpenIDUserInfoStore {
protected static final Log log = LogFactory.getLog(OpenIDUserInfoStoreImpl.class);
public static final String DIRECTORY_NAME = "openIdUserInfos";
public static final String SCHEMA_NAME = "openIdUserInfo";
public static final String NUXEO_LOGIN_KEY = "nuxeoLogin";
public static final String OPENID_SUBJECT_KEY = "subject";
public static final String OPENID_PROVIDER_KEY = "provider";
public static final String ID = "id";
private String providerName;
public OpenIDUserInfoStoreImpl(String providerName) {
this.providerName = providerName;
}
@Override
public void storeUserInfo(String userId, OpenIDUserInfo userInfo) {
DirectoryService ds = Framework.getService(DirectoryService.class);
try (Session session = ds.open(DIRECTORY_NAME)) {
Map<String, Object> data = new HashMap<String, Object>();
// Generate an ID
String userInfoId = getID(providerName, userInfo.getSubject());
data.put(NUXEO_LOGIN_KEY, userId);
data.put(OPENID_PROVIDER_KEY, providerName);
// Copy the standard fields
data.put(OPENID_SUBJECT_KEY, userInfo.getSubject());
data.put("name", userInfo.getName());
data.put("given_name", userInfo.getGivenName());
data.put("family_name", userInfo.getFamilyName());
data.put("middle_name", userInfo.getMiddleName());
data.put("nickname", userInfo.getNickname());
data.put("preferred_username", userInfo.getPreferredUsername());
data.put("profile", userInfo.getProfile());
data.put("picture", userInfo.getPicture());
data.put("website", userInfo.getWebsite());
data.put("email", userInfo.getEmail());
data.put("email_verified", userInfo.isEmailVerified());
data.put("gender", userInfo.getGender());
data.put("birthdate", userInfo.getBirthdate());
data.put("zoneinfo", userInfo.getZoneInfo());
data.put("locale", userInfo.getLocale());
data.put("phone_number", userInfo.getPhoneNumber());
data.put("address", userInfo.getAddress());
data.put("updated_time", userInfo.getUpdatedTime());
if (session.hasEntry(userInfoId)) {
DocumentModel userInfoDoc = session.getEntry(userInfoId);
userInfoDoc.setProperties(SCHEMA_NAME, data);
session.updateEntry(userInfoDoc);
} else {
data.put(ID, userInfoId);
session.createEntry(data);
}
} catch (DirectoryException e) {
log.error("Error during token storage", e);
}
}
@Override
public String getNuxeoLogin(OpenIDUserInfo userInfo) {
DirectoryService ds = Framework.getService(DirectoryService.class);
try (Session session = ds.open(DIRECTORY_NAME)) {
DocumentModel entry = session.getEntry(getID(providerName, userInfo.getSubject()));
if (entry == null) {
return null;
}
return (String) entry.getPropertyValue(SCHEMA_NAME + ":" + NUXEO_LOGIN_KEY);
} catch (PropertyNotFoundException e) {
log.error("Error retrieving OpenID user info", e);
return null;
}
}
@Override
public OpenIDUserInfo getUserInfo(String nuxeoLogin) {
DirectoryService ds = Framework.getService(DirectoryService.class);
try (Session session = ds.open(DIRECTORY_NAME)) {
Map<String, Serializable> filter = new HashMap<String, Serializable>();
filter.put(OPENID_PROVIDER_KEY, providerName);
filter.put(NUXEO_LOGIN_KEY, nuxeoLogin);
DocumentModelList entries = session.query(filter);
if (entries.size() == 0) {
return null;
}
DocumentModel entry = entries.get(0);
DefaultOpenIDUserInfo userInfo = new DefaultOpenIDUserInfo();
userInfo.putAll(entry.getProperties(SCHEMA_NAME));
return userInfo;
} catch (DirectoryException e) {
log.error("Error retrieving OpenID user info", e);
return null;
}
}
protected String getID(String provider, String subject) {
return subject + "@" + provider;
}
}