merged cont.
[opensuse:yast-rest-service.git] / webyast / app / controllers / permissions_controller.rb
1 #--
2 # Webyast Webservice framework
3 #
4 # Copyright (C) 2009, 2010 Novell, Inc. 
5 #   This library is free software; you can redistribute it and/or modify
6 # it only under the terms of version 2.1 of the GNU Lesser General Public
7 # License as published by the Free Software Foundation. 
8 #
9 #   This library is distributed in the hope that it will be useful, but WITHOUT
10 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
11 # FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more 
12 # details. 
13 #
14 #   You should have received a copy of the GNU Lesser General Public
15 # License along with this library; if not, write to the Free Software 
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17 #++
18
19
20 #
21 # Configure PolicyKit permissions for a user
22 #
23
24 class PermissionsController < ApplicationController
25
26   before_filter :login_required
27
28   # before filter is called even when the action is cached
29   before_filter :check_perms, :cache_valid, :only => :show
30
31   # modify the cache path so it includes also the filter and user name parameters
32   caches_action :show, :cache_path => Proc.new { |controller|
33       ret = controller.controller_path
34       unless controller.params[:user_id].blank?
35         ret = ret + '/' + controller.params[:user_id]
36       end
37       unless controller.params[:filter].blank?
38         ret = ret + '/' + controller.params[:filter]
39       end
40       if controller.params[:with_description]
41         ret = ret + '/with_description'
42       end
43       Rails.logger.info "Using cache path: #{ret}"
44       ret
45   }
46
47   CACHE_ID = 'permissions:timestamp'
48
49   def initialize
50     @permissions = []
51   end
52   
53   private
54   
55   #
56   # check if logged in user requests his own stuff
57   #
58   def user_self( params )
59     !params[:user_id].blank? && (params[:user_id] == self.current_account.login)
60   end
61
62   def check_perms
63     unless user_self(params)
64       permission_check "org.opensuse.yast.permissions.read"
65     end
66   end
67
68   def get_cache_timestamp
69     lst = [
70       # the global config file
71       File.mtime('/etc/PolicyKit/PolicyKit.conf'),
72       # policies
73       File.mtime('/usr/share/PolicyKit/policy/'),
74       # explicit user authorizations
75       File.mtime('/var/lib/PolicyKit/'),
76       # default overrides
77       File.mtime('/var/lib/PolicyKit-public/'),
78     ]
79
80     lst.compact!
81
82     lst.max.to_i
83   end
84
85   def cache_valid
86  #cache contain string as it is only object supported by all caching backends
87     cache_timestamp = Rails.cache.read(CACHE_ID).to_i
88     current_timestamp = get_cache_timestamp
89
90     if !cache_timestamp
91         Rails.cache.write(CACHE_ID, current_timestamp.to_s)
92     elsif cache_timestamp < current_timestamp
93         Rails.logger.debug "#### Permissions cache expired"
94         # expire all cached values using a regexp (for all users/filters)
95         expire_fragment(%r{#{controller_path}/.*})
96         Rails.cache.write(CACHE_ID, current_timestamp.to_s)
97     end
98   end
99
100   public
101 #--------------------------------------------------------------------------------
102 #
103 # actions
104 #
105 #--------------------------------------------------------------------------------
106
107   # permissions
108   # GET /permissions/:user_id(.:format)
109
110   def show
111     # note: permission check is done in the check_perms before filter
112     permission = Permission.find(:all,params)
113     respond_to do |format|
114       format.json { render :json => permission.to_json }
115       format.xml { render :xml => permission.to_xml(:root => "permissions") }
116     end
117   end
118
119   # change permissions
120   # PUT /permissions/:id(.:format)
121   # nested within users
122   # PUT /users/:user_id/permissions/:id(.:format)
123
124   def update
125
126   #implementation is wrong so mark as not implemented
127   ret = { :error => "not implemented" }
128     respond_to do |format|
129       format.json { render :json => ret.to_json }
130       format.xml { render :xml => ret.to_xml(:root => "permissions")}
131     end
132
133   end
134
135 end