source: lliurex-apt/trunk/fuentes/src/Backend.cpp @ 923

Last change on this file since 923 was 923, checked in by mabarracus, 3 years ago

Imported trusty code

File size: 3.1 KB
Line 
1
2#include <iostream>
3#include <fstream>
4#include <string>
5#include <stdexcept>
6#include <sstream>
7
8#include <giomm.h>
9#include <glibmm.h>
10
11using namespace std;
12
13
14
15int main(int argc,char * argv[])
16{
17
18        if(argc<3)
19        {
20                throw runtime_error("No enough parameters");
21        }
22       
23        string source(argv[1]);
24        string destination(argv[2]);
25       
26
27
28        Glib::init();
29        Gio::init();
30
31        Glib::RefPtr<Gio::DBus::Connection> connection = Gio::DBus::Connection::get_sync(Gio::DBus::BUS_TYPE_SYSTEM);
32       
33        if(!connection)
34        {
35                throw runtime_error("Failed to connect to system bus");
36        }
37       
38        Glib::RefPtr<Gio::DBus::Proxy> proxy;
39       
40        proxy = Gio::DBus::Proxy::create_sync(connection, "org.freedesktop.PolicyKit1",
41"/org/freedesktop/PolicyKit1/Authority", "org.freedesktop.PolicyKit1.Authority");
42
43
44        try
45        {
46                //parameters
47                vector<Glib::VariantBase>  parameters;
48               
49                //subject
50                vector<Glib::VariantBase>  subject;
51               
52               
53                Glib::Variant<Glib::ustring> kind=Glib::Variant<Glib::ustring>::create("unix-process");
54                map<Glib::ustring,Glib::VariantBase> kind_details;
55               
56                kind_details["pid"]=Glib::Variant<guint32>::create(getppid()); //parent process id
57                kind_details["start-time"]=Glib::Variant<guint64>::create(0);
58               
59                subject.push_back(kind);
60                subject.push_back(Glib::Variant<map<Glib::ustring,Glib::VariantBase>>::create(kind_details));
61               
62               
63                parameters.push_back(Glib::VariantContainerBase::create_tuple(subject));               
64               
65               
66                //action id
67                Glib::Variant<Glib::ustring> action_id=Glib::Variant<Glib::ustring>::create("net.lliurex.apt.write-sources-list");
68               
69                parameters.push_back(action_id);
70               
71                //details
72                map<Glib::ustring,Glib::ustring> details;
73
74                parameters.push_back(Glib::Variant<map<Glib::ustring,Glib::ustring>>::create(details));
75               
76                //flags
77                Glib::Variant<guint32 > flags=Glib::Variant<guint32 >::create(1);
78               
79                parameters.push_back(flags);
80
81                //cancellation_id
82                Glib::Variant<Glib::ustring > cancellation_id=Glib::Variant<Glib::ustring>::create("");
83               
84                parameters.push_back(cancellation_id);
85               
86                               
87                Glib::VariantContainerBase param_container = Glib::VariantContainerBase::create_tuple(parameters);
88               
89                //sync call, 60 seconds timeout
90               
91                Glib::VariantContainerBase ret_base=proxy->call_sync("CheckAuthorization",param_container,60000);
92                Glib::VariantContainerBase ret;
93
94               
95                ret_base.get_child(ret,0);
96
97               
98                Glib::Variant<bool> is_authorized;
99                Glib::Variant<bool> is_challenged;
100
101                ret.get_child(is_authorized,0);
102                ret.get_child(is_challenged,1);
103                       
104               
105                if(is_authorized.get())
106                {
107                        cout<<"Authorization success!"<<endl;
108                       
109                        Glib::RefPtr<Gio::File> fsource;
110                        Glib::RefPtr<Gio::File> fdestination;
111                       
112                        fsource=Gio::File::create_for_path(source);
113                        fdestination=Gio::File::create_for_path(destination);
114                       
115                        fsource->copy(fdestination,Gio::FILE_COPY_OVERWRITE);
116                       
117                }
118                else
119                {
120                        throw runtime_error("Authorization failed");
121                }
122               
123               
124        }
125        catch(Gio::DBus::Error e)
126        {
127                cerr<<"Dbus Error: "<<e.code()<<endl;
128                cerr<<e.what()<<endl;
129                std::exit(1);
130        }
131        catch(Gio::Error e)
132        {
133                cerr<<"Error: "<<e.code()<<endl;
134                cerr<<e.what()<<endl;
135                std::exit(1);
136        }
137        catch(runtime_error e)
138        {
139                cerr<<"Error: "<<endl;
140                cerr<<e.what()<<endl;
141                std::exit(1);
142        }
143       
144        return 0;
145}
Note: See TracBrowser for help on using the repository browser.