Rearrange stuff
This commit is contained in:
parent
518f578298
commit
d7e2aee3a3
21 changed files with 20 additions and 139 deletions
|
|
@ -1,68 +0,0 @@
|
|||
/**
|
||||
* hermes antispam proxy
|
||||
* Copyright (C) 2006, 2007 Juan José Gutiérrez de Quevedo <juanjo@gutierrezdequevedo.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; version 2 of the License
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* @author Juan José Gutiérrez de Quevedo <juanjo@gutierrezdequevedo.com>
|
||||
*/
|
||||
#ifndef DATABASE_H
|
||||
#define DATABASE_H
|
||||
|
||||
#include "hermes.h"
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <iostream>
|
||||
#include <string>
|
||||
#include <sqlite3.h>
|
||||
#include <pthread.h>
|
||||
|
||||
#include "Utils.h"
|
||||
|
||||
using namespace std;
|
||||
|
||||
/**
|
||||
* this class implements an interface to the sqlite3 database
|
||||
*/
|
||||
class Database
|
||||
{
|
||||
private:
|
||||
string dbfile;
|
||||
sqlite3 *dbh;
|
||||
void _open();
|
||||
int countRows(string);
|
||||
void doQuery(string);
|
||||
unsigned long getIntValue(string&);
|
||||
public:
|
||||
Database();
|
||||
~Database();
|
||||
void setDatabaseFile(string);
|
||||
static string cleanString(string);
|
||||
void init();
|
||||
void open();
|
||||
void close();
|
||||
bool greylisted(string,string,string,int,int,int);
|
||||
bool whitelistedIP(string);
|
||||
bool whitelistedHostname(string);
|
||||
bool whitelistedTO(string);
|
||||
bool whitelistedDomain(string);
|
||||
bool blacklistedTO(string);
|
||||
bool blacklistedToDomain(string);
|
||||
bool blacklistedIP(string);
|
||||
bool blacklistedFROM(string);
|
||||
bool allowedDomainPerIP(string,string);
|
||||
unsigned long cleanDB();
|
||||
};
|
||||
|
||||
#endif //DATABASE_H
|
||||
|
|
@ -1,64 +0,0 @@
|
|||
/**
|
||||
* hermes antispam proxy
|
||||
* Copyright (C) 2006, 2007 Juan José Gutiérrez de Quevedo <juanjo@gutierrezdequevedo.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; version 2 of the License
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* @author Juan José Gutiérrez de Quevedo <juanjo@gutierrezdequevedo.com>
|
||||
*/
|
||||
#ifndef EXCEPTION_H
|
||||
#define EXCEPTION_H
|
||||
|
||||
#include <iostream>
|
||||
#include <string>
|
||||
|
||||
#include "Configfile.h"
|
||||
#include "Logger.h"
|
||||
|
||||
using namespace std;
|
||||
|
||||
class Exception
|
||||
{
|
||||
private:
|
||||
string error;
|
||||
string file;
|
||||
unsigned line;
|
||||
void notifyByEmail(string);
|
||||
public:
|
||||
Exception(string,string,unsigned);
|
||||
operator string();
|
||||
friend ostream& operator<<(ostream&,Exception&);
|
||||
};
|
||||
|
||||
class NetworkException:public Exception
|
||||
{
|
||||
public:
|
||||
NetworkException(string p_error,string p_file,int p_line):Exception(p_error,p_file,p_line){}
|
||||
};
|
||||
|
||||
class SQLException:public Exception
|
||||
{
|
||||
public:
|
||||
SQLException(string p_error,string p_file,int p_line):Exception(p_error,p_file,p_line){}
|
||||
};
|
||||
|
||||
class NotifyException
|
||||
{
|
||||
private:
|
||||
string error;
|
||||
public:
|
||||
NotifyException(string p_error){ error=p_error; }
|
||||
operator string(){ return "NotifyException: "+error;};
|
||||
};
|
||||
#endif //EXCEPTION_H
|
||||
|
|
@ -1,57 +0,0 @@
|
|||
/**
|
||||
* hermes antispam proxy
|
||||
* Copyright (C) 2006, 2007 Juan José Gutiérrez de Quevedo <juanjo@gutierrezdequevedo.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; version 2 of the License
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* @author Juan José Gutiérrez de Quevedo <juanjo@gutierrezdequevedo.com>
|
||||
*/
|
||||
#ifndef FILELOGGER_H
|
||||
#define FILELOGGER_H
|
||||
|
||||
#include <stdio.h>
|
||||
#include <pthread.h>
|
||||
#include <string>
|
||||
#include <list>
|
||||
|
||||
#include "Logger.h"
|
||||
#include "Configfile.h"
|
||||
|
||||
using namespace std;
|
||||
|
||||
/**
|
||||
* this class implements a logger that writes to a file
|
||||
*
|
||||
* @see Logger
|
||||
*/
|
||||
class FileLogger: public Logger
|
||||
{
|
||||
unsigned char linecount;
|
||||
time_t last_rotation;
|
||||
private:
|
||||
FILE *f;
|
||||
pthread_mutex_t mutex;
|
||||
list<string> tmpstrings;
|
||||
void openFile(string);
|
||||
void closeFile();
|
||||
void syncBufferToDisk();
|
||||
void rotateLog();
|
||||
string getProcessedRotateFilename();
|
||||
public:
|
||||
FileLogger();
|
||||
~FileLogger();
|
||||
void addMessage(string,int,int,string);
|
||||
};
|
||||
|
||||
#endif //FILELOGGER_H
|
||||
49
src/Logger.h
49
src/Logger.h
|
|
@ -1,49 +0,0 @@
|
|||
/**
|
||||
* hermes antispam proxy
|
||||
* Copyright (C) 2006, 2007 Juan José Gutiérrez de Quevedo <juanjo@gutierrezdequevedo.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; version 2 of the License
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* @author Juan José Gutiérrez de Quevedo <juanjo@gutierrezdequevedo.com>
|
||||
*/
|
||||
#ifndef LOGGER_H
|
||||
#define LOGGER_H
|
||||
|
||||
#include <string>
|
||||
|
||||
using namespace std;
|
||||
|
||||
/**
|
||||
* logger base class
|
||||
*/
|
||||
class Logger
|
||||
{
|
||||
public:
|
||||
virtual ~Logger(){}; //empty destructor, not creating anything
|
||||
virtual void addMessage(string,int,int,string)=0;
|
||||
};
|
||||
|
||||
#ifndef WIN32
|
||||
#include "UnixLogger.h"
|
||||
#endif //WIN32
|
||||
|
||||
#ifndef HERMES_LOG_INFO
|
||||
#define HERMES_LOG_ERR 0
|
||||
#define HERMES_LOG_INFO 1
|
||||
#define HERMES_LOG_DEBUG 2
|
||||
#endif //HERMES_LOG_INFO
|
||||
#include "FileLogger.h"
|
||||
#include "NullLogger.h"
|
||||
|
||||
#endif //LOGGER_H
|
||||
|
|
@ -1,41 +0,0 @@
|
|||
/**
|
||||
* hermes antispam proxy
|
||||
* Copyright (C) 2006, 2007 Juan José Gutiérrez de Quevedo <juanjo@gutierrezdequevedo.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; version 2 of the License
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* @author Juan José Gutiérrez de Quevedo <juanjo@gutierrezdequevedo.com>
|
||||
*/
|
||||
#ifndef NULLLOGGER_H
|
||||
#define NULLLOGGER_H
|
||||
|
||||
#include <string>
|
||||
|
||||
#include "Logger.h"
|
||||
|
||||
using namespace std;
|
||||
|
||||
/**
|
||||
* this logger implements a null logger
|
||||
* messages added to this logger go nowhere
|
||||
*
|
||||
* @see Logger
|
||||
*/
|
||||
class NullLogger: public Logger
|
||||
{
|
||||
public:
|
||||
void addMessage(string,int,int,string){}; //ignore messages
|
||||
};
|
||||
|
||||
#endif //NULLLOGGER_H
|
||||
14
src/Proxy.h
14
src/Proxy.h
|
|
@ -1,14 +0,0 @@
|
|||
// Proxy.h
|
||||
#pragma once
|
||||
#include <string>
|
||||
#include "SocketInterface.h"
|
||||
|
||||
class Proxy {
|
||||
public:
|
||||
Proxy(SocketInterface* outside_socket) : outside(outside_socket) {}
|
||||
|
||||
void run(std::string& peer_address);
|
||||
|
||||
private:
|
||||
SocketInterface* outside;
|
||||
};
|
||||
|
|
@ -1,56 +0,0 @@
|
|||
/**
|
||||
* hermes antispam proxy
|
||||
* Copyright (C) 2006, 2007 Juan José Gutiérrez de Quevedo <juanjo@gutierrezdequevedo.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; version 2 of the License
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* @author Juan José Gutiérrez de Quevedo <juanjo@gutierrezdequevedo.com>
|
||||
*/
|
||||
#ifndef SERVERSOCKET_H
|
||||
#define SERVERSOCKET_H
|
||||
|
||||
|
||||
#include <sys/types.h>
|
||||
#ifdef WIN32
|
||||
#include <winsock2.h>
|
||||
#else
|
||||
#include <sys/socket.h>
|
||||
#include <netdb.h>
|
||||
#include <libintl.h>
|
||||
#endif //WIN32
|
||||
|
||||
#include <iostream>
|
||||
|
||||
#include "hermes.h"
|
||||
#include "Socket.h"
|
||||
/**
|
||||
* implement the server specific methods for socket, mainly listen() and accept()
|
||||
* @see Socket
|
||||
*/
|
||||
class ServerSocket: public Socket
|
||||
{
|
||||
private:
|
||||
unsigned int port;
|
||||
string listen_ip;
|
||||
public:
|
||||
ServerSocket(){};
|
||||
~ServerSocket(){};
|
||||
void setPort(unsigned int);
|
||||
void setListenIP(string&);
|
||||
void listen();
|
||||
void listen(unsigned int,string);
|
||||
int accept(string *);
|
||||
};
|
||||
|
||||
#endif //SERVERSOCKET_H
|
||||
106
src/Socket.h
106
src/Socket.h
|
|
@ -1,106 +0,0 @@
|
|||
/**
|
||||
* hermes antispam proxy
|
||||
* Copyright (C) 2006, 2007 Juan José Gutiérrez de Quevedo <juanjo@gutierrezdequevedo.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; version 2 of the License
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* @author Juan José Gutiérrez de Quevedo <juanjo@gutierrezdequevedo.com>
|
||||
*/
|
||||
#ifndef SOCKET_H
|
||||
#define SOCKET_H
|
||||
|
||||
#include "hermes.h"
|
||||
|
||||
#include <iostream>
|
||||
#include <string>
|
||||
#include <sstream>
|
||||
#include <sys/types.h>
|
||||
#ifdef WIN32
|
||||
#include <winsock2.h>
|
||||
#include <ws2tcpip.h>
|
||||
#ifndef AI_ADDRCONFIG
|
||||
#define AI_ADDRCONFIG 0 //if the windows we are compiling at is old, define it as 0
|
||||
#endif //AI_ADDRCONFIG
|
||||
#else
|
||||
#include <sys/socket.h>
|
||||
#include <netdb.h>
|
||||
#include <arpa/inet.h>
|
||||
#endif //WIN32
|
||||
#include <errno.h>
|
||||
#ifdef HAVE_SSL
|
||||
#include <openssl/ssl.h>
|
||||
#include <openssl/rand.h>
|
||||
#endif //HAVE_SSL
|
||||
|
||||
//this is a bit of a hack
|
||||
//if a system doesn't have MSG_NOSIGNAL then we define it as 0 (that is, no options selected)
|
||||
//I've tried this on Solaris and NetBSD and it seems to work. Still, recheck in the future (TODO)
|
||||
#ifndef MSG_NOSIGNAL
|
||||
#define MSG_NOSIGNAL 0
|
||||
#endif //MSG_NOSIGNAL
|
||||
|
||||
#include "Configfile.h"
|
||||
#include "Utils.h"
|
||||
|
||||
using namespace std;
|
||||
|
||||
/**
|
||||
* implements a socket class independent of operating system and that supports ssl
|
||||
*/
|
||||
class Socket
|
||||
{
|
||||
protected:
|
||||
int fd;
|
||||
private:
|
||||
// bool closed;
|
||||
static int created_sockets;
|
||||
#ifdef HAVE_SSL
|
||||
bool ssl_enabled;
|
||||
SSL *ssl;
|
||||
static SSL_CTX *ssl_ctx_client;
|
||||
static SSL_CTX *ssl_ctx_server;
|
||||
#endif //HAVE_SSL
|
||||
public:
|
||||
Socket();
|
||||
~Socket();
|
||||
#ifdef HAVE_SSL
|
||||
bool is_ssl_enabled();
|
||||
void prepareSSL(bool);
|
||||
void startSSL(bool);
|
||||
#endif //HAVE_SSL
|
||||
void setFD(int);
|
||||
bool canRead(float);
|
||||
bool connect(string,unsigned int);
|
||||
int getFD();
|
||||
static struct sockaddr resolve(string);
|
||||
static string resolveToString(string);
|
||||
static string resolveInverselyToString(string);
|
||||
|
||||
void init();
|
||||
void close();
|
||||
//reading and writing
|
||||
char readByte();
|
||||
ssize_t readBytes(void *,ssize_t);
|
||||
string readLine();
|
||||
|
||||
void writeByte(char);
|
||||
void writeBytes(void *,ssize_t);
|
||||
void writeLine(string);
|
||||
|
||||
bool isClosed();
|
||||
|
||||
void setTimeout(float,float);
|
||||
};
|
||||
|
||||
#endif //SOCKET_H
|
||||
|
|
@ -1,16 +0,0 @@
|
|||
// SocketInterface.h
|
||||
#pragma once
|
||||
#include <string>
|
||||
|
||||
class SocketInterface {
|
||||
public:
|
||||
virtual ~SocketInterface() = default;
|
||||
virtual void connect(const std::string& host, unsigned short port) = 0;
|
||||
virtual void writeLine(const std::string& data) = 0;
|
||||
virtual std::string readLine() = 0;
|
||||
virtual bool canRead(double timeout) = 0;
|
||||
virtual bool isClosed() = 0;
|
||||
virtual void close() = 0;
|
||||
virtual void prepareSSL(bool incoming) = 0;
|
||||
virtual void startSSL(bool incoming) = 0;
|
||||
};
|
||||
44
src/Spf.h
44
src/Spf.h
|
|
@ -1,44 +0,0 @@
|
|||
/**
|
||||
* hermes antispam proxy
|
||||
* Copyright (C) 2006, 2007 Juan José Gutiérrez de Quevedo <juanjo@gutierrezdequevedo.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; version 2 of the License
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* @author Juan José Gutiérrez de Quevedo <juanjo@gutierrezdequevedo.com>
|
||||
*/
|
||||
#ifndef SPF_H
|
||||
#define SPF_H
|
||||
|
||||
#include "hermes.h"
|
||||
|
||||
extern "C"
|
||||
{
|
||||
#include <spf2/spf.h>
|
||||
}
|
||||
|
||||
class Spf
|
||||
{
|
||||
private:
|
||||
static SPF_server_t *spfserver;
|
||||
SPF_request_t *spfrequest;
|
||||
SPF_response_t *spfresponse;
|
||||
pthread_mutex_t mutex;
|
||||
public:
|
||||
Spf();
|
||||
~Spf();
|
||||
static void deinitialize();
|
||||
bool query(const string&, const string&, const string&);
|
||||
};
|
||||
|
||||
#endif //SPF_H
|
||||
|
|
@ -1,43 +0,0 @@
|
|||
/**
|
||||
* hermes antispam proxy
|
||||
* Copyright (C) 2006, 2007 Juan José Gutiérrez de Quevedo <juanjo@gutierrezdequevedo.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; version 2 of the License
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* @author Juan José Gutiérrez de Quevedo <juanjo@gutierrezdequevedo.com>
|
||||
*/
|
||||
#ifndef UNIXLOGGER_H
|
||||
#define UNIXLOGGER_H
|
||||
|
||||
#include <syslog.h>
|
||||
#include <string>
|
||||
|
||||
#include "Logger.h"
|
||||
|
||||
using namespace std;
|
||||
|
||||
/**
|
||||
* implements the logger for Linux/UNIX
|
||||
*
|
||||
* @see Logger
|
||||
*/
|
||||
class UnixLogger: public Logger
|
||||
{
|
||||
public:
|
||||
UnixLogger();
|
||||
~UnixLogger();
|
||||
void addMessage(string,int,int,string);
|
||||
};
|
||||
|
||||
#endif //UNIXLOGGER_H
|
||||
88
src/Utils.h
88
src/Utils.h
|
|
@ -1,88 +0,0 @@
|
|||
/**
|
||||
* hermes antispam proxy
|
||||
* Copyright (C) 2006, 2007 Juan José Gutiérrez de Quevedo <juanjo@gutierrezdequevedo.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; version 2 of the License
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* @author Juan José Gutiérrez de Quevedo <juanjo@gutierrezdequevedo.com>
|
||||
*/
|
||||
#ifndef UTILS_H
|
||||
#define UTILS_H
|
||||
|
||||
#include "hermes.h"
|
||||
#include <string>
|
||||
#include <sstream>
|
||||
#include <iostream>
|
||||
#include <dirent.h>
|
||||
#include <time.h>
|
||||
|
||||
#ifndef WIN32
|
||||
#include <pwd.h>
|
||||
#include <grp.h>
|
||||
#endif //WIN32
|
||||
|
||||
#include "Database.h"
|
||||
#include "Socket.h"
|
||||
|
||||
using namespace std;
|
||||
|
||||
#ifdef WIN32
|
||||
#define sleep(x) Sleep(1000*(x))
|
||||
#endif //WIN32
|
||||
|
||||
/*#ifndef MAX
|
||||
#define MAX(x,y) (((x)>(y))?(x):(y))
|
||||
#endif //MAX*/
|
||||
|
||||
/**
|
||||
* this class implements common utilities
|
||||
*/
|
||||
class Utils
|
||||
{
|
||||
public:
|
||||
//string utilities
|
||||
static string strtolower(string);
|
||||
static string trim(string);
|
||||
static string inttostr(int);
|
||||
static string ulongtostr(unsigned long);
|
||||
|
||||
//email-related utilities
|
||||
static string getmail(string&);
|
||||
static string getdomain(string&);
|
||||
static string reverseip(string&);
|
||||
|
||||
//spam-related utilities (TODO: move to a different class)
|
||||
static bool greylist(string,string&,string&,string&);
|
||||
static bool listed_on_dns_lists(list<string>&,unsigned char,string&);
|
||||
static bool whitelisted(string,string&);
|
||||
static bool blacklisted(string,string&,string&);
|
||||
|
||||
#ifndef WIN32
|
||||
//posix-utils
|
||||
static int usertouid(string);
|
||||
static int grouptogid(string);
|
||||
#endif //WIN32
|
||||
|
||||
//misc
|
||||
static string get_canonical_filename(string);
|
||||
static bool file_exists(string);
|
||||
static bool dir_exists(string);
|
||||
static string errnotostrerror(int);
|
||||
static string rfc2821_date(time_t *timestamp=NULL);
|
||||
static string gethostname();
|
||||
static void write_pid(string,pid_t);
|
||||
static string gethostname(int s);
|
||||
};
|
||||
|
||||
#endif //UTILS_H
|
||||
41
src/hermes.h
41
src/hermes.h
|
|
@ -1,41 +0,0 @@
|
|||
/**
|
||||
* hermes antispam proxy
|
||||
* Copyright (C) 2006, 2007 Juan José Gutiérrez de Quevedo <juanjo@gutierrezdequevedo.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; version 2 of the License
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* @author Juan José Gutiérrez de Quevedo <juanjo@gutierrezdequevedo.com>
|
||||
*/
|
||||
#ifndef SMTPPROXY_H
|
||||
#define SMTPPROXY_H
|
||||
|
||||
#include "Exception.h"
|
||||
#include <assert.h>
|
||||
#include <string>
|
||||
|
||||
#define _(x) (x)
|
||||
#define LOG(x,y) hermes_log.addMessage(__FILE__,__LINE__,x,y)
|
||||
#define LERR(x) LOG(HERMES_LOG_ERR,x)
|
||||
#define LINF(x) LOG(HERMES_LOG_INFO,x)
|
||||
#define LDEB(x) LOG(HERMES_LOG_DEBUG,x)
|
||||
|
||||
|
||||
typedef struct
|
||||
{
|
||||
int new_fd;
|
||||
std::string peer_address;
|
||||
unsigned long connection_id;
|
||||
}new_conn_info;
|
||||
|
||||
#endif //SMTPPROXY_H
|
||||
|
|
@ -1,96 +0,0 @@
|
|||
#ifndef LIBSPF2_MOCK_H
|
||||
#define LIBSPF2_MOCK_H
|
||||
#include <gmock/gmock.h>
|
||||
#include <gtest/gtest.h>
|
||||
#include <string>
|
||||
#include <spf2/spf.h>
|
||||
|
||||
// Control variables to adjust behavior of mocked functions
|
||||
extern "C" {
|
||||
static SPF_errcode_t spf_set_ipv4_result = SPF_E_SUCCESS;
|
||||
static SPF_errcode_t spf_set_helo_result = SPF_E_SUCCESS;
|
||||
static int spf_set_from_result;
|
||||
static SPF_response_t* spf_mock_response = nullptr;
|
||||
static SPF_errcode_t spf_request_query_result = SPF_E_SUCCESS;
|
||||
|
||||
// New control variables for SPF_server mocking
|
||||
static SPF_server_t* spf_mock_server = nullptr;
|
||||
static bool spf_server_new_should_fail = false;
|
||||
|
||||
SPF_server_t* SPF_server_new(SPF_server_dnstype_t dnstype,int debug)
|
||||
{
|
||||
if (spf_server_new_should_fail) {
|
||||
return nullptr;
|
||||
}
|
||||
return spf_mock_server ? spf_mock_server : new SPF_server_t();
|
||||
}
|
||||
|
||||
void SPF_server_free(SPF_server_t* server) {
|
||||
delete server;
|
||||
}
|
||||
|
||||
SPF_request_t* SPF_request_new(SPF_server_t *server) {
|
||||
return new SPF_request_t(); // Simply allocate and return new request
|
||||
}
|
||||
|
||||
void SPF_request_free(SPF_request_t* request) {
|
||||
delete request; // Deallocate request
|
||||
}
|
||||
|
||||
SPF_errcode_t SPF_request_set_ipv4_str(SPF_request_t* request, const char* ip) {
|
||||
return spf_set_ipv4_result; // Use controllable result
|
||||
}
|
||||
|
||||
SPF_errcode_t SPF_request_set_helo_dom(SPF_request_t* request, const char* helo) {
|
||||
return spf_set_helo_result; // Use controllable result
|
||||
}
|
||||
|
||||
int SPF_request_set_env_from(SPF_request_t* request, const char* from) {
|
||||
return spf_set_from_result; // Use controllable result
|
||||
}
|
||||
|
||||
SPF_errcode_t SPF_request_query_mailfrom(SPF_request_t* request, SPF_response_t** response) {
|
||||
*response = spf_mock_response;
|
||||
return spf_request_query_result;
|
||||
}
|
||||
|
||||
SPF_result_t SPF_response_result(SPF_response_t* response) {
|
||||
return response->result; // Return the result
|
||||
}
|
||||
|
||||
void SPF_response_free(SPF_response_t* response) {
|
||||
delete response; // Deallocate response
|
||||
}
|
||||
}
|
||||
|
||||
// Functions to set return values for mocked functions
|
||||
void SetSpfMockReturnIPv4Value(SPF_errcode_t value) {
|
||||
spf_set_ipv4_result = value;
|
||||
}
|
||||
|
||||
void SetSpfMockReturnHeloValue(SPF_errcode_t value) {
|
||||
spf_set_helo_result = value;
|
||||
}
|
||||
|
||||
void SetSpfMockReturnFromValue(int value) {
|
||||
spf_set_from_result = value;
|
||||
}
|
||||
|
||||
void SetSpfRequestQueryResult(SPF_errcode_t value) {
|
||||
spf_request_query_result = value;
|
||||
}
|
||||
|
||||
void SetSpfMockResponse(SPF_response_t* mockResponse) {
|
||||
spf_mock_response = mockResponse;
|
||||
}
|
||||
|
||||
// New functions for SPF_server mocking
|
||||
void SetSpfMockServer(SPF_server_t* mockServer) {
|
||||
spf_mock_server = mockServer;
|
||||
}
|
||||
|
||||
void SetSpfServerNewShouldFail(bool shouldFail) {
|
||||
spf_server_new_should_fail = shouldFail;
|
||||
}
|
||||
|
||||
#endif // LIBSPF2_MOCK_H
|
||||
|
|
@ -1,15 +0,0 @@
|
|||
// MockSocket.h
|
||||
#include "SocketInterface.h"
|
||||
#include <gmock/gmock.h>
|
||||
|
||||
class MockSocket : public SocketInterface {
|
||||
public:
|
||||
MOCK_METHOD(void, connect, (const std::string& host, unsigned short port), (override));
|
||||
MOCK_METHOD(void, writeLine, (const std::string& data), (override));
|
||||
MOCK_METHOD(std::string, readLine, (), (override));
|
||||
MOCK_METHOD(bool, canRead, (double timeout), (override));
|
||||
MOCK_METHOD(bool, isClosed, (), (override));
|
||||
MOCK_METHOD(void, close, (), (override));
|
||||
MOCK_METHOD(void, prepareSSL, (bool incoming), (override));
|
||||
MOCK_METHOD(void, startSSL, (bool incoming), (override));
|
||||
};
|
||||
|
|
@ -1,63 +0,0 @@
|
|||
// ProxyTest.cpp
|
||||
#include <gtest/gtest.h>
|
||||
#include "Proxy.h"
|
||||
#include "socket_mock.h"
|
||||
|
||||
class ProxyTest : public ::testing::Test {
|
||||
protected:
|
||||
MockSocket mock_socket;
|
||||
Proxy* proxy;
|
||||
|
||||
void SetUp() override {
|
||||
proxy = new Proxy(&mock_socket);
|
||||
}
|
||||
|
||||
void TearDown() override {
|
||||
delete proxy;
|
||||
}
|
||||
};
|
||||
|
||||
TEST_F(ProxyTest, HandlesMailFromCommand) {
|
||||
std::string peer_address = "127.0.0.1";
|
||||
|
||||
EXPECT_CALL(mock_socket, connect("server-host", 25));
|
||||
EXPECT_CALL(mock_socket, canRead(0.2)).WillOnce(testing::Return(true));
|
||||
EXPECT_CALL(mock_socket, readLine()).WillOnce(testing::Return("MAIL FROM:<test@example.com>"));
|
||||
EXPECT_CALL(mock_socket, writeLine("MAIL FROM:<test@example.com>"));
|
||||
EXPECT_CALL(mock_socket, writeLine("250 OK"));
|
||||
|
||||
proxy->run(peer_address);
|
||||
}
|
||||
|
||||
TEST_F(ProxyTest, HandlesRcptToCommand) {
|
||||
std::string peer_address = "127.0.0.1";
|
||||
|
||||
EXPECT_CALL(mock_socket, connect("server-host", 25));
|
||||
EXPECT_CALL(mock_socket, canRead(0.2)).WillRepeatedly(testing::Return(true));
|
||||
EXPECT_CALL(mock_socket, readLine())
|
||||
.WillOnce(testing::Return("MAIL FROM:<test@example.com>"))
|
||||
.WillOnce(testing::Return("RCPT TO:<receiver@example.com>"))
|
||||
.WillOnce(testing::Return(""));
|
||||
|
||||
EXPECT_CALL(mock_socket, writeLine("MAIL FROM:<test@example.com>"));
|
||||
EXPECT_CALL(mock_socket, writeLine("RCPT TO:<receiver@example.com>"));
|
||||
EXPECT_CALL(mock_socket, writeLine("250 OK"));
|
||||
|
||||
proxy->run(peer_address);
|
||||
}
|
||||
|
||||
TEST_F(ProxyTest, HandlesEmptyLine) {
|
||||
std::string peer_address = "127.0.0.1";
|
||||
|
||||
EXPECT_CALL(mock_socket, connect("server-host", 25));
|
||||
EXPECT_CALL(mock_socket, canRead(0.2)).WillOnce(testing::Return(true));
|
||||
EXPECT_CALL(mock_socket, readLine()).WillOnce(testing::Return(""));
|
||||
|
||||
proxy->run(peer_address);
|
||||
// Expect no further actions to occur
|
||||
}
|
||||
|
||||
int main(int argc, char** argv) {
|
||||
::testing::InitGoogleMock(&argc, argv);
|
||||
return RUN_ALL_TESTS();
|
||||
}
|
||||
|
|
@ -1,98 +0,0 @@
|
|||
#include <gtest/gtest.h>
|
||||
#include "Spf.h"
|
||||
|
||||
#include "libspf2_mock.h"
|
||||
|
||||
// Mock the SPF server responses for unit testing
|
||||
class MockSPFServer {
|
||||
public:
|
||||
static void initialize() {
|
||||
// Initialize any mock data here
|
||||
}
|
||||
|
||||
static void cleanup() {
|
||||
// Cleanup if needed
|
||||
}
|
||||
|
||||
static SPF_response_t* mockResponse(SPF_result_t result) {
|
||||
SPF_response_t* response = new SPF_response_t; // Replace with actual allocation
|
||||
response->result = result; // Set the desired mock result
|
||||
return response;
|
||||
}
|
||||
};
|
||||
|
||||
// Test Fixture for SPF tests
|
||||
class SpfTest : public ::testing::Test {
|
||||
protected:
|
||||
Spf* spf;
|
||||
|
||||
void SetUp() override {
|
||||
// Create a new Spf instance before each test
|
||||
spf = new Spf();
|
||||
}
|
||||
|
||||
void TearDown() override {
|
||||
// Clean up after each test
|
||||
delete spf;
|
||||
spf->deinitialize();
|
||||
}
|
||||
};
|
||||
|
||||
// Test the construction of the Spf object
|
||||
TEST_F(SpfTest, Construction) {
|
||||
EXPECT_NO_THROW({
|
||||
Spf testSpf;
|
||||
});
|
||||
}
|
||||
|
||||
// Test SPF querying with valid parameters
|
||||
TEST_F(SpfTest, QueryValidParameters) {
|
||||
// Assuming the mocked SPF server is set up to return a valid response
|
||||
MockSPFServer::initialize();
|
||||
|
||||
bool result = spf->query("192.0.2.1", "mail.example.com", "test@example.com");
|
||||
EXPECT_TRUE(result);
|
||||
|
||||
MockSPFServer::cleanup();
|
||||
}
|
||||
|
||||
// Test SPF querying with failed result
|
||||
TEST_F(SpfTest, QueryFailResult) {
|
||||
// Mock the response to return a fail result here
|
||||
SPF_response_t* response = MockSPFServer::mockResponse(SPF_RESULT_FAIL);
|
||||
|
||||
bool result = spf->query("198.51.100.1", "fail.example.com", "test@fail.com");
|
||||
EXPECT_FALSE(result);
|
||||
|
||||
delete response; // Clean up mocked response
|
||||
}
|
||||
|
||||
// Test SPF querying with an empty HELO string
|
||||
TEST_F(SpfTest, QueryEmptyHelo) {
|
||||
EXPECT_THROW({
|
||||
spf->query("192.0.2.1", "", "test@example.com");
|
||||
}, std::runtime_error);
|
||||
}
|
||||
|
||||
// Test SPF querying with invalid IP format
|
||||
TEST_F(SpfTest, QueryInvalidIPAddress) {
|
||||
EXPECT_THROW({
|
||||
spf->query("invalid_ip", "mail.example.com", "test@example.com");
|
||||
}, std::runtime_error);
|
||||
}
|
||||
|
||||
// Test SPF request failure
|
||||
TEST_F(SpfTest, QueryRequestFailure) {
|
||||
// Here you might want to simulate a situation
|
||||
// where the request cannot be created or fails due to some other reason.
|
||||
spf->deinitialize(); // Ensure the server is cleaned up before running this.
|
||||
|
||||
EXPECT_THROW({
|
||||
spf->query("192.0.2.1", "mail.example.com", "test@example.com");
|
||||
}, std::runtime_error);
|
||||
}
|
||||
|
||||
int main(int argc, char **argv) {
|
||||
::testing::InitGoogleTest(&argc, argv);
|
||||
return RUN_ALL_TESTS();
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue