18676: make v2 token check more strict, and add the ["GET /"] scope to
[arvados.git] / services / api / app / models / api_client_authorization.rb
index 26853c34967a5b66de29e24d46ba85551809b4ff..c74c1ce5bf353a951e7c6ca076f2a4fd426f3038 100644 (file)
@@ -112,11 +112,26 @@ class ApiClientAuthorization < ArvadosModel
   end
 
   def self.check_anonymous_user_token token
-    if token.length >= 50 and token == Rails.configuration.Users.AnonymousUserToken
+    case token[0..2]
+    when 'v2/'
+      _, token_uuid, secret, optional = token.split('/')
+      unless token_uuid.andand.length == 27 && secret.andand.length.andand > 0 &&
+             token_uuid == Rails.configuration.ClusterID+"-gj3su-anonymouspublic"
+        # invalid v2 token, or v2 token for another user
+        return nil
+      end
+    else
+      # v1 token
+      secret = token
+    end
+
+    # The anonymous token content and minimum length is verified in lib/config
+    if secret.length >= 0 && secret == Rails.configuration.Users.AnonymousUserToken
       return ApiClientAuthorization.new(user: User.find_by_uuid(anonymous_user_uuid),
                                         uuid: Rails.configuration.ClusterID+"-gj3su-anonymouspublic",
                                         api_token: token,
-                                        api_client: anonymous_user_token_api_client)
+                                        api_client: anonymous_user_token_api_client,
+                                        scopes: ['GET /'])
     else
       return nil
     end