users/groups: build again from ground up, work in progress
[opensuse:yast-web-client.git] / plugins / users / app / controllers / groups_controller.rb
1 require 'yast/service_resource'
2
3 class GroupsController < ApplicationController
4
5   before_filter :login_required
6   before_filter :load_permissions, :only => [:index,:add,:show]
7   layout 'main'
8
9   # Initialize GetText and Content-Type.
10   init_gettext "yast_webclient_users"
11
12 private
13   def validate_group_id
14     if params[:id].blank?
15       flash[:error] = _('Missing group name parameter')
16       redirect_to :action => :index
17       false
18     else
19       true
20     end
21   end
22
23   def validate_group_params( redirect_action )
24     if params[:group] && (! params[:group].empty?)
25       true
26     else
27       flash[:error] = _('Missing group parameters')
28       redirect_to :action => redirect_action
29       false
30     end
31   end
32
33   def validate_group_name( redirect_action )
34     if params[:group] && params[:group][:cn] =~ /[a-z]+/
35       true
36     else
37       flash[:error] = _('Please enter a valid group name')
38       redirect_to :action => redirect_action
39       false
40     end
41   end
42
43   def validate_group_type( redirect_action )
44     if params[:group] && ["system","local"].include?( params[:group][:type] )
45       true
46     else
47       flash[:error] = _('Please enter a valid group type. Only "system" or "local" are allowed.')
48       redirect_to :action => redirect_action
49       false
50     end
51   end
52
53   def validate_members( redirect_action )
54     member = "[a-z]+"
55     if params[:group] && params[:group][:members] =~ /(#{member}(\.#{member})+)?/
56       true
57     else
58       flash[:error] = _('Please enter a valid list of members')
59       redirect_to :action => redirect_action
60       false
61     end
62   end
63
64   def load_permissions
65     @permissions = Group.permissions
66   end
67
68   def load_user_names
69     begin
70       users = User.find :all
71     rescue ActiveResource::ResourceNotFound => e
72       flash[:error] = _("Cannot read users list.")
73       return
74     end
75     users.collect {|u| u.cn }
76   end
77
78   def load_group
79     begin
80       Group.find params[:id]
81     rescue ActiveResource::ResourceNotFound => e
82       flash[:error] = _("Group named '#{params[:id]}' was not found.")
83       redirect_to :action => :index
84       nil
85     end
86   end
87
88
89 public
90   def index
91     begin
92       @groups = Group.find :all
93     rescue ActiveResource::ResourceNotFound => e
94       flash[:error] = _("Cannot read groups list.")
95       return
96     end
97     return unless @groups
98     @permissions = Group.permissions
99   end
100
101   def add
102     @group = Group.new
103     @permissions = Group.permissions
104
105     # add default properties
106     defaults = {
107       :gid => 0,
108       :old_gid => 0,
109       :default_members => [],
110       :members => [],
111       :type => "local",
112       :cn => ""
113     }
114     @group.load(defaults)
115     @adding = true
116     @user_names = load_user_names
117     render :show
118   end
119
120   def show
121     validate_group_id or return
122     @group = load_group or return
123     @adding = false
124     @user_names = load_user_names
125   end
126
127   def create
128     validate_group_params or return
129     validate_group_name( :add ) or return
130     validate_members( :add ) or return
131     validate_group_type( :add ) or return
132
133     @group = Group.new
134     group = params[:group]
135
136     @group.cn = group[:cn]
137     @group.old_cn = group[:cn]
138     @group.gid = 0              # just a placeholder, new gid will be alocated by yast call
139     @group.default_members = [] # default members cannot be set
140     @group.members = group[:members].split(",")
141     @group.type = group[:type]
142
143     begin
144       if @group.save
145         flash[:message] = _("Group '#{@group.cn}' has been added.")
146       end
147     rescue ActiveResource::ServerError, ActiveResource::ResourceNotFound => ex
148       begin
149         Rails.logger.error "Received error: #{ex.inspect}"
150         err = Hash.from_xml ex.response.body
151
152         if !err['error']['message'].blank?
153           Rails.logger.error "Cannot create group '#{@group.cn}': #{ERB::Util.html_escape err['error']['message']}"
154         end
155
156         flash[:error] = _("Cannot create group '#{@group.cn}'")
157       rescue Exception => e
158         Rails.logger.error "Exception: #{e}"
159         # XML parsing has failed, display complete response
160         flash[:error] = _("Unknown backend error")
161         Rails.logger.error "Unknown backend error: #{ex.response.body}"
162       end
163       redirect_to :action => :add and return
164     end
165
166     redirect_to :action => :index and return
167   end
168
169
170   def update
171     validate_group_id or return
172     validate_group_params( :index ) or return
173     validate_group_name( :index ) or return
174     validate_members( :index ) or return
175     @group = load_group or return
176
177     group = params[:group]
178     @group.cn = group[:cn]
179     @group.gid = group[:gid]
180     @group.members = group[:members].split(",")
181
182     begin
183       if @group.save
184         flash[:message] = _("Group '#{@group.cn}' has been updated.")
185       else
186         if @group.errors.size > 0
187           Rails.logger.error "Group save failed: #{@repo.errors.errors.inspect}"
188           flash[:error] = generate_error_messages @repo, attribute_mapping
189         else
190           flash[:error] = _("Cannot update group '#{group.old_cn}': Unknown error")
191         end
192
193         render :show and return
194       end
195     rescue ActiveResource::ServerError, ActiveResource::ResourceNotFound => ex
196       begin
197         Rails.logger.error "Received ActiveResource::ServerError: #{ex.inspect}"
198         err = Hash.from_xml ex.response.body
199
200         if !err['error']['message'].blank?
201           Rails.logger.error "Cannot update group '#{@group.old_cn}': #{err['error']['message']}"
202         end
203
204         flash[:error] = _("Cannot update group '#{ERB::Util.html_escape @group.old_cn}'}")
205       rescue Exception => e
206           # XML parsing has failed, display complete response
207           flash[:error] = _("Unknown backend error: #{ERB::Util.html_escape ex.response.body}")
208           Rails.logger.error "Unknown backend error: #{ex.response.body}"
209       end
210
211       render :show and return
212     end
213
214     redirect_to :action => :index and return
215   end
216
217   def destroy
218     validate_group_id or return
219     @group = load_group or return
220
221     begin
222       if @group.destroy
223         flash[:message] = _("Group '#{@group.cn}' has been deleted.")
224       end
225     rescue ActiveResource::ResourceNotFound => e
226       flash[:error] = _("Cannot remove group '#{@group.cn}'")
227     end
228
229     redirect_to :action => :index and return
230   end
231 end