mirror of
https://gitee.com/acl-dev/acl.git
synced 2024-12-15 17:30:53 +08:00
293 lines
6.8 KiB
C++
293 lines
6.8 KiB
C++
#include "StdAfx.h"
|
||
#include "global/global.h"
|
||
#include "global/passwd_crypt.h"
|
||
#include "net_store.h"
|
||
|
||
net_store::net_store(const char* smtp_addr, int smtp_port,
|
||
const char* pop3_addr, int pop3_port,
|
||
const char* user, const char* pass,
|
||
const char* recipients, net_store_callback* callback,
|
||
bool store /* = false */)
|
||
: smtp_addr_(smtp_addr)
|
||
, smtp_port_(smtp_port)
|
||
, pop3_addr_(pop3_addr)
|
||
, pop3_port_(pop3_port)
|
||
, user_(user)
|
||
, pass_(pass)
|
||
, recipients_(recipients)
|
||
, callback_(callback)
|
||
, store_(store)
|
||
{
|
||
|
||
}
|
||
|
||
net_store::~net_store()
|
||
{
|
||
|
||
}
|
||
|
||
//////////////////////////////////////////////////////////////////////////
|
||
|
||
bool create_option_tbl(acl::db_handle& db, const char* tbl_name,
|
||
const char* sql_create)
|
||
{
|
||
if (db.tbl_exists(tbl_name))
|
||
{
|
||
logger("table(%s) exist", tbl_name);
|
||
return (true);
|
||
}
|
||
else if (db.sql_update(sql_create) == false)
|
||
{
|
||
logger_error("sql(%s) error", sql_create);
|
||
return (false);
|
||
}
|
||
else
|
||
{
|
||
logger("create table %s ok", tbl_name);
|
||
return (true);
|
||
}
|
||
}
|
||
|
||
//////////////////////////////////////////////////////////////////////////
|
||
|
||
static const char* CREATE_OPT_TBL =
|
||
"create table option_tbl"
|
||
"(\r\n"
|
||
"name varchar(128) not null default '',\r\n"
|
||
"value varchar(256) not null default '',\r\n"
|
||
"PRIMARY KEY(name)"
|
||
")";
|
||
|
||
static acl::db_handle* open_option_tbl()
|
||
{
|
||
const char* path = global::get_instance().get_path();
|
||
acl::string dbpath;
|
||
dbpath.format("%s/net_store.db", path);
|
||
|
||
acl::db_handle* db = new acl::db_sqlite(dbpath.c_str());
|
||
if (db->open() == false)
|
||
{
|
||
logger_error("open db: %s failed", dbpath.c_str());
|
||
delete db;
|
||
return NULL;
|
||
}
|
||
else if (create_option_tbl(*db, "option_tbl", CREATE_OPT_TBL) == false)
|
||
{
|
||
delete db;
|
||
return NULL;
|
||
}
|
||
else
|
||
return db;
|
||
}
|
||
|
||
bool net_store::get_key(const char* name, acl::string& out)
|
||
{
|
||
acl::db_handle* db = open_option_tbl();
|
||
if (db == NULL)
|
||
return false;
|
||
acl::string sql;
|
||
sql.format("select value from option_tbl where name='%s'", name);
|
||
if (db->sql_select(sql.c_str()) == false)
|
||
{
|
||
delete db;
|
||
return false;
|
||
}
|
||
|
||
const acl::db_row* row = db->get_first_row();
|
||
if (row == NULL)
|
||
{
|
||
delete db;
|
||
return false;
|
||
}
|
||
const char* value = (*row)["value"];
|
||
if (value == NULL)
|
||
{
|
||
db->free_result();
|
||
delete db;
|
||
return false;
|
||
}
|
||
out = value;
|
||
return true;
|
||
}
|
||
|
||
bool net_store::set_key(const char* name, const char* value)
|
||
{
|
||
acl::db_handle* db = open_option_tbl();
|
||
if (db == NULL)
|
||
return false;
|
||
|
||
acl::string sql;
|
||
sql.format("insert into option_tbl(name, value) values('%s', '%s')",
|
||
name, value);
|
||
if (db->sql_update(sql.c_str()) == false)
|
||
{
|
||
sql.format("update option_tbl set value='%s' where name='%s'",
|
||
value, name);
|
||
db->sql_update(sql.c_str());
|
||
delete db;
|
||
return false;
|
||
}
|
||
else
|
||
{
|
||
delete db;
|
||
return true;
|
||
}
|
||
}
|
||
|
||
//////////////////////////////////////////////////////////////////////////
|
||
// <20><><EFBFBD>߳<EFBFBD><DFB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
|
||
void net_store::rpc_onover()
|
||
{
|
||
callback_->load_db_callback(smtp_addr_.c_str(), smtp_port_,
|
||
pop3_addr_.c_str(), pop3_port_, user_.c_str(),
|
||
pass_.c_str(), recipients_.c_str(), store_);
|
||
|
||
delete this;
|
||
}
|
||
|
||
//////////////////////////////////////////////////////////////////////////
|
||
// <20><><EFBFBD>߳<EFBFBD><DFB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
|
||
static const char* CREATE_MAIL_TBL =
|
||
"create table mail_tbl\r\n"
|
||
"(\r\n"
|
||
"smtp_addr varchar(128) not null,\r\n"
|
||
"smtp_port int not null,\r\n"
|
||
"pop3_addr varchar(128) not null default '',\r\n"
|
||
"pop3_port int not null,\r\n"
|
||
"user varchar(128) not null default '',\r\n"
|
||
"pass varchar(128) not null default '',\r\n"
|
||
"recipients varchar(256) not null default '',\r\n"
|
||
"PRIMARY KEY(user)"
|
||
")";
|
||
|
||
void net_store::rpc_run()
|
||
{
|
||
const char* path = global::get_instance().get_path();
|
||
dbpath_.format("%s/net_store.db", path);
|
||
|
||
acl::db_sqlite db(dbpath_.c_str());
|
||
if (db.open() == false)
|
||
logger_error("open db: %s failed", dbpath_.c_str());
|
||
else if (create_mail_tbl(db, "mail_tbl", CREATE_MAIL_TBL) == false)
|
||
logger_error("create table failed for %s", dbpath_.c_str());
|
||
else if (store_)
|
||
save_mail_db(db);
|
||
else
|
||
load_mail_db(db);
|
||
}
|
||
|
||
bool net_store::create_mail_tbl(acl::db_handle& db, const char* tbl_name,
|
||
const char* sql_create)
|
||
{
|
||
if (db.tbl_exists(tbl_name))
|
||
{
|
||
logger("table(%s) exist", tbl_name);
|
||
return (true);
|
||
}
|
||
else if (db.sql_update(sql_create) == false)
|
||
{
|
||
logger_error("sql(%s) error", sql_create);
|
||
return (false);
|
||
}
|
||
else
|
||
{
|
||
save_mail_db(db);
|
||
logger("create table %s ok", tbl_name);
|
||
return (true);
|
||
}
|
||
}
|
||
|
||
void net_store::save_mail_db(acl::db_handle& db)
|
||
{
|
||
acl::string sql;
|
||
|
||
// <20><>ɾ<EFBFBD><C9BE>ԭ<EFBFBD><D4AD><EFBFBD><EFBFBD><EFBFBD>еļ<D0B5>¼
|
||
sql.format("delete from mail_tbl");
|
||
db.sql_update(sql.c_str());
|
||
|
||
acl::string smtp_addr, pop3_addr, user, pass, recipients;
|
||
db.escape_string(smtp_addr_.c_str(), smtp_addr_.length(), smtp_addr);
|
||
db.escape_string(pop3_addr_.c_str(), pop3_addr_.length(), pop3_addr);
|
||
db.escape_string(user_.c_str(), user_.length(), user);
|
||
db.escape_string(pass_.c_str(), pass_.length(), pass);
|
||
|
||
ACL_ARGV* tokens = acl_argv_split(recipients_.c_str(), "\t,;\r\n");
|
||
ACL_ITER iter;
|
||
acl::string buf;
|
||
acl_foreach(iter, tokens)
|
||
{
|
||
if (iter.i > 0)
|
||
buf << ",";
|
||
buf << (char*) iter.data;
|
||
}
|
||
acl_argv_free(tokens);
|
||
db.escape_string(buf.c_str(), recipients_.length(), recipients);
|
||
|
||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD>ܴ洢
|
||
char* pass_crypted = passwd_crypt(pass.c_str());
|
||
sql.format("insert into mail_tbl(smtp_addr, smtp_port, pop3_addr,"
|
||
" pop3_port, user, pass, recipients)"
|
||
" values('%s', %d, '%s', %d, '%s', '%s', '%s')",
|
||
smtp_addr.c_str(), smtp_port_, pop3_addr.c_str(), pop3_port_,
|
||
user.c_str(), pass_crypted, recipients.c_str());
|
||
acl_myfree(pass_crypted);
|
||
|
||
const char* ptr = sql.c_str();
|
||
ptr = pop3_addr.c_str();
|
||
|
||
if (db.sql_update(sql.c_str()) == false)
|
||
logger_error("sql(%s) error", sql.c_str());
|
||
}
|
||
|
||
void net_store::load_mail_db(acl::db_handle& db)
|
||
{
|
||
acl::string sql;
|
||
sql.format("select smtp_addr, smtp_port, pop3_addr, pop3_port, user, pass, recipients from mail_tbl");
|
||
if (db.sql_select(sql.c_str()) == false)
|
||
{
|
||
logger_error("sql(%s) error", sql.c_str());
|
||
return;
|
||
}
|
||
|
||
const acl::db_row* first_row = db.get_first_row();
|
||
if (first_row == NULL)
|
||
return;
|
||
const char* ptr = (*first_row)["smtp_addr"];
|
||
if (ptr)
|
||
smtp_addr_ = ptr;
|
||
ptr = (*first_row)["smtp_port"];
|
||
|
||
int n;
|
||
if (ptr && (n = atoi(ptr)) > 0)
|
||
smtp_port_ = n;
|
||
|
||
ptr = (*first_row)["pop3_addr"];
|
||
if (ptr)
|
||
pop3_addr_ = ptr;
|
||
|
||
ptr = (*first_row)["pop3_port"];
|
||
if (ptr && (n = atoi(ptr)) > 0)
|
||
pop3_port_ = n;
|
||
|
||
ptr = (*first_row)["user"];
|
||
if (ptr)
|
||
user_ = ptr;
|
||
|
||
ptr = (*first_row)["pass"];
|
||
if (ptr)
|
||
{
|
||
// <20>Լ<EFBFBD><D4BC>ܵ<EFBFBD><DCB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD>Ƚ<EFBFBD><C8BD><EFBFBD>
|
||
char* pass_plain = passwd_decrypt(ptr);
|
||
if (pass_plain)
|
||
{
|
||
pass_ = pass_plain;
|
||
acl_myfree(pass_plain);
|
||
}
|
||
}
|
||
|
||
ptr = (*first_row)["recipients"];
|
||
if (ptr)
|
||
recipients_ = ptr;
|
||
} |