Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

GUACAMOLE-1948: Provide a comprehensive error message for input exceeding database column. #983

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,8 @@
import java.util.Map;
import java.util.Set;
import org.apache.guacamole.auth.jdbc.user.ModeledAuthenticatedUser;
import org.apache.guacamole.language.TranslatableGuacamoleClientOverrunException;
import org.apache.guacamole.language.TranslatableMessage;
import org.apache.guacamole.auth.jdbc.base.ModeledDirectoryObjectMapper;
import org.apache.guacamole.auth.jdbc.tunnel.GuacamoleTunnelService;
import org.apache.guacamole.GuacamoleClientException;
Expand Down Expand Up @@ -89,6 +91,11 @@ public class ConnectionService extends ModeledChildDirectoryObjectService<Modele
*/
@Inject
private GuacamoleTunnelService tunnelService;

/**
* Known limit for the size of the connection parameter values.
*/
private static final int CONNECTION_PARAMETER_VALUE_LIMIT = 4096;

@Override
protected ModeledDirectoryObjectMapper<ConnectionModel> getObjectMapper() {
Expand Down Expand Up @@ -154,11 +161,50 @@ protected ObjectPermissionSet getParentEffectivePermissionSet(ModeledAuthenticat

}

/**
* Validates that all connection parameter values are within the expected size limit.
*
* @param parameters
* The map of connection parameter name/value pairs to validate.
*
* @throws GuacamoleClientException
* If any of the parameter values exceed the defined limit.
*/
private void validateParameters(Map<String, String> parameters) throws GuacamoleClientException {
// Iterate through each parameter to validate its size
for (Map.Entry<String, String> parameter : parameters.entrySet()) {
String value = parameter.getValue();

// Check if parameter value exceeds size limit
if (value != null && value.length() > CONNECTION_PARAMETER_VALUE_LIMIT) {

Map<String, Object> vars = new HashMap<>();
vars.put("MAX_SIZE", CONNECTION_PARAMETER_VALUE_LIMIT);
vars.put("PARAMETER_NAME", parameter.getKey());

// Create a translatable message with the error key and substitution variables
TranslatableMessage translatableMessage = new TranslatableMessage(
"CONNECTION_PARAMETERS.DATABASE_PARAMETER_VALUE_TOO_LONG",
vars
);

throw new TranslatableGuacamoleClientOverrunException(
"The value provided for connection parameter \"" + parameter.getKey() +
"\" exceeds the maximum allowed length.",
translatableMessage
);
}
}
}

@Override
protected void beforeCreate(ModeledAuthenticatedUser user,
Connection object, ConnectionModel model)
throws GuacamoleException {

// Validate parameters before saving
validateParameters(object.getConfiguration().getParameters());

super.beforeCreate(user, object, model);

// Name must not be blank
Expand All @@ -177,6 +223,9 @@ protected void beforeUpdate(ModeledAuthenticatedUser user,
ModeledConnection object, ConnectionModel model)
throws GuacamoleException {

// Validate parameters before saving
validateParameters(object.getConfiguration().getParameters());

super.beforeUpdate(user, object, model);

// Name must not be blank
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,10 @@

"SECTION_HEADER_RESTRICTIONS" : "Group Restrictions"

}
},

"CONNECTION_PARAMETERS": {
"DATABASE_PARAMETER_VALUE_TOO_LONG": "The value provided for connection parameter {PARAMETER_NAME} exceeds the maximum allowed length of {MAX_SIZE} {MAX_SIZE, plural, one{character} other{characters}}."
}

}