/** * plain.C: PLAIN mechanism provider * * Copyright © 2007 Pippijn van Steenhoven / The Ermyth Team * Rights to this code are as documented in COPYING. * * * Portions of this file were derived from sources bearing the following license: * Copyright © 2006 Atheme Development Group * Rights to this code are as documented in doc/pod/license.pod. * * $Id: plain.C,v 1.7 2007/09/22 14:27:30 pippijn Exp $ */ #include "atheme.h" #include #include #include static char const rcsid[] = "$Id: plain.C,v 1.7 2007/09/22 14:27:30 pippijn Exp $"; REGISTER_MODULE ("saslserv/plain", false, "The Ermyth Team "); E list_t sasl_mechanisms; static node_t *mnode; static int mech_start (sasl_session_t *p, char **out, int *out_len); static int mech_step (sasl_session_t *p, char *message, int len, char **out, int *out_len); static void mech_finish (sasl_session_t *p); static sasl_mechanism_t mech ("PLAIN", &mech_start, &mech_step, &mech_finish); bool _modinit (module *m) { mnode = node_create (); node_add (&mech, mnode, &sasl_mechanisms); return true; } void _moddeinit () { node_del (mnode, &sasl_mechanisms); } static int mech_start (sasl_session_t *p, char **out, int *out_len) { return ASASL_MORE; } static int mech_step (sasl_session_t *p, char *message, int len, char **out, int *out_len) { char auth[256]; char pass[256]; myuser_t *mu; /* Skip the authzid entirely */ len -= strlen (message) + 1; if (len <= 0) return ASASL_FAIL; message += strlen (message) + 1; /* Copy the authcid */ if (strlen (message) > 255) return ASASL_FAIL; len -= strlen (message) + 1; if (len <= 0) return ASASL_FAIL; strcpy (auth, message); message += strlen (message) + 1; /* Copy the password */ if (strlen (message) > 255) return ASASL_FAIL; strlcpy (pass, message, len + 1); /* Done dissecting, now check. */ if (!(mu = myuser_t::find (auth))) return ASASL_FAIL; p->username = strdup (auth); return mu->verify_password (pass) ? ASASL_DONE : ASASL_FAIL; } static void mech_finish (sasl_session_t *p) { }