blob: 9ea255685fa23f1aaccb8572ad71d4a9e75fa964 [file] [log] [blame]
/*
* 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);
}
}
}