mirror of
https://github.com/gyurix1968/guacamole-client.git
synced 2025-09-06 05:07:41 +00:00
GUACAMOLE-5: Expose sharing profiles via a Directory on the UserContext according to granted permissions.
This commit is contained in:
@@ -60,8 +60,13 @@ import org.apache.guacamole.auth.jdbc.activeconnection.ActiveConnectionService;
|
|||||||
import org.apache.guacamole.auth.jdbc.activeconnection.TrackedActiveConnection;
|
import org.apache.guacamole.auth.jdbc.activeconnection.TrackedActiveConnection;
|
||||||
import org.apache.guacamole.auth.jdbc.connection.ConnectionParameterMapper;
|
import org.apache.guacamole.auth.jdbc.connection.ConnectionParameterMapper;
|
||||||
import org.apache.guacamole.auth.jdbc.permission.SharingProfilePermissionMapper;
|
import org.apache.guacamole.auth.jdbc.permission.SharingProfilePermissionMapper;
|
||||||
|
import org.apache.guacamole.auth.jdbc.permission.SharingProfilePermissionService;
|
||||||
|
import org.apache.guacamole.auth.jdbc.permission.SharingProfilePermissionSet;
|
||||||
|
import org.apache.guacamole.auth.jdbc.sharingprofile.ModeledSharingProfile;
|
||||||
|
import org.apache.guacamole.auth.jdbc.sharingprofile.SharingProfileDirectory;
|
||||||
import org.apache.guacamole.auth.jdbc.sharingprofile.SharingProfileMapper;
|
import org.apache.guacamole.auth.jdbc.sharingprofile.SharingProfileMapper;
|
||||||
import org.apache.guacamole.auth.jdbc.sharingprofile.SharingProfileParameterMapper;
|
import org.apache.guacamole.auth.jdbc.sharingprofile.SharingProfileParameterMapper;
|
||||||
|
import org.apache.guacamole.auth.jdbc.sharingprofile.SharingProfileService;
|
||||||
import org.apache.guacamole.auth.jdbc.tunnel.RestrictedGuacamoleTunnelService;
|
import org.apache.guacamole.auth.jdbc.tunnel.RestrictedGuacamoleTunnelService;
|
||||||
import org.apache.guacamole.net.auth.AuthenticationProvider;
|
import org.apache.guacamole.net.auth.AuthenticationProvider;
|
||||||
import org.mybatis.guice.MyBatisModule;
|
import org.mybatis.guice.MyBatisModule;
|
||||||
@@ -141,8 +146,11 @@ public class JDBCAuthenticationProviderModule extends MyBatisModule {
|
|||||||
bind(ModeledConnection.class);
|
bind(ModeledConnection.class);
|
||||||
bind(ModeledConnectionGroup.class);
|
bind(ModeledConnectionGroup.class);
|
||||||
bind(ModeledGuacamoleConfiguration.class);
|
bind(ModeledGuacamoleConfiguration.class);
|
||||||
|
bind(ModeledSharingProfile.class);
|
||||||
bind(ModeledUser.class);
|
bind(ModeledUser.class);
|
||||||
bind(RootConnectionGroup.class);
|
bind(RootConnectionGroup.class);
|
||||||
|
bind(SharingProfileDirectory.class);
|
||||||
|
bind(SharingProfilePermissionSet.class);
|
||||||
bind(SystemPermissionSet.class);
|
bind(SystemPermissionSet.class);
|
||||||
bind(TrackedActiveConnection.class);
|
bind(TrackedActiveConnection.class);
|
||||||
bind(UserContext.class);
|
bind(UserContext.class);
|
||||||
@@ -159,6 +167,8 @@ public class JDBCAuthenticationProviderModule extends MyBatisModule {
|
|||||||
bind(GuacamoleTunnelService.class).to(RestrictedGuacamoleTunnelService.class);
|
bind(GuacamoleTunnelService.class).to(RestrictedGuacamoleTunnelService.class);
|
||||||
bind(PasswordEncryptionService.class).to(SHA256PasswordEncryptionService.class);
|
bind(PasswordEncryptionService.class).to(SHA256PasswordEncryptionService.class);
|
||||||
bind(SaltService.class).to(SecureRandomSaltService.class);
|
bind(SaltService.class).to(SecureRandomSaltService.class);
|
||||||
|
bind(SharingProfilePermissionService.class);
|
||||||
|
bind(SharingProfileService.class);
|
||||||
bind(SystemPermissionService.class);
|
bind(SystemPermissionService.class);
|
||||||
bind(UserPermissionService.class);
|
bind(UserPermissionService.class);
|
||||||
bind(UserService.class);
|
bind(UserService.class);
|
||||||
|
@@ -0,0 +1,66 @@
|
|||||||
|
/*
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
* or more contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. The ASF licenses this file
|
||||||
|
* to you 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.guacamole.auth.jdbc.permission;
|
||||||
|
|
||||||
|
import com.google.inject.Inject;
|
||||||
|
import com.google.inject.Provider;
|
||||||
|
import org.apache.guacamole.auth.jdbc.user.AuthenticatedUser;
|
||||||
|
import org.apache.guacamole.GuacamoleException;
|
||||||
|
import org.apache.guacamole.auth.jdbc.user.ModeledUser;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Service which provides convenience methods for creating, retrieving, and
|
||||||
|
* deleting sharing profile permissions. This service will automatically enforce
|
||||||
|
* the permissions of the current user.
|
||||||
|
*
|
||||||
|
* @author Michael Jumper
|
||||||
|
*/
|
||||||
|
public class SharingProfilePermissionService extends ModeledObjectPermissionService {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Mapper for sharing profile permissions.
|
||||||
|
*/
|
||||||
|
@Inject
|
||||||
|
private SharingProfilePermissionMapper sharingProfilePermissionMapper;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Provider for sharing profile permission sets.
|
||||||
|
*/
|
||||||
|
@Inject
|
||||||
|
private Provider<SharingProfilePermissionSet> sharingProfilePermissionSetProvider;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected ObjectPermissionMapper getPermissionMapper() {
|
||||||
|
return sharingProfilePermissionMapper;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ObjectPermissionSet getPermissionSet(AuthenticatedUser user,
|
||||||
|
ModeledUser targetUser) throws GuacamoleException {
|
||||||
|
|
||||||
|
// Create permission set for requested user
|
||||||
|
ObjectPermissionSet permissionSet = sharingProfilePermissionSetProvider.get();
|
||||||
|
permissionSet.init(user, targetUser);
|
||||||
|
|
||||||
|
return permissionSet;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@@ -0,0 +1,44 @@
|
|||||||
|
/*
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
* or more contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. The ASF licenses this file
|
||||||
|
* to you 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.guacamole.auth.jdbc.permission;
|
||||||
|
|
||||||
|
import com.google.inject.Inject;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A database implementation of ObjectPermissionSet which uses an injected
|
||||||
|
* service to query and manipulate the sharing profile permissions associated
|
||||||
|
* with a particular user.
|
||||||
|
*
|
||||||
|
* @author Michael Jumper
|
||||||
|
*/
|
||||||
|
public class SharingProfilePermissionSet extends ObjectPermissionSet {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Service for querying and manipulating sharing profile permissions.
|
||||||
|
*/
|
||||||
|
@Inject
|
||||||
|
private SharingProfilePermissionService sharingProfilePermissionService;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected ObjectPermissionService getObjectPermissionService() {
|
||||||
|
return sharingProfilePermissionService;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@@ -0,0 +1,110 @@
|
|||||||
|
/*
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
* or more contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. The ASF licenses this file
|
||||||
|
* to you 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.guacamole.auth.jdbc.sharingprofile;
|
||||||
|
|
||||||
|
import com.google.inject.Inject;
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.Map;
|
||||||
|
import org.apache.guacamole.auth.jdbc.base.ModeledDirectoryObject;
|
||||||
|
import org.apache.guacamole.form.Form;
|
||||||
|
import org.apache.guacamole.net.auth.SharingProfile;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An implementation of the SharingProfile object which is backed by a database
|
||||||
|
* model.
|
||||||
|
*
|
||||||
|
* @author Michael Jumper
|
||||||
|
*/
|
||||||
|
public class ModeledSharingProfile
|
||||||
|
extends ModeledDirectoryObject<SharingProfileModel>
|
||||||
|
implements SharingProfile {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* All possible attributes of sharing profile objects organized as
|
||||||
|
* individual, logical forms. Currently, there are no such attributes.
|
||||||
|
*/
|
||||||
|
public static final Collection<Form> ATTRIBUTES = Collections.<Form>emptyList();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The manually-set parameter map, if any.
|
||||||
|
*/
|
||||||
|
private Map<String, String> parameters = null;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Service for managing sharing profiles.
|
||||||
|
*/
|
||||||
|
@Inject
|
||||||
|
private SharingProfileService sharingProfileService;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a new, empty ModeledSharingProfile.
|
||||||
|
*/
|
||||||
|
public ModeledSharingProfile() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getName() {
|
||||||
|
return getModel().getName();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setName(String name) {
|
||||||
|
getModel().setName(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getPrimaryConnectionIdentifier() {
|
||||||
|
return getModel().getPrimaryConnectionIdentifier();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setPrimaryConnectionIdentifier(String identifier) {
|
||||||
|
getModel().setPrimaryConnectionIdentifier(identifier);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Map<String, String> getParameters() {
|
||||||
|
|
||||||
|
// Retrieve visible parameters, if not overridden by setParameters()
|
||||||
|
if (parameters == null)
|
||||||
|
return sharingProfileService.retrieveParameters(getCurrentUser(),
|
||||||
|
getModel().getIdentifier());
|
||||||
|
|
||||||
|
return parameters;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setParameters(Map<String, String> parameters) {
|
||||||
|
this.parameters = parameters;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Map<String, String> getAttributes() {
|
||||||
|
return Collections.<String, String>emptyMap();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setAttributes(Map<String, String> attributes) {
|
||||||
|
// Do nothing - no attributes
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@@ -0,0 +1,85 @@
|
|||||||
|
/*
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
* or more contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. The ASF licenses this file
|
||||||
|
* to you 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.guacamole.auth.jdbc.sharingprofile;
|
||||||
|
|
||||||
|
import com.google.inject.Inject;
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.Set;
|
||||||
|
import org.apache.guacamole.GuacamoleException;
|
||||||
|
import org.apache.guacamole.auth.jdbc.base.RestrictedObject;
|
||||||
|
import org.apache.guacamole.net.auth.Directory;
|
||||||
|
import org.apache.guacamole.net.auth.SharingProfile;
|
||||||
|
import org.mybatis.guice.transactional.Transactional;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Implementation of the SharingProfile Directory which is driven by an
|
||||||
|
* underlying, arbitrary database.
|
||||||
|
*
|
||||||
|
* @author Michael Jumper
|
||||||
|
*/
|
||||||
|
public class SharingProfileDirectory extends RestrictedObject
|
||||||
|
implements Directory<SharingProfile> {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Service for managing sharing profile objects.
|
||||||
|
*/
|
||||||
|
@Inject
|
||||||
|
private SharingProfileService sharingProfileService;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SharingProfile get(String identifier) throws GuacamoleException {
|
||||||
|
return sharingProfileService.retrieveObject(getCurrentUser(), identifier);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Transactional
|
||||||
|
public Collection<SharingProfile> getAll(Collection<String> identifiers) throws GuacamoleException {
|
||||||
|
return Collections.<SharingProfile>unmodifiableCollection(
|
||||||
|
sharingProfileService.retrieveObjects(getCurrentUser(), identifiers)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Transactional
|
||||||
|
public Set<String> getIdentifiers() throws GuacamoleException {
|
||||||
|
return sharingProfileService.getIdentifiers(getCurrentUser());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Transactional
|
||||||
|
public void add(SharingProfile object) throws GuacamoleException {
|
||||||
|
sharingProfileService.createObject(getCurrentUser(), object);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Transactional
|
||||||
|
public void update(SharingProfile object) throws GuacamoleException {
|
||||||
|
ModeledSharingProfile sharingProfile = (ModeledSharingProfile) object;
|
||||||
|
sharingProfileService.updateObject(getCurrentUser(), sharingProfile);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Transactional
|
||||||
|
public void remove(String identifier) throws GuacamoleException {
|
||||||
|
sharingProfileService.deleteObject(getCurrentUser(), identifier);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@@ -0,0 +1,328 @@
|
|||||||
|
/*
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
* or more contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. The ASF licenses this file
|
||||||
|
* to you 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.guacamole.auth.jdbc.sharingprofile;
|
||||||
|
|
||||||
|
import com.google.inject.Inject;
|
||||||
|
import com.google.inject.Provider;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
|
import org.apache.guacamole.auth.jdbc.user.AuthenticatedUser;
|
||||||
|
import org.apache.guacamole.auth.jdbc.base.ModeledDirectoryObjectMapper;
|
||||||
|
import org.apache.guacamole.GuacamoleClientException;
|
||||||
|
import org.apache.guacamole.GuacamoleException;
|
||||||
|
import org.apache.guacamole.auth.jdbc.base.ModeledDirectoryObjectService;
|
||||||
|
import org.apache.guacamole.auth.jdbc.permission.SharingProfilePermissionMapper;
|
||||||
|
import org.apache.guacamole.auth.jdbc.permission.ObjectPermissionMapper;
|
||||||
|
import org.apache.guacamole.net.auth.SharingProfile;
|
||||||
|
import org.apache.guacamole.net.auth.permission.ObjectPermission;
|
||||||
|
import org.apache.guacamole.net.auth.permission.ObjectPermissionSet;
|
||||||
|
import org.apache.guacamole.net.auth.permission.SystemPermission;
|
||||||
|
import org.apache.guacamole.net.auth.permission.SystemPermissionSet;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Service which provides convenience methods for creating, retrieving, and
|
||||||
|
* manipulating sharing profiles.
|
||||||
|
*
|
||||||
|
* @author Michael Jumper
|
||||||
|
*/
|
||||||
|
public class SharingProfileService
|
||||||
|
extends ModeledDirectoryObjectService<ModeledSharingProfile,
|
||||||
|
SharingProfile, SharingProfileModel> {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Mapper for accessing sharing profiles.
|
||||||
|
*/
|
||||||
|
@Inject
|
||||||
|
private SharingProfileMapper sharingProfileMapper;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Mapper for manipulating sharing profile permissions.
|
||||||
|
*/
|
||||||
|
@Inject
|
||||||
|
private SharingProfilePermissionMapper sharingProfilePermissionMapper;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Mapper for accessing sharing profile parameters.
|
||||||
|
*/
|
||||||
|
@Inject
|
||||||
|
private SharingProfileParameterMapper parameterMapper;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Provider for creating sharing profiles.
|
||||||
|
*/
|
||||||
|
@Inject
|
||||||
|
private Provider<ModeledSharingProfile> sharingProfileProvider;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected ModeledDirectoryObjectMapper<SharingProfileModel> getObjectMapper() {
|
||||||
|
return sharingProfileMapper;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected ObjectPermissionMapper getPermissionMapper() {
|
||||||
|
return sharingProfilePermissionMapper;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected ModeledSharingProfile getObjectInstance(AuthenticatedUser currentUser,
|
||||||
|
SharingProfileModel model) {
|
||||||
|
ModeledSharingProfile sharingProfile = sharingProfileProvider.get();
|
||||||
|
sharingProfile.init(currentUser, model);
|
||||||
|
return sharingProfile;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected SharingProfileModel getModelInstance(AuthenticatedUser currentUser,
|
||||||
|
final SharingProfile object) {
|
||||||
|
|
||||||
|
// Create new ModeledSharingProfile backed by blank model
|
||||||
|
SharingProfileModel model = new SharingProfileModel();
|
||||||
|
ModeledSharingProfile sharingProfile = getObjectInstance(currentUser, model);
|
||||||
|
|
||||||
|
// Set model contents through ModeledSharingProfile, copying the
|
||||||
|
// provided sharing profile
|
||||||
|
sharingProfile.setPrimaryConnectionIdentifier(object.getPrimaryConnectionIdentifier());
|
||||||
|
sharingProfile.setName(object.getName());
|
||||||
|
sharingProfile.setParameters(object.getParameters());
|
||||||
|
sharingProfile.setAttributes(object.getAttributes());
|
||||||
|
|
||||||
|
return model;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected boolean hasCreatePermission(AuthenticatedUser user)
|
||||||
|
throws GuacamoleException {
|
||||||
|
|
||||||
|
// Return whether user has explicit sharing profile creation permission
|
||||||
|
SystemPermissionSet permissionSet = user.getUser().getSystemPermissions();
|
||||||
|
return permissionSet.hasPermission(SystemPermission.Type.CREATE_SHARING_PROFILE);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected ObjectPermissionSet getPermissionSet(AuthenticatedUser user)
|
||||||
|
throws GuacamoleException {
|
||||||
|
|
||||||
|
// Return permissions related to sharing profiles
|
||||||
|
return user.getUser().getSharingProfilePermissions();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void beforeCreate(AuthenticatedUser user,
|
||||||
|
SharingProfileModel model) throws GuacamoleException {
|
||||||
|
|
||||||
|
super.beforeCreate(user, model);
|
||||||
|
|
||||||
|
// Name must not be blank
|
||||||
|
if (model.getName() == null || model.getName().trim().isEmpty())
|
||||||
|
throw new GuacamoleClientException("Sharing profile names must not be blank.");
|
||||||
|
|
||||||
|
// Do not attempt to create duplicate sharing profiles
|
||||||
|
SharingProfileModel existing = sharingProfileMapper.selectOneByName(model.getPrimaryConnectionIdentifier(), model.getName());
|
||||||
|
if (existing != null)
|
||||||
|
throw new GuacamoleClientException("The sharing profile \"" + model.getName() + "\" already exists.");
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void beforeUpdate(AuthenticatedUser user,
|
||||||
|
SharingProfileModel model) throws GuacamoleException {
|
||||||
|
|
||||||
|
super.beforeUpdate(user, model);
|
||||||
|
|
||||||
|
// Name must not be blank
|
||||||
|
if (model.getName() == null || model.getName().trim().isEmpty())
|
||||||
|
throw new GuacamoleClientException("Sharing profile names must not be blank.");
|
||||||
|
|
||||||
|
// Check whether such a sharing profile is already present
|
||||||
|
SharingProfileModel existing = sharingProfileMapper.selectOneByName(model.getPrimaryConnectionIdentifier(), model.getName());
|
||||||
|
if (existing != null) {
|
||||||
|
|
||||||
|
// If the specified name matches a DIFFERENT existing sharing profile, the update cannot continue
|
||||||
|
if (!existing.getObjectID().equals(model.getObjectID()))
|
||||||
|
throw new GuacamoleClientException("The sharing profile \"" + model.getName() + "\" already exists.");
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Given an arbitrary Guacamole sharing profile, produces a collection of
|
||||||
|
* parameter model objects containing the name/value pairs of that
|
||||||
|
* sharing profile's parameters.
|
||||||
|
*
|
||||||
|
* @param sharingProfile
|
||||||
|
* The sharing profile whose configuration should be used to produce the
|
||||||
|
* collection of parameter models.
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
* A collection of parameter models containing the name/value pairs
|
||||||
|
* of the given sharing profile's parameters.
|
||||||
|
*/
|
||||||
|
private Collection<SharingProfileParameterModel> getParameterModels(ModeledSharingProfile sharingProfile) {
|
||||||
|
|
||||||
|
Map<String, String> parameters = sharingProfile.getParameters();
|
||||||
|
|
||||||
|
// Convert parameters to model objects
|
||||||
|
Collection<SharingProfileParameterModel> parameterModels = new ArrayList<SharingProfileParameterModel>(parameters.size());
|
||||||
|
for (Map.Entry<String, String> parameterEntry : parameters.entrySet()) {
|
||||||
|
|
||||||
|
// Get parameter name and value
|
||||||
|
String name = parameterEntry.getKey();
|
||||||
|
String value = parameterEntry.getValue();
|
||||||
|
|
||||||
|
// There is no need to insert empty parameters
|
||||||
|
if (value == null || value.isEmpty())
|
||||||
|
continue;
|
||||||
|
|
||||||
|
// Produce model object from parameter
|
||||||
|
SharingProfileParameterModel model = new SharingProfileParameterModel();
|
||||||
|
model.setSharingProfileIdentifier(sharingProfile.getIdentifier());
|
||||||
|
model.setName(name);
|
||||||
|
model.setValue(value);
|
||||||
|
|
||||||
|
// Add model to list
|
||||||
|
parameterModels.add(model);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
return parameterModels;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ModeledSharingProfile createObject(AuthenticatedUser user, SharingProfile object)
|
||||||
|
throws GuacamoleException {
|
||||||
|
|
||||||
|
// Create sharing profile
|
||||||
|
ModeledSharingProfile sharingProfile = super.createObject(user, object);
|
||||||
|
sharingProfile.setParameters(object.getParameters());
|
||||||
|
|
||||||
|
// Insert new parameters, if any
|
||||||
|
Collection<SharingProfileParameterModel> parameterModels = getParameterModels(sharingProfile);
|
||||||
|
if (!parameterModels.isEmpty())
|
||||||
|
parameterMapper.insert(parameterModels);
|
||||||
|
|
||||||
|
return sharingProfile;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void updateObject(AuthenticatedUser user, ModeledSharingProfile object)
|
||||||
|
throws GuacamoleException {
|
||||||
|
|
||||||
|
// Update sharing profile
|
||||||
|
super.updateObject(user, object);
|
||||||
|
|
||||||
|
// Replace existing parameters with new parameters, if any
|
||||||
|
Collection<SharingProfileParameterModel> parameterModels = getParameterModels(object);
|
||||||
|
parameterMapper.delete(object.getIdentifier());
|
||||||
|
if (!parameterModels.isEmpty())
|
||||||
|
parameterMapper.insert(parameterModels);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the set of all identifiers for all sharing profiles associated
|
||||||
|
* with the given primary connection. Only sharing profiles that the user
|
||||||
|
* has read access to will be returned.
|
||||||
|
*
|
||||||
|
* Permission to read the primary connection having the given identifier is
|
||||||
|
* NOT checked.
|
||||||
|
*
|
||||||
|
* @param user
|
||||||
|
* The user retrieving the identifiers.
|
||||||
|
*
|
||||||
|
* @param identifier
|
||||||
|
* The identifier of the primary connection.
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
* The set of all identifiers for all sharing profiles associated with
|
||||||
|
* the primary connection having the given identifier that the user has
|
||||||
|
* read access to.
|
||||||
|
*
|
||||||
|
* @throws GuacamoleException
|
||||||
|
* If an error occurs while reading identifiers.
|
||||||
|
*/
|
||||||
|
public Set<String> getIdentifiersWithin(AuthenticatedUser user,
|
||||||
|
String identifier)
|
||||||
|
throws GuacamoleException {
|
||||||
|
|
||||||
|
// Bypass permission checks if the user is a system admin
|
||||||
|
if (user.getUser().isAdministrator())
|
||||||
|
return sharingProfileMapper.selectIdentifiersWithin(identifier);
|
||||||
|
|
||||||
|
// Otherwise only return explicitly readable identifiers
|
||||||
|
else
|
||||||
|
return sharingProfileMapper.selectReadableIdentifiersWithin(
|
||||||
|
user.getUser().getModel(), identifier);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieves all parameters visible to the given user and associated with
|
||||||
|
* the sharing profile having the given identifier. If the given user has no
|
||||||
|
* access to such parameters, or no such sharing profile exists, the
|
||||||
|
* returned map will be empty.
|
||||||
|
*
|
||||||
|
* @param user
|
||||||
|
* The user retrieving sharing profile parameters.
|
||||||
|
*
|
||||||
|
* @param identifier
|
||||||
|
* The identifier of the sharing profile whose parameters are being
|
||||||
|
* retrieved.
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
* A new map of all parameter name/value pairs that the given user has
|
||||||
|
* access to.
|
||||||
|
*/
|
||||||
|
public Map<String, String> retrieveParameters(AuthenticatedUser user,
|
||||||
|
String identifier) {
|
||||||
|
|
||||||
|
Map<String, String> parameterMap = new HashMap<String, String>();
|
||||||
|
|
||||||
|
// Determine whether we have permission to read parameters
|
||||||
|
boolean canRetrieveParameters;
|
||||||
|
try {
|
||||||
|
canRetrieveParameters = hasObjectPermission(user, identifier,
|
||||||
|
ObjectPermission.Type.UPDATE);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Provide empty (but mutable) map if unable to check permissions
|
||||||
|
catch (GuacamoleException e) {
|
||||||
|
return parameterMap;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Populate parameter map if we have permission to do so
|
||||||
|
if (canRetrieveParameters) {
|
||||||
|
for (SharingProfileParameterModel parameter : parameterMapper.select(identifier))
|
||||||
|
parameterMap.put(parameter.getName(), parameter.getValue());
|
||||||
|
}
|
||||||
|
|
||||||
|
return parameterMap;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@@ -26,13 +26,14 @@ import org.apache.guacamole.auth.jdbc.connection.ConnectionDirectory;
|
|||||||
import com.google.inject.Inject;
|
import com.google.inject.Inject;
|
||||||
import com.google.inject.Provider;
|
import com.google.inject.Provider;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.Collections;
|
|
||||||
import org.apache.guacamole.GuacamoleException;
|
import org.apache.guacamole.GuacamoleException;
|
||||||
import org.apache.guacamole.auth.jdbc.base.RestrictedObject;
|
import org.apache.guacamole.auth.jdbc.base.RestrictedObject;
|
||||||
import org.apache.guacamole.auth.jdbc.activeconnection.ActiveConnectionDirectory;
|
import org.apache.guacamole.auth.jdbc.activeconnection.ActiveConnectionDirectory;
|
||||||
import org.apache.guacamole.auth.jdbc.connection.ConnectionRecordSet;
|
import org.apache.guacamole.auth.jdbc.connection.ConnectionRecordSet;
|
||||||
import org.apache.guacamole.auth.jdbc.connection.ModeledConnection;
|
import org.apache.guacamole.auth.jdbc.connection.ModeledConnection;
|
||||||
import org.apache.guacamole.auth.jdbc.connectiongroup.ModeledConnectionGroup;
|
import org.apache.guacamole.auth.jdbc.connectiongroup.ModeledConnectionGroup;
|
||||||
|
import org.apache.guacamole.auth.jdbc.sharingprofile.ModeledSharingProfile;
|
||||||
|
import org.apache.guacamole.auth.jdbc.sharingprofile.SharingProfileDirectory;
|
||||||
import org.apache.guacamole.form.Form;
|
import org.apache.guacamole.form.Form;
|
||||||
import org.apache.guacamole.net.auth.ActiveConnection;
|
import org.apache.guacamole.net.auth.ActiveConnection;
|
||||||
import org.apache.guacamole.net.auth.AuthenticationProvider;
|
import org.apache.guacamole.net.auth.AuthenticationProvider;
|
||||||
@@ -41,7 +42,6 @@ import org.apache.guacamole.net.auth.ConnectionGroup;
|
|||||||
import org.apache.guacamole.net.auth.Directory;
|
import org.apache.guacamole.net.auth.Directory;
|
||||||
import org.apache.guacamole.net.auth.SharingProfile;
|
import org.apache.guacamole.net.auth.SharingProfile;
|
||||||
import org.apache.guacamole.net.auth.User;
|
import org.apache.guacamole.net.auth.User;
|
||||||
import org.apache.guacamole.net.auth.simple.SimpleDirectory;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* UserContext implementation which is driven by an arbitrary, underlying
|
* UserContext implementation which is driven by an arbitrary, underlying
|
||||||
@@ -80,6 +80,13 @@ public class UserContext extends RestrictedObject
|
|||||||
@Inject
|
@Inject
|
||||||
private ConnectionGroupDirectory connectionGroupDirectory;
|
private ConnectionGroupDirectory connectionGroupDirectory;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sharing profile directory restricted by the permissions of the user
|
||||||
|
* associated with this context.
|
||||||
|
*/
|
||||||
|
@Inject
|
||||||
|
private SharingProfileDirectory sharingProfileDirectory;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ActiveConnection directory restricted by the permissions of the user
|
* ActiveConnection directory restricted by the permissions of the user
|
||||||
* associated with this context.
|
* associated with this context.
|
||||||
@@ -108,6 +115,7 @@ public class UserContext extends RestrictedObject
|
|||||||
userDirectory.init(currentUser);
|
userDirectory.init(currentUser);
|
||||||
connectionDirectory.init(currentUser);
|
connectionDirectory.init(currentUser);
|
||||||
connectionGroupDirectory.init(currentUser);
|
connectionGroupDirectory.init(currentUser);
|
||||||
|
sharingProfileDirectory.init(currentUser);
|
||||||
activeConnectionDirectory.init(currentUser);
|
activeConnectionDirectory.init(currentUser);
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -140,7 +148,7 @@ public class UserContext extends RestrictedObject
|
|||||||
@Override
|
@Override
|
||||||
public Directory<SharingProfile> getSharingProfileDirectory()
|
public Directory<SharingProfile> getSharingProfileDirectory()
|
||||||
throws GuacamoleException {
|
throws GuacamoleException {
|
||||||
return new SimpleDirectory<SharingProfile>();
|
return sharingProfileDirectory;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -184,7 +192,7 @@ public class UserContext extends RestrictedObject
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Collection<Form> getSharingProfileAttributes() {
|
public Collection<Form> getSharingProfileAttributes() {
|
||||||
return Collections.<Form>emptyList();
|
return ModeledSharingProfile.ATTRIBUTES;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user