/*************************************************************************
* UrBackup - Client/Server backup system
* Copyright (C) 2011 Martin Raiber
*
* 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, either version 3 of the License, or
* (at your option) any later version.
*
* 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, see .
**************************************************************************/
#ifndef CLIENT_ONLY
#include "action_header.h"
#include "../server_settings.h"
#include "../../Interface/SettingsReader.h"
#include "../../urlplugin/IUrlFactory.h"
#include "../../urbackupcommon/os_functions.h"
#include "../../cryptoplugin/ICryptoFactory.h"
#include "../server_get.h"
extern IUrlFactory *url_fak;
extern ICryptoFactory *crypto_fak;
std::vector getMailSettingsList(void)
{
std::vector tmp;
tmp.push_back(L"mail_servername");
tmp.push_back(L"mail_serverport");
tmp.push_back(L"mail_username");
tmp.push_back(L"mail_password");
tmp.push_back(L"mail_from");
tmp.push_back(L"mail_ssl_only");
tmp.push_back(L"mail_check_certificate");
return tmp;
}
JSON::Object getJSONClientSettings(ServerSettings &settings)
{
JSON::Object ret;
ret.set("update_freq_incr", settings.getSettings()->update_freq_incr);
ret.set("update_freq_full", settings.getSettings()->update_freq_full);
ret.set("update_freq_image_full", settings.getSettings()->update_freq_image_full);
ret.set("update_freq_image_incr", settings.getSettings()->update_freq_image_incr);
ret.set("max_file_incr", settings.getSettings()->max_file_incr);
ret.set("min_file_incr", settings.getSettings()->min_file_incr);
ret.set("max_file_full", settings.getSettings()->max_file_full);
ret.set("min_file_full", settings.getSettings()->min_file_full);
ret.set("min_image_incr", settings.getSettings()->min_image_incr);
ret.set("max_image_incr", settings.getSettings()->max_image_incr);
ret.set("min_image_full", settings.getSettings()->min_image_full);
ret.set("max_image_full", settings.getSettings()->max_image_full);
ret.set("allow_overwrite", settings.getSettings()->allow_overwrite);
ret.set("startup_backup_delay", settings.getSettings()->startup_backup_delay);
ret.set("backup_window", settings.getSettings()->backup_window);
ret.set("computername", settings.getSettings()->computername);
ret.set("exclude_files", settings.getSettings()->exclude_files);
ret.set("default_dirs", settings.getSettings()->default_dirs);
ret.set("allow_config_paths", settings.getSettings()->allow_config_paths);
ret.set("allow_starting_file_backups", settings.getSettings()->allow_starting_file_backups);
ret.set("allow_starting_image_backups", settings.getSettings()->allow_starting_image_backups);
ret.set("allow_pause", settings.getSettings()->allow_pause);
ret.set("allow_log_view", settings.getSettings()->allow_log_view);
ret.set("image_letters", settings.getSettings()->image_letters);
return ret;
}
struct SGeneralSettings
{
SGeneralSettings(void): no_images(false), no_file_backups(false), autoshutdown(false), autoupdate_clients(true),
max_sim_backups(10), max_active_clients(100), cleanup_window(L"1-7/3-4"), backup_database(true),
internet_server_port(55415){}
std::wstring backupfolder;
bool no_images;
bool no_file_backups;
bool autoshutdown;
bool autoupdate_clients;
int max_sim_backups;
int max_active_clients;
std::wstring tmpdir;
std::wstring cleanup_window;
bool backup_database;
std::string internet_server;
unsigned short internet_server_port;
};
struct SClientSettings
{
SClientSettings(void) : overwrite(false) {}
bool overwrite;
};
SGeneralSettings getGeneralSettings(IDatabase *db)
{
IQuery *q=db->Prepare("SELECT key, value FROM settings_db.settings WHERE clientid=0");
db_results res=q->Read();
q->Reset();
SGeneralSettings ret;
for(size_t i=0;iConvertToUTF8(value);
else if(key==L"internet_server_port" )
ret.internet_server_port=(unsigned short)watoi(value);
}
return ret;
}
void getMailSettings(JSON::Object &obj, IDatabase *db)
{
std::vector slist=getMailSettingsList();
IQuery *q=db->Prepare("SELECT key, value FROM settings_db.settings WHERE clientid=0 AND key=?");
for(size_t i=0;iBind(slist[i]);
db_results res=q->Read();
q->Reset();
if(!res.empty())
{
obj.set(Server->ConvertToUTF8(slist[i]), res[0][L"value"]);
}
else
{
std::string v="";
if(slist[i]==L"mail_serverport")
v="25";
obj.set(Server->ConvertToUTF8(slist[i]), v);
}
}
}
SClientSettings getClientSettings(IDatabase *db, int clientid)
{
IQuery *q=db->Prepare("SELECT key, value FROM settings_db.settings WHERE clientid=?");
q->Bind(clientid);
db_results res=q->Read();
q->Reset();
SClientSettings ret;
for(size_t i=0;iBind(key);
db_results r_get=q_get->Read();
q_get->Reset();
if(r_get.empty())
{
q_insert->Bind(key);
q_insert->Bind(value);
q_insert->Write();
q_insert->Reset();
}
else if( r_get[0][L"value"]!=value )
{
q_update->Bind(value);
q_update->Bind(key);
q_update->Write();
q_update->Reset();
}
}
void saveGeneralSettings(SGeneralSettings settings, IDatabase *db)
{
IQuery *q_get=db->Prepare("SELECT value FROM settings_db.settings WHERE clientid=0 AND key=?");
IQuery *q_update=db->Prepare("UPDATE settings_db.settings SET value=? WHERE key=? AND clientid=0");
IQuery *q_insert=db->Prepare("INSERT INTO settings_db.settings (key, value, clientid) VALUES (?,?,0)");
updateSetting(L"backupfolder", settings.backupfolder, q_get, q_update, q_insert);
updateSetting(L"no_images", settings.no_images?L"true":L"false", q_get, q_update, q_insert);
updateSetting(L"no_file_backups", settings.no_file_backups?L"true":L"false", q_get, q_update, q_insert);
updateSetting(L"autoshutdown", settings.autoshutdown?L"true":L"false", q_get, q_update, q_insert);
updateSetting(L"autoupdate_clients", settings.autoupdate_clients?L"true":L"false", q_get, q_update, q_insert);
updateSetting(L"max_sim_backups", convert(settings.max_sim_backups), q_get, q_update, q_insert);
updateSetting(L"max_active_clients", convert(settings.max_active_clients), q_get, q_update, q_insert);
updateSetting(L"tmpdir", settings.tmpdir, q_get, q_update, q_insert);
updateSetting(L"cleanup_window", settings.cleanup_window, q_get, q_update, q_insert);
updateSetting(L"backup_database", settings.backup_database?L"true":L"false", q_get, q_update, q_insert);
#ifdef _WIN32
if(!settings.tmpdir.empty())
{
os_create_dir(settings.tmpdir+os_file_sep()+L"urbackup_tmp");
Server->setTemporaryDirectory(settings.tmpdir+os_file_sep()+L"urbackup_tmp");
}
#endif
}
void updateMailSettings(str_map &GET, IDatabase *db)
{
IQuery *q_get=db->Prepare("SELECT value FROM settings_db.settings WHERE clientid=0 AND key=?");
IQuery *q_update=db->Prepare("UPDATE settings_db.settings SET value=? WHERE key=? AND clientid=0");
IQuery *q_insert=db->Prepare("INSERT INTO settings_db.settings (key, value, clientid) VALUES (?,?,0)");
std::vector settings=getMailSettingsList();
for(size_t i=0;isecond, q_get, q_update, q_insert);
}
}
}
void updateInternetSettings(SGeneralSettings settings, IDatabase *db)
{
IQuery *q_get=db->Prepare("SELECT value FROM settings_db.settings WHERE clientid=0 AND key=?");
IQuery *q_update=db->Prepare("UPDATE settings_db.settings SET value=? WHERE key=? AND clientid=0");
IQuery *q_insert=db->Prepare("INSERT INTO settings_db.settings (key, value, clientid) VALUES (?,?,0)");
updateSetting(L"internet_server", Server->ConvertToUnicode(settings.internet_server), q_get, q_update, q_insert);
updateSetting(L"internet_server_port", convert(settings.internet_server_port), q_get, q_update, q_insert);
}
void saveClientSettings(SClientSettings settings, IDatabase *db, int clientid)
{
IQuery *q_get=db->Prepare("SELECT value FROM settings_db.settings WHERE clientid="+nconvert(clientid)+" AND key=?");
IQuery *q_update=db->Prepare("UPDATE settings_db.settings SET value=? WHERE key=? AND clientid="+nconvert(clientid));
IQuery *q_insert=db->Prepare("INSERT INTO settings_db.settings (key, value, clientid) VALUES (?,?,"+nconvert(clientid)+")");
updateSetting(L"overwrite", settings.overwrite?L"true":L"false", q_get, q_update, q_insert);
}
void updateClientSettings(int t_clientid, str_map &GET, IDatabase *db)
{
IQuery *q_get=db->Prepare("SELECT value FROM settings_db.settings WHERE key=? AND clientid=?");
IQuery *q_update=db->Prepare("UPDATE settings_db.settings SET value=? WHERE key=? AND clientid=?");
IQuery *q_insert=db->Prepare("INSERT INTO settings_db.settings (key, value, clientid) VALUES (?,?,?)");
std::vector sset=getSettingsList();
sset.push_back(L"allow_overwrite");
for(size_t i=0;iBind(sset[i]);
q_get->Bind(t_clientid);
db_results res=q_get->Read();
q_get->Reset();
if(!res.empty())
{
q_update->Bind(it->second);
q_update->Bind(sset[i]);
q_update->Bind(t_clientid);
q_update->Write();
q_update->Reset();
}
else
{
q_insert->Bind(sset[i]);
q_insert->Bind(it->second);
q_insert->Bind(t_clientid);
q_insert->Write();
q_insert->Reset();
}
}
}
}
void updateRights(int t_userid, std::string s_rights, IDatabase *db)
{
str_map rights;
ParseParamStr(s_rights, &rights);
IQuery *q_del=db->Prepare("DELETE FROM settings_db.si_permissions WHERE clientid=?");
q_del->Bind(t_userid);
q_del->Write();
q_del->Reset();
str_map::iterator idx=rights.find(L"idx");
if(idx!=rights.end())
{
std::vector elms;
Tokenize(idx->second, elms, L",");
if(!elms.empty())
{
IQuery *q_insert=db->Prepare("INSERT INTO settings_db.si_permissions (t_domain, t_right, clientid) VALUES (?,?,?)");
for(size_t i=0;iBind(it_domain->second);
q_insert->Bind(it_right->second);
q_insert->Bind(t_userid);
q_insert->Write();
q_insert->Reset();
}
}
}
}
}
ACTION_IMPL(settings)
{
Helper helper(tid, &GET, &PARAMS);
JSON::Object ret;
SUser *session=helper.getSession();
if(session!=NULL && session->id==-1) return;
std::wstring sa=GET[L"sa"];
int t_clientid=watoi(GET[L"t_clientid"]);
std::string rights=helper.getRights("settings");
std::vector clientid;
IDatabase *db=helper.getDatabase();
if(rights!="all" && rights!="none" )
{
std::vector s_clientid;
Tokenize(rights, s_clientid, ",");
for(size_t i=0;iPrepare("SELECT id,name FROM clients");
db_results res=q->Read();
q->Reset();
for(size_t i=0;iPrepare("SELECT name FROM clients WHERE id=?");
for(size_t i=0;iBind(clientid[i]);
db_results res=q->Read();
q->Reset();
JSON::Object u;
u.set("id", clientid[i]);
u.set("name", res[0][L"name"]);
clients.add(u);
}
}
navitems.set("clients", clients);
if(helper.getRights("general_settings")=="all" )
{
navitems.set("general", true);
}
ret.set("navitems", navitems);
}
if(sa==L"clientsettings" || sa==L"clientsettings_save")
{
bool r_ok=false;
if(rights=="all")
{
r_ok=true;
}
else
{
for(size_t i=0;iPrepare("SELECT id FROM settings_db.si_users WHERE name=?");
q_find->Bind(name);
db_results res=q_find->Read();
q_find->Reset();
if(res.empty())
{
IQuery *q=db->Prepare("INSERT INTO settings_db.si_users (name, password_md5, salt) VALUES (?,?,?)");
q->Bind(name);
q->Bind(pwmd5);
q->Bind(salt);
q->Write();
q->Reset();
ret.set("add_ok", true);
int t_userid=(int)db->getLastInsertID();
std::string s_rights=Server->ConvertToUTF8(GET[L"rights"]);
updateRights(t_userid, s_rights, db);
}
else
{
ret.set("alread_exists", true);
}
sa=L"listusers";
}
if(sa==L"changepw" && helper.getRights("usermod")=="all")
{
std::wstring salt=GET[L"salt"];
std::wstring pwmd5=GET[L"pwmd5"];
int t_userid=watoi(GET[L"userid"]);
IQuery *q=db->Prepare("UPDATE settings_db.si_users SET salt=?, password_md5=? WHERE id=?");
q->Bind(salt);
q->Bind(pwmd5);
q->Bind(t_userid);
q->Write();
q->Reset();
ret.set("change_ok", true);
sa=L"listusers";
}
if(sa==L"updaterights" && helper.getRights("usermod")=="all")
{
int t_userid=watoi(GET[L"userid"]);
std::string s_rights=Server->ConvertToUTF8(GET[L"rights"]);
updateRights(t_userid, s_rights, db);
sa=L"listusers";
ret.set("update_right", true);
}
if(sa==L"removeuser" && helper.getRights("usermod")=="all")
{
int userid=watoi(GET[L"userid"]);
IQuery *q=db->Prepare("DELETE FROM settings_db.si_users WHERE id=?");
q->Bind(userid);
q->Write();
q->Reset();
ret.set("removeuser", true);
sa=L"listusers";
}
if(sa==L"listusers" && helper.getRights("usermod")=="all" )
{
IQuery *q=db->Prepare("SELECT id,name FROM settings_db.si_users");
db_results res=q->Read();
q->Reset();
q=db->Prepare("SELECT t_right, t_domain FROM settings_db.si_permissions WHERE clientid=?");
JSON::Array users;
for(size_t i=0;iBind(res[i][L"id"]);
db_results res_r=q->Read();
q->Reset();
JSON::Array rights;
for(size_t j=0;j");
#endif //_WIN32
ret.set("settings", obj);
}
}
if(sa==L"mail_save" && helper.getRights("mail_settings")=="all")
{
updateMailSettings(GET, db);
ret.set("saved_ok", true);
std::wstring testmailaddr=GET[L"testmailaddr"];
if(!testmailaddr.empty())
{
MailServer mail_server=BackupServerGet::getMailServerSettings();
if(url_fak!=NULL)
{
std::vector to;
to.push_back(Server->ConvertToUTF8(testmailaddr));
std::string errmsg;
bool b=url_fak->sendMail(mail_server, to, "UrBackup mail test", "This is a test mail from UrBackup", &errmsg);
if(!b)
{
ret.set("mail_test", errmsg);
}
else
{
ret.set("mail_test", "ok");
}
}
else
{
ret.set("mail_test", "Mail module not loaded");
}
}
sa=L"mail";
}
if( sa==L"mail" && helper.getRights("mail_settings")=="all")
{
JSON::Object obj;
getMailSettings(obj, db);
ret.set("settings", obj);
ret.set("sa", sa);
}
if( sa==L"internet_save" && helper.getRights("internet_save")=="all" )
{
SGeneralSettings settings;
settings.internet_server=Server->ConvertToUTF8(GET[L"internet_server"] );
settings.internet_server_port=watoi(GET[L"internet_server_port"]);
updateInternetSettings(settings, db);
ret.set("saved_ok", true);
sa=L"internet";
}
if( sa==L"internet" && helper.getRights("internet_settings")=="all")
{
JSON::Object obj;
SGeneralSettings settings=getGeneralSettings(db);
obj.set("internet_server", settings.internet_server);
obj.set("internet_server_port", settings.internet_server_port);
ret.set("settings", obj);
ret.set("sa", sa);
}
}
else
{
ret.set("error", 1);
}
#ifdef _WIN32
ret.set("ONLY_WIN32_BEGIN", "");
ret.set("ONLY_WIN32_END", "");
#else
ret.set("ONLY_WIN32_BEGIN", "");
#endif
helper.Write(ret.get(false));
}
#endif //CLIENT_ONLY