case GSASL_VALIDATE_SIMPLE:
/* GSASL_AUTHID, GSASL_AUTHZID, and GSASL_PASSWORD */
propval = US gsasl_property_fast(sctx, GSASL_AUTHID);
- auth_vars[0] = expand_nstring[1] = propval ? propval : US"";
+ auth_vars[0] = expand_nstring[1] = propval ? string_copy(propval) : US"";
propval = US gsasl_property_fast(sctx, GSASL_AUTHZID);
- auth_vars[1] = expand_nstring[2] = propval ? propval : US"";
+ auth_vars[1] = expand_nstring[2] = propval ? string_copy(propval) : US"";
propval = US gsasl_property_fast(sctx, GSASL_PASSWORD);
- auth_vars[2] = expand_nstring[3] = propval ? propval : US"";
+ auth_vars[2] = expand_nstring[3] = propval ? string_copy(propval) : US"";
expand_nmax = 3;
for (int i = 1; i <= 3; ++i)
expand_nlength[i] = Ustrlen(expand_nstring[i]);
propval = US gsasl_property_fast(sctx, GSASL_AUTHZID);
/* We always set $auth1, even if only to empty string. */
- auth_vars[0] = expand_nstring[1] = propval ? propval : US"";
+ auth_vars[0] = expand_nstring[1] = propval ? string_copy(propval) : US"";
expand_nlength[1] = Ustrlen(expand_nstring[1]);
expand_nmax = 1;
/* We always set $auth1, even if only to empty string. */
- auth_vars[0] = expand_nstring[1] = propval ? propval : US"";
+ auth_vars[0] = expand_nstring[1] = propval ? string_copy(propval) : US"";
expand_nlength[1] = Ustrlen(expand_nstring[1]);
expand_nmax = 1;
switched to match the ordering of GSASL_VALIDATE_SIMPLE. */
propval = US gsasl_property_fast(sctx, GSASL_GSSAPI_DISPLAY_NAME);
- auth_vars[0] = expand_nstring[1] = propval ? propval : US"";
+ auth_vars[0] = expand_nstring[1] = propval ? string_copy(propval) : US"";
propval = US gsasl_property_fast(sctx, GSASL_AUTHZID);
- auth_vars[1] = expand_nstring[2] = propval ? propval : US"";
+ auth_vars[1] = expand_nstring[2] = propval ? string_copy(propval) : US"";
expand_nmax = 2;
for (int i = 1; i <= 2; ++i)
expand_nlength[i] = Ustrlen(expand_nstring[i]);
checked_server_condition = TRUE;
break;
+ case GSASL_SCRAM_ITER:
+ if (ob->server_scram_iter)
+ {
+ tmps = CS expand_string(ob->server_scram_iter);
+ gsasl_property_set(sctx, GSASL_SCRAM_ITER, tmps);
+ cbrc = GSASL_OK;
+ }
+ break;
+
+ case GSASL_SCRAM_SALT:
+ if (ob->server_scram_iter)
+ {
+ tmps = CS expand_string(ob->server_scram_salt);
+ gsasl_property_set(sctx, GSASL_SCRAM_SALT, tmps);
+ cbrc = GSASL_OK;
+ }
+ break;
+
case GSASL_PASSWORD:
/* DIGEST-MD5: GSASL_AUTHID, GSASL_AUTHZID and GSASL_REALM
CRAM-MD5: GSASL_AUTHID
point of SASL. */
propval = US gsasl_property_fast(sctx, GSASL_AUTHID);
- auth_vars[0] = expand_nstring[1] = propval ? propval : US"";
+ auth_vars[0] = expand_nstring[1] = propval ? string_copy(propval) : US"";
propval = US gsasl_property_fast(sctx, GSASL_AUTHZID);
- auth_vars[1] = expand_nstring[2] = propval ? propval : US"";
+ auth_vars[1] = expand_nstring[2] = propval ? string_copy(propval) : US"";
propval = US gsasl_property_fast(sctx, GSASL_REALM);
- auth_vars[2] = expand_nstring[3] = propval ? propval : US"";
+ auth_vars[2] = expand_nstring[3] = propval ? string_copy(propval) : US"";
expand_nmax = 3;
for (int i = 1; i <= 3; ++i)
expand_nlength[i] = Ustrlen(expand_nstring[i]);
--- /dev/null
+# Exim test configuration 3820
+
+SERVER=
+
+.include DIR/aux-var/std_conf_prefix
+
+primary_hostname = myhost.test.ex
+
+# ----- Main settings -----
+
+
+# ----- Authentication -----
+
+begin authenticators
+
+sasl1:
+ driver = gsasl
+ public_name = ANONYMOUS
+ server_set_id = $auth1
+ server_condition = true
+
+sasl2:
+ driver = gsasl
+ public_name = PLAIN
+ server_set_id = $auth1
+ server_condition = false
+
+sasl3:
+ driver = gsasl
+ public_name = SCRAM-SHA-1
+
+ # will need to give library salt, stored-key, server-key, itercount
+ #
+ # sigh
+ # gsasl takes props: GSASL_SCRAM_ITER, GSASL_SCRAM_SALT. It _might_ take
+ # a GSASL_SCRAM_SALTED_PASSWORD - but that is only documented for client mode.
+
+ server_scram_iter = 4096
+ # unclear if the salt is given in binary or base64 to the library
+ server_scram_salt = QSXCR+Q6sek8bf92
+ server_password = pencil
+
+ server_condition = true
+ server_set_id = $auth1
+
+
+# End