diff -rw cyrus-sasl-2.1.24/doc/options.html cyrus-sasl-2.1.24-sql/doc/options.html
177c177
<
sql_select | SQL plugin |
---
> sql_auxprop_select | SQL plugin |
179c179,185
< required in order to use the SQL plugin.
---
> required in order to use the SQL auxprop plugin.
> none |
>
>
> sql_canon_select | SQL plugin |
> SELECT statement to use for fetching properties. This option is
> required in order to use the SQL canon plugin. |
diff -rw cyrus-sasl-2.1.24/plugins/makeinit.sh cyrus-sasl-2.1.24-sql/plugins/makeinit.sh
92c92
< # ldapdb is also a canon_user plugin
---
> # ldapdb and sql are also canon_user plugins
93a94,95
> echo "SASL_CANONUSER_PLUG_INIT( sql )" >> sql_init.c
>
diff -rw cyrus-sasl-2.1.24/plugins/sql.c cyrus-sasl-2.1.24-sql/plugins/sql.c
3c3
< ** SQL Auxprop plugin
---
> ** SQL Auxprop and Canon plugin
5c5,6
< ** Ken Murchison
---
> ** Lars Duesing -- canon plugin
> ** Ken Murchison -- original auxprop plugin
53c54,55
< const char *sql_select;
---
> const char *sql_auxprop_select;
> const char *sql_canon_select;
802,804c804,806
< r = utils->getopt(utils->getopt_context,"SQL", "sql_select",
< &settings->sql_select, NULL);
< if (r || !settings->sql_select ) {
---
> r = utils->getopt(utils->getopt_context,"SQL", "sql_auxprop_select",
> &settings->sql_auxprop_select, NULL);
> if (r || !settings->sql_auxprop_select ) {
805a808,810
> r = utils->getopt(utils->getopt_context,"SQL", "sql_select",
> &settings->sql_auxprop_select, NULL);
> if (r || !settings->sql_auxprop_select) {
807,809c812,818
< &settings->sql_select, NULL);
< if (r || !settings->sql_select) {
< settings->sql_select = SQL_BLANK_STRING;
---
> &settings->sql_auxprop_select, NULL);
> if (r || !settings->sql_auxprop_select) {
> settings->sql_auxprop_select = SQL_BLANK_STRING;
> } else
> {
> utils->log(NULL, SASL_LOG_WARN,
> "sql plugin: Option sql_statement is deprecated, use sql_auxprop_select instead!");
811a821,833
> else
> {
> utils->log(NULL, SASL_LOG_WARN,
> "sql plugin: Option sql_select is deprecated, use sql_auxprop_select instead!");
> }
>
> }
>
> r = utils->getopt(utils->getopt_context, "SQL", "sql_canon_select",
> &settings->sql_canon_select, NULL);
> if (r || !settings->sql_canon_select) {
> settings->sql_canon_select = SQL_BLANK_STRING;
> }
921c943
< "sql plugin Parse the username %s\n", user);
---
> "sql_auxprop plugin Parse the username %s\n", user);
970c992
< "sql plugin couldn't connect to any host\n");
---
> "sql_auxprop plugin couldn't connect to any host\n");
1025c1047
< "sql plugin create statement from %s %s %s\n",
---
> "sql_auxprop plugin create statement from %s %s %s\n",
1029c1051
< query = sql_create_statement(settings->sql_select,
---
> query = sql_create_statement(settings->sql_auxprop_select,
1039c1061
< "sql plugin doing query %s\n", query);
---
> "sql_auxprop plugin doing query %s\n", query);
1076c1098
< "sql plugin create statement from %s %s %s\n",
---
> "sql_auxprop plugin create statement from %s %s %s\n",
1082c1104
< query = sql_create_statement(settings->sql_select,
---
> query = sql_create_statement(settings->sql_auxprop_select,
1092c1114
< "sql plugin doing query %s\n", query);
---
> "sql_auxprop plugin doing query %s\n", query);
1226c1248
< statement = sql_create_statement(settings->sql_select,
---
> statement = sql_create_statement(settings->sql_auxprop_select,
1295d1316
<
1308a1330,1527
>
> static int
> sql_canon_server (void *glob_context,
> sasl_server_params_t * sparams,
> const char *user, unsigned ulen,
> unsigned flags __attribute__((unused)),
> char *out_user,
> unsigned out_umax, unsigned *out_ulen)
> {
> sparams->utils->seterror (sparams->utils->conn, 0, "sql_canon_server");
>
> char *userid = NULL;
> /* realm could be used for something clever */
> char *realm = NULL;
> const char *user_realm = NULL;
> char value[8192];
> size_t value_len;
> char old_value[8192];
> size_t old_value_len;
> char *query = NULL;
> char *escap_userid = NULL;
> char *escap_realm = NULL;
> sql_settings_t *settings;
> void *conn = NULL;
> unsigned i;
> char *in_buf, *userin;
> const char *begin_u;
> size_t u_apprealm = 0;
>
> if (!glob_context || !sparams->utils || !user)
> return SASL_BADPARAM;
>
> sparams->utils->log(NULL, SASL_LOG_DEBUG,
> "sql_canon_server Parse the username %s\n", user);
>
>
> in_buf = sparams->utils->malloc ((ulen + 2) * sizeof (char));
> if (!in_buf)
> return SASL_NOMEM;
>
> userin = in_buf;
>
> memcpy (userin, user, ulen);
> userin[ulen] = '\0';
>
>
> for (i = 0; isspace ((int) userin[i]) && i < ulen; i++);
> begin_u = &(userin[i]);
> if (i > 0)
> ulen -= i;
>
> for (; ulen > 0 && isspace ((int) begin_u[ulen - 1]); ulen--);
> if (begin_u == &(userin[ulen]))
> {
> sparams->utils->free (in_buf);
> sparams->utils->seterror (sparams->utils->conn, 0,
> "All-whitespace username.");
> return SASL_FAIL;
> }
>
> /* Need to append realm if necessary (see sasl.h) */
> if (sparams->user_realm)
> {
> user_realm = sparams->user_realm;
> }
> else
> {
> user_realm = sparams->serverFQDN;
> }
>
> if (!strchr (user, '@'))
> {
> u_apprealm = strlen (user_realm) + 1;
> }
>
> /* setup the settings */
> settings = (sql_settings_t *) glob_context;
>
> /* just need to escape userid and realm now */
> /* allocate some memory */
> escap_userid = (char *) sparams->utils->malloc (255);
> escap_realm = (char *) sparams->utils->malloc (255);
>
> if (!escap_userid || !escap_realm)
> {
> sparams->utils->log (NULL, SASL_LOG_DEBUG,
> "sql_canon_server: memerror \n");
> MEMERROR (sparams->utils);
> goto done;
> }
>
> conn = sql_connect (settings, sparams->utils);
> if (!conn)
> {
> sparams->utils->log (NULL, SASL_LOG_ERR,
> "sql_canon_server couldn't connect to any host\n");
> goto done;
> }
>
> /* escape out */
> settings->sql_engine->sql_escape_str (escap_userid, userin);
> settings->sql_engine->sql_escape_str (escap_realm, user_realm);
>
> /* create a statement that we will use */
> sparams->utils->log(NULL, SASL_LOG_DEBUG,
> "sql_canon plugin create statement from %s %s\n",
> escap_userid, escap_realm);
>
> query = sql_create_statement (settings->sql_canon_select,
> escap_userid, escap_userid,
> escap_realm, NULL, sparams->utils);
> memcpy(old_value,userin, strlen (userin));
> old_value_len = strlen (userin);
> /* run the query */
> sparams->utils->log(NULL, SASL_LOG_DEBUG,
> "sql_canon plugin doing query %s\n", query);
>
> while (!settings->sql_engine->sql_exec (conn, query, value, sizeof (value),
> &value_len, sparams->utils))
> {
> memcpy(old_value,value,value_len);
> old_value_len=value_len;
> settings->sql_engine->sql_escape_str (escap_userid, value);
> settings->sql_engine->sql_escape_str (escap_realm, user_realm);
> sparams->utils->log(NULL, SASL_LOG_DEBUG,
> "sql_canon plugin create statement from %s %s\n",
> escap_userid, escap_realm);
>
> /* create a statement that we will use */
> query = sql_create_statement (settings->sql_canon_select,
> escap_userid, escap_userid,
> escap_realm, NULL, sparams->utils);
> sparams->utils->log(NULL, SASL_LOG_DEBUG,
> "sql_canon plugin doing query %s\n", query);
>
> }
> if (old_value_len < out_umax)
> {
> memcpy (out_user, old_value, old_value_len);
> out_user[old_value_len] = '\0';
> *out_ulen = old_value_len;
> }
> else
> {
> MEMERROR (sparams->utils);
> goto done;
> }
> sparams->utils->free (query);
>
> done:
> if (escap_userid)
> sparams->utils->free (escap_userid);
> if (escap_realm)
> sparams->utils->free (escap_realm);
> if (conn)
> settings->sql_engine->sql_close (conn);
> if (userid)
> sparams->utils->free (userid);
> if (realm)
> sparams->utils->free (realm);
> return SASL_OK;
> }
>
> static int
> sql_canon_client(void *glob_context __attribute__((unused)),
> sasl_client_params_t *cparams,
> const char *user,
> unsigned ulen,
> unsigned flags __attribute__((unused)),
> char *out,
> unsigned out_max,
> unsigned *out_ulen){
> if(!cparams || !user) return SASL_BADPARAM;
>
> /* Trim whitespace */
> while(isspace(*(unsigned char *)user)) {
> user++;
> ulen--;
> }
> while(isspace((unsigned char)user[ulen-1])) {
> ulen--;
> }
>
> if (!ulen) {
> cparams->utils->seterror(cparams->utils->conn, 0,
> "All-whitespace username.");
> return SASL_FAIL;
> }
> memcpy(out, user, ulen);
> out[ulen] = '\0';
> *out_ulen = ulen;
> return SASL_OK;
> }
>
>
>
>
>
1346,1347c1565,1566
< if (!sql_exists(settings->sql_select)) {
< utils->log(NULL, SASL_LOG_ERR, "sql_select option missing");
---
> if (!sql_exists(settings->sql_auxprop_select)) {
> utils->log(NULL, SASL_LOG_ERR, "sql_auxprop_select option missing");
1353,1354c1572,1573
< "sql auxprop plugin using %s engine\n",
< settings->sql_engine->name);
---
> "sql_auxprop_plugin using %s engine with select: %s\n",
> settings->sql_engine->name, settings->sql_auxprop_select);
1359a1579,1643
> static sasl_canonuser_plug_t sql_canonuser_plugin = {
> 0, /* features */
> 0, /* spare */
> NULL, /* glob_context */
> "sql", /* name */
> sql_auxprop_free, /* canon_user_free */
> sql_canon_server, /* canon_user_server */
> sql_canon_client, /* canon_user_client */
> NULL,
> NULL,
> NULL
> };
>
> int
> sql_canonuser_plug_init (const sasl_utils_t * utils
> __attribute__ ((unused)), int max_version,
> int *out_version,
> sasl_canonuser_plug_t ** plug,
> const char *plugname
> __attribute__ ((unused)))
> {
> sql_settings_t *settings;
>
> if (!out_version || !plug)
> return SASL_BADPARAM;
>
> if (max_version < SASL_CANONUSER_PLUG_VERSION)
> return SASL_BADVERS;
>
> *out_version = SASL_CANONUSER_PLUG_VERSION;
>
> settings = (sql_settings_t *) utils->malloc (sizeof (sql_settings_t));
>
> if (!settings)
> {
> MEMERROR (utils);
> return SASL_NOMEM;
> }
>
> memset (settings, 0, sizeof (sql_settings_t));
> sql_get_settings (utils, settings);
>
> if (!settings->sql_engine->name)
> return SASL_NOMECH;
>
> if (!sql_exists (settings->sql_canon_select))
> {
> utils->log (NULL, SASL_LOG_ERR,
> "sql_canon_plugin: sql_canon_select option missing");
> utils->free (settings);
> return SASL_NOMECH;
> }
>
> utils->log (NULL, SASL_LOG_DEBUG,
> "sql_canon_plugin using %s engine with select: %s\n",
> settings->sql_engine->name, settings->sql_canon_select);
>
> sql_canonuser_plugin.glob_context = settings;
>
>
>
> *plug = &sql_canonuser_plugin;
>
> return SASL_OK;
> }
diff -rw cyrus-sasl-2.1.24/plugins/sql_init.c cyrus-sasl-2.1.24-sql/plugins/sql_init.c
38a39
> SASL_CANONUSER_PLUG_INIT( sql )