1 // 2 // ======================================================================== 3 // Copyright (c) 1995-2013 Mort Bay Consulting Pty. Ltd. 4 // ------------------------------------------------------------------------ 5 // All rights reserved. This program and the accompanying materials 6 // are made available under the terms of the Eclipse Public License v1.0 7 // and Apache License v2.0 which accompanies this distribution. 8 // 9 // The Eclipse Public License is available at 10 // http://www.eclipse.org/legal/epl-v10.html 11 // 12 // The Apache License v2.0 is available at 13 // http://www.opensource.org/licenses/apache2.0.php 14 // 15 // You may elect to redistribute this code under either of these licenses. 16 // ======================================================================== 17 // 18 19 package org.eclipse.jetty.security; 20 21 import java.io.IOException; 22 23 import org.eclipse.jetty.security.PropertyUserStore.UserListener; 24 import org.eclipse.jetty.server.UserIdentity; 25 import org.eclipse.jetty.util.Scanner; 26 import org.eclipse.jetty.util.log.Log; 27 import org.eclipse.jetty.util.log.Logger; 28 import org.eclipse.jetty.util.resource.Resource; 29 import org.eclipse.jetty.util.security.Credential; 30 31 /* ------------------------------------------------------------ */ 32 /** 33 * Properties User Realm. 34 * 35 * An implementation of UserRealm that stores users and roles in-memory in HashMaps. 36 * <P> 37 * Typically these maps are populated by calling the load() method or passing a properties resource to the constructor. The format of the properties file is: 38 * 39 * <PRE> 40 * username: password [,rolename ...] 41 * </PRE> 42 * 43 * Passwords may be clear text, obfuscated or checksummed. The class com.eclipse.Util.Password should be used to generate obfuscated passwords or password 44 * checksums. 45 * 46 * If DIGEST Authentication is used, the password must be in a recoverable format, either plain text or OBF:. 47 */ 48 public class HashLoginService extends MappedLoginService implements UserListener 49 { 50 private static final Logger LOG = Log.getLogger(HashLoginService.class); 51 52 private PropertyUserStore _propertyUserStore; 53 private String _config; 54 private Resource _configResource; 55 private Scanner _scanner; 56 private int _refreshInterval = 0;// default is not to reload 57 58 /* ------------------------------------------------------------ */ 59 public HashLoginService() 60 { 61 } 62 63 /* ------------------------------------------------------------ */ 64 public HashLoginService(String name) 65 { 66 setName(name); 67 } 68 69 /* ------------------------------------------------------------ */ 70 public HashLoginService(String name, String config) 71 { 72 setName(name); 73 setConfig(config); 74 } 75 76 /* ------------------------------------------------------------ */ 77 public String getConfig() 78 { 79 return _config; 80 } 81 82 /* ------------------------------------------------------------ */ 83 public void getConfig(String config) 84 { 85 _config = config; 86 } 87 88 /* ------------------------------------------------------------ */ 89 public Resource getConfigResource() 90 { 91 return _configResource; 92 } 93 94 /* ------------------------------------------------------------ */ 95 /** 96 * Load realm users from properties file. The property file maps usernames to password specs followed by an optional comma separated list of role names. 97 * 98 * @param config 99 * Filename or url of user properties file. 100 */ 101 public void setConfig(String config) 102 { 103 _config = config; 104 } 105 106 /* ------------------------------------------------------------ */ 107 public void setRefreshInterval(int msec) 108 { 109 _refreshInterval = msec; 110 } 111 112 /* ------------------------------------------------------------ */ 113 public int getRefreshInterval() 114 { 115 return _refreshInterval; 116 } 117 118 /* ------------------------------------------------------------ */ 119 @Override 120 protected UserIdentity loadUser(String username) 121 { 122 return null; 123 } 124 125 /* ------------------------------------------------------------ */ 126 @Override 127 public void loadUsers() throws IOException 128 { 129 // TODO: Consider refactoring MappedLoginService to not have to override with unused methods 130 } 131 132 /* ------------------------------------------------------------ */ 133 /** 134 * @see org.eclipse.jetty.util.component.AbstractLifeCycle#doStart() 135 */ 136 protected void doStart() throws Exception 137 { 138 super.doStart(); 139 140 if (_propertyUserStore == null) 141 { 142 if(LOG.isDebugEnabled()) 143 LOG.debug("doStart: Starting new PropertyUserStore. PropertiesFile: " + _config + " refreshInterval: " + _refreshInterval); 144 145 _propertyUserStore = new PropertyUserStore(); 146 _propertyUserStore.setRefreshInterval(_refreshInterval); 147 _propertyUserStore.setConfig(_config); 148 _propertyUserStore.registerUserListener(this); 149 _propertyUserStore.start(); 150 } 151 } 152 153 /* ------------------------------------------------------------ */ 154 /** 155 * @see org.eclipse.jetty.util.component.AbstractLifeCycle#doStop() 156 */ 157 protected void doStop() throws Exception 158 { 159 super.doStop(); 160 if (_scanner != null) 161 _scanner.stop(); 162 _scanner = null; 163 } 164 165 /* ------------------------------------------------------------ */ 166 public void update(String userName, Credential credential, String[] roleArray) 167 { 168 if (LOG.isDebugEnabled()) 169 LOG.debug("update: " + userName + " Roles: " + roleArray.length); 170 putUser(userName,credential,roleArray); 171 } 172 173 /* ------------------------------------------------------------ */ 174 public void remove(String userName) 175 { 176 if (LOG.isDebugEnabled()) 177 LOG.debug("remove: " + userName); 178 removeUser(userName); 179 } 180 }