OpenPKG CVS Repository
  http://cvs.openpkg.org/
  ____________________________________________________________________________

  Server: cvs.openpkg.org                  Name:   Ralf S. Engelschall
  Root:   /v/openpkg/cvs                   Email:  r...@openpkg.org
  Module: openpkg-src                      Date:   25-Dec-2008 13:31:57
  Branch: HEAD                             Handle: 2008122512315600

  Modified files:
    openpkg-src/sasl        sasl.patch sasl.spec

  Log:
    OK, break everything in SASL related to SQL lookups by changing the
    code to IMHO correctly retrieve BLOBs from MySQL/PgSQL/SQLite

  Summary:
    Revision    Changes     Path
    1.25        +167 -11    openpkg-src/sasl/sasl.patch
    1.164       +1  -1      openpkg-src/sasl/sasl.spec
  ____________________________________________________________________________

  patch -p0 <<'@@ .'
  Index: openpkg-src/sasl/sasl.patch
  ============================================================================
  $ cvs diff -u -r1.24 -r1.25 sasl.patch
  --- openpkg-src/sasl/sasl.patch       23 Dec 2008 19:58:59 -0000      1.24
  +++ openpkg-src/sasl/sasl.patch       25 Dec 2008 12:31:56 -0000      1.25
  @@ -223,8 +223,52 @@
    
   Index: plugins/sql.c
   --- plugins/sql.c.orig       2006-04-07 15:42:16 +0200
  -+++ plugins/sql.c    2007-01-08 18:49:07 +0100
  -@@ -342,7 +342,7 @@
  ++++ plugins/sql.c    2008-12-25 13:24:00 +0100
  +@@ -150,9 +150,15 @@
  +     return -1;
  +     }
  +     if (value) {
  +-    strncpy(value, row[0], size-2);
  +-    value[size-1] = '\0';
  +-    if (value_len) *value_len = strlen(value);
  ++        unsigned long *col_lens;
  ++        size_t col_len;
  ++        col_lens = mysql_fetch_lengths(result);
  ++        col_len = (size_t)col_lens[0];
  ++        if (col_len > size - 1);
  ++            col_len = size - 1;
  ++    memcpy(value, row[0], col_len);
  ++    value[col_len] = '\0';
  ++    if (value_len) *value_len = col_len;
  +     }
  +     
  +     /* free result */
  +@@ -298,6 +304,7 @@
  +     row_count = PQntuples(result);
  +     if (!row_count) {
  +     /* umm nothing found */
  ++    utils->log(NULL, SASL_LOG_DEBUG, "sql plugin: no result found for query 
%s", cmd);
  +     utils->log(NULL, SASL_LOG_NOTE, "sql plugin: no result found");
  +     PQclear(result);
  +     return -1;
  +@@ -310,9 +317,13 @@
  +     /* now get the result set value and value_len */
  +     /* we only fetch one because we don't care about the rest */
  +     if (value) {
  +-    strncpy(value, PQgetvalue(result,0,0), size-2);
  +-    value[size-1] = '\0';
  +-    if (value_len) *value_len = strlen(value);
  ++        size_t col_len;
  ++    col_len = (size_t)PQgetlength(result, 0, 0);
  ++        if (col_len > size - 1);
  ++            col_len = size - 1;
  ++    memcpy(value, PQgetvalue(result, 0, 0), col_len);
  ++    value[col_len] = '\0';
  ++    if (value_len) *value_len = col_len;
  +     }
  +     
  +     /* free result */
  +@@ -342,7 +353,7 @@
    #endif /* HAVE_PGSQL */
    
    #ifdef HAVE_SQLITE
  @@ -233,7 +277,7 @@
    
    static void *_sqlite_open(char *host __attribute__((unused)),
                          char *port __attribute__((unused)),
  -@@ -352,21 +352,23 @@
  +@@ -352,21 +363,23 @@
                          const char *database, const sasl_utils_t *utils)
    {
        int rc;
  @@ -264,20 +308,116 @@
        return NULL;
        }
    
  -@@ -412,10 +414,10 @@
  -     char *result = NULL;
  -     char *zErrMsg = NULL;
  +@@ -388,62 +401,67 @@
  +     return 0;
  + }
  + 
  +-static int sqlite_my_callback(void *pArg, int argc __attribute__((unused)),
  +-                          char **argv,
  +-                          char **columnNames __attribute__((unused)))
  +-{
  +-    char **result = (char**)pArg;
  +-
  +-    if (argv == NULL) {
  +-    *result = NULL;                         /* no record */
  +-    } else if (argv[0] == NULL) {
  +-    *result = strdup(SQL_NULL_VALUE);       /* NULL IS SQL_NULL_VALUE */
  +-    } else {
  +-    *result = strdup(argv[0]);
  +-    }
  +-
  +-    return /*ABORT*/1;
  +-}
  +-
  + static int _sqlite_exec(void *db, const char *cmd, char *value, size_t size,
  +                     size_t *value_len, const sasl_utils_t *utils)
  + {
  +     int rc;
  +-    char *result = NULL;
  +-    char *zErrMsg = NULL;
  ++    sqlite3_stmt *stmt;
  ++    const char *todo;
  ++    size_t len;
    
   -    rc = sqlite_exec((sqlite*)db, cmd, sqlite_my_callback, (void*)&result, 
&zErrMsg);
  -+    rc = sqlite3_exec((sqlite3*)db, cmd, sqlite_my_callback, 
(void*)&result, &zErrMsg);
  -     if (rc != SQLITE_OK && rc != SQLITE_ABORT) {
  -     utils->log(NULL, SASL_LOG_DEBUG, "sql plugin: %s ", zErrMsg);
  +-    if (rc != SQLITE_OK && rc != SQLITE_ABORT) {
  +-    utils->log(NULL, SASL_LOG_DEBUG, "sql plugin: %s ", zErrMsg);
   -    sqlite_freemem (zErrMsg);
  -+    sqlite3_free (zErrMsg);
  ++    rc = sqlite3_prepare((sqlite3*)db, cmd, (int)strlen(cmd), &stmt, &todo);
  ++    if (rc != SQLITE_OK) {
  ++    utils->log(NULL, SASL_LOG_DEBUG, "sql plugin error: %s", 
sqlite3_errmsg((sqlite3*)db));
        return -1;
        }
  +-
  +-    if (rc == SQLITE_OK) {
  ++    rc = sqlite3_step(stmt);
  ++    if (rc != SQLITE_ROW && rc != SQLITE_DONE) {
  ++    utils->log(NULL, SASL_LOG_DEBUG, "sql plugin error: %s", 
sqlite3_errmsg((sqlite3*)db));
  ++    sqlite3_finalize(stmt);
  ++    return -1;
  ++    }
  ++    if (sqlite3_column_count(stmt) == 0) {
  +     /* no results (BEGIN, COMMIT, DELETE, INSERT, UPDATE) */
  ++    sqlite3_finalize(stmt);
  +     return 0;
  +     }
  +-
  +-    if (result == NULL) {
  ++    if (rc == SQLITE_DONE) {
  +     /* umm nothing found */
  ++    utils->log(NULL, SASL_LOG_DEBUG, "sql plugin: no result found for query 
%s", cmd);
  +     utils->log(NULL, SASL_LOG_NOTE, "sql plugin: no result found");
  ++    sqlite3_finalize(stmt);
  +     return -1;
  +     }
  +-
  +-    /* XXX: Duplication cannot be found by this method. */
  +-
  +-    /* now get the result set value and value_len */
  +-    /* we only fetch one because we don't care about the rest */
  +-    if (value) {
  +-    strncpy(value, result, size - 2);
  +-    value[size - 1] = '\0';
  +-    if (value_len) {
  +-        *value_len = strlen(value);
  +-    }
  ++    rc = sqlite3_column_type(stmt, 0);
  ++    switch (rc) {
  ++        case SQLITE_NULL: {
  ++            len = strlen(SQL_NULL_VALUE);
  ++            if (len > size - 1)
  ++                len = size - 1;
  ++        memcpy(value, SQL_NULL_VALUE, len);
  ++            value[len] = '\0';
  ++        if (value_len)
  ++            *value_len = len;
  ++            break;
  ++        }
  ++        default: {
  ++            const void *blob = sqlite3_column_blob(stmt, 0);
  ++            len = (size_t)sqlite3_column_bytes(stmt, 0);
  ++            if (len > size - 1)
  ++                len = size - 1;
  ++        memcpy(value, blob, len);
  ++            value[len] = '\0';
  ++        if (value_len)
  ++            *value_len = len;
  ++            break;
  ++        }
  +     }
  +-
  +-    /* free result */
  +-    free(result);
  ++    rc = sqlite3_step(stmt);
  ++    if (rc != SQLITE_DONE) {
  ++    utils->log(NULL, SASL_LOG_WARN,
  ++               "sql plugin: found duplicate row for query %s", cmd);
  ++    }
  ++    sqlite3_finalize(stmt);
  +     return 0;
  + }
    
  -@@ -464,7 +466,7 @@
  +@@ -464,7 +482,7 @@
    
    static void _sqlite_close(void *db)
    {
  @@ -286,6 +426,22 @@
    }
    #endif /* HAVE_SQLITE */
    
  +@@ -864,9 +882,15 @@
  +     /* run the query */
  +     if (!settings->sql_engine->sql_exec(conn, query, value, sizeof(value),
  +                                         &value_len, sparams->utils)) {
  ++            sparams->utils->log(NULL, SASL_LOG_DEBUG,
  ++                                "sql plugin query successful\n");
  +         sparams->utils->prop_set(sparams->propctx, cur->name,
  +                                  value, value_len);
  +     }
  ++        else {
  ++            sparams->utils->log(NULL, SASL_LOG_DEBUG,
  ++                                "sql plugin query failed\n");
  ++        }
  +     
  +     sparams->utils->free(query);
  +     }
   Index: sample/client.c
   --- sample/client.c.orig     2004-03-09 18:35:32 +0100
   +++ sample/client.c  2008-12-23 10:19:47 +0100
  @@ .
  patch -p0 <<'@@ .'
  Index: openpkg-src/sasl/sasl.spec
  ============================================================================
  $ cvs diff -u -r1.163 -r1.164 sasl.spec
  --- openpkg-src/sasl/sasl.spec        24 Dec 2008 09:59:09 -0000      1.163
  +++ openpkg-src/sasl/sasl.spec        25 Dec 2008 12:31:56 -0000      1.164
  @@ -32,7 +32,7 @@
   Group:        Cryptography
   License:      BSD
   Version:      2.1.22
  -Release:      20081224
  +Release:      20081225
   
   #   package options
   %option       with_fsl      yes
  @@ .
______________________________________________________________________
OpenPKG                                             http://openpkg.org
CVS Repository Commit List                     openpkg-cvs@openpkg.org

Reply via email to