mirror of
https://github.com/gyurix1968/guacamole-client.git
synced 2025-09-06 21:27:40 +00:00
GUACAMOLE-5: Add SharingProfiles to REST API.
This commit is contained in:
@@ -39,6 +39,7 @@ import org.apache.guacamole.rest.connectiongroup.ConnectionGroupModule;
|
||||
import org.apache.guacamole.rest.language.LanguageRESTService;
|
||||
import org.apache.guacamole.rest.patch.PatchRESTService;
|
||||
import org.apache.guacamole.rest.session.SessionResourceFactory;
|
||||
import org.apache.guacamole.rest.sharingprofile.SharingProfileModule;
|
||||
import org.apache.guacamole.rest.user.UserModule;
|
||||
|
||||
/**
|
||||
@@ -96,6 +97,7 @@ public class RESTServiceModule extends ServletModule {
|
||||
install(new ActiveConnectionModule());
|
||||
install(new ConnectionModule());
|
||||
install(new ConnectionGroupModule());
|
||||
install(new SharingProfileModule());
|
||||
install(new UserModule());
|
||||
|
||||
// Set up the servlet and JSON mappings
|
||||
|
@@ -39,6 +39,16 @@ public class APIConnectionRecord {
|
||||
*/
|
||||
private final String connectionName;
|
||||
|
||||
/**
|
||||
* The identifier of the sharing profile associated with this record.
|
||||
*/
|
||||
private final String sharingProfileIdentifier;
|
||||
|
||||
/**
|
||||
* The identifier of the sharing profile associated with this record.
|
||||
*/
|
||||
private final String sharingProfileName;
|
||||
|
||||
/**
|
||||
* The date and time the connection began.
|
||||
*/
|
||||
@@ -75,6 +85,8 @@ public class APIConnectionRecord {
|
||||
public APIConnectionRecord(ConnectionRecord record) {
|
||||
this.connectionIdentifier = record.getConnectionIdentifier();
|
||||
this.connectionName = record.getConnectionName();
|
||||
this.sharingProfileIdentifier = record.getSharingProfileIdentifier();
|
||||
this.sharingProfileName = record.getSharingProfileName();
|
||||
this.startDate = record.getStartDate();
|
||||
this.endDate = record.getEndDate();
|
||||
this.remoteHost = record.getRemoteHost();
|
||||
@@ -103,6 +115,32 @@ public class APIConnectionRecord {
|
||||
return connectionName;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the identifier of the sharing profile associated with this
|
||||
* record. If the connection was not being used via a sharing profile, this
|
||||
* will be null.
|
||||
*
|
||||
* @return
|
||||
* The identifier of the sharing profile associated with this record,
|
||||
* or null if no sharing profile was used.
|
||||
*/
|
||||
public String getSharingProfileIdentifier() {
|
||||
return sharingProfileIdentifier;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the name of the sharing profile associated with this record. If
|
||||
* the connection was not being used via a sharing profile, this will be
|
||||
* null.
|
||||
*
|
||||
* @return
|
||||
* The name of the sharing profile associated with this record, or null
|
||||
* if no sharing profile was used.
|
||||
*/
|
||||
public String getSharingProfileName() {
|
||||
return sharingProfileName;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the date and time the connection began.
|
||||
*
|
||||
|
@@ -53,6 +53,12 @@ public class APIPermissionSet {
|
||||
private Map<String, Set<ObjectPermission.Type>> connectionGroupPermissions =
|
||||
new HashMap<String, Set<ObjectPermission.Type>>();
|
||||
|
||||
/**
|
||||
* Map of sharing profile ID to the set of granted permissions.
|
||||
*/
|
||||
private Map<String, Set<ObjectPermission.Type>> sharingProfilePermissions =
|
||||
new HashMap<String, Set<ObjectPermission.Type>>();
|
||||
|
||||
/**
|
||||
* Map of active connection ID to the set of granted permissions.
|
||||
*/
|
||||
@@ -155,6 +161,7 @@ public class APIPermissionSet {
|
||||
addSystemPermissions(systemPermissions, user.getSystemPermissions());
|
||||
addObjectPermissions(connectionPermissions, user.getConnectionPermissions());
|
||||
addObjectPermissions(connectionGroupPermissions, user.getConnectionGroupPermissions());
|
||||
addObjectPermissions(sharingProfilePermissions, user.getSharingProfilePermissions());
|
||||
addObjectPermissions(activeConnectionPermissions, user.getActiveConnectionPermissions());
|
||||
addObjectPermissions(userPermissions, user.getUserPermissions());
|
||||
|
||||
@@ -190,6 +197,21 @@ public class APIPermissionSet {
|
||||
return connectionGroupPermissions;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a map of sharing profile identifiers to the set of permissions
|
||||
* granted for that sharing profile. If no permissions are granted to a
|
||||
* particular sharing profile, its identifier will not be present as a key
|
||||
* in the map. This map is mutable, and changes to this map will affect the
|
||||
* permission set directly.
|
||||
*
|
||||
* @return
|
||||
* A map of sharing profile identifiers to the set of permissions
|
||||
* granted for that sharing profile.
|
||||
*/
|
||||
public Map<String, Set<ObjectPermission.Type>> getSharingProfilePermissions() {
|
||||
return sharingProfilePermissions;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a map of active connection IDs to the set of permissions granted
|
||||
* for that active connection. If no permissions are granted to a particular
|
||||
@@ -257,6 +279,19 @@ public class APIPermissionSet {
|
||||
this.connectionGroupPermissions = connectionGroupPermissions;
|
||||
}
|
||||
|
||||
/**
|
||||
* Replaces the current map of sharing profile permissions with the given
|
||||
* map, which must map each sharing profile identifier to its corresponding
|
||||
* set of granted permissions. If a sharing profile has no permissions, its
|
||||
* identifier must not be present as a key in the map.
|
||||
*
|
||||
* @param sharingProfilePermissions
|
||||
* The map which must replace the currently-stored map of permissions.
|
||||
*/
|
||||
public void setSharingProfilePermissions(Map<String, Set<ObjectPermission.Type>> sharingProfilePermissions) {
|
||||
this.sharingProfilePermissions = sharingProfilePermissions;
|
||||
}
|
||||
|
||||
/**
|
||||
* Replaces the current map of active connection permissions with the give
|
||||
* map, which must map active connection ID to its corresponding set of
|
||||
|
@@ -55,6 +55,12 @@ public class PermissionSetResource {
|
||||
*/
|
||||
private static final String CONNECTION_GROUP_PERMISSION_PATCH_PATH_PREFIX = "/connectionGroupPermissions/";
|
||||
|
||||
/**
|
||||
* The prefix of any path within an operation of a JSON patch which
|
||||
* modifies the permissions of a user regarding a specific sharing profile.
|
||||
*/
|
||||
private static final String SHARING_PROFILE_PERMISSION_PATCH_PATH_PREFIX = "/sharingProfilePermissions/";
|
||||
|
||||
/**
|
||||
* The prefix of any path within an operation of a JSON patch which
|
||||
* modifies the permissions of a user regarding a specific active connection.
|
||||
@@ -170,6 +176,7 @@ public class PermissionSetResource {
|
||||
// Permission patches for all types of permissions
|
||||
PermissionSetPatch<ObjectPermission> connectionPermissionPatch = new PermissionSetPatch<ObjectPermission>();
|
||||
PermissionSetPatch<ObjectPermission> connectionGroupPermissionPatch = new PermissionSetPatch<ObjectPermission>();
|
||||
PermissionSetPatch<ObjectPermission> sharingProfilePermissionPatch = new PermissionSetPatch<ObjectPermission>();
|
||||
PermissionSetPatch<ObjectPermission> activeConnectionPermissionPatch = new PermissionSetPatch<ObjectPermission>();
|
||||
PermissionSetPatch<ObjectPermission> userPermissionPatch = new PermissionSetPatch<ObjectPermission>();
|
||||
PermissionSetPatch<SystemPermission> systemPermissionPatch = new PermissionSetPatch<SystemPermission>();
|
||||
@@ -205,6 +212,19 @@ public class PermissionSetResource {
|
||||
|
||||
}
|
||||
|
||||
// Create sharing profile permission if path has sharing profileprefix
|
||||
else if (path.startsWith(SHARING_PROFILE_PERMISSION_PATCH_PATH_PREFIX)) {
|
||||
|
||||
// Get identifier and type from patch operation
|
||||
String identifier = path.substring(SHARING_PROFILE_PERMISSION_PATCH_PATH_PREFIX.length());
|
||||
ObjectPermission.Type type = ObjectPermission.Type.valueOf(patch.getValue());
|
||||
|
||||
// Create and update corresponding permission
|
||||
ObjectPermission permission = new ObjectPermission(type, identifier);
|
||||
updatePermissionSet(patch.getOp(), sharingProfilePermissionPatch, permission);
|
||||
|
||||
}
|
||||
|
||||
// Create active connection permission if path has active connection prefix
|
||||
else if (path.startsWith(ACTIVE_CONNECTION_PERMISSION_PATCH_PATH_PREFIX)) {
|
||||
|
||||
@@ -252,6 +272,7 @@ public class PermissionSetResource {
|
||||
// Save the permission changes
|
||||
connectionPermissionPatch.apply(user.getConnectionPermissions());
|
||||
connectionGroupPermissionPatch.apply(user.getConnectionGroupPermissions());
|
||||
sharingProfilePermissionPatch.apply(user.getSharingProfilePermissions());
|
||||
activeConnectionPermissionPatch.apply(user.getActiveConnectionPermissions());
|
||||
userPermissionPatch.apply(user.getUserPermissions());
|
||||
systemPermissionPatch.apply(user.getSystemPermissions());
|
||||
|
@@ -32,6 +32,7 @@ import org.apache.guacamole.GuacamoleException;
|
||||
import org.apache.guacamole.net.auth.ActiveConnection;
|
||||
import org.apache.guacamole.net.auth.Connection;
|
||||
import org.apache.guacamole.net.auth.ConnectionGroup;
|
||||
import org.apache.guacamole.net.auth.SharingProfile;
|
||||
import org.apache.guacamole.net.auth.User;
|
||||
import org.apache.guacamole.net.auth.UserContext;
|
||||
import org.apache.guacamole.rest.activeconnection.APIActiveConnection;
|
||||
@@ -39,6 +40,7 @@ import org.apache.guacamole.rest.connection.APIConnection;
|
||||
import org.apache.guacamole.rest.connectiongroup.APIConnectionGroup;
|
||||
import org.apache.guacamole.rest.history.HistoryResource;
|
||||
import org.apache.guacamole.rest.schema.SchemaResource;
|
||||
import org.apache.guacamole.rest.sharingprofile.APISharingProfile;
|
||||
import org.apache.guacamole.rest.user.APIUser;
|
||||
|
||||
/**
|
||||
@@ -79,6 +81,14 @@ public class UserContextResource {
|
||||
private DirectoryResourceFactory<ConnectionGroup, APIConnectionGroup>
|
||||
connectionGroupDirectoryResourceFactory;
|
||||
|
||||
/**
|
||||
* Factory for creating DirectoryResources which expose a given
|
||||
* SharingProfile Directory.
|
||||
*/
|
||||
@Inject
|
||||
private DirectoryResourceFactory<SharingProfile, APISharingProfile>
|
||||
sharingProfileDirectoryResourceFactory;
|
||||
|
||||
/**
|
||||
* Factory for creating DirectoryResources which expose a given
|
||||
* User Directory.
|
||||
@@ -153,6 +163,24 @@ public class UserContextResource {
|
||||
userContext.getConnectionGroupDirectory());
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a new resource which represents the SharingProfile Directory
|
||||
* contained within the UserContext exposed by this UserContextResource.
|
||||
*
|
||||
* @return
|
||||
* A new resource which represents the SharingProfile Directory
|
||||
* contained within the UserContext exposed by this UserContextResource.
|
||||
*
|
||||
* @throws GuacamoleException
|
||||
* If an error occurs while retrieving the SharingProfile Directory.
|
||||
*/
|
||||
@Path("sharingProfiles")
|
||||
public DirectoryResource<SharingProfile, APISharingProfile>
|
||||
getSharingProfileDirectoryResource() throws GuacamoleException {
|
||||
return sharingProfileDirectoryResourceFactory.create(userContext,
|
||||
userContext.getSharingProfileDirectory());
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a new resource which represents the User Directory contained
|
||||
* within the UserContext exposed by this UserContextResource.
|
||||
|
@@ -0,0 +1,207 @@
|
||||
/*
|
||||
* 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.rest.sharingprofile;
|
||||
|
||||
import java.util.Map;
|
||||
import org.codehaus.jackson.annotate.JsonIgnoreProperties;
|
||||
import org.apache.guacamole.net.auth.SharingProfile;
|
||||
|
||||
/**
|
||||
* The external representation used by the REST API for sharing profiles.
|
||||
*
|
||||
* @author Michael Jumper
|
||||
*/
|
||||
@JsonIgnoreProperties(ignoreUnknown = true)
|
||||
public class APISharingProfile {
|
||||
|
||||
/**
|
||||
* The human-readable name of this sharing profile.
|
||||
*/
|
||||
private String name;
|
||||
|
||||
/**
|
||||
* The unique string which identifies this sharing profile within its
|
||||
* containing directory.
|
||||
*/
|
||||
private String identifier;
|
||||
|
||||
/**
|
||||
* The identifier of the primary connection that this sharing profile
|
||||
* can be used to share.
|
||||
*/
|
||||
private String primaryConnectionIdentifier;
|
||||
|
||||
/**
|
||||
* Map of all associated connection parameter values which apply when the
|
||||
* sharing profile is used, indexed by parameter name.
|
||||
*/
|
||||
private Map<String, String> parameters;
|
||||
|
||||
/**
|
||||
* Map of all associated attributes by attribute identifier.
|
||||
*/
|
||||
private Map<String, String> attributes;
|
||||
|
||||
/**
|
||||
* Creates an empty, uninitialized APISharingProfile. The properties of the
|
||||
* created APISharingProfile will need to be set individually as necessary
|
||||
* via their corresponding setters.
|
||||
*/
|
||||
public APISharingProfile() {}
|
||||
|
||||
/**
|
||||
* Creates a new APISharingProfile with its data populated from that of an
|
||||
* existing SharingProfile. As the connection parameters of the
|
||||
* SharingProfile are potentially sensitive, they will not be included in
|
||||
* the new APISharingProfile.
|
||||
*
|
||||
* @param sharingProfile
|
||||
* The sharing profile to use to populate the data of the new
|
||||
* APISharingProfile.
|
||||
*/
|
||||
public APISharingProfile(SharingProfile sharingProfile) {
|
||||
|
||||
// Set main information
|
||||
this.name = sharingProfile.getName();
|
||||
this.identifier = sharingProfile.getIdentifier();
|
||||
this.primaryConnectionIdentifier = sharingProfile.getPrimaryConnectionIdentifier();
|
||||
|
||||
// Associate any attributes
|
||||
this.attributes = sharingProfile.getAttributes();
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the human-readable name of this sharing profile.
|
||||
*
|
||||
* @return
|
||||
* The human-readable name of this sharing profile.
|
||||
*/
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the human-readable name of this sharing profile.
|
||||
*
|
||||
* @param name
|
||||
* The human-readable name of this sharing profile.
|
||||
*/
|
||||
public void setName(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the unique string which identifies this sharing profile within
|
||||
* its containing directory.
|
||||
*
|
||||
* @return
|
||||
* The unique string which identifies this sharing profile within its
|
||||
* containing directory.
|
||||
*/
|
||||
public String getIdentifier() {
|
||||
return identifier;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the unique string which identifies this sharing profile within
|
||||
* its containing directory.
|
||||
*
|
||||
* @param identifier
|
||||
* The unique string which identifies this sharing profile within its
|
||||
* containing directory.
|
||||
*/
|
||||
public void setIdentifier(String identifier) {
|
||||
this.identifier = identifier;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the identifier of the primary connection that this sharing
|
||||
* profile can be used to share.
|
||||
*
|
||||
* @return
|
||||
* The identifier of the primary connection that this sharing profile
|
||||
* can be used to share.
|
||||
*/
|
||||
public String getPrimaryConnectionIdentifier() {
|
||||
return primaryConnectionIdentifier;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the identifier of the primary connection that this sharing profile
|
||||
* can be used to share.
|
||||
*
|
||||
* @param primaryConnectionIdentifier
|
||||
* The identifier of the primary connection that this sharing profile
|
||||
* can be used to share.
|
||||
*/
|
||||
public void setPrimaryConnectionIdentifier(String primaryConnectionIdentifier) {
|
||||
this.primaryConnectionIdentifier = primaryConnectionIdentifier;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a map of all associated connection parameter values which apply
|
||||
* when the sharing profile is used, indexed by parameter name.
|
||||
*
|
||||
* @return
|
||||
* A map of all associated connection parameter values which apply when
|
||||
* the sharing profile is used, indexed by parameter name.
|
||||
*/
|
||||
public Map<String, String> getParameters() {
|
||||
return parameters;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the map of all associated connection parameter values which apply
|
||||
* when the sharing profile is used, indexed by parameter name.
|
||||
*
|
||||
* @param parameters
|
||||
* The map of all associated connection parameter values which apply
|
||||
* when the sharing profile is used, indexed by parameter name.
|
||||
*/
|
||||
public void setParameters(Map<String, String> parameters) {
|
||||
this.parameters = parameters;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a map of all attributes associated with this sharing profile.
|
||||
* Each entry key is the attribute identifier, while each value is the
|
||||
* attribute value itself.
|
||||
*
|
||||
* @return
|
||||
* The attribute map for this sharing profile.
|
||||
*/
|
||||
public Map<String, String> getAttributes() {
|
||||
return attributes;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the map of all attributes associated with this sharing profile. Each
|
||||
* entry key is the attribute identifier, while each value is the attribute
|
||||
* value itself.
|
||||
*
|
||||
* @param attributes
|
||||
* The attribute map for this sharing profile.
|
||||
*/
|
||||
public void setAttributes(Map<String, String> attributes) {
|
||||
this.attributes = attributes;
|
||||
}
|
||||
|
||||
}
|
@@ -0,0 +1,101 @@
|
||||
/*
|
||||
* 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.rest.sharingprofile;
|
||||
|
||||
import java.util.Map;
|
||||
import org.apache.guacamole.net.auth.SharingProfile;
|
||||
|
||||
/**
|
||||
* Wrapper for APISharingProfile which provides a SharingProfile interface.
|
||||
* Changes to the underlying APISharingProfile are reflected immediately in the
|
||||
* values exposed by the SharingProfile interface, and changes made through the
|
||||
* SharingProfile interface immediately affect the underlying APISharingProfile.
|
||||
*
|
||||
* @author Michael Jumper
|
||||
*/
|
||||
public class APISharingProfileWrapper implements SharingProfile {
|
||||
|
||||
/**
|
||||
* The wrapped APISharingProfile.
|
||||
*/
|
||||
private final APISharingProfile apiSharingProfile;
|
||||
|
||||
/**
|
||||
* Creates a new APISharingProfileWrapper which is backed by the given
|
||||
* APISharingProfile.
|
||||
*
|
||||
* @param apiSharingProfile
|
||||
* The APISharingProfile to wrap.
|
||||
*/
|
||||
public APISharingProfileWrapper(APISharingProfile apiSharingProfile) {
|
||||
this.apiSharingProfile = apiSharingProfile;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return apiSharingProfile.getName();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setName(String name) {
|
||||
apiSharingProfile.setName(name);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getIdentifier() {
|
||||
return apiSharingProfile.getIdentifier();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setIdentifier(String identifier) {
|
||||
apiSharingProfile.setIdentifier(identifier);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getPrimaryConnectionIdentifier() {
|
||||
return apiSharingProfile.getPrimaryConnectionIdentifier();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setPrimaryConnectionIdentifier(String primaryConnectionIdentifier) {
|
||||
apiSharingProfile.setPrimaryConnectionIdentifier(primaryConnectionIdentifier);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Map<String, String> getParameters() {
|
||||
return apiSharingProfile.getParameters();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setParameters(Map<String, String> parameters) {
|
||||
apiSharingProfile.setParameters(parameters);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Map<String, String> getAttributes() {
|
||||
return apiSharingProfile.getAttributes();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setAttributes(Map<String, String> attributes) {
|
||||
apiSharingProfile.setAttributes(attributes);
|
||||
}
|
||||
|
||||
}
|
@@ -0,0 +1,72 @@
|
||||
/*
|
||||
* 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.rest.sharingprofile;
|
||||
|
||||
import com.google.inject.assistedinject.Assisted;
|
||||
import com.google.inject.assistedinject.AssistedInject;
|
||||
import javax.ws.rs.Consumes;
|
||||
import javax.ws.rs.Produces;
|
||||
import javax.ws.rs.core.MediaType;
|
||||
import org.apache.guacamole.net.auth.Directory;
|
||||
import org.apache.guacamole.net.auth.SharingProfile;
|
||||
import org.apache.guacamole.net.auth.UserContext;
|
||||
import org.apache.guacamole.rest.directory.DirectoryObjectResourceFactory;
|
||||
import org.apache.guacamole.rest.directory.DirectoryObjectTranslator;
|
||||
import org.apache.guacamole.rest.directory.DirectoryResource;
|
||||
|
||||
/**
|
||||
* A REST resource which abstracts the operations available on a Directory of
|
||||
* SharingProfiles.
|
||||
*
|
||||
* @author Michael Jumper
|
||||
*/
|
||||
@Produces(MediaType.APPLICATION_JSON)
|
||||
@Consumes(MediaType.APPLICATION_JSON)
|
||||
public class SharingProfileDirectoryResource
|
||||
extends DirectoryResource<SharingProfile, APISharingProfile> {
|
||||
|
||||
/**
|
||||
* Creates a new SharingProfileDirectoryResource which exposes the
|
||||
* operations and subresources available for the given SharingProfile
|
||||
* Directory.
|
||||
*
|
||||
* @param userContext
|
||||
* The UserContext associated with the given Directory.
|
||||
*
|
||||
* @param directory
|
||||
* The Directory being exposed.
|
||||
*
|
||||
* @param translator
|
||||
* A DirectoryObjectTranslator implementation which handles
|
||||
* SharingProfiles.
|
||||
*
|
||||
* @param resourceFactory
|
||||
* A factory which can be used to create instances of resources
|
||||
* representing SharingProfiles.
|
||||
*/
|
||||
@AssistedInject
|
||||
public SharingProfileDirectoryResource(@Assisted UserContext userContext,
|
||||
@Assisted Directory<SharingProfile> directory,
|
||||
DirectoryObjectTranslator<SharingProfile, APISharingProfile> translator,
|
||||
DirectoryObjectResourceFactory<SharingProfile, APISharingProfile> resourceFactory) {
|
||||
super(userContext, directory, translator, resourceFactory);
|
||||
}
|
||||
|
||||
}
|
@@ -0,0 +1,65 @@
|
||||
/*
|
||||
* 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.rest.sharingprofile;
|
||||
|
||||
import com.google.inject.AbstractModule;
|
||||
import org.apache.guacamole.rest.directory.DirectoryObjectResourceFactory;
|
||||
import org.apache.guacamole.rest.directory.DirectoryObjectResource;
|
||||
import com.google.inject.TypeLiteral;
|
||||
import com.google.inject.assistedinject.FactoryModuleBuilder;
|
||||
import org.apache.guacamole.net.auth.SharingProfile;
|
||||
import org.apache.guacamole.rest.directory.DirectoryObjectTranslator;
|
||||
import org.apache.guacamole.rest.directory.DirectoryResource;
|
||||
import org.apache.guacamole.rest.directory.DirectoryResourceFactory;
|
||||
|
||||
/**
|
||||
* Guice Module which configures injections required for handling SharingProfile
|
||||
* resources via the REST API.
|
||||
*
|
||||
* @author Michael Jumper
|
||||
*/
|
||||
public class SharingProfileModule extends AbstractModule {
|
||||
|
||||
@Override
|
||||
protected void configure() {
|
||||
|
||||
// Create the required DirectoryResourceFactory implementation
|
||||
install(new FactoryModuleBuilder()
|
||||
.implement(
|
||||
new TypeLiteral<DirectoryResource<SharingProfile, APISharingProfile>>() {},
|
||||
SharingProfileDirectoryResource.class
|
||||
)
|
||||
.build(new TypeLiteral<DirectoryResourceFactory<SharingProfile, APISharingProfile>>() {}));
|
||||
|
||||
// Create the required DirectoryObjectResourceFactory implementation
|
||||
install(new FactoryModuleBuilder()
|
||||
.implement(
|
||||
new TypeLiteral<DirectoryObjectResource<SharingProfile, APISharingProfile>>() {},
|
||||
SharingProfileResource.class
|
||||
)
|
||||
.build(new TypeLiteral<DirectoryObjectResourceFactory<SharingProfile, APISharingProfile>>() {}));
|
||||
|
||||
// Bind translator for converting between SharingProfile and APISharingProfile
|
||||
bind(new TypeLiteral<DirectoryObjectTranslator<SharingProfile, APISharingProfile>>() {})
|
||||
.to(SharingProfileObjectTranslator.class);
|
||||
|
||||
}
|
||||
|
||||
}
|
@@ -0,0 +1,58 @@
|
||||
/*
|
||||
* 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.rest.sharingprofile;
|
||||
|
||||
import org.apache.guacamole.GuacamoleException;
|
||||
import org.apache.guacamole.net.auth.SharingProfile;
|
||||
import org.apache.guacamole.rest.directory.DirectoryObjectTranslator;
|
||||
|
||||
/**
|
||||
* Translator which converts between SharingProfile objects and
|
||||
* APISharingProfile objects.
|
||||
*
|
||||
* @author Michael Jumper
|
||||
*/
|
||||
public class SharingProfileObjectTranslator
|
||||
implements DirectoryObjectTranslator<SharingProfile, APISharingProfile> {
|
||||
|
||||
@Override
|
||||
public APISharingProfile toExternalObject(SharingProfile object)
|
||||
throws GuacamoleException {
|
||||
return new APISharingProfile(object);
|
||||
}
|
||||
|
||||
@Override
|
||||
public SharingProfile toInternalObject(APISharingProfile object) {
|
||||
return new APISharingProfileWrapper(object);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void applyExternalChanges(SharingProfile existingObject,
|
||||
APISharingProfile object) {
|
||||
|
||||
// Update the sharing profile
|
||||
existingObject.setPrimaryConnectionIdentifier(object.getPrimaryConnectionIdentifier());
|
||||
existingObject.setName(object.getName());
|
||||
existingObject.setParameters(object.getParameters());
|
||||
existingObject.setAttributes(object.getAttributes());
|
||||
|
||||
}
|
||||
|
||||
}
|
@@ -0,0 +1,125 @@
|
||||
/*
|
||||
* 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.rest.sharingprofile;
|
||||
|
||||
import com.google.inject.assistedinject.Assisted;
|
||||
import com.google.inject.assistedinject.AssistedInject;
|
||||
import java.util.Map;
|
||||
import javax.ws.rs.Consumes;
|
||||
import javax.ws.rs.GET;
|
||||
import javax.ws.rs.Path;
|
||||
import javax.ws.rs.Produces;
|
||||
import javax.ws.rs.core.MediaType;
|
||||
import org.apache.guacamole.GuacamoleException;
|
||||
import org.apache.guacamole.GuacamoleSecurityException;
|
||||
import org.apache.guacamole.net.auth.Directory;
|
||||
import org.apache.guacamole.net.auth.SharingProfile;
|
||||
import org.apache.guacamole.net.auth.User;
|
||||
import org.apache.guacamole.net.auth.UserContext;
|
||||
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;
|
||||
import org.apache.guacamole.rest.directory.DirectoryObjectResource;
|
||||
import org.apache.guacamole.rest.directory.DirectoryObjectTranslator;
|
||||
|
||||
/**
|
||||
* A REST resource which abstracts the operations available on an existing
|
||||
* SharingProfile.
|
||||
*
|
||||
* @author Michael Jumper
|
||||
*/
|
||||
@Produces(MediaType.APPLICATION_JSON)
|
||||
@Consumes(MediaType.APPLICATION_JSON)
|
||||
public class SharingProfileResource
|
||||
extends DirectoryObjectResource<SharingProfile, APISharingProfile> {
|
||||
|
||||
/**
|
||||
* The UserContext associated with the Directory which contains the
|
||||
* SharingProfile exposed by this resource.
|
||||
*/
|
||||
private final UserContext userContext;
|
||||
|
||||
/**
|
||||
* The SharingProfile object represented by this SharingProfileResource.
|
||||
*/
|
||||
private final SharingProfile sharingProfile;
|
||||
|
||||
/**
|
||||
* Creates a new SharingProfileResource which exposes the operations and
|
||||
* subresources available for the given SharingProfile.
|
||||
*
|
||||
* @param userContext
|
||||
* The UserContext associated with the given Directory.
|
||||
*
|
||||
* @param directory
|
||||
* The Directory which contains the given SharingProfile.
|
||||
*
|
||||
* @param sharingProfile
|
||||
* The SharingProfile that this SharingProfileResource should represent.
|
||||
*
|
||||
* @param translator
|
||||
* A DirectoryObjectTranslator implementation which handles the type of
|
||||
* object given.
|
||||
*/
|
||||
@AssistedInject
|
||||
public SharingProfileResource(@Assisted UserContext userContext,
|
||||
@Assisted Directory<SharingProfile> directory,
|
||||
@Assisted SharingProfile sharingProfile,
|
||||
DirectoryObjectTranslator<SharingProfile, APISharingProfile> translator) {
|
||||
super(directory, sharingProfile, translator);
|
||||
this.userContext = userContext;
|
||||
this.sharingProfile = sharingProfile;
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves the connection parameters associated with the SharingProfile
|
||||
* exposed by this SharingProfile resource.
|
||||
*
|
||||
* @return
|
||||
* A map of parameter name/value pairs.
|
||||
*
|
||||
* @throws GuacamoleException
|
||||
* If an error occurs while retrieving the connection parameters of the
|
||||
* SharingProfile.
|
||||
*/
|
||||
@GET
|
||||
@Path("parameters")
|
||||
public Map<String, String> getParameters()
|
||||
throws GuacamoleException {
|
||||
|
||||
User self = userContext.self();
|
||||
|
||||
// Retrieve permission sets
|
||||
SystemPermissionSet systemPermissions = self.getSystemPermissions();
|
||||
ObjectPermissionSet sharingProfilePermissions = self.getSharingProfilePermissions();
|
||||
|
||||
// Deny access if adminstrative or update permission is missing
|
||||
String identifier = sharingProfile.getIdentifier();
|
||||
if (!systemPermissions.hasPermission(SystemPermission.Type.ADMINISTER)
|
||||
&& !sharingProfilePermissions.hasPermission(ObjectPermission.Type.UPDATE, identifier))
|
||||
throw new GuacamoleSecurityException("Permission to read sharing profile parameters denied.");
|
||||
|
||||
// Return parameter map
|
||||
return sharingProfile.getParameters();
|
||||
|
||||
}
|
||||
|
||||
}
|
@@ -0,0 +1,25 @@
|
||||
/*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Classes related to retrieving or manipulating sharing profiles using the
|
||||
* Guacamole REST API.
|
||||
*/
|
||||
package org.apache.guacamole.rest.sharingprofile;
|
||||
|
@@ -97,6 +97,11 @@ public class APIUserWrapper implements User {
|
||||
throw new GuacamoleUnsupportedException("APIUserWrapper does not provide permission access.");
|
||||
}
|
||||
|
||||
@Override
|
||||
public ObjectPermissionSet getSharingProfilePermissions() throws GuacamoleException {
|
||||
throw new GuacamoleUnsupportedException("APIUserWrapper does not provide permission access.");
|
||||
}
|
||||
|
||||
@Override
|
||||
public ObjectPermissionSet getUserPermissions()
|
||||
throws GuacamoleException {
|
||||
|
Reference in New Issue
Block a user