mirror of
https://github.com/gyurix1968/guacamole-client.git
synced 2025-09-06 05:07:41 +00:00
GUACAMOLE-1289: Add new translations and guacamole properties.
This commit is contained in:
@@ -102,7 +102,7 @@ public class UserVerificationService {
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
|
|
||||||
String redirectUrl = confService.getRedirectUrl().toString();
|
String redirectUrl = confService.getRedirectUri().toString();
|
||||||
|
|
||||||
String builtUrl = UriComponentsBuilder
|
String builtUrl = UriComponentsBuilder
|
||||||
.fromUriString(redirectUrl)
|
.fromUriString(redirectUrl)
|
||||||
@@ -124,7 +124,7 @@ public class UserVerificationService {
|
|||||||
String duoCode = request.getParameter(DUO_CODE_PARAMETER_NAME);
|
String duoCode = request.getParameter(DUO_CODE_PARAMETER_NAME);
|
||||||
String duoState = request.getParameter(DUO_STATE_PARAMETER_NAME);
|
String duoState = request.getParameter(DUO_STATE_PARAMETER_NAME);
|
||||||
|
|
||||||
// If no code or state is received, assume Duo MFA redirect has not occured and do it.
|
// If no code or state is received, assume Duo MFA redirect has not occured and do it
|
||||||
if (duoCode == null || duoState == null) {
|
if (duoCode == null || duoState == null) {
|
||||||
|
|
||||||
// Get a new session state from the Duo client
|
// Get a new session state from the Duo client
|
||||||
|
@@ -55,8 +55,8 @@ public class ConfigurationService {
|
|||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The property within guacamole.properties which defines the integration
|
* The property within guacamole.properties which defines the client id
|
||||||
* key received from Duo for verifying Guacamole users. This value MUST be
|
* received from Duo for verifying Guacamole users. This value MUST be
|
||||||
* exactly 20 characters.
|
* exactly 20 characters.
|
||||||
*/
|
*/
|
||||||
private static final StringGuacamoleProperty DUO_CLIENT_ID =
|
private static final StringGuacamoleProperty DUO_CLIENT_ID =
|
||||||
@@ -81,15 +81,15 @@ public class ConfigurationService {
|
|||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The property within guacamole.properties which defines the redirect URL
|
* The property within guacamole.properties which defines the redirect URI
|
||||||
* that Duo will call after the second factor has been completed. This
|
* that Duo will call after the second factor has been completed. This
|
||||||
* should be the URL used to access Guacamole.
|
* should be the URI used to access Guacamole.
|
||||||
*/
|
*/
|
||||||
private static final URIGuacamoleProperty DUO_REDIRECT_URL =
|
private static final URIGuacamoleProperty DUO_REDIRECT_URI =
|
||||||
new URIGuacamoleProperty() {
|
new URIGuacamoleProperty() {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getName() { return "duo-redirect-url"; }
|
public String getName() { return "duo-redirect-uri"; }
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -140,8 +140,8 @@ public class ConfigurationService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the client secert received from Duo for verifying Guacamole users,
|
* Returns the client secret received from Duo for verifying Guacamole users,
|
||||||
* as defined in guacamole.properties by the "duo-client-secert" property.
|
* as defined in guacamole.properties by the "duo-client-secret" property.
|
||||||
* This value MUST be exactly 20 characters.
|
* This value MUST be exactly 20 characters.
|
||||||
*
|
*
|
||||||
* @return
|
* @return
|
||||||
@@ -155,9 +155,9 @@ public class ConfigurationService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return the callback URL that will be called by Duo after authentication
|
* Return the callback URI that will be called by Duo after authentication
|
||||||
* with Duo has been completed. This should be the URL to return the user
|
* with Duo has been completed. This should be the URI to return the user
|
||||||
* to the Guacamole interface, and will be a full URL.
|
* to the Guacamole interface, and will be a full URI.
|
||||||
*
|
*
|
||||||
* @return
|
* @return
|
||||||
* The URL for Duo to use to callback to the Guacamole interface after
|
* The URL for Duo to use to callback to the Guacamole interface after
|
||||||
@@ -167,8 +167,8 @@ public class ConfigurationService {
|
|||||||
* If guacamole.properties cannot be read, or if the property is not
|
* If guacamole.properties cannot be read, or if the property is not
|
||||||
* defined.
|
* defined.
|
||||||
*/
|
*/
|
||||||
public URI getRedirectUrl() throws GuacamoleException {
|
public URI getRedirectUri() throws GuacamoleException {
|
||||||
return environment.getRequiredProperty(DUO_REDIRECT_URL);
|
return environment.getRequiredProperty(DUO_REDIRECT_URI);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -7,7 +7,8 @@
|
|||||||
"LOGIN" : {
|
"LOGIN" : {
|
||||||
"FIELD_HEADER_GUAC_DUO_SIGNED_RESPONSE" : "",
|
"FIELD_HEADER_GUAC_DUO_SIGNED_RESPONSE" : "",
|
||||||
"INFO_DUO_VALIDATION_CODE_INCORRECT" : "Duo validation code incorrect.",
|
"INFO_DUO_VALIDATION_CODE_INCORRECT" : "Duo validation code incorrect.",
|
||||||
"INFO_DUO_AUTH_REQUIRED" : "Please authenticate with Duo to continue."
|
"INFO_DUO_AUTH_REQUIRED" : "Please authenticate with Duo to continue.",
|
||||||
|
"INFO_DUO_REDIRECT_PENDING" : "Please wait, redirecting to Duo..."
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@@ -2,7 +2,8 @@
|
|||||||
|
|
||||||
"LOGIN" : {
|
"LOGIN" : {
|
||||||
"INFO_DUO_VALIDATION_CODE_INCORRECT" : "Duoの認証コードが間違っています。",
|
"INFO_DUO_VALIDATION_CODE_INCORRECT" : "Duoの認証コードが間違っています。",
|
||||||
"INFO_DUO_AUTH_REQUIRED" : "Duoで認証してください。"
|
"INFO_DUO_AUTH_REQUIRED" : "Duoで認証してください。",
|
||||||
|
"INFO_DUO_REDIRECT_PENDING" : "Duoへリダイレクトしています。"
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@@ -845,14 +845,13 @@ associate_totp() {
|
|||||||
|
|
||||||
##
|
##
|
||||||
## Adds properties to guacamole.properties which configure the Duo two-factor
|
## Adds properties to guacamole.properties which configure the Duo two-factor
|
||||||
## authentication service. Checks to see if all variables are defined and makes sure
|
## authentication service. Checks to see if all variables are defined
|
||||||
## DUO_APPLICATION_KEY is >= 40 characters.
|
|
||||||
##
|
##
|
||||||
associate_duo() {
|
associate_duo() {
|
||||||
# Verify required parameters are present
|
# Verify required parameters are present
|
||||||
if [ -z "$DUO_INTEGRATION_KEY" ] || \
|
if [ -z "$DUO_CLIENT_ID" ] || \
|
||||||
[ -z "$DUO_SECRET_KEY" ] || \
|
[ -z "$DUO_CLIENT_SECRET" ] || \
|
||||||
[ ${#DUO_APPLICATION_KEY} -lt 40 ]
|
[ -z "$DUO_REDIRECT_URI" ]
|
||||||
then
|
then
|
||||||
cat <<END
|
cat <<END
|
||||||
FATAL: Missing required environment variables
|
FATAL: Missing required environment variables
|
||||||
@@ -862,21 +861,20 @@ following environment variables:
|
|||||||
|
|
||||||
DUO_API_HOSTNAME The hostname of the Duo API endpoint.
|
DUO_API_HOSTNAME The hostname of the Duo API endpoint.
|
||||||
|
|
||||||
DUO_INTEGRATION_KEY The integration key provided for Guacamole by Duo.
|
DUO_CLIENT_ID The client id (or integration key) provided for Guacamole by Duo.
|
||||||
|
|
||||||
DUO_SECRET_KEY The secret key provided for Guacamole by Duo.
|
DUO_CLIENT_SECRET The secret key provided for Guacamole by Duo.
|
||||||
|
|
||||||
DUO_APPLICATION_KEY An arbitrary, random key.
|
DUO_REDIRECT_URI The URI to redirect back to upon successful authentication.
|
||||||
This value must be at least 40 characters.
|
|
||||||
END
|
END
|
||||||
exit 1;
|
exit 1;
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Update config file
|
# Update config file
|
||||||
set_property "duo-api-hostname" "$DUO_API_HOSTNAME"
|
set_property "duo-api-hostname" "$DUO_API_HOSTNAME"
|
||||||
set_property "duo-integration-key" "$DUO_INTEGRATION_KEY"
|
set_property "duo-client-id" "$DUO_CLIENT_ID"
|
||||||
set_property "duo-secret-key" "$DUO_SECRET_KEY"
|
set_property "duo-client-secret" "$DUO_CLIENT_SECRET"
|
||||||
set_property "duo-application-key" "$DUO_APPLICATION_KEY"
|
set_property "duo-redirect-uri" "$DUO_REDIRECT_URI"
|
||||||
|
|
||||||
# Add required .jar files to GUACAMOLE_EXT
|
# Add required .jar files to GUACAMOLE_EXT
|
||||||
ln -s /opt/guacamole/duo/guacamole-auth-*.jar "$GUACAMOLE_EXT"
|
ln -s /opt/guacamole/duo/guacamole-auth-*.jar "$GUACAMOLE_EXT"
|
||||||
|
@@ -108,8 +108,8 @@ protected final long expires;
|
|||||||
* as the number of milliseconds since UNIX epoch.
|
* as the number of milliseconds since UNIX epoch.
|
||||||
*/
|
*/
|
||||||
public GuacamoleInsufficientCredentialsException(String message,
|
public GuacamoleInsufficientCredentialsException(String message,
|
||||||
CredentialsInfo credentialsInfo, String state, String providerIdentifier, String queryIdentifier,
|
CredentialsInfo credentialsInfo, String state,
|
||||||
long expires) {
|
String providerIdentifier, String queryIdentifier, long expires) {
|
||||||
super(message, credentialsInfo);
|
super(message, credentialsInfo);
|
||||||
this.state = state;
|
this.state = state;
|
||||||
this.providerIdentifier = providerIdentifier;
|
this.providerIdentifier = providerIdentifier;
|
||||||
|
@@ -364,7 +364,7 @@ public class AuthenticationService {
|
|||||||
*
|
*
|
||||||
* @return
|
* @return
|
||||||
* Resumed credentials if a valid resumable state is found; otherwise,
|
* Resumed credentials if a valid resumable state is found; otherwise,
|
||||||
* returns {@code null}.
|
* returns null.
|
||||||
*/
|
*/
|
||||||
private Credentials resumeAuthentication(Credentials credentials) {
|
private Credentials resumeAuthentication(Credentials credentials) {
|
||||||
|
|
||||||
@@ -373,11 +373,11 @@ public class AuthenticationService {
|
|||||||
// Retrieve signed State from the request
|
// Retrieve signed State from the request
|
||||||
HttpServletRequest request = credentials.getRequest();
|
HttpServletRequest request = credentials.getRequest();
|
||||||
|
|
||||||
// Retrieve the provider id from the query parameters.
|
// Retrieve the provider id from the query parameters
|
||||||
String resumableProviderId = request.getParameter(Credentials.RESUME_QUERY);
|
String resumableProviderId = request.getParameter(Credentials.RESUME_QUERY);
|
||||||
// Check if a provider id is set.
|
// Check if a provider id is set
|
||||||
if (resumableProviderId == null || resumableProviderId.isEmpty()) {
|
if (resumableProviderId == null || resumableProviderId.isEmpty()) {
|
||||||
// return if a provider id is not set.
|
// Return if a provider id is not set
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -387,34 +387,34 @@ public class AuthenticationService {
|
|||||||
Map.Entry<String, ResumableAuthenticationState> entry = iterator.next();
|
Map.Entry<String, ResumableAuthenticationState> entry = iterator.next();
|
||||||
ResumableAuthenticationState resumableState = entry.getValue();
|
ResumableAuthenticationState resumableState = entry.getValue();
|
||||||
|
|
||||||
// Check if the provider ID from the request matches the one in the map entry.
|
// Check if the provider ID from the request matches the one in the map entry
|
||||||
boolean providerMatches = resumableProviderId.equals(resumableState.getProviderIdentifier());
|
boolean providerMatches = resumableProviderId.equals(resumableState.getProviderIdentifier());
|
||||||
if (!providerMatches) {
|
if (!providerMatches) {
|
||||||
// If the provider doesn't match, skip to the next entry.
|
// If the provider doesn't match, skip to the next entry
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Use the query identifier from the entry to retrieve the corresponding state parameter.
|
// Use the query identifier from the entry to retrieve the corresponding state parameter
|
||||||
String stateQueryParameter = resumableState.getQueryIdentifier();
|
String stateQueryParameter = resumableState.getQueryIdentifier();
|
||||||
String stateFromParameter = request.getParameter(stateQueryParameter);
|
String stateFromParameter = request.getParameter(stateQueryParameter);
|
||||||
|
|
||||||
// Check if the `state` parameter is set.
|
// Check if a state parameter is set
|
||||||
if (stateFromParameter == null || stateFromParameter.isEmpty()) {
|
if (stateFromParameter == null || stateFromParameter.isEmpty()) {
|
||||||
// Remove and continue if `state` is not provided or is empty.
|
// Remove and continue if`state is not provided or is empty
|
||||||
iterator.remove();
|
iterator.remove();
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// If the key in the entry (state) matches the state parameter provided in the request.
|
// If the key in the entry (state) matches the state parameter provided in the request
|
||||||
if (entry.getKey().equals(stateFromParameter)) {
|
if (entry.getKey().equals(stateFromParameter)) {
|
||||||
|
|
||||||
// Remove the current entry from the map.
|
// Remove the current entry from the map
|
||||||
iterator.remove();
|
iterator.remove();
|
||||||
|
|
||||||
// Check if the resumableState has expired
|
// Check if the resumableState has expired
|
||||||
if (!resumableState.isExpired()) {
|
if (!resumableState.isExpired()) {
|
||||||
|
|
||||||
// Set the actualCredentials to the credentials from the matched entry.
|
// Set the actualCredentials to the credentials from the matched entry
|
||||||
resumedCredentials = resumableState.getCredentials();
|
resumedCredentials = resumableState.getCredentials();
|
||||||
|
|
||||||
if (resumedCredentials != null) {
|
if (resumedCredentials != null) {
|
||||||
@@ -423,7 +423,7 @@ public class AuthenticationService {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Exit the loop since we've found the matching state and it's unique.
|
// Exit the loop since we've found the matching state and it's unique
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -89,7 +89,7 @@ public class ResumableAuthenticationState {
|
|||||||
* indicating that the state is expired; false otherwise.
|
* indicating that the state is expired; false otherwise.
|
||||||
*/
|
*/
|
||||||
public boolean isExpired() {
|
public boolean isExpired() {
|
||||||
return System.currentTimeMillis() > expirationTimestamp;
|
return System.currentTimeMillis() >= expirationTimestamp;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Reference in New Issue
Block a user