X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=citadel%2Fmodules%2Fjabber%2Fxmpp_sasl_service.c;h=f015236e0146528097d3174688c33372b5ab2a6e;hb=8c47559cb5ae97ec0fa35660ee16fd61a9451c72;hp=41458597404a9ced5466c985e03dbdc0a14f61b1;hpb=b689fd4d1a8e7698ef7c5f5565ad6f15a632e0f3;p=citadel.git diff --git a/citadel/modules/jabber/xmpp_sasl_service.c b/citadel/modules/jabber/xmpp_sasl_service.c index 414585974..f015236e0 100644 --- a/citadel/modules/jabber/xmpp_sasl_service.c +++ b/citadel/modules/jabber/xmpp_sasl_service.c @@ -3,11 +3,23 @@ * * 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); } @@ -106,9 +130,15 @@ void xmpp_sasl_auth(char *sasl_auth_mech, char *authstring) { return; } - if (CC->logged_in) logout(CC); /* Client may try to log in twice. Handle this. */ + if (CC->logged_in) logout(); /* Client may try to log in twice. Handle this. */ - if (xmpp_auth_plain(authstring) == 0) { + if (CC->nologin) { + cprintf(""); + cprintf(""); + cprintf(""); + } + + else if (xmpp_auth_plain(authstring) == 0) { cprintf(""); } @@ -119,17 +149,30 @@ void xmpp_sasl_auth(char *sasl_auth_mech, char *authstring) { } } + + /* - * Offer non-SASL authentication to legacy clients. + * Non-SASL authentication */ -void jabber_offer_non_sasl_authentication(void) { - cprintf("" - "" - "" - /* "" */ - /* "" */ - "" +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("" + "" + "" + "" ); } - -#endif /* HAVE_EXPAT */