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