📄 ammimeutils.cpp
字号:
/*
AMMimeUtils.cpp
Utilidades de encriptaci髇 y desencriptaci髇.
*/
#include "StdAfx.h"
#include "AMMimeUtils.h"
#include <malloc.h>
#include <stdlib.h>
#include <string.h>
////////// a small helper function, to do case insensitive search ////////
#define strupos(x, y) (strustr(x, y) != NULL ? strustr(x, y) - x : -1) //char version
char* strustr(char *source, char *s)
{
//make an uppercase copy af source and s
char *csource = strdup(source);
char *cs = strdup(s);
strupr(csource);
strupr(cs);
//find cs in csource...
char *result = strstr(csource, cs);
if (result != NULL)
{
//cs is somewhere in csource
int pos = result - csource;
result = source;
result += pos;
}
//clean up
free(csource);
free(cs);
return result;
}
////////// The "real" decoding stuff //////////
const char base64chars[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
#define SKIP '\202'
#define NOSKIP 'A'
#define MaxLineLength 76
const char base64map[] =
{
SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP,
SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP,
SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP,
SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP,
SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP,
SKIP, SKIP, SKIP, 62, SKIP, SKIP, SKIP, 63,
52, 53, 54, 55, 56, 57, 58, 59,
60, 61, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP,
SKIP, 0 , 1 , 2 , 3 , 4 , 5 , 6 ,
7 , 8 , 9 , 10, 11, 12, 13, 14,
15, 16, 17, 18, 19, 20, 21, 22,
23, 24, 25, SKIP, SKIP, SKIP, SKIP, SKIP,
SKIP, 26, 27, 28, 29, 30, 31, 32,
33, 34, 35, 36, 37, 38, 39, 40,
41, 42, 43, 44, 45, 46, 47, 48,
49, 50, 51, SKIP, SKIP, SKIP, SKIP, SKIP,
SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP,
SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP,
SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP,
SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP,
SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP,
SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP,
SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP,
SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP,
SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP,
SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP,
SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP,
SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP,
SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP,
SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP,
SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP,
SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP
};
const char hexmap[] = {
SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP,
SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP,
SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP,
SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP,
SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP,
SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP,
0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 ,
8 , 9 , SKIP, SKIP, SKIP, SKIP, SKIP, SKIP,
SKIP, 10, 11, 12, 13, 14, 15, SKIP,
SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP,
SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP,
SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP,
SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP,
SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP,
SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP,
SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP,
SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP,
SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP,
SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP,
SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP,
SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP,
SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP,
SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP,
SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP,
SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP,
SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP,
SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP,
SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP,
SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP,
SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP,
SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP,
SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP
};
const char QpEncodeMap[] = {
SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP,
SKIP, SKIP, NOSKIP, SKIP, SKIP, NOSKIP, SKIP, SKIP,
SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP,
SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP,
NOSKIP, SKIP, SKIP, SKIP, SKIP, NOSKIP, NOSKIP, NOSKIP,
NOSKIP, NOSKIP, NOSKIP, NOSKIP, NOSKIP, NOSKIP, NOSKIP, NOSKIP,
NOSKIP, NOSKIP, NOSKIP, NOSKIP, NOSKIP, NOSKIP, NOSKIP, NOSKIP,
NOSKIP, NOSKIP, NOSKIP, NOSKIP, NOSKIP, SKIP, NOSKIP, NOSKIP,
SKIP, NOSKIP, NOSKIP, NOSKIP, NOSKIP, NOSKIP, NOSKIP, NOSKIP,
NOSKIP, NOSKIP, NOSKIP, NOSKIP, NOSKIP, NOSKIP, NOSKIP, NOSKIP,
NOSKIP, NOSKIP, NOSKIP, NOSKIP, NOSKIP, NOSKIP, NOSKIP, NOSKIP,
NOSKIP, NOSKIP, NOSKIP, SKIP, SKIP, SKIP, SKIP, NOSKIP,
SKIP, NOSKIP, NOSKIP, NOSKIP, NOSKIP, NOSKIP, NOSKIP, NOSKIP,
NOSKIP, NOSKIP, NOSKIP, NOSKIP, NOSKIP, NOSKIP, NOSKIP, NOSKIP,
NOSKIP, NOSKIP, NOSKIP, NOSKIP, NOSKIP, NOSKIP, NOSKIP, NOSKIP,
NOSKIP, NOSKIP, NOSKIP, SKIP, SKIP, SKIP, SKIP, SKIP,
SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP,
SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP,
SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP,
SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP,
SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP,
SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP,
SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP,
SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP,
SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP,
SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP,
SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP,
SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP,
SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP,
SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP,
SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP,
SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP, SKIP
};
char* MimeDecodeMailHeaderField(char *s)
{
if (s == NULL) return s;
//if s ends with a crlf pair, remove it...
if (s[strlen(s) - 2] == '\r')
{
s[strlen(s) - 2] = '\0';
}
//remove starting spaces...
char *s1 = s;
char *rest = NULL;
char *start = NULL;
while (*s1 == ' ') s1++;
if (strupos(s1, "=?") > 0)
{
int startend = strupos(s1, "=?");
start = (char*)_alloca((startend + 1) * sizeof(char));
strncpy(start, s, startend);
start[startend] = '\0';
s1 += startend;
}
if (strupos(s1, "=?") == 0)
{
//we have to decode
//if there are text after "?=" we have to move it to another string, so the decoder don't delete it...
//if isn't qp-encoded and the first char is encoded, we have to move past the "?=", to find the next...
int plainpos = strupos(s1, "Q?=");
if (plainpos > 0)
{
plainpos += 3;
char *m = s1 + plainpos;
plainpos += strupos(m, "?=");
}
else
{
plainpos = strupos(s1, "?=");
}
if (plainpos > 1)
{
char *mid = s1 + plainpos + 2;
s1[plainpos] = '\0';
if (strlen(mid) > 0)
{
//we have some text we need to "cut"
rest = (char*)_alloca(strlen(mid) + sizeof(char));
strcpy(rest, mid);
}
}
//do the decode...
char *subj = s1;
char *decodedText;
if (strupos(s1, "?Q?") > 0)
{
//it's quoted printable
//find the right "starting point" in the string...
int pos = strupos(s1, "?Q?");
s1 += pos;
if (strlen(s1) < 4) return s; //this should never happend, if the sender is RFC compliant...
s1 += 3;
CQPUtils qp;
decodedText = qp.Decode(s1);
}
if (strupos(s1, "?B?") > 0)
{
//it's base64
//find the right "starting point" in the string...
int pos = strupos(s1, "?B?");
s1 += pos;
if (strlen(s1) < 4) return s; //this should never happend, if the sender is RFC compliant...
s1 += 3;
CBase64Utils bu;
int sLen = strlen(s1);
decodedText = bu.Decode(s1, &sLen);
}
//put the decoded text back in s, and append rest...
int alloclen = strlen(decodedText) + 1;
if (start != NULL) alloclen += strlen(start);
if (rest != NULL) alloclen += strlen(rest);
alloclen *= sizeof(char);
s = (char*)realloc(s, alloclen);
s[0] = '\0';
if (start != NULL)
{
strcat(s, start);
}
strcat(s, decodedText);
if (rest != NULL)
{
strcat(s, rest);
}
free(decodedText);
}
return s;
}
CBase64Utils::CBase64Utils()
{
ErrorCode = 0;
}
CBase64Utils::~CBase64Utils()
{
}
char* CBase64Utils::Encode(char *input, int bufsize)
{
int alsize = ((bufsize * 4) / 3);
char *finalresult = (char*)calloc(alsize + ((alsize / 76) * 2) + (10 * sizeof(char)), sizeof(char));
int count = 0;
int LineLen = 0;
char* fresult = finalresult;
char *s = input;
int tmp = 0;
//let's step through the buffer and encode it...
while (count <= bufsize)
{
if (count % 3 == 0 && count != 0)
{
tmp >>= 8;
tmp &= 0xFFFFFF;
//we have 4 new b64 chars, add them to finalresult
int mid = tmp;
mid >>= 18;
mid &= 0x3F;
*(fresult++) = base64chars[mid];
LineLen++;
mid = tmp;
mid >>= 12;
mid &= 0x3F;
*(fresult++) = base64chars[mid];
LineLen++;
mid = tmp;
mid >>= 6;
mid &= 0x3F;
*(fresult++) = base64chars[mid];
LineLen++;
mid = tmp;
mid &= 0x3F;
*(fresult++) = base64chars[mid];
LineLen++;
//reset tmp
tmp = 0;
//should we break the line...
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -