]> code.citadel.org Git - citadel.git/blobdiff - citadel/modules/xmpp/xmpp_sasl_service.c
BASE64: we don't remove \0's anymore, we need to treat auth basic strings different.
[citadel.git] / citadel / modules / xmpp / xmpp_sasl_service.c
index 968cef950025830a79e5491153be821a8d0b7a2b..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. */
@@ -163,18 +177,21 @@ void xmpp_non_sasl_authenticate(char *iq_id, char *username, char *password, cha
        if (result == login_ok) {
                result = CtdlTryPassword(password, strlen(password));
                if (result == pass_ok) {
-                       XPUT("<iq type=\"result\" id=\"");
-                       XPutProp(iq_id, strlen(iq_id));
-                       XPUT("\"></iq>"); /* success */
+                       XPrint(HKEY("iq"), XCLOSED,
+                              XCPROPERTY("type", "result"),
+                              XSPROPERTY("ID", IQ_id),
+                              TYPE_ARGEND);
+                              /* success */
                        return;
                }
        }
 
        /* failure */
-       XPUT("<iq type=\"error\" id=\"");
-       XPutProp(iq_id, strlen(iq_id));
-       XPUT("\">"
-            "<error code=\"401\" type=\"auth\">"
+       XPrint(HKEY("iq"), 0,
+              XCPROPERTY("type", "error"),
+              XSPROPERTY("ID", IQ_id),
+              TYPE_ARGEND);
+       XPUT("<error code=\"401\" type=\"auth\">"
             "<not-authorized xmlns=\"urn:ietf:params:xml:ns:xmpp-stanzas\"/>"
             "</error>"
             "</iq>"