Github user necouchman commented on a diff in the pull request:

    
https://github.com/apache/incubator-guacamole-client/pull/183#discussion_r140666346
  
    --- Diff: 
guacamole-ext/src/main/java/org/apache/guacamole/properties/CipherGuacamoleProperty.java
 ---
    @@ -0,0 +1,92 @@
    +/*
    + * 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.properties;
    +
    +import java.io.BufferedInputStream;
    +import java.io.File;
    +import java.io.FileInputStream;
    +import java.io.FileNotFoundException;
    +import java.io.InputStream;
    +import java.io.IOException;
    +import java.lang.IllegalArgumentException;
    +import java.security.InvalidKeyException;
    +import java.security.KeyFactory;
    +import java.security.NoSuchAlgorithmException;
    +import java.security.PrivateKey;
    +import java.security.spec.InvalidKeySpecException;
    +import java.security.spec.KeySpec;
    +import java.security.spec.PKCS8EncodedKeySpec;
    +import javax.crypto.Cipher;
    +import javax.crypto.NoSuchPaddingException;
    +import org.apache.guacamole.GuacamoleException;
    +import org.apache.guacamole.environment.Environment;
    +import org.apache.guacamole.environment.LocalEnvironment;
    +
    +/**
    + * A GuacamoleProperty whose value is derived from a private key file.
    + */
    +public abstract class CipherGuacamoleProperty implements 
GuacamoleProperty<Cipher>  {
    +
    +    @Override
    +    public Cipher parseValue(String value) throws GuacamoleException {
    +
    +        try {
    +
    +            final Environment environment = new LocalEnvironment();
    +
    +            // Open and read the file specified in the configuration.
    +            File keyFile = new File(environment.getGuacamoleHome(), value);
    +            InputStream keyInput = new BufferedInputStream(new 
FileInputStream(keyFile));
    +            final byte[] keyBytes = new byte[(int) keyFile.length()];
    +            keyInput.read(keyBytes);
    +            keyInput.close();
    +
    +            // Set up decryption infrastructure
    +            KeyFactory keyFactory = KeyFactory.getInstance("RSA");
    +            KeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes);
    +            final PrivateKey privateKey = 
keyFactory.generatePrivate(keySpec);
    +            final Cipher cipher = 
Cipher.getInstance(privateKey.getAlgorithm());
    +            cipher.init(Cipher.DECRYPT_MODE, privateKey);
    +
    +            return cipher;
    +
    +        }
    +        catch (FileNotFoundException e) {
    +            throw new GuacamoleException("Could not find the specified key 
file.", e);
    +        }
    +        catch (IOException e) {
    +            throw new GuacamoleException("Could not read in the specified 
key file.", e);
    +        }
    +        catch (NoSuchAlgorithmException e) {
    +            throw new GuacamoleException("Specified algorithm does not 
exist.", e);
    +        }
    +        catch (InvalidKeyException e) {
    +            throw new GuacamoleException("Specified key is invalid.", e);
    +        }
    +        catch (InvalidKeySpecException e) {
    +            throw new GuacamoleException("Invalid KeySpec 
initialization.", e);
    +        }
    +        catch (NoSuchPaddingException e) {
    +            throw new GuacamoleException("No such padding exception.", e);
    +        }
    +
    --- End diff --
    
    So, I've redone most of this such that it throws the 
GuacamoleServerException.  There are two scenarios I can think of where having 
authentication succeed despite some error in the ClearPass decryption process 
would be desirable:
    - If the credentials object is provided by the CAS server, but the 
Guacamole admin has not configured a private key, I think authentication should 
still succeed.  Since, in many organizations, SSO is run by someone different 
than a VDI/Desktop/RemoteAccess person, it's conceivable that the CAS server 
may provide something we choose not to consume, and that should not cause an 
error.
    - Where the Guacamole admin has configured a PrivateKey, but CAS is not 
providing a value for the credential parameter.  Again, with the potential for 
CAS and Guacamole to be run by different admins/groups, or for different users 
within CAS to have different policies applied, it's conceivable that the 
GuacamoleAdmin configures a PrivateKey file for this purpose, but the attribute 
is blank/null.
    
    Is my logic sound there?


---

Reply via email to