X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=citadel%2Fmodules%2Fjabber%2Fxmpp_sasl_service.c;h=f015236e0146528097d3174688c33372b5ab2a6e;hb=8c47559cb5ae97ec0fa35660ee16fd61a9451c72;hp=2f05783f7cd44fd006153500e216945b2166e7d9;hpb=55f0266810a4e017993a89fa3b8a48183aeaa4e6;p=citadel.git diff --git a/citadel/modules/jabber/xmpp_sasl_service.c b/citadel/modules/jabber/xmpp_sasl_service.c index 2f05783f7..f015236e0 100644 --- a/citadel/modules/jabber/xmpp_sasl_service.c +++ b/citadel/modules/jabber/xmpp_sasl_service.c @@ -1,13 +1,25 @@ /* - * $Id: $ + * $Id$ * * Barebones SASL authentication service for XMPP (Jabber) clients. * - * Why barebones? Because RFC3920 says we "must" support DIGEST-MD5 but - * we only support PLAIN. + * Note: RFC3920 says we "must" support DIGEST-MD5 but we only support PLAIN. * - * Copyright (c) 2007 by Art Cancro - * This code is released under the terms of the GNU General Public License. + * Copyright (c) 2007-2009 by Art Cancro + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ @@ -36,6 +48,7 @@ #include #include #include +#include #include #include "citadel.h" #include "server.h" @@ -46,9 +59,6 @@ #include "internet_addressing.h" #include "md5.h" #include "ctdl_module.h" - -#ifdef HAVE_EXPAT -#include #include "serv_xmpp.h" @@ -63,11 +73,25 @@ int xmpp_auth_plain(char *authstring) char pass[256]; int result; + + /* Take apart the authentication string */ + memset(pass, 0, sizeof(pass)); + CtdlDecodeBase64(decoded_authstring, authstring, strlen(authstring)); safestrncpy(ident, decoded_authstring, sizeof ident); safestrncpy(user, &decoded_authstring[strlen(ident) + 1], sizeof user); safestrncpy(pass, &decoded_authstring[strlen(ident) + strlen(user) + 2], sizeof pass); + + /* If there are underscores in either string, change them to spaces. Some clients + * do not allow spaces so we can tell the user to substitute underscores if their + * login name contains spaces. + */ + convert_spaces_to_underscores(ident); + convert_spaces_to_underscores(user); + + /* Now attempt authentication */ + if (!IsEmptyStr(ident)) { result = CtdlLoginExistingUser(user, ident); } @@ -99,14 +123,22 @@ void xmpp_output_auth_mechs(void) { */ void xmpp_sasl_auth(char *sasl_auth_mech, char *authstring) { - if (strcasecmp(XMPP->sasl_auth_mech, "PLAIN")) { + if (strcasecmp(sasl_auth_mech, "PLAIN")) { cprintf(""); cprintf(""); cprintf(""); return; } - if (xmpp_auth_plain(authstring) == 0) { + if (CC->logged_in) logout(); /* Client may try to log in twice. Handle this. */ + + if (CC->nologin) { + cprintf(""); + cprintf(""); + cprintf(""); + } + + else if (xmpp_auth_plain(authstring) == 0) { cprintf(""); } @@ -117,4 +149,30 @@ void xmpp_sasl_auth(char *sasl_auth_mech, char *authstring) { } } -#endif /* HAVE_EXPAT */ + + +/* + * Non-SASL authentication + */ +void jabber_non_sasl_authenticate(char *iq_id, char *username, char *password, char *resource) { + int result; + + if (CC->logged_in) logout(); /* Client may try to log in twice. Handle this. */ + + result = CtdlLoginExistingUser(NULL, username); + if (result == login_ok) { + result = CtdlTryPassword(password); + if (result == pass_ok) { + cprintf("", iq_id); /* success */ + return; + } + } + + /* failure */ + cprintf("", iq_id); + cprintf("" + "" + "" + "" + ); +}