diff --git a/doc/api/users.md b/doc/api/users.md index 49afbab8c6a01aaf4370d736d3f5067cfd1ddaee..b9651c19b970f20bc27a90b6803f1e400b7bbb8f 100644 --- a/doc/api/users.md +++ b/doc/api/users.md @@ -87,17 +87,19 @@ POST /users Parameters: -+ `email` (required) - Email -+ `password` (required) - Password -+ `username` (required) - Username -+ `name` (required) - Name -+ `skype` (optional) - Skype ID -+ `linkedin` (optional) - Linkedin -+ `twitter` (optional) - Twitter account -+ `projects_limit` (optional) - Number of projects user can create -+ `extern_uid` (optional) - External UID -+ `provider` (optional) - External provider name -+ `bio` (optional) - User's bio ++ `email` (required) - Email ++ `password` (required unless force_random_password is set) - Password ++ `username` (required) - Username ++ `name` (required) - Name ++ `skype` (optional) - Skype ID ++ `linkedin` (optional) - Linkedin ++ `twitter` (optional) - Twitter account ++ `projects_limit` (optional) - Number of projects user can create ++ `extern_uid` (optional) - External UID ++ `provider` (optional) - External provider name ++ `bio` (optional) - User's bio ++ `expired_password` (true/false) - Password is set expired ++ `force_random_password` (true/false; required unless password is set) - generate random password for user ## User modification diff --git a/lib/api/users.rb b/lib/api/users.rb index 00dc2311ffde16919e0d3b02945bab74709808fa..69b850f8ae4f8431c96d0b1c99836356e676a862 100644 --- a/lib/api/users.rb +++ b/lib/api/users.rb @@ -30,23 +30,44 @@ module API # Create user. Available only for admin # # Parameters: - # email (required) - Email - # password (required) - Password - # name - Name - # skype - Skype ID - # linkedin - Linkedin - # twitter - Twitter account - # projects_limit - Number of projects user can create - # extern_uid - External authentication provider UID - # provider - External provider - # bio - Bio + # email (required) - Email + # password (required unless force_random_password is set) - Password + # name (required) - Name + # username (required) - username + # skype - Skype ID + # linkedin - Linkedin + # twitter - Twitter account + # projects_limit - Number of projects user can create + # extern_uid - External authentication provider UID + # provider - External provider + # bio - Bio + # expired_password (true/false) - password is set expired + # force_random_password (true/false; required unless password is set) - generate random password for user # Example Request: # POST /users post do authenticated_as_admin! - required_attributes! [:email, :password, :name, :username] - attrs = attributes_for_keys [:email, :name, :password, :skype, :linkedin, :twitter, :projects_limit, :username, :extern_uid, :provider, :bio] - user = User.build_user(attrs, as: :admin) + required_attributes! [:email, :name, :username] + + attrs = attributes_for_keys [:email, :name, :skype, :linkedin, :twitter, :projects_limit, :username, :extern_uid, :provider, :bio] + + #parse password strategy params + expired = params[:expired_password] && (params[:expired_password].to_i > 0) + force_random = params[:force_random_password] && (params[:force_random_password].to_i > 0) + + if params[:password] && !force_random + attrs[:password] = params[:password] + elsif force_random && !params[:password] + attrs[:force_random_password] = true + else + render_api_error!('400 Either password or force_random_password must be set',400) + end + + attrs[:password_expires_at] = Time.now if expired + + user = User.new attrs, as: :admin + user.created_by_id = current_user.id if expired # this is necessary to make the new user notification work correctly. + if user.save present user, with: Entities::User else diff --git a/lib/support/nginx/gitlab b/lib/support/nginx/gitlab index 3e929c52990de1633104b0448a5cee5e189efb3a..54bf6fb905927b8fa191edf201a86ea4936f6679 100644 --- a/lib/support/nginx/gitlab +++ b/lib/support/nginx/gitlab @@ -1,6 +1,6 @@ # GITLAB # Maintainer: @randx -# App Version: 5.0 +# App Version: 6.1 upstream gitlab { server unix:/home/git/gitlab/tmp/sockets/gitlab.socket; diff --git a/lib/tasks/sidekiq.rake b/lib/tasks/sidekiq.rake index d0e9dfe46a160279cbbcf3ad650d8c34678ea63b..ba79b6e035d43e4dfa607a7de2825ea7af98fd0b 100644 --- a/lib/tasks/sidekiq.rake +++ b/lib/tasks/sidekiq.rake @@ -5,16 +5,28 @@ namespace :sidekiq do end desc "GITLAB | Start sidekiq" - task :start do - system "nohup bundle exec sidekiq -q post_receive,mailer,system_hook,project_web_hook,gitlab_shell,common,default -e #{Rails.env} -P #{pidfile} >> #{Rails.root.join("log", "sidekiq.log")} 2>&1 &" + task :start => :restart + + desc 'GitLab | Restart sidekiq' + task :restart do + if File.exist?(pidfile) + puts 'Shutting down existing sidekiq process.' + Rake::Task['sidekiq:stop'].invoke + puts 'Starting new sidekiq process.' + end + system "bundle exec sidekiq -q post_receive,mailer,system_hook,project_web_hook,gitlab_shell,common,default -e #{Rails.env} -P #{pidfile} -d -L #{log_file} >> #{log_file} 2>&1" end desc "GITLAB | Start sidekiq with launchd on Mac OS X" task :launchd do - system "bundle exec sidekiq -q post_receive,mailer,system_hook,project_web_hook,gitlab_shell,common,default -e #{Rails.env} -P #{pidfile} >> #{Rails.root.join("log", "sidekiq.log")} 2>&1" + system "bundle exec sidekiq -q post_receive,mailer,system_hook,project_web_hook,gitlab_shell,common,default -e #{Rails.env} -P #{pidfile} >> #{log_file} 2>&1" end def pidfile Rails.root.join("tmp", "pids", "sidekiq.pid") end + + def log_file + Rails.root.join("log", "sidekiq.log") + end end diff --git a/spec/requests/api/users_spec.rb b/spec/requests/api/users_spec.rb index 2fced3ec945bf082d449ef2731140b32af7908d5..e56a7b61f45f9edcde5ad66f4addf734ed960d16 100644 --- a/spec/requests/api/users_spec.rb +++ b/spec/requests/api/users_spec.rb @@ -71,21 +71,26 @@ describe API::API do end it "should not create user with invalid email" do - post api("/users", admin), { email: "invalid email", password: 'password' } + post api("/users", admin), { email: "invalid email", password: 'password', name: "T. User", username: "testuser" } response.status.should == 400 end - it "should return 400 error if password not given" do - post api("/users", admin), { email: 'test@example.com' } + it "should return 400 error if password or force_random_password not given" do + post api("/users", admin), { email: 'test@example.com', name: "T. User", username: "testuser" } + response.status.should == 400 + end + + it "should return 400 error if both password and force_random_password are set" do + post api("/users", admin), { password: 'password', force_random_password: '1', email: 'test@example.com', name: "T. User", username: "testuser" } response.status.should == 400 end it "should return 400 error if email not given" do - post api("/users", admin), { password: 'pass1234' } + post api("/users", admin), { password: 'pass1234', name: "T. User", username: "testuser" } response.status.should == 400 end - it "shouldn't available for non admin users" do + it "shouldn't be available for non admin users" do post api("/users", user), attributes_for(:user) response.status.should == 403 end