Added file utilities and better base 64de/encode
Signed-off-by: tyrolyean <tyrolyean@tyrolyean.net>
This commit is contained in:
parent
022e400a2a
commit
c379556e54
8 changed files with 232 additions and 311 deletions
2
Makefile
2
Makefile
|
@ -13,7 +13,7 @@ SRCDIR := $(CWD)/src
|
||||||
INCLUDEDIR := $(CWD)/include
|
INCLUDEDIR := $(CWD)/include
|
||||||
|
|
||||||
# flas
|
# flas
|
||||||
CFLAGS := -O2 -I$(INCLUDEDIR) -Wall -Wextra
|
CFLAGS := -O2 -I$(INCLUDEDIR) -Wall -Wextra -Wpedantic
|
||||||
LDFLAGS := -pthread
|
LDFLAGS := -pthread
|
||||||
|
|
||||||
# target files
|
# target files
|
||||||
|
|
3
README
3
README
|
@ -27,7 +27,8 @@ You can specify the following command line options:
|
||||||
The outgoing smtp port/the port to which mail ist passed through.
|
The outgoing smtp port/the port to which mail ist passed through.
|
||||||
|
|
||||||
--directory -d
|
--directory -d
|
||||||
The directory inside of which the attachments will be stored in.
|
The directory inside of which the attachments will be stored in. Please
|
||||||
|
DON'T specify a / at the end!
|
||||||
|
|
||||||
--url -u
|
--url -u
|
||||||
The base which should point to the same location as the directory does,
|
The base which should point to the same location as the directory does,
|
||||||
|
|
|
@ -32,4 +32,6 @@ void free_submails(struct email_t* mail);
|
||||||
|
|
||||||
char* attach_files(char* message, size_t len);
|
char* attach_files(char* message, size_t len);
|
||||||
|
|
||||||
|
int replace_base64_files(struct email_t* mail, const char* dirname);
|
||||||
|
|
||||||
#endif /* ATTACH_H */
|
#endif /* ATTACH_H */
|
||||||
|
|
|
@ -1,97 +1,18 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2003 Apple Computer, Inc. All rights reserved.
|
* Base64 encoding/decoding (RFC1341)
|
||||||
*
|
* Copyright (c) 2005, Jouni Malinen <j@w1.fi>
|
||||||
* @APPLE_LICENSE_HEADER_START@
|
|
||||||
*
|
|
||||||
* Copyright (c) 1999-2003 Apple Computer, Inc. All Rights Reserved.
|
|
||||||
*
|
|
||||||
* This file contains Original Code and/or Modifications of Original Code
|
|
||||||
* as defined in and that are subject to the Apple Public Source License
|
|
||||||
* Version 2.0 (the 'License'). You may not use this file except in
|
|
||||||
* compliance with the License. Please obtain a copy of the License at
|
|
||||||
* http://www.opensource.apple.com/apsl/ and read it before using this
|
|
||||||
* file.
|
|
||||||
*
|
|
||||||
* The Original Code and all software distributed under the License are
|
|
||||||
* distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
|
|
||||||
* EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
|
|
||||||
* INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
|
|
||||||
* Please see the License for the specific language governing rights and
|
|
||||||
* limitations under the License.
|
|
||||||
*
|
|
||||||
* @APPLE_LICENSE_HEADER_END@
|
|
||||||
*/
|
|
||||||
/* ====================================================================
|
|
||||||
* Copyright (c) 1995-1999 The Apache Group. All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
*
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
*
|
|
||||||
* 2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in
|
|
||||||
* the documentation and/or other materials provided with the
|
|
||||||
* distribution.
|
|
||||||
*
|
|
||||||
* 3. All advertising materials mentioning features or use of this
|
|
||||||
* software must display the following acknowledgment:
|
|
||||||
* "This product includes software developed by the Apache Group
|
|
||||||
* for use in the Apache HTTP server project (http://www.apache.org/)."
|
|
||||||
*
|
|
||||||
* 4. The names "Apache Server" and "Apache Group" must not be used to
|
|
||||||
* endorse or promote products derived from this software without
|
|
||||||
* prior written permission. For written permission, please contact
|
|
||||||
* apache@apache.org.
|
|
||||||
*
|
|
||||||
* 5. Products derived from this software may not be called "Apache"
|
|
||||||
* nor may "Apache" appear in their names without prior written
|
|
||||||
* permission of the Apache Group.
|
|
||||||
*
|
|
||||||
* 6. Redistributions of any form whatsoever must retain the following
|
|
||||||
* acknowledgment:
|
|
||||||
* "This product includes software developed by the Apache Group
|
|
||||||
* for use in the Apache HTTP server project (http://www.apache.org/)."
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE APACHE GROUP ``AS IS'' AND ANY
|
|
||||||
* EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
|
||||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE APACHE GROUP OR
|
|
||||||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
|
||||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
|
||||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
||||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
|
||||||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
||||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
|
||||||
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
* ====================================================================
|
|
||||||
*
|
|
||||||
* This software consists of voluntary contributions made by many
|
|
||||||
* individuals on behalf of the Apache Group and was originally based
|
|
||||||
* on public domain software written at the National Center for
|
|
||||||
* Supercomputing Applications, University of Illinois, Urbana-Champaign.
|
|
||||||
* For more information on the Apache Group and the Apache HTTP server
|
|
||||||
* project, please see <http://www.apache.org/>.
|
|
||||||
*
|
*
|
||||||
|
* This software may be distributed under the terms of the BSD license.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* Base64 encoder/decoder. Originally Apache file ap_base64.c
|
|
||||||
*/
|
|
||||||
#ifndef BASE64_H
|
#ifndef BASE64_H
|
||||||
#define BASE64_H
|
#define BASE64_H
|
||||||
|
|
||||||
extern const unsigned char pr2six[256];
|
#include <stddef.h>
|
||||||
|
|
||||||
int Base64decode_len(const char *bufcoded);
|
unsigned char * base64_encode(const unsigned char *src, size_t len,
|
||||||
int Base64decode(char *bufplain, const char *bufcoded);
|
size_t *out_len);
|
||||||
|
unsigned char * base64_decode(const unsigned char *src, size_t len,
|
||||||
extern const char basis_64[];
|
size_t *out_len);
|
||||||
|
|
||||||
int Base64encode_len(int len);
|
|
||||||
int Base64encode(char *encoded, const char *string, int len);
|
|
||||||
|
|
||||||
#endif /* BASE64_H */
|
#endif /* BASE64_H */
|
||||||
|
|
|
@ -18,27 +18,6 @@
|
||||||
#ifndef FILE_H
|
#ifndef FILE_H
|
||||||
#define FILE_H
|
#define FILE_H
|
||||||
|
|
||||||
|
char* generate_safe_dirname();
|
||||||
|
|
||||||
char* generate_safe_dirname(){
|
|
||||||
|
|
||||||
/* Get time */
|
|
||||||
time_t rawtime;
|
|
||||||
struct tm *info;
|
|
||||||
time( &rawtime );
|
|
||||||
info = localtime( &rawtime );
|
|
||||||
|
|
||||||
#define TIME_LEN 30
|
|
||||||
char datestr[TIME_LEN];
|
|
||||||
if(datestr == NULL){
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
strftime(datestr, TIME_LEN, "%FT%T%z", info);
|
|
||||||
|
|
||||||
|
|
||||||
#undef TIME_LEN
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* FILE_H */
|
#endif /* FILE_H */
|
||||||
|
|
36
src/attach.c
36
src/attach.c
|
@ -21,6 +21,7 @@
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
#include "mail.h"
|
#include "mail.h"
|
||||||
#include "tools.h"
|
#include "tools.h"
|
||||||
|
#include "file.h"
|
||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
@ -283,7 +284,21 @@ char* attach_files(char* message, size_t len){
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Now we can start the real work! */
|
/* Now we can start the real work! */
|
||||||
|
const char* storage_dir = generate_safe_dirname();
|
||||||
|
if(storage_dir == NULL){
|
||||||
|
fprintf(stderr,"Failed to get mail storage directory!\n");
|
||||||
|
goto finish;
|
||||||
|
}
|
||||||
|
if(verbose){
|
||||||
|
printf("Storing mail messages into directory [%s]\n",
|
||||||
|
storage_dir);
|
||||||
|
}
|
||||||
|
if(replace_base64_files(email, storage_dir) < 0){
|
||||||
|
fprintf(stderr, "Failed to store base64 messages!\n");
|
||||||
|
goto finish;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Announce our presence via header */
|
/* Announce our presence via header */
|
||||||
if(append_header(email,"X-Mailattached", instance_id) < 0){
|
if(append_header(email,"X-Mailattached", instance_id) < 0){
|
||||||
fprintf(stderr, "Failed to attach header!\n");
|
fprintf(stderr, "Failed to attach header!\n");
|
||||||
|
@ -297,3 +312,24 @@ finish:
|
||||||
return mess;
|
return mess;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* This function RECURSIVELY replaces ALL base 64 encoded messages above the
|
||||||
|
* threshold set in the config file with links to that file in the HTML format.
|
||||||
|
* Call this function with the mail ROOT object if you want to replace all
|
||||||
|
* base64 files, or only one when you want to replace only one.
|
||||||
|
*/
|
||||||
|
int replace_base64_files(struct email_t* mail, const char* dirname){
|
||||||
|
|
||||||
|
if(mail->is_multipart){
|
||||||
|
|
||||||
|
for(size_t i = 0; i < mail->submes_cnt; i++){
|
||||||
|
if(replace_base64_files(mail->submes[i], dirname) < 0){
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
322
src/base64.c
322
src/base64.c
|
@ -1,209 +1,155 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2003 Apple Computer, Inc. All rights reserved.
|
* Base64 encoding/decoding (RFC1341)
|
||||||
*
|
* Copyright (c) 2005-2011, Jouni Malinen <j@w1.fi>
|
||||||
* @APPLE_LICENSE_HEADER_START@
|
|
||||||
*
|
|
||||||
* Copyright (c) 1999-2003 Apple Computer, Inc. All Rights Reserved.
|
|
||||||
*
|
|
||||||
* This file contains Original Code and/or Modifications of Original Code
|
|
||||||
* as defined in and that are subject to the Apple Public Source License
|
|
||||||
* Version 2.0 (the 'License'). You may not use this file except in
|
|
||||||
* compliance with the License. Please obtain a copy of the License at
|
|
||||||
* http://www.opensource.apple.com/apsl/ and read it before using this
|
|
||||||
* file.
|
|
||||||
*
|
|
||||||
* The Original Code and all software distributed under the License are
|
|
||||||
* distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
|
|
||||||
* EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
|
|
||||||
* INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
|
|
||||||
* Please see the License for the specific language governing rights and
|
|
||||||
* limitations under the License.
|
|
||||||
*
|
|
||||||
* @APPLE_LICENSE_HEADER_END@
|
|
||||||
*/
|
|
||||||
/* ====================================================================
|
|
||||||
* Copyright (c) 1995-1999 The Apache Group. All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
*
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
*
|
|
||||||
* 2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in
|
|
||||||
* the documentation and/or other materials provided with the
|
|
||||||
* distribution.
|
|
||||||
*
|
|
||||||
* 3. All advertising materials mentioning features or use of this
|
|
||||||
* software must display the following acknowledgment:
|
|
||||||
* "This product includes software developed by the Apache Group
|
|
||||||
* for use in the Apache HTTP server project (http://www.apache.org/)."
|
|
||||||
*
|
|
||||||
* 4. The names "Apache Server" and "Apache Group" must not be used to
|
|
||||||
* endorse or promote products derived from this software without
|
|
||||||
* prior written permission. For written permission, please contact
|
|
||||||
* apache@apache.org.
|
|
||||||
*
|
|
||||||
* 5. Products derived from this software may not be called "Apache"
|
|
||||||
* nor may "Apache" appear in their names without prior written
|
|
||||||
* permission of the Apache Group.
|
|
||||||
*
|
|
||||||
* 6. Redistributions of any form whatsoever must retain the following
|
|
||||||
* acknowledgment:
|
|
||||||
* "This product includes software developed by the Apache Group
|
|
||||||
* for use in the Apache HTTP server project (http://www.apache.org/)."
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE APACHE GROUP ``AS IS'' AND ANY
|
|
||||||
* EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
|
||||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE APACHE GROUP OR
|
|
||||||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
|
||||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
|
||||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
||||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
|
||||||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
||||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
|
||||||
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
* ====================================================================
|
|
||||||
*
|
|
||||||
* This software consists of voluntary contributions made by many
|
|
||||||
* individuals on behalf of the Apache Group and was originally based
|
|
||||||
* on public domain software written at the National Center for
|
|
||||||
* Supercomputing Applications, University of Illinois, Urbana-Champaign.
|
|
||||||
* For more information on the Apache Group and the Apache HTTP server
|
|
||||||
* project, please see <http://www.apache.org/>.
|
|
||||||
*
|
*
|
||||||
|
* This software may be distributed under the terms of the BSD license.
|
||||||
|
* See README for more details.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* Base64 encoder/decoder. Originally Apache file ap_base64.c
|
#include <stddef.h>
|
||||||
*/
|
|
||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include <stdlib.h>
|
||||||
#include "base64.h"
|
#include "base64.h"
|
||||||
|
|
||||||
/* aaaack but it's fast and const should make it shared text page. */
|
static const unsigned char base64_table[65] =
|
||||||
const unsigned char pr2six[256] =
|
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* base64_encode - Base64 encode
|
||||||
|
* @src: Data to be encoded
|
||||||
|
* @len: Length of the data to be encoded
|
||||||
|
* @out_len: Pointer to output length variable, or %NULL if not used
|
||||||
|
* Returns: Allocated buffer of out_len bytes of encoded data,
|
||||||
|
* or %NULL on failure
|
||||||
|
*
|
||||||
|
* Caller is responsible for freeing the returned buffer. Returned buffer is
|
||||||
|
* nul terminated to make it easier to use as a C string. The nul terminator is
|
||||||
|
* not included in out_len.
|
||||||
|
*/
|
||||||
|
unsigned char * base64_encode(const unsigned char *src, size_t len,
|
||||||
|
size_t *out_len)
|
||||||
{
|
{
|
||||||
/* ASCII table */
|
unsigned char *out, *pos;
|
||||||
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
|
const unsigned char *end, *in;
|
||||||
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
|
size_t olen;
|
||||||
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 62, 64, 64, 64, 63,
|
int line_len;
|
||||||
52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 64, 64, 64, 64, 64, 64,
|
|
||||||
64, 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, 64, 64, 64, 64, 64,
|
|
||||||
64, 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, 64, 64, 64, 64, 64,
|
|
||||||
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
|
|
||||||
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
|
|
||||||
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
|
|
||||||
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
|
|
||||||
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
|
|
||||||
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
|
|
||||||
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
|
|
||||||
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64
|
|
||||||
};
|
|
||||||
|
|
||||||
int Base64decode_len(const char *bufcoded)
|
olen = len * 4 / 3 + 4; /* 3-byte blocks to 4-byte */
|
||||||
{
|
olen += olen / 72; /* line feeds */
|
||||||
int nbytesdecoded;
|
olen++; /* nul termination */
|
||||||
register const unsigned char *bufin;
|
if (olen < len)
|
||||||
register int nprbytes;
|
return NULL; /* integer overflow */
|
||||||
|
out = malloc(olen);
|
||||||
|
if (out == NULL)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
bufin = (const unsigned char *) bufcoded;
|
end = src + len;
|
||||||
while (pr2six[*(bufin++)] <= 63);
|
in = src;
|
||||||
|
pos = out;
|
||||||
|
line_len = 0;
|
||||||
|
while (end - in >= 3) {
|
||||||
|
*pos++ = base64_table[in[0] >> 2];
|
||||||
|
*pos++ = base64_table[((in[0] & 0x03) << 4) | (in[1] >> 4)];
|
||||||
|
*pos++ = base64_table[((in[1] & 0x0f) << 2) | (in[2] >> 6)];
|
||||||
|
*pos++ = base64_table[in[2] & 0x3f];
|
||||||
|
in += 3;
|
||||||
|
line_len += 4;
|
||||||
|
if (line_len >= 72) {
|
||||||
|
*pos++ = '\n';
|
||||||
|
line_len = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
nprbytes = (bufin - (const unsigned char *) bufcoded) - 1;
|
if (end - in) {
|
||||||
nbytesdecoded = ((nprbytes + 3) / 4) * 3;
|
*pos++ = base64_table[in[0] >> 2];
|
||||||
|
if (end - in == 1) {
|
||||||
|
*pos++ = base64_table[(in[0] & 0x03) << 4];
|
||||||
|
*pos++ = '=';
|
||||||
|
} else {
|
||||||
|
*pos++ = base64_table[((in[0] & 0x03) << 4) |
|
||||||
|
(in[1] >> 4)];
|
||||||
|
*pos++ = base64_table[(in[1] & 0x0f) << 2];
|
||||||
|
}
|
||||||
|
*pos++ = '=';
|
||||||
|
line_len += 4;
|
||||||
|
}
|
||||||
|
|
||||||
return nbytesdecoded + 1;
|
if (line_len)
|
||||||
|
*pos++ = '\n';
|
||||||
|
|
||||||
|
*pos = '\0';
|
||||||
|
if (out_len)
|
||||||
|
*out_len = pos - out;
|
||||||
|
return out;
|
||||||
}
|
}
|
||||||
|
|
||||||
int Base64decode(char *bufplain, const char *bufcoded)
|
|
||||||
|
/**
|
||||||
|
* base64_decode - Base64 decode
|
||||||
|
* @src: Data to be decoded
|
||||||
|
* @len: Length of the data to be decoded
|
||||||
|
* @out_len: Pointer to output length variable
|
||||||
|
* Returns: Allocated buffer of out_len bytes of decoded data,
|
||||||
|
* or %NULL on failure
|
||||||
|
*
|
||||||
|
* Caller is responsible for freeing the returned buffer.
|
||||||
|
*/
|
||||||
|
unsigned char * base64_decode(const unsigned char *src, size_t len,
|
||||||
|
size_t *out_len)
|
||||||
{
|
{
|
||||||
int nbytesdecoded;
|
unsigned char dtable[256], *out, *pos, block[4], tmp;
|
||||||
register const unsigned char *bufin;
|
size_t i, count, olen;
|
||||||
register unsigned char *bufout;
|
int pad = 0;
|
||||||
register int nprbytes;
|
|
||||||
|
|
||||||
bufin = (const unsigned char *) bufcoded;
|
memset(dtable, 0x80, 256);
|
||||||
while (pr2six[*(bufin++)] <= 63);
|
for (i = 0; i < sizeof(base64_table) - 1; i++)
|
||||||
nprbytes = (bufin - (const unsigned char *) bufcoded) - 1;
|
dtable[base64_table[i]] = (unsigned char) i;
|
||||||
nbytesdecoded = ((nprbytes + 3) / 4) * 3;
|
dtable['='] = 0;
|
||||||
|
|
||||||
bufout = (unsigned char *) bufplain;
|
count = 0;
|
||||||
bufin = (const unsigned char *) bufcoded;
|
for (i = 0; i < len; i++) {
|
||||||
|
if (dtable[src[i]] != 0x80)
|
||||||
|
count++;
|
||||||
|
}
|
||||||
|
|
||||||
while (nprbytes > 4) {
|
if (count == 0 || count % 4)
|
||||||
*(bufout++) =
|
return NULL;
|
||||||
(unsigned char) (pr2six[*bufin] << 2 | pr2six[bufin[1]] >> 4);
|
|
||||||
*(bufout++) =
|
|
||||||
(unsigned char) (pr2six[bufin[1]] << 4 | pr2six[bufin[2]] >> 2);
|
|
||||||
*(bufout++) =
|
|
||||||
(unsigned char) (pr2six[bufin[2]] << 6 | pr2six[bufin[3]]);
|
|
||||||
bufin += 4;
|
|
||||||
nprbytes -= 4;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Note: (nprbytes == 1) would be an error, so just ingore that case */
|
olen = count / 4 * 3;
|
||||||
if (nprbytes > 1) {
|
pos = out = malloc(olen);
|
||||||
*(bufout++) =
|
if (out == NULL)
|
||||||
(unsigned char) (pr2six[*bufin] << 2 | pr2six[bufin[1]] >> 4);
|
return NULL;
|
||||||
}
|
|
||||||
if (nprbytes > 2) {
|
|
||||||
*(bufout++) =
|
|
||||||
(unsigned char) (pr2six[bufin[1]] << 4 | pr2six[bufin[2]] >> 2);
|
|
||||||
}
|
|
||||||
if (nprbytes > 3) {
|
|
||||||
*(bufout++) =
|
|
||||||
(unsigned char) (pr2six[bufin[2]] << 6 | pr2six[bufin[3]]);
|
|
||||||
}
|
|
||||||
|
|
||||||
*(bufout++) = '\0';
|
count = 0;
|
||||||
nbytesdecoded -= (4 - nprbytes) & 3;
|
for (i = 0; i < len; i++) {
|
||||||
return nbytesdecoded;
|
tmp = dtable[src[i]];
|
||||||
}
|
if (tmp == 0x80)
|
||||||
|
continue;
|
||||||
const char basis_64[] =
|
|
||||||
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
|
if (src[i] == '=')
|
||||||
|
pad++;
|
||||||
int Base64encode_len(int len)
|
block[count] = tmp;
|
||||||
{
|
count++;
|
||||||
return ((len + 2) / 3 * 4) + 1;
|
if (count == 4) {
|
||||||
}
|
*pos++ = (block[0] << 2) | (block[1] >> 4);
|
||||||
|
*pos++ = (block[1] << 4) | (block[2] >> 2);
|
||||||
int Base64encode(char *encoded, const char *string, int len)
|
*pos++ = (block[2] << 6) | block[3];
|
||||||
{
|
count = 0;
|
||||||
int i;
|
if (pad) {
|
||||||
char *p;
|
if (pad == 1)
|
||||||
|
pos--;
|
||||||
p = encoded;
|
else if (pad == 2)
|
||||||
for (i = 0; i < len - 2; i += 3) {
|
pos -= 2;
|
||||||
*p++ = basis_64[(string[i] >> 2) & 0x3F];
|
else {
|
||||||
*p++ = basis_64[((string[i] & 0x3) << 4) |
|
/* Invalid padding */
|
||||||
((int) (string[i + 1] & 0xF0) >> 4)];
|
free(out);
|
||||||
*p++ = basis_64[((string[i + 1] & 0xF) << 2) |
|
return NULL;
|
||||||
((int) (string[i + 2] & 0xC0) >> 6)];
|
}
|
||||||
*p++ = basis_64[string[i + 2] & 0x3F];
|
break;
|
||||||
}
|
}
|
||||||
if (i < len) {
|
}
|
||||||
*p++ = basis_64[(string[i] >> 2) & 0x3F];
|
}
|
||||||
if (i == (len - 1)) {
|
|
||||||
*p++ = basis_64[((string[i] & 0x3) << 4)];
|
*out_len = pos - out;
|
||||||
*p++ = '=';
|
return out;
|
||||||
}
|
|
||||||
else {
|
|
||||||
*p++ = basis_64[((string[i] & 0x3) << 4) |
|
|
||||||
((int) (string[i + 1] & 0xF0) >> 4)];
|
|
||||||
*p++ = basis_64[((string[i + 1] & 0xF) << 2)];
|
|
||||||
}
|
|
||||||
*p++ = '=';
|
|
||||||
}
|
|
||||||
|
|
||||||
*p++ = '\0';
|
|
||||||
return p - encoded;
|
|
||||||
}
|
}
|
||||||
|
|
60
src/file.c
60
src/file.c
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* file.h - File writing functionality
|
* file.c - File writing functionality
|
||||||
* The author licenses this file
|
* The author licenses this file
|
||||||
* to you under the Apache License, Version 2.0 (the
|
* to you under the Apache License, Version 2.0 (the
|
||||||
* "License"); you may not use this file except in compliance
|
* "License"); you may not use this file except in compliance
|
||||||
|
@ -15,11 +15,22 @@
|
||||||
* under the License.
|
* under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef FILE_H
|
#include "file.h"
|
||||||
#define FILE_H
|
#include "config.h"
|
||||||
|
|
||||||
|
|
||||||
|
#include <time.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
|
||||||
|
/* Generate a safe directory name to store ONE emails files into. This is
|
||||||
|
* done to prevent someone from guessing the directory names. THe first part
|
||||||
|
* is the date in ISO format, in case you want to have a shell script cleaning
|
||||||
|
* the directory every once in a while.
|
||||||
|
*/
|
||||||
char* generate_safe_dirname(){
|
char* generate_safe_dirname(){
|
||||||
|
|
||||||
/* Get time */
|
/* Get time */
|
||||||
|
@ -30,15 +41,40 @@ char* generate_safe_dirname(){
|
||||||
|
|
||||||
#define TIME_LEN 30
|
#define TIME_LEN 30
|
||||||
char datestr[TIME_LEN];
|
char datestr[TIME_LEN];
|
||||||
if(datestr == NULL){
|
memset(datestr, 0, TIME_LEN);
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
strftime(datestr, TIME_LEN, "%FT%T%z", info);
|
strftime(datestr, TIME_LEN, "%FT%T%z", info);
|
||||||
|
|
||||||
|
/* Get data from urandom to be secure. I mean from what I
|
||||||
|
* know it should be, but I'm not a crypto expert. If you have doubts
|
||||||
|
* and know how I should do that, PLEASE TELL ME! The man pages told me
|
||||||
|
* to do so!
|
||||||
|
*/
|
||||||
|
int randie[3];
|
||||||
|
int random_fd = open("/dev/random", O_RDONLY);
|
||||||
|
if (random_fd < 0){
|
||||||
|
perror("Failed to open /dev/urandom");
|
||||||
|
return NULL;
|
||||||
|
}else{
|
||||||
|
size_t randie_len = 0;
|
||||||
|
while (randie_len < sizeof(randie)){
|
||||||
|
ssize_t result = read(random_fd, randie + randie_len, sizeof(randie) - randie_len);
|
||||||
|
if (result < 0){
|
||||||
|
|
||||||
|
perror("Failed to read from /dev/urandom");
|
||||||
|
close(random_fd);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
randie_len += result;
|
||||||
|
}
|
||||||
|
close(random_fd);
|
||||||
|
}
|
||||||
|
size_t dir_len = TIME_LEN + 50 + strlen(directory);
|
||||||
|
char * dir_id = malloc(dir_len+1);
|
||||||
|
memset(dir_id, 0, dir_len+1 );
|
||||||
|
|
||||||
|
snprintf(dir_id,dir_len, "%s/%s%i%i%i/",directory, datestr,
|
||||||
|
randie[0], randie[1], randie[2]);
|
||||||
#undef TIME_LEN
|
#undef TIME_LEN
|
||||||
|
return dir_id;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* FILE_H */
|
|
||||||
|
|
Loading…
Reference in a new issue