/* (c) 2014 Open Source Geospatial Foundation - all rights reserved * (c) 2001 - 2013 OpenPlans * This code is licensed under the GPL 2.0 license, available at the root * application directory. */ package org.geoserver.security; import java.io.IOException; import java.util.SortedSet; import org.geoserver.security.impl.GeoServerUser; import org.geoserver.security.validation.PasswordPolicyException; import org.springframework.util.StringUtils; /** */ public class UserPropertyAuthenticationKeyMapper extends AbstractAuthenticationKeyMapper { private String userPropertyName; public String getUserPropertyName() { return userPropertyName; } public void setUserPropertyName(String userPropertyName) { this.userPropertyName = userPropertyName; } @Override protected void checkProperties() throws IOException { super.checkProperties(); if (StringUtils.hasLength(getUserPropertyName())==false) { throw new IOException ("User property name is unset"); } } public boolean supportsReadOnlyUserGroupService() { return false; } @Override public GeoServerUser getUser(String key) throws IOException { checkProperties(); SortedSet<GeoServerUser> set = getUserGroupService().getUsersHavingPropertyValue(getUserPropertyName(), key); if (set.isEmpty()) return null; if (set.size()>1) { StringBuffer buff = new StringBuffer(); for (GeoServerUser user: set) { buff.append(user.getUsername()).append(","); } buff.setLength(buff.length()-1); throw new IOException ("More than one user have auth key: "+key+ ". Problematic users :" + buff.toString()); } GeoServerUser user = set.first(); if (user.isEnabled()==false) { LOGGER.info("Found user "+user.getUsername()+ " for key " + key + ", but this user is disabled"); return null; } return (GeoServerUser) getUserGroupService().loadUserByUsername(user.getUsername()); } @Override synchronized public int synchronize() throws IOException { checkProperties(); GeoServerUserGroupService service = getUserGroupService(); if (service.canCreateStore()==false) throw new IOException("Cannot synchronize a read only user group service"); int counter=0; GeoServerUserGroupStore store = service.createStore(); store.load(); for (GeoServerUser user : store.getUsers()) { String value =user.getProperties().getProperty(getUserPropertyName()); if (StringUtils.hasLength(value) ==false) { user.getProperties().put(getUserPropertyName(), createAuthKey()); try { store.updateUser(user); counter++; } catch (PasswordPolicyException e) { throw new IOException("Never should reach this point",e); } } } store.store(); return counter; } }