From: Arvin Schnell Date: Thu, 2 Aug 2012 13:06:51 +0000 (+0200) Subject: - work on dbus interface X-Git-Tag: v0.1.3~177 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=fd358f5bc25641fb7e8b46045c0348a0ac4c5ee7;p=thirdparty%2Fsnapper.git - work on dbus interface --- diff --git a/client/snapper.cc b/client/snapper.cc index 6542a950..8a128f7f 100644 --- a/client/snapper.cc +++ b/client/snapper.cc @@ -1201,6 +1201,8 @@ main(int argc, char** argv) cerr << _("Config is locked.") << endl; else if (name == "error.config_in_use") cerr << _("Config is in use.") << endl; + else if (name == "error.unknown_file_use") + cerr << _("Unknown file.") << endl; else cerr << _("Failure") << " (" << name << ")." << endl; exit(EXIT_FAILURE); diff --git a/server/Client.h b/server/Client.h index 10ccf53d..2b925b10 100644 --- a/server/Client.h +++ b/server/Client.h @@ -42,6 +42,9 @@ using namespace std; using namespace snapper; +class MetaSnapper; + + struct NoComparison : public std::exception { explicit NoComparison() throw() {} @@ -55,6 +58,12 @@ public: static void introspect(DBus::Connection& conn, DBus::Message& msg); + void check_permission(DBus::Connection& conn, DBus::Message& msg) const; + void check_permission(DBus::Connection& conn, DBus::Message& msg, + const MetaSnapper& meta_snapper) const; + void check_lock(DBus::Connection& conn, DBus::Message& msg, const string& config_name) const; + void check_in_use(const MetaSnapper& meta_snapper) const; + void signal_config_created(DBus::Connection& conn, const string& config_name); void signal_config_deleted(DBus::Connection& conn, const string& config_name); void signal_snapshot_created(DBus::Connection& conn, const string& config_name, diff --git a/server/snapperd.cc b/server/snapperd.cc index 643e0547..31a0299f 100644 --- a/server/snapperd.cc +++ b/server/snapperd.cc @@ -253,7 +253,7 @@ struct Permissions : public std::exception void -check_permission(DBus::Connection& conn, DBus::Message& msg) +Client::check_permission(DBus::Connection& conn, DBus::Message& msg) const { unsigned long uid = conn.get_unix_userid(msg); if (uid == 0) @@ -264,7 +264,8 @@ check_permission(DBus::Connection& conn, DBus::Message& msg) void -check_permission(DBus::Connection& conn, DBus::Message& msg, const MetaSnapper& meta_snapper) +Client::check_permission(DBus::Connection& conn, DBus::Message& msg, + const MetaSnapper& meta_snapper) const { unsigned long uid = conn.get_unix_userid(msg); if (uid == 0) @@ -285,11 +286,11 @@ struct Lock : public std::exception void -check_lock(DBus::Connection& conn, DBus::Message& msg, const string& config_name) +Client::check_lock(DBus::Connection& conn, DBus::Message& msg, const string& config_name) const { for (Clients::const_iterator it = clients.begin(); it != clients.end(); ++it) { - if (it->zombie || it->name == msg.get_sender()) + if (it->zombie || &*it == this) continue; if (it->has_lock(config_name)) @@ -306,7 +307,7 @@ struct InUse : public std::exception void -check_in_use(const MetaSnapper& meta_snapper) +Client::check_in_use(const MetaSnapper& meta_snapper) const { if (meta_snapper.use_count() != 0) throw InUse(); @@ -363,6 +364,13 @@ Client::signal_snapshots_deleted(DBus::Connection& conn, const string& config_na } +struct UnknownFile : public std::exception +{ + explicit UnknownFile() throw() {} + virtual const char* what() const throw() { return "unknown config"; } +}; + + void Client::list_configs(DBus::Connection& conn, DBus::Message& msg) { @@ -946,7 +954,8 @@ Client::get_diff(DBus::Connection& conn, DBus::Message& msg) Files& files = comparison->getFiles(); Files::iterator it3 = files.find(filename); - assert(it3 != files.end()); + if (it3 == files.end()) + throw UnknownFile(); lock.unlock(); @@ -988,8 +997,10 @@ Client::set_undo(DBus::Connection& conn, DBus::Message& msg) for (list::const_iterator it2 = undos.begin(); it2 != undos.end(); ++it2) { Files::iterator it3 = files.find(it2->filename); - if (it3 != files.end()) - it3->setUndo(it2->undo); + if (it3 == files.end()) + throw UnknownFile(); + + it3->setUndo(it2->undo); } DBus::MessageMethodReturn reply(msg); @@ -1248,6 +1259,11 @@ Client::dispatch(DBus::Connection& conn, DBus::Message& msg) DBus::MessageError reply(msg, "error.illegal_snapshot", DBUS_ERROR_FAILED); conn.send(reply); } + catch (const UnknownFile& e) + { + DBus::MessageError reply(msg, "error.unknown_file", DBUS_ERROR_FAILED); + conn.send(reply); + } catch (const InvalidUserdataException& e) { DBus::MessageError reply(msg, "error.invalid_userdata", DBUS_ERROR_FAILED);