/* | |
* Copyright 2005 The Apache Software Foundation | |
* | |
* 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. | |
* | |
*/ | |
package org.apache.felix.jmood.compendium; | |
import java.util.Dictionary; | |
import java.util.Enumeration; | |
import java.util.Hashtable; | |
import java.util.Vector; | |
import javax.management.MBeanRegistration; | |
import javax.management.MBeanServer; | |
import javax.management.Notification; | |
import javax.management.NotificationBroadcasterSupport; | |
import javax.management.ObjectName; | |
import javax.management.openmbean.CompositeData; | |
import org.apache.felix.jmood.AgentConstants; | |
import org.apache.felix.jmood.AgentContext; | |
import org.apache.felix.jmood.utils.OSGi2JMXCodec; | |
import org.apache.felix.jmood.utils.ObjectNames; | |
import org.osgi.service.useradmin.Group; | |
import org.osgi.service.useradmin.Role; | |
import org.osgi.service.useradmin.User; | |
import org.osgi.service.useradmin.UserAdminEvent; | |
import org.osgi.service.useradmin.UserAdminListener; | |
/** | |
* User manager for the gateway. This mbean provides access to the user admin | |
* functionality. | |
* | |
* | |
*/ | |
public class UserManager extends NotificationBroadcasterSupport implements | |
MBeanRegistration, UserManagerMBean { | |
private AgentContext ac; | |
private UserManager um; | |
public UserManager(AgentContext ac) { | |
this.ac = ac; | |
this.um = this; | |
} | |
private static long sequenceNumber = 0; | |
/** | |
* Creates a role of the specified type, case insensitive, with the | |
* specified name | |
* | |
* @param name | |
* @param type | |
* @throws Exception | |
*/ | |
public void createRole(String name, String type) throws Exception { | |
int t = -1; | |
if (type.equalsIgnoreCase(AgentConstants.GROUP)) | |
t = Role.GROUP; | |
else if (type.equalsIgnoreCase(AgentConstants.USER)) | |
t = Role.USER; | |
else | |
throw new Exception( | |
"Incorrect type name. Valid names: User | Group. Case Insensitive"); | |
try { | |
ac.getUserAdmin().createRole(name, t); | |
} catch (NullPointerException npe) { | |
ac.debug("UserAdmin not available. Could not create Role"); | |
} | |
} | |
public CompositeData getRole(String name) throws Exception { | |
try { | |
return OSGi2JMXCodec.encodeRole(ac.getUserAdmin().getRole(name)); | |
} catch (NullPointerException npe) { | |
ac.debug("UserAdmin not available. Could not get Role"); | |
return null; | |
} | |
} | |
public CompositeData getGroup(String groupname) { | |
try { | |
Role group = ac.getUserAdmin().getRole(groupname); | |
if (group.getType() == Role.GROUP) | |
return OSGi2JMXCodec.encodeGroup((Group) group); | |
else | |
return null; | |
} catch (NullPointerException npe) { | |
ac.debug("UserAdmin not available. "); | |
return null; | |
} catch (Exception e) { | |
ac.error("unexpected exception", e); | |
return null; | |
} | |
} | |
public CompositeData getUser(String username) throws Exception { | |
try { | |
Role user = ac.getUserAdmin().getRole(username); | |
if (user.getType() == Role.USER) | |
return OSGi2JMXCodec.encodeUser((User) user); | |
else | |
return null; | |
} catch (NullPointerException npe) { | |
ac.debug("UserAdmin not available. "); | |
return null; | |
} | |
} | |
public CompositeData getAuthorization(String user) { | |
try { | |
return OSGi2JMXCodec.encodeAuthorization(ac.getUserAdmin() | |
.getAuthorization((User) ac.getUserAdmin().getRole(user))); | |
} catch (Exception e) { | |
ac.error("unexpected exception", e); | |
return null; | |
} | |
} | |
public String[] getRoles(String filter) throws Exception { | |
try { | |
Role[] roles = ac.getUserAdmin().getRoles(filter); | |
String[] result = new String[roles.length]; | |
for (int i = 0; i < roles.length; i++) { | |
result[i] = roles[i].getName(); | |
} | |
return result; | |
} catch (NullPointerException npe) { | |
ac.debug("UserAdmin not available. "); | |
return null; | |
} | |
} | |
public String getUser(String key, String value) { | |
try { | |
return ac.getUserAdmin().getUser(key, value).getName(); | |
} catch (NullPointerException npe) { | |
ac.debug("UserAdmin not available. "); | |
return null; | |
} | |
} | |
public boolean removeRole(String name) { | |
try { | |
return ac.getUserAdmin().removeRole(name); | |
} catch (NullPointerException npe) { | |
ac.debug("UserAdmin not available. "); | |
return false; | |
} | |
} | |
public String[] getRoles() throws Exception { | |
try { | |
Role[] roles = ac.getUserAdmin().getRoles(null); | |
String[] result = new String[roles.length]; | |
for (int i = 0; i < roles.length; i++) { | |
result[i] = roles[i].getName(); | |
} | |
return result; | |
} catch (NullPointerException npe) { | |
ac.debug("UserAdmin not available. "); | |
return null; | |
} | |
} | |
public String[] getGroups() throws Exception { | |
try { | |
Role[] roles = ac.getUserAdmin().getRoles(null); | |
Vector tmp = new Vector(); | |
int j = 0; | |
for (int i = 0; i < roles.length; i++) { | |
if (roles[i].getType() == Role.GROUP) { | |
j++; | |
tmp.add(roles[i].getName()); | |
} | |
} | |
if (j == 0) | |
return new String[0]; | |
else { | |
String[] result = new String[j]; | |
tmp.copyInto(result); | |
return result; | |
} | |
} catch (NullPointerException npe) { | |
ac.debug("UserAdmin not available. "); | |
return null; | |
} | |
} | |
public String[] getUsers() throws Exception { | |
try { | |
Role[] roles = ac.getUserAdmin().getRoles(null); | |
Vector tmp = new Vector(); | |
int j = 0; | |
for (int i = 0; i < roles.length; i++) { | |
if (roles[i].getType() == Role.USER) { | |
j++; | |
tmp.add(roles[i].getName()); | |
} | |
} | |
if (j == 0) | |
return new String[0]; | |
else { | |
String[] result = new String[j]; | |
tmp.copyInto(result); | |
return result; | |
} | |
} catch (NullPointerException npe) { | |
ac.debug("UserAdmin not available. "); | |
return null; | |
} | |
} | |
public String[] getMembers(String groupname) { | |
try { | |
Group group = (Group) ac.getUserAdmin().getRole(groupname); | |
Role[] members = group.getMembers(); | |
if (members == null) | |
return null; | |
String[] names = new String[members.length]; | |
for (int i = 0; i < members.length; i++) { | |
names[i] = members[i].getName(); | |
} | |
return names; | |
} catch (NullPointerException npe) { | |
ac.debug("UserAdmin not available. "); | |
return null; | |
} | |
} | |
public String[] getRequiredMembers(String groupname) { | |
try { | |
Group group = (Group) ac.getUserAdmin().getRole(groupname); | |
Role[] members = group.getRequiredMembers(); | |
if (members == null) | |
return null; | |
String[] names = new String[members.length]; | |
for (int i = 0; i < members.length; i++) { | |
names[i] = members[i].getName(); | |
} | |
return names; | |
} catch (NullPointerException npe) { | |
ac.debug("UserAdmin not available. "); | |
return null; | |
} | |
} | |
public boolean addMember(String groupname, String rolename) { | |
try { | |
Role group = ac.getUserAdmin().getRole(groupname); | |
Role role = ac.getUserAdmin().getRole(rolename); | |
if (!(group.getType() == Role.GROUP)) | |
return false; | |
return ((Group) group).addMember(role); | |
} catch (NullPointerException npe) { | |
ac.debug("UserAdmin not available. "); | |
return false; | |
} | |
} | |
public boolean addRequiredMember(String groupname, String rolename) { | |
try { | |
Role group = ac.getUserAdmin().getRole(groupname); | |
Role role = ac.getUserAdmin().getRole(rolename); | |
if (!(group.getType() == Role.GROUP)) | |
return false; | |
return ((Group) group).addRequiredMember(role); | |
} catch (NullPointerException npe) { | |
ac.debug("UserAdmin not available. "); | |
return false; | |
} | |
} | |
public boolean removeMember(String groupname, String rolename) { | |
try { | |
Role group = ac.getUserAdmin().getRole(groupname); | |
Role role = ac.getUserAdmin().getRole(rolename); | |
if (!(group.getType() == Role.GROUP)) | |
return false; | |
return ((Group) group).removeMember(role); | |
} catch (NullPointerException npe) { | |
ac.debug("UserAdmin not available. "); | |
return false; | |
} | |
} | |
public String[] getImpliedRoles(String username) throws Exception { | |
try { | |
Role role = ac.getUserAdmin().getRole(username); | |
if (role.getType() == Role.USER && role instanceof User) { | |
return ac.getUserAdmin().getAuthorization((User) role) | |
.getRoles(); | |
} else | |
return null; | |
} catch (NullPointerException npe) { | |
ac.debug("UserAdmin not available. "); | |
return null; | |
} | |
} | |
public void addProperty(String key, Object value, String rolename) | |
throws IllegalArgumentException { | |
try { | |
if (value instanceof Byte[]) { | |
Byte[] ByteValue = (Byte[]) value; | |
byte[] primitive = new byte[ByteValue.length]; | |
for (int i = 0; i < ByteValue.length; i++) | |
primitive[i] = ByteValue[i].byteValue(); | |
value = primitive; | |
} else if (!(value instanceof String) && !(value instanceof byte[])) | |
throw new IllegalArgumentException( | |
"Credentials can only be byte[] or String"); | |
Role role = ac.getUserAdmin().getRole(rolename); | |
role.getProperties().put(key, value); | |
} catch (NullPointerException npe) { | |
ac.debug("UserAdmin not available. "); | |
} | |
} | |
public void removeProperty(String key, String rolename) { | |
try { | |
Role role = ac.getUserAdmin().getRole(rolename); | |
role.getProperties().remove(key); | |
} catch (NullPointerException npe) { | |
ac.debug("UserAdmin not available. "); | |
} | |
} | |
public void addCredential(String key, Object value, String username) | |
throws IllegalArgumentException { | |
try { | |
if (value instanceof Byte[]) { | |
Byte[] ByteValue = (Byte[]) value; | |
byte[] primitive = new byte[ByteValue.length]; | |
for (int i = 0; i < ByteValue.length; i++) | |
primitive[i] = ByteValue[i].byteValue(); | |
value = primitive; | |
} else if (!(value instanceof String) && !(value instanceof byte[])) | |
throw new IllegalArgumentException( | |
"Credentials can only be byte[] or String"); | |
User user = (User) ac.getUserAdmin().getRole(username); | |
user.getCredentials().put(key, value); | |
} catch (NullPointerException npe) { | |
ac.debug("UserAdmin not available. "); | |
} | |
} | |
public void removeCredential(String key, String username) { | |
try { | |
User user = (User) ac.getUserAdmin().getRole(username); | |
user.getCredentials().remove(key); | |
} catch (NullPointerException npe) { | |
ac.debug("UserAdmin not available. "); | |
} catch (Exception e) { | |
ac.error("unexpected exception", e); | |
} | |
} | |
public Hashtable getProperties(String rolename) { | |
try { | |
Role role = ac.getUserAdmin().getRole(rolename); | |
Dictionary dic = role.getProperties(); | |
Hashtable props = new Hashtable(); | |
Enumeration keys = dic.keys(); | |
while (keys.hasMoreElements()) { | |
Object key = keys.nextElement(); | |
props.put(key, dic.get(key)); | |
} | |
return props; | |
} catch (NullPointerException npe) { | |
ac.debug("UserAdmin not available. "); | |
return null; | |
} | |
} | |
public Hashtable getCredentials(String username) { | |
try { | |
User user = (User) ac.getUserAdmin().getRole(username); | |
Dictionary dic = user.getCredentials(); | |
Hashtable credentials = new Hashtable(); | |
Enumeration keys = dic.keys(); | |
while (keys.hasMoreElements()) { | |
Object key = keys.nextElement(); | |
credentials.put(key, dic.get(key)); | |
} | |
return credentials; | |
} catch (NullPointerException npe) { | |
ac.debug("UserAdmin not available. "); | |
return null; | |
} | |
} | |
// /////////////////////MBEANREGISTRATION | |
// METHODS/////////////////////////////////////////////////// | |
public void postDeregister() { | |
} | |
public void postRegister(Boolean registrationDone) { | |
} | |
public void preDeregister() throws Exception { | |
} | |
/** | |
* @see javax.management.MBeanRegistration#preRegister(javax.management.MBeanServer, | |
* javax.management.ObjectName) | |
* @param server | |
* @param name | |
* @return | |
* @throws java.lang.Exception | |
*/ | |
public ObjectName preRegister(MBeanServer server, ObjectName name) | |
throws Exception { | |
ac.getBundleContext().registerService( | |
UserAdminListener.class.getName(), new UserAdminListener() { | |
public void roleChanged(UserAdminEvent e) { | |
um.notifyUserAdminEvent(e); | |
} | |
}, null); | |
try { | |
ac.getUserAdmin().removeRole(AgentConstants.USER); | |
} catch (NullPointerException npe) { | |
ac.debug("UserAdmin not available. "); | |
} | |
return name; | |
} | |
// ///////PRIVATE METHODS////////////////////////// | |
private void notifyUserAdminEvent(UserAdminEvent event) { | |
String typedesc = null; | |
switch (event.getType()) { | |
case UserAdminEvent.ROLE_CREATED: | |
typedesc = "created"; | |
break; | |
case UserAdminEvent.ROLE_CHANGED: | |
typedesc = "changed"; | |
break; | |
case UserAdminEvent.ROLE_REMOVED: | |
typedesc = "removed"; | |
break; | |
} | |
try { | |
ObjectName source = new ObjectName(ObjectNames.UA_SERVICE); | |
String message = "User Admin event: Role " | |
+ event.getRole().getName() + typedesc; | |
Notification notification = new Notification( | |
AgentConstants.USER_ADMIN_NOTIFICATION_TYPE, source, | |
sequenceNumber++, message); | |
CompositeData userData = OSGi2JMXCodec.encodeUserAdminEvent(event); | |
notification.setUserData(userData); | |
sendNotification(notification); | |
} catch (Exception e) { | |
ac.error("Unexpected exception", e); | |
} | |
} | |
} |