imclient_authenticate wrong prompt order.

Jesper Schmitz Mouridsen jesper at schmitz.computer
Tue Sep 27 14:28:40 EDT 2016


mandag den 26. september 2016 15.51.45 CEST skrev Dan White:
> On 09/24/16 17:28 +0200, jesper--- via Info-cyrus wrote:
>> The following sample prompts for entering the password after ones actually
>> did enter the password. 1) Why is that e.g why does this sample write
>> "please enter your password: " after the password is entered, and then
>> exits?
>> 
>> The authentication works. Only the prompting is a problem. ...
>
> Have a look at doc/programming.html#callbacks_interactions within the cyrus
> sasl source. 
Thanks for the hint.
>Can you provide an example which includes callbacks that is
> not working as expected?
No I could not.

For reference I came up with the following:

#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <cyrus/imclient.h>

static int getsecret_func(sasl_conn_t *conn,
      void *context __attribute__((unused)),
      int id,
      sasl_secret_t **psecret);
static struct imclient *imclient;

    static int getauthname_func(void *context,
                                int id,
                                const char **result,
                                unsigned *len);
void fatal(const char *s, int code)
{
  fprintf(stderr, "Fatal error: %s\n", s);
  
}      
 
    /* callbacks we support. This is a global variable at the 
       top of the program */
    static sasl_callback_t callbacks[] = {
    {
      SASL_CB_GETREALM, NULL, NULL/* we'll just use an interaction if this 
comes up */
    }, {
      SASL_CB_USER, NULL, NULL      /* we'll just use an interaction if 
this comes up */
    }, {
      SASL_CB_AUTHNAME, &getauthname_func, NULL  /*A mechanism should call 
getauthname_func                                                   if it 
needs the authentication name */
    },{ 
      SASL_CB_PASS, &getsecret_func, NULL      /* Call getsecret_func if 
need secret */
    }, {
      SASL_CB_LIST_END, NULL, NULL
    }
    };


    static int getsecret_func(sasl_conn_t *conn,
      void *context __attribute__((unused)),
      int id,
      sasl_secret_t **psecret)
    {
    *psecret = malloc(sizeof(sasl_secret_t)+7);

   char * secret = "cyrus\0";
   
       *psecret = malloc(sizeof(sasl_secret_t*)+strlen(secret)+1);
       static sasl_secret_t *x;

    x = (sasl_secret_t *) realloc(x, sizeof(sasl_secret_t) + 
strlen(secret)); 
    memcpy(x->data,secret,sizeof(sasl_secret_t)+strlen(secret)+1);    
    x->len=strlen(secret);
    *psecret = x;
   
   return SASL_OK;
    }

    static int getauthname_func(void *context,
                                int id,
                                const char **result,
                                unsigned *len)
    {
       if (id!=SASL_CB_AUTHNAME) return SASL_FAIL;
 
       char *authname = "cyrus\0";
       *result = malloc(sizeof(char)*strlen(authname)+1);
       *result = authname;
        unsigned length =strlen(authname); ;	
         len=&length;
        
       return SASL_OK;
     }


char server[] = "localhost" ;
char port[] = "imap";
char mech[] ="CRAM-MD5";
char service[] = "imap";

int main() {
     if(imclient_connect(&imclient, server, port,callbacks)) {
     fprintf(stderr,
     "error: Couldn't connect to %s %s\n",
      server, port);
     }
if(imclient_authenticate(imclient, mech,service,NULL, 0,256)) {
     fprintf(stderr,
     "error: Authentication failed");
}

return 0;
}





More information about the Info-cyrus mailing list