Merged master
[arvados.git] / services / api / app / controllers / arvados / v1 / users_controller.rb
index 5498619729b6cbd1a5779399ea7c28aecdbff9eb..0934642261bb314fdfbf76175251a2d702fb3a6b 100644 (file)
@@ -1,4 +1,10 @@
 class Arvados::V1::UsersController < ApplicationController
+  skip_before_filter :find_object_by_uuid, only:
+    [:activate, :event_stream, :current, :system, :setup]
+  skip_before_filter :render_404_if_no_object, only:
+    [:activate, :event_stream, :current, :system, :setup]
+  before_filter :admin_required, only: [:setup, :unsetup]
+
   def current
     @object = current_user
     show
@@ -23,7 +29,7 @@ class Arvados::V1::UsersController < ApplicationController
       end
     end
   end
-      
+
   def event_stream
     channel = current_user.andand.uuid
     if current_user.andand.is_admin
@@ -43,40 +49,95 @@ class Arvados::V1::UsersController < ApplicationController
 
   def activate
     if current_user.andand.is_admin && params[:uuid]
-      @user = User.find params[:uuid]
+      @object = User.find params[:uuid]
     else
-      @user = current_user
+      @object = current_user
     end
-    if not @user.is_active
-      target_user_uuid = @user.uuid
-      act_as_system_user do
-        required_uuids = Link.where(owner_uuid: system_user_uuid,
-                                    link_class: 'signature',
-                                    name: 'require',
-                                    tail_uuid: system_user_uuid,
-                                    head_kind: 'arvados#collection').
+    if not @object.is_active
+      if not (current_user.is_admin or @object.is_invited)
+        logger.warn "User #{@object.uuid} called users.activate " +
+          "but is not invited"
+        raise ArgumentError.new "Cannot activate without being invited."
+      end
+      act_as_system_user do       
+        required_uuids = Link.where("owner_uuid = ? and link_class = ? and name = ? and tail_uuid = ? and head_uuid like ?",
+                                    system_user_uuid,
+                                    'signature',
+                                    'require',
+                                    system_user_uuid,
+                                    Collection.uuid_like_pattern).
           collect(&:head_uuid)
         signed_uuids = Link.where(owner_uuid: system_user_uuid,
                                   link_class: 'signature',
                                   name: 'click',
-                                  tail_kind: 'arvados#user',
-                                  tail_uuid: target_user_uuid,
-                                  head_kind: 'arvados#collection',
+                                  tail_uuid: @object.uuid,
                                   head_uuid: required_uuids).
           collect(&:head_uuid)
         todo_uuids = required_uuids - signed_uuids
         if todo_uuids == []
-          @user.update_attributes is_active: true
-          logger.info "User #{@user.uuid} activated"
+          @object.update_attributes is_active: true
+          logger.info "User #{@object.uuid} activated"
         else
-          logger.warn "User #{@user.uuid} called users.activate " +
+          logger.warn "User #{@object.uuid} called users.activate " +
             "before signing agreements #{todo_uuids.inspect}"
-          raise ArgumentError.new \
+          raise ArvadosModel::PermissionDeniedError.new \
           "Cannot activate without user agreements #{todo_uuids.inspect}."
         end
       end
     end
-    @object = @user
     show
   end
+
+  # create user object and all the needed links
+  def setup
+    @object = nil
+    if params[:uuid]
+      @object = User.find_by_uuid params[:uuid]
+      if !@object
+        return render_404_if_no_object
+      end
+      object_found = true
+    else
+      if !params[:user]
+        raise ArgumentError.new "Required uuid or user"
+      else
+        if params[:user]['uuid']
+          @object = User.find_by_uuid params[:user]['uuid']
+          if @object
+            object_found = true
+          end
+        end
+
+        if !@object
+          if !params[:user]['email']
+            raise ArgumentError.new "Require user email"
+          end
+
+          if !params[:openid_prefix]
+            raise ArgumentError.new "Required openid_prefix parameter is missing."
+          end
+
+          @object = model_class.create! resource_attrs
+        end
+      end
+    end
+
+    if object_found
+      @response = @object.setup_repo_vm_links params[:repo_name],
+                    params[:vm_uuid], params[:openid_prefix]
+    else
+      @response = User.setup @object, params[:openid_prefix],
+                    params[:repo_name], params[:vm_uuid]
+    end
+
+    render json: { kind: "arvados#HashList", items: @response }
+  end
+
+  # delete user agreements, vm, repository, login links; set state to inactive
+  def unsetup
+    reload_object_before_update
+    @object.unsetup
+    show
+  end
+
 end