fix
[opensuse:yast-rest-service.git] / plugins / administrator / package / webyastAdministratorService.rb
1 #!/usr/bin/env ruby
2
3 require 'rubygems'
4 require 'dbus'
5 require 'etc'
6 require 'polkit'
7
8 # Choose the bus (could also be DBus::session_bus, which is not suitable for a system service)
9 bus = DBus::system_bus
10 # Define the service name
11 service = bus.request_service("webyast.administrator.service")
12
13 class WebyastAdministratorService < DBus::Object
14
15   # overriding DBus::Object#dispatch
16   # It is needed because dispatch sent just parameters and without sender it is
17   # imposible to check permissions of sender. So to avoid it add as last
18   # parameter sender id.
19   def dispatch(msg)
20     msg.params << msg.sender
21     super(msg)
22   end
23
24   def log(msg)
25     f = File.new("/srv/www/yastws/log/administrator_service.log","a",0600)
26     f.write(msg+"\n")
27     f.close
28   end
29
30   # Create an interface.
31   dbus_interface "webyast.administrator.Interface" do
32     dbus_method :write, "out result:s, in password:s" do |password,sender|
33       log "Trying to save password"
34
35       return ["NOPERM"] unless check_polkit sender
36       result = ""
37
38       f = File.new("/tmp/pw","a",0600)
39       f.write(password)
40       f.close
41         
42       `cat "/tmp/pw" | passwd --stdin -q; rm /tmp/pw`
43
44       log "Root password changed"
45
46       [result]
47     end
48   end
49
50   PERMISSION="org.opensuse.yast.modules.yapi.administrator.write"
51   def check_polkit(sender)
52     uid = DBus::SystemBus.instance.proxy.GetConnectionUnixUser(sender)[0]
53     user = Etc.getpwuid(uid).name
54     begin
55       return PolKit.polkit_check(PERMISSION, user) == :yes
56     rescue Exception => e
57       return false
58     end
59   end
60 end
61
62 # Set the object path
63 obj = WebyastAdministratorService.new("/webyast/administrator/Interface")
64 # Export it!
65 service.export(obj)
66
67 # Now listen to incoming requests
68 main = DBus::Main.new
69 main << bus
70 main.run