[api] do not allow user registration, when LDAP is used
[opensuse:build-service.git] / src / api / app / controllers / person_controller.rb
1 #require "rexml/document"
2
3 class PersonController < ApplicationController
4
5   def userinfo
6     if !@http_user
7       logger.debug "No user logged in, permission to userinfo denied"
8       @errorcode = 401
9       @summary = "No user logged in, permission to userinfo denied"
10       render :template => 'error', :status => 401
11     else
12       if request.get?
13         with_watchlist = false
14         if params[:login]
15           login = URI.unescape( params[:login] )
16           logger.debug "Generating for user from parameter #{login}"
17           @render_user = User.find_by_login( login )
18           if @render_user.blank?
19             logger.debug "User is not valid!"
20             render_error :status => 404, :errorcode => 'unknown_user',
21               :message => "Unknown user: #{login}"
22             return
23           end
24         else 
25           logger.debug "Generating user info for logged in user #{@http_user.login}"
26           @render_user = @http_user
27         end
28         if @http_user.is_admin? or @http_user == @render_user
29           with_watchlist = true
30         end
31         render :text => @render_user.render_axml( with_watchlist ), :content_type => "text/xml"
32       elsif request.put?
33         user = @http_user
34       
35         if user 
36           if params[:login]
37             login = URI.unescape( params[:login] )
38             user = User.find_by_login( login )
39             if user and user.login != @http_user.login 
40               # TODO: check permission to update someone elses info
41               if @http_user.is_admin?
42                 # ok, may update user info
43               else
44                 logger.debug "User has no permission to change userinfo"
45                 render_error :status => 403, :errorcode => 'change_userinfo_no_permission',
46                   :message => "no permission to change userinfo for user #{user.login}"
47                 return
48               end
49             end
50             if !user and @http_user.is_admin?
51               user = User.create( 
52                      :login => login,
53                      :password => "notset",
54                      :password_confirmation => "notset",
55                      :email => "TEMP" )
56               user.state = "locked"
57             end
58           end
59         
60           xml = REXML::Document.new( request.raw_post )
61
62           logger.debug( "XML: #{request.raw_post}" )
63
64           user.email = xml.elements["/person/email"].text
65           user.realname = xml.elements["/person/realname"].text
66
67           update_watchlist( user, xml )
68
69           user.save!
70           render_ok
71         end
72       end
73     end
74   
75   end
76
77   def register
78     if defined?( LDAP_MODE ) && LDAP_MODE == :on
79       render_error :message => "LDAP mode enabled, users can only be registered via LDAP", :errorcode => "err_register_save", :status => 400
80       return
81     end
82
83     xml = REXML::Document.new( request.raw_post )
84     
85     logger.debug( "register XML: #{request.raw_post}" )
86
87     login = xml.elements["/unregisteredperson/login"].text
88     logger.debug("Found login #{login}")
89     realname = xml.elements["/unregisteredperson/realname"].text
90     email = xml.elements["/unregisteredperson/email"].text
91     status = xml.elements["/unregisteredperson/state"].text
92     password = xml.elements["/unregisteredperson/password"].text
93     note = xml.elements["/unregisteredperson/note"].text
94
95     if auth_method == :ichain
96       if request.env['HTTP_X_USERNAME'].blank?
97         render_error :message => "Missing iChain header", :errorcode => "err_register_save", :status => 400
98         return
99       end
100       login = request.env['HTTP_X_USERNAME']
101       email = request.env['HTTP_X_EMAIL'] unless request.env['HTTP_X_EMAIL'].blank?
102       realname = request.env['HTTP_X_FIRSTNAME'] + " " + request.env['HTTP_X_LASTNAME'] unless request.env['HTTP_X_LASTNAME'].blank?
103     end
104
105     newuser = User.create( 
106               :login => login,
107               :password => password,
108               :password_confirmation => password,
109               :email => email )
110
111     newuser.realname = realname
112     newuser.state = status
113     newuser.adminnote = note
114     logger.debug("Saving...")
115     newuser.save
116     
117     if !newuser.errors.empty?
118       details = newuser.errors.map{ |key, msg| "#{key}: #{msg}" }.join(", ")
119       
120       render_error :message => "Could not save the registration",
121                    :errorcode => "err_register_save",
122                    :details => details, :status => 400
123     else
124       # create subscription for submit requests
125       if Object.const_defined? :Hermes
126         h = Hermes.new
127         h.add_user(login, email)
128         h.add_request_subscription(login)
129       end
130
131       IchainNotifier.deliver_approval(newuser)
132       render_ok
133     end
134   end
135   
136   def update_watchlist( user, xml )
137     new_watchlist = []
138     old_watchlist = []
139
140     xml.elements.each("/person/watchlist/project") do |e|
141       new_watchlist << e.attributes['name']
142     end
143
144     user.watched_projects.each do |wp|
145       old_watchlist << wp.name
146     end
147     add_to_watchlist = new_watchlist.collect {|i| old_watchlist.include?(i) ? nil : i}.compact
148     remove_from_watchlist = old_watchlist.collect {|i| new_watchlist.include?(i) ? nil : i}.compact
149
150     remove_from_watchlist.each do |name|
151       WatchedProject.find_by_name( name, :conditions => [ 'bs_user_id = ?', user.id ] ).destroy
152     end
153
154     add_to_watchlist.each do |name|
155       user.watched_projects << WatchedProject.new( :name => name )
156     end
157     true
158   end
159 end