Back to index

citadel  8.12
Functions
xmpp_sasl_service.c File Reference
#include "sysdep.h"
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <fcntl.h>
#include <signal.h>
#include <pwd.h>
#include <errno.h>
#include <sys/types.h>
#include <time.h>
#include <sys/wait.h>
#include <string.h>
#include <limits.h>
#include <ctype.h>
#include <expat.h>
#include <libcitadel.h>
#include "citadel.h"
#include "server.h"
#include "citserver.h"
#include "support.h"
#include "config.h"
#include "user_ops.h"
#include "internet_addressing.h"
#include "md5.h"
#include "ctdl_module.h"
#include "serv_xmpp.h"

Go to the source code of this file.

Functions

int xmpp_auth_plain (char *authstring)
void xmpp_output_auth_mechs (void)
void xmpp_sasl_auth (char *sasl_auth_mech, char *authstring)
void xmpp_non_sasl_authenticate (char *iq_id, char *username, char *password, char *resource)

Function Documentation

int xmpp_auth_plain ( char *  authstring)

Definition at line 66 of file xmpp_sasl_service.c.

{
       char decoded_authstring[1024];
       char ident[256];
       char user[256];
       char pass[256];
       int result;
       long len;


       /* 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);
       len = safestrncpy(pass, &decoded_authstring[strlen(ident) + strlen(user) + 2], sizeof pass);
       if (len < 0)
              len = -len;

       /* 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);
       }
       else {
              result = CtdlLoginExistingUser(NULL, user);
       }

       if (result == login_ok) {
              if (CtdlTryPassword(pass, len) == pass_ok) {
                     return(0);                         /* success */
              }
       }

       return(1);                                       /* failure */
}

Here is the call graph for this function:

Here is the caller graph for this function:

void xmpp_non_sasl_authenticate ( char *  iq_id,
char *  username,
char *  password,
char *  resource 
)

Definition at line 157 of file xmpp_sasl_service.c.

                                                                                             {
       int result;
       char xmlbuf[256];

        if (CC->logged_in) CtdlUserLogout();  /* Client may try to log in twice.  Handle this. */

       result = CtdlLoginExistingUser(NULL, username);
       if (result == login_ok) {
              result = CtdlTryPassword(password, strlen(password));
              if (result == pass_ok) {
                     cprintf("<iq type=\"result\" id=\"%s\"></iq>", xmlesc(xmlbuf, iq_id, sizeof xmlbuf));      /* success */
                     return;
              }
       }

       /* failure */
       cprintf("<iq type=\"error\" id=\"%s\">", xmlesc(xmlbuf, iq_id, sizeof xmlbuf));
       cprintf("<error code=\"401\" type=\"auth\">"
              "<not-authorized xmlns=\"urn:ietf:params:xml:ns:xmpp-stanzas\"/>"
              "</error>"
              "</iq>"
       );
}

Here is the call graph for this function:

Here is the caller graph for this function:

void xmpp_output_auth_mechs ( void  )

Definition at line 115 of file xmpp_sasl_service.c.

                                  {
       cprintf("<mechanisms xmlns=\"urn:ietf:params:xml:ns:xmpp-sasl\">");
       cprintf("<mechanism>PLAIN</mechanism>");
       cprintf("</mechanisms>");
}

Here is the call graph for this function:

Here is the caller graph for this function:

void xmpp_sasl_auth ( char *  sasl_auth_mech,
char *  authstring 
)

Definition at line 124 of file xmpp_sasl_service.c.

                                                            {

       if (strcasecmp(sasl_auth_mech, "PLAIN")) {
              cprintf("<failure xmlns=\"urn:ietf:params:xml:ns:xmpp-sasl\">");
              cprintf("<invalid-mechanism/>");
              cprintf("</failure>");
              return;
       }

        if (CC->logged_in) CtdlUserLogout();  /* Client may try to log in twice.  Handle this. */

       if (CC->nologin) {
              cprintf("<failure xmlns=\"urn:ietf:params:xml:ns:xmpp-sasl\">");
              cprintf("<system-shutdown/>");
              cprintf("</failure>");
       }

       else if (xmpp_auth_plain(authstring) == 0) {
              cprintf("<success xmlns=\"urn:ietf:params:xml:ns:xmpp-sasl\"/>");
       }

       else {
              cprintf("<failure xmlns=\"urn:ietf:params:xml:ns:xmpp-sasl\">");
              cprintf("<not-authorized/>");
              cprintf("</failure>");
       }
}

Here is the call graph for this function:

Here is the caller graph for this function: