GUACAMOLE-320: Merge Ensure blank values for text attributes are interpreted equivalently to null.
diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/connection/ModeledConnection.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/connection/ModeledConnection.java
index bcd7b11..7a7162e 100644
--- a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/connection/ModeledConnection.java
+++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/connection/ModeledConnection.java
@@ -285,8 +285,8 @@
             logger.debug("Unable to parse numeric attribute.", e);
         }
 
-        // Set guacd hostname (no translation necessary)
-        getModel().setProxyHostname(attributes.get(GUACD_HOSTNAME_NAME));
+        // Translate guacd hostname
+        getModel().setProxyHostname(TextField.parse(attributes.get(GUACD_HOSTNAME_NAME)));
 
         // Translate guacd port
         try { getModel().setProxyPort(NumericField.parse(attributes.get(GUACD_PORT_NAME))); }
diff --git a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/user/ModeledUser.java b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/user/ModeledUser.java
index 418ffad..cab45c8 100644
--- a/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/user/ModeledUser.java
+++ b/extensions/guacamole-auth-jdbc/modules/guacamole-auth-jdbc-base/src/main/java/org/apache/guacamole/auth/jdbc/user/ModeledUser.java
@@ -526,16 +526,16 @@
     private void setUnrestrictedAttributes(Map<String, String> attributes) {
 
         // Translate full name attribute
-        getModel().setFullName(attributes.get(User.Attribute.FULL_NAME));
+        getModel().setFullName(TextField.parse(attributes.get(User.Attribute.FULL_NAME)));
 
         // Translate email address attribute
-        getModel().setEmailAddress(attributes.get(User.Attribute.EMAIL_ADDRESS));
+        getModel().setEmailAddress(TextField.parse(attributes.get(User.Attribute.EMAIL_ADDRESS)));
 
         // Translate organization attribute
-        getModel().setOrganization(attributes.get(User.Attribute.ORGANIZATION));
+        getModel().setOrganization(TextField.parse(attributes.get(User.Attribute.ORGANIZATION)));
 
         // Translate role attribute
-        getModel().setOrganizationalRole(attributes.get(User.Attribute.ORGANIZATIONAL_ROLE));
+        getModel().setOrganizationalRole(TextField.parse(attributes.get(User.Attribute.ORGANIZATIONAL_ROLE)));
 
     }
 
diff --git a/guacamole-ext/src/main/java/org/apache/guacamole/form/TextField.java b/guacamole-ext/src/main/java/org/apache/guacamole/form/TextField.java
index 0880771..2751e14 100644
--- a/guacamole-ext/src/main/java/org/apache/guacamole/form/TextField.java
+++ b/guacamole-ext/src/main/java/org/apache/guacamole/form/TextField.java
@@ -35,4 +35,25 @@
         super(name, Field.Type.TEXT);
     }
 
+    /**
+     * Parses the given string, interpreting empty strings as equivalent to
+     * null. For all other cases, the given string is returned verbatim.
+     *
+     * @param str
+     *     The string to parse, which may be null.
+     *
+     * @return
+     *     The given string, or null if the given string was null or empty.
+     */
+    public static String parse(String str) {
+
+        // Return null if no value provided
+        if (str == null || str.isEmpty())
+            return null;
+
+        // Otherwise, return string unmodified
+        return str;
+
+    }
+
 }