~rogpeppe/+junk/mgo-tagged-log-messages

« back to all changes in this revision

Viewing changes to sasl/sasl.c

  • Committer: Roger Peppe
  • Date: 2014-03-14 18:11:33 UTC
  • mfrom: (263.1.8 master)
  • Revision ID: roger.peppe@canonical.com-20140314181133-107ag3xpitk9682u
merge trunk

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#include <sasl/sasl.h>
 
2
#include <stdlib.h>
 
3
#include <stdio.h>
 
4
#include <string.h>
 
5
 
 
6
static int mgo_sasl_simple(void *context, int id, const char **result, unsigned int *len)
 
7
{
 
8
        if (!result) {
 
9
                return SASL_BADPARAM;
 
10
        }
 
11
        switch (id) {
 
12
        case SASL_CB_USER:
 
13
                *result = (char *) context;
 
14
                break;
 
15
        case SASL_CB_AUTHNAME:
 
16
                *result = (char *) context;
 
17
                break;
 
18
        case SASL_CB_LANGUAGE:
 
19
                *result = NULL;
 
20
                break;
 
21
        default:
 
22
                return SASL_BADPARAM;
 
23
        }
 
24
        if (len) {
 
25
                *len = *result ? strlen(*result) : 0;
 
26
        }
 
27
        return SASL_OK;
 
28
}
 
29
 
 
30
typedef int (*callback)(void);
 
31
 
 
32
static int mgo_sasl_secret(sasl_conn_t *conn, void *context, int id, sasl_secret_t **result)
 
33
{
 
34
        if (!conn || !result || id != SASL_CB_PASS) {
 
35
                return SASL_BADPARAM;
 
36
        }
 
37
        *result = (sasl_secret_t *)context;
 
38
        return SASL_OK;
 
39
}
 
40
 
 
41
sasl_callback_t *mgo_sasl_callbacks(const char *username, const char *password)
 
42
{
 
43
        sasl_callback_t *cb = malloc(4 * sizeof(sasl_callback_t));
 
44
        int n = 0;
 
45
 
 
46
        size_t len = strlen(password);
 
47
        sasl_secret_t *secret = (sasl_secret_t*)malloc(sizeof(sasl_secret_t) + len);
 
48
        if (!secret) {
 
49
                free(cb);
 
50
                return NULL;
 
51
        }
 
52
        strcpy((char *)secret->data, password);
 
53
        secret->len = len;
 
54
 
 
55
        cb[n].id = SASL_CB_PASS;
 
56
        cb[n].proc = (callback)&mgo_sasl_secret;
 
57
        cb[n].context = secret;
 
58
        n++;
 
59
 
 
60
        cb[n].id = SASL_CB_USER;
 
61
        cb[n].proc = (callback)&mgo_sasl_simple;
 
62
        cb[n].context = (char*)username;
 
63
        n++;
 
64
 
 
65
        cb[n].id = SASL_CB_AUTHNAME;
 
66
        cb[n].proc = (callback)&mgo_sasl_simple;
 
67
        cb[n].context = (char*)username;
 
68
        n++;
 
69
 
 
70
        cb[n].id = SASL_CB_LIST_END;
 
71
        cb[n].proc = NULL;
 
72
        cb[n].context = NULL;
 
73
 
 
74
        return cb;
 
75
}