]> code.citadel.org Git - citadel.git/blobdiff - citadel/modules/xmpp/xmpp_sasl_service.c
Revert "sys/time.h no longer needed on modern systems"
[citadel.git] / citadel / modules / xmpp / xmpp_sasl_service.c
index fd4986137b1fa28ad484dd31f0f1cf726702bea9..5e53ceb4cc08d6d60bc4221a0ab34fbddab6b48c 100644 (file)
  */
 int xmpp_auth_plain(char *authstring)
 {
-       char decoded_authstring[1024];
-       char ident[256];
-       char user[256];
-       char pass[256];
+       StrBuf *AuthBuf;
+       const char *decoded_authstring;
+       char ident[256] = "";
+       char user[256] = "";
+       char pass[256] = "";
        int result;
        long len;
 
@@ -76,12 +77,25 @@ int xmpp_auth_plain(char *authstring)
        /* 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;
+       AuthBuf = NewStrBufPlain(authstring, -1);
+       len = StrBufDecodeBase64(AuthBuf);
+       if (len > 0)
+       {
+               decoded_authstring = ChrPtr(AuthBuf);
+
+               len = safestrncpy(ident, decoded_authstring, sizeof ident);
+
+               decoded_authstring += len + 1;
+
+               len = safestrncpy(user, decoded_authstring, sizeof user);
+
+               decoded_authstring += len + 1;
+
+               len = safestrncpy(pass, decoded_authstring, sizeof pass);
+               if (len < 0)
+                       len = sizeof(pass) - 1;
+       }
+       FreeStrBuf(&AuthBuf);
 
        /* 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
@@ -154,7 +168,7 @@ void xmpp_sasl_auth(char *sasl_auth_mech, char *authstring) {
 /*
  * Non-SASL authentication
  */
-void xmpp_non_sasl_authenticate(char *iq_id, char *username, char *password, char *resource) {
+void xmpp_non_sasl_authenticate(StrBuf *IQ_id, char *username, char *password, char *resource) {
        int result;
 
         if (CC->logged_in) CtdlUserLogout();  /* Client may try to log in twice.  Handle this. */
@@ -165,7 +179,7 @@ void xmpp_non_sasl_authenticate(char *iq_id, char *username, char *password, cha
                if (result == pass_ok) {
                        XPrint(HKEY("iq"), XCLOSED,
                               XCPROPERTY("type", "result"),
-                              XPROPERTY("ID", iq_id, strlen(iq_id)),
+                              XSPROPERTY("ID", IQ_id),
                               TYPE_ARGEND);
                               /* success */
                        return;
@@ -175,7 +189,7 @@ void xmpp_non_sasl_authenticate(char *iq_id, char *username, char *password, cha
        /* failure */
        XPrint(HKEY("iq"), 0,
               XCPROPERTY("type", "error"),
-              XPROPERTY("ID", iq_id, strlen(iq_id)),
+              XSPROPERTY("ID", IQ_id),
               TYPE_ARGEND);
        XPUT("<error code=\"401\" type=\"auth\">"
             "<not-authorized xmlns=\"urn:ietf:params:xml:ns:xmpp-stanzas\"/>"