source: packages/net/dsniff/patches/001-decode_pop.patch @ 31187

Last change on this file since 31187 was 31187, checked in by florian, 4 years ago

[package] dsniff: fix decoding of POP data

Signed-off-by: Stefan Tomanek <stefan.tomanek+openwrt@…>

File size: 2.7 KB
  • decode_pop.c

    diff --git a/decode_pop.c b/decode_pop.c
    index 04044f5..767da41 100644
    a b  
    66 * Copyright (c) 2000 Dug Song <dugsong@monkey.org> 
    77 * 
    88 * $Id: decode_pop.c,v 1.4 2001/03/15 08:33:02 dugsong Exp $ 
     9 * 
     10 * Rewritten by Stefan Tomanek 2011 <stefan@pico.ruhr.de> 
    911 */ 
    1012 
    1113#include "config.h" 
    int 
    4547decode_pop(u_char *buf, int len, u_char *obuf, int olen) 
    4648{ 
    4749        char *p; 
     50        char *s; 
     51        int n; 
    4852        int i, j; 
     53        char *user; 
     54        char *password; 
     55        enum { 
     56                NONE, 
     57                AUTHPLAIN, 
     58                AUTHLOGIN, 
     59                USERPASS 
     60        } mode = NONE; 
     61 
    4962         
    5063        obuf[0] = '\0'; 
    5164         
    5265        for (p = strtok(buf, "\r\n"); p != NULL; p = strtok(NULL, "\r\n")) { 
    53                 if (strncasecmp(p, "AUTH PLAIN", 10) == 0 || 
    54                     strncasecmp(p, "AUTH LOGIN", 10) == 0) { 
    55                         strlcat(obuf, p, olen); 
    56                         strlcat(obuf, "\n", olen); 
    57                          
    58                         /* Decode SASL auth. */ 
    59                         for (i = 0; i < 2 && (p = strtok(NULL, "\r\n")); i++) { 
    60                                 strlcat(obuf, p, olen); 
    61                                 j = base64_pton(p, p, strlen(p)); 
    62                                 p[j] = '\0'; 
    63                                 strlcat(obuf, " [", olen); 
    64                                 strlcat(obuf, p, olen); 
    65                                 strlcat(obuf, "]\n", olen); 
     66                if (mode == NONE) { 
     67                        user = NULL; 
     68                        password = NULL; 
     69                        if (strncasecmp(p, "AUTH PLAIN", 10) == 0) { 
     70                                mode = AUTHPLAIN; 
     71                                continue; 
     72                        } 
     73                        if (strncasecmp(p, "AUTH LOGIN", 10) == 0) { 
     74                                mode = AUTHLOGIN; 
     75                                continue; 
     76                        } 
     77                        if (strncasecmp(p, "USER ", 5) == 0) { 
     78                                mode = USERPASS; 
     79                                /* the traditional login cuts right to the case, 
     80                                 * so no continue here 
     81                                 */ 
    6682                        } 
    6783                } 
    68                 /* Save regular POP2, POP3 auth info. */ 
    69                 else if (strncasecmp(p, "USER ", 5) == 0 || 
    70                          strncasecmp(p, "PASS ", 5) == 0 || 
    71                          strncasecmp(p, "HELO ", 5) == 0) { 
    72                         strlcat(obuf, p, olen); 
    73                         strlcat(obuf, "\n", olen); 
     84                printf("(%d) %s\n", mode, p); 
     85                if (mode == USERPASS) { 
     86                        if (strncasecmp(p, "USER ", 5) == 0) { 
     87                                user = &p[5]; 
     88                        } else if (strncasecmp(p, "PASS ", 5) == 0) { 
     89                                password = &p[5]; 
     90                        } 
     91                } 
     92 
     93                if (mode == AUTHPLAIN) { 
     94                        j = base64_pton(p, p, strlen(p)); 
     95                        p[j] = '\0'; 
     96                        n = 0; 
     97                        s = p; 
     98                        /* p consists of three parts, divided by \0 */ 
     99                        while (s <= &p[j] && n<=3) { 
     100                                if (n == 0) { 
     101                                        /* we do not process this portion yet */ 
     102                                } else if (n == 1) { 
     103                                        user = s; 
     104                                } else if (n == 2) { 
     105                                        password = s; 
     106                                } 
     107                                n++; 
     108                                while (*s) s++; 
     109                                s++; 
     110                        } 
     111                } 
     112 
     113                if (mode == AUTHLOGIN) { 
     114                        j = base64_pton(p, p, strlen(p)); 
     115                        p[j] = '\0'; 
     116                        if (! user) { 
     117                                user = p; 
     118                        } else { 
     119                                password = p; 
     120                                /* got everything we need :-) */ 
     121                        } 
     122                } 
     123 
     124                if (user && password) { 
     125                        strlcat(obuf, "\nusername [", olen); 
     126                        strlcat(obuf, user, olen); 
     127                        strlcat(obuf, "] password [", olen); 
     128                        strlcat(obuf, password, olen); 
     129                        strlcat(obuf, "]\n", olen); 
     130 
     131                        mode = NONE; 
    74132                } 
    75133        } 
    76134        return (strlen(obuf)); 
Note: See TracBrowser for help on using the repository browser.