Merge branch 'master' into 2257-inequality-conditions
[arvados.git] / services / api / app / controllers / user_sessions_controller.rb
index 45edc9049bf8dff321a6b483b1ce63fb40e79767..3674c010cb7bcd97ae808483997ef5118554042f 100644 (file)
@@ -2,6 +2,7 @@ class UserSessionsController < ApplicationController
   before_filter :require_auth_scope_all, :only => [ :destroy ]
 
   skip_before_filter :find_object_by_uuid
+  skip_before_filter :render_404_if_no_object
 
   respond_to :html
 
@@ -20,6 +21,22 @@ class UserSessionsController < ApplicationController
     end
 
     user = User.find_by_identity_url(omniauth['info']['identity_url'])
+    if not user
+      # Check for permission to log in to an existing User record with
+      # a different identity_url
+      Link.where(link_class: 'permission',
+                 name: 'can_login',
+                 tail_kind: 'email',
+                 tail_uuid: omniauth['info']['email'],
+                 head_kind: 'arvados#user').each do |link|
+        if prefix = link.properties['identity_url_prefix']
+          if prefix == omniauth['info']['identity_url'][0..prefix.size-1]
+            user = User.find_by_uuid(link.head_uuid)
+            break if user
+          end
+        end
+      end
+    end
     if not user
       # New user registration
       user = User.new(:email => omniauth['info']['email'],
@@ -31,6 +48,10 @@ class UserSessionsController < ApplicationController
       user.email = omniauth['info']['email']
       user.first_name = omniauth['info']['first_name']
       user.last_name = omniauth['info']['last_name']
+      if user.identity_url.nil?
+        # First login to a pre-activated account
+        user.identity_url = omniauth['info']['identity_url']
+      end
     end
 
     # prevent ArvadosModel#before_create and _update from throwing
@@ -93,20 +114,23 @@ class UserSessionsController < ApplicationController
 
     # Stub: automatically register all new API clients
     api_client_url_prefix = callback_url.match(%r{^.*?://[^/]+})[0] + '/'
-    api_client = ApiClient.find_or_create_by_url_prefix(api_client_url_prefix)
+    act_as_system_user do
+      @api_client = ApiClient.find_or_create_by_url_prefix api_client_url_prefix
+    end
 
     api_client_auth = ApiClientAuthorization.
       new(user: user,
-          api_client: api_client,
-          created_by_ip_address: remote_ip)
+          api_client: @api_client,
+          created_by_ip_address: remote_ip,
+          scopes: ["all"])
     api_client_auth.save!
 
     if callback_url.index('?')
-      callback_url << '&'
+      callback_url += '&'
     else
-      callback_url << '?'
+      callback_url += '?'
     end
-    callback_url << 'api_token=' << api_client_auth.api_token
+    callback_url += 'api_token=' + api_client_auth.api_token
     redirect_to callback_url
   end
 end