From: Mark A. <ad...@an...> - 2002-11-07 19:53:36
|
> This is great news! Do you have a web page where you'll release the > module, or will it be on CPAN? I just now uploaded a 0.06 module. I haven't done heavy testing of it since there are those anxious to get their hands on it. Appended below is the patch to Cyrus.xs, and you will need to tell Makefile.PL to grab the sasl2 library. -Mark diff -ur Authen-SASL-Cyrus-0.05/Cyrus.xs Authen-SASL-Cyrus-0.05-sasl2/Cyrus.xs --- Authen-SASL-Cyrus-0.05/Cyrus.xs Wed Jun 26 17:39:51 2002 +++ Authen-SASL-Cyrus-0.05-sasl2/Cyrus.xs Thu Oct 17 20:18:43 2002 @@ -21,7 +21,11 @@ char *mech; char *user; char *initstring; +#if defined(SASL2) + const char *errormsg; +#else char *errormsg; +#endif }; @@ -186,7 +190,10 @@ - +#ifdef SASL2 +#define SASL_IP_LOCAL 5 +#define SASL_IP_REMOTE 6 +#endif static int PropertyNumber(char *name) @@ -194,13 +201,30 @@ if (!strcasecmp(name, "user")) return SASL_USERNAME; else if (!strcasecmp(name, "ssf")) return SASL_SSF; else if (!strcasecmp(name, "maxout")) return SASL_MAXOUTBUF; - else if (!strcasecmp(name, "realm")) return SASL_REALM; else if (!strcasecmp(name, "optctx")) return SASL_GETOPTCTX; +#if defined(SASL2) + else if (!strcasecmp(name, "realm")) return SASL_DEFUSERREALM; + else if (!strcasecmp(name, "iplocalport")) return SASL_IPLOCALPORT; + else if (!strcasecmp(name, "ipremoteport")) return SASL_IPREMOTEPORT; + else if (!strcasecmp(name, "service")) return SASL_SERVICE; + else if (!strcasecmp(name, "serverfqdn")) return SASL_SERVERFQDN; + else if (!strcasecmp(name, "authsource")) return SASL_AUTHSOURCE; + else if (!strcasecmp(name, "mechname")) return SASL_MECHNAME; + else if (!strcasecmp(name, "authuser")) return SASL_AUTHUSER; + else if (!strcasecmp(name, "sockname")) return SASL_IP_LOCAL; + else if (!strcasecmp(name, "peername")) return SASL_IP_REMOTE; +#else + else if (!strcasecmp(name, "realm")) return SASL_REALM; else if (!strcasecmp(name, "iplocal")) return SASL_IP_LOCAL; else if (!strcasecmp(name, "sockname")) return SASL_IP_LOCAL; else if (!strcasecmp(name, "ipremote")) return SASL_IP_REMOTE; else if (!strcasecmp(name, "peername")) return SASL_IP_REMOTE; +#endif +#if defined(SASL2) + croak("Unknown SASL property: '%s' (user|ssf|maxout|realm|optctx|iplocalport|ipremoteport|service|serverfqdn|authsource|mechname|authuser)\n", name); +#else croak("Unknown SASL property: '%s' (user|ssf|maxout|realm|optctx|sockname|peername)\n", name); +#endif return -1; } @@ -360,7 +384,11 @@ CODE: { const char *mech=NULL; +#if defined(SASL2) + const char *init=NULL; +#else char *init=NULL; +#endif int rc; unsigned int initlen=0; struct authensasl *sasl; @@ -399,17 +427,28 @@ } sasl_client_init(NULL); - rc = sasl_client_new(sasl->service, sasl->server, sasl->callbacks, 1, &sasl->conn); + rc = sasl_client_new(sasl->service, sasl->server, 0, 0, sasl->callbacks, 1, &sasl->conn); if (rc != SASL_OK) { +#ifdef SASL2 + if (!sasl->errormsg) sasl->errormsg = sasl_errdetail(sasl->conn); +#endif if (!sasl->errormsg) sasl->errormsg = "sasl_client_new failed"; } else { +#if defined(SASL2) + rc = sasl_client_start(sasl->conn, sasl->mech, NULL, &init, &initlen, &mech); +#else rc = sasl_client_start(sasl->conn, sasl->mech, NULL, NULL, &init, &initlen, &mech); +#endif if (rc == SASL_NOMECH) { if (!sasl->errormsg) sasl->errormsg = "No mechanisms available (did you set all needed callbacks?)"; } else if ((rc != SASL_OK) && (rc != SASL_CONTINUE)) { +#ifdef SASL2 + if (!sasl->errormsg) sasl->errormsg = sasl_errdetail(sasl->conn); +#endif + if (!sasl->errormsg) sasl->errormsg = "sasl_client_start failed"; } else { @@ -424,6 +463,8 @@ + + char * client_start(sasl) struct authensasl *sasl @@ -442,7 +483,11 @@ char *instring PPCODE: { +#if defined(SASL2) + const char *outstring=NULL; +#else char *outstring=NULL; +#endif int rc; unsigned int inlen, outlen=0; @@ -457,7 +502,10 @@ sasl->errormsg = "OK"; } else if (rc != SASL_CONTINUE) { - sasl->errormsg = "sasl_client_step failed"; +#ifdef SASL2 + if (!sasl->errormsg) sasl->errormsg = sasl_errdetail(sasl->conn); +#endif + if (!sasl->errormsg) sasl->errormsg = "sasl_client_step failed"; XSRETURN_UNDEF; } XPUSHp(outstring, outlen); @@ -472,7 +520,11 @@ char *instring PPCODE: { +#if defined(SASL2) + const char *outstring=NULL; +#else char *outstring=NULL; +#endif int rc; unsigned int inlen, outlen=0; @@ -484,7 +536,10 @@ rc = sasl_encode(sasl->conn, instring, inlen, &outstring, &outlen); if (rc != SASL_OK) { - sasl->errormsg = "sasl_encode failed"; +#ifdef SASL2 + if (!sasl->errormsg) sasl->errormsg = sasl_errdetail(sasl->conn); +#endif + if (!sasl->errormsg) sasl->errormsg = "sasl_encode failed"; XSRETURN_UNDEF; } XPUSHp(outstring, outlen); @@ -499,7 +554,11 @@ char *instring PPCODE: { +#if defined(SASL2) + const char *outstring=NULL; +#else char *outstring=NULL; +#endif int rc; unsigned int inlen, outlen=0; @@ -511,7 +570,10 @@ rc = sasl_decode(sasl->conn, instring, inlen, &outstring, &outlen); if (rc != SASL_OK) { - sasl->errormsg = "sasl_decode failed"; +#ifdef SASL2 + if (!sasl->errormsg) sasl->errormsg = sasl_errdetail(sasl->conn); +#endif + if (!sasl->errormsg) sasl->errormsg = "sasl_decode failed"; XSRETURN_UNDEF; } XPUSHp(outstring, outlen); @@ -595,7 +657,7 @@ error(sasl) struct authensasl *sasl CODE: - RETVAL = sasl->errormsg; + RETVAL = (char *)sasl->errormsg; sasl->errormsg = NULL; OUTPUT: RETVAL @@ -671,7 +733,11 @@ struct authensasl *sasl PPCODE: { +#if defined(SASL2) + const void *value=NULL; +#else void *value=NULL; +#endif char *name; int rc, x, propnum=-1; SV *prop; @@ -693,17 +759,42 @@ if (rc != SASL_OK) XSRETURN_UNDEF; switch(propnum){ case SASL_USERNAME: +#if defined(SASL2) + case SASL_DEFUSERREALM: +#else case SASL_REALM: +#endif XPUSHp( (char *)value, strlen((char *)value)); break; case SASL_SSF: case SASL_MAXOUTBUF: XPUSHi((int *)value); break; +#if defined(SASL2) + case SASL_IPLOCALPORT: + case SASL_IPREMOTEPORT: + XPUSHp( (char *)value, strlen((char *)value)); + break; + case SASL_IP_LOCAL: + propnum = SASL_IPLOCALPORT; + { + char *addr = inet_ntoa( (*(struct in_addr *)value)); + XPUSHp( addr, strlen(addr)); + } + break; + case SASL_IP_REMOTE: + propnum = SASL_IPREMOTEPORT; + { + char *addr = inet_ntoa( (*(struct in_addr *)value)); + XPUSHp( addr, strlen(addr)); + } + break; +#else case SASL_IP_LOCAL: case SASL_IP_REMOTE: XPUSHp( (char *)value, sizeof(struct sockaddr_in)); break; +#endif default: XPUSHi(-1); } @@ -725,6 +816,9 @@ } rc = sasl_setprop(sasl->conn, propnum, value); if (rc != SASL_OK) { +#ifdef SASL2 + if (!sasl->errormsg) sasl->errormsg = sasl_errdetail(sasl->conn); +#endif if (!sasl->errormsg) sasl->errormsg="sasl_setprop failed"; RETVAL = 1; } @@ -746,7 +840,9 @@ } if (sasl->service) free(sasl->service); if (sasl->mech) free(sasl->mech); +#ifndef SASL2 if (sasl->errormsg) free(sasl->errormsg); +#endif if (sasl->initstring)free(sasl->initstring); free(sasl); |