Do not self-activate, or show user agreements to, an uninvited user:
[arvados.git] / services / api / app / controllers / arvados / v1 / repositories_controller.rb
index d7a6367c98aa9f1fd11a2c13f91cf60a093a6668..6ba98c8e0914e46e45a65fd04e40ad050cdd67a3 100644 (file)
@@ -1,2 +1,67 @@
 class Arvados::V1::RepositoriesController < ApplicationController
+  before_filter :admin_required, :only => :get_all_permissions
+  def get_all_permissions
+    @users = {}
+    User.includes(:authorized_keys).all.each do |u|
+      @users[u.uuid] = u
+    end
+    @user_aks = {}
+    @repo_info = {}
+    @repos = Repository.includes(:permissions).all
+    @repos.each do |repo|
+      gitolite_permissions = ''
+      perms = []
+      repo.permissions.each do |perm|
+        if perm.tail_kind == 'arvados#group'
+          @users.each do |user_uuid, user|
+            user.group_permissions.each do |group_uuid, perm_mask|
+              if perm_mask[:write]
+                perms << {name: 'can_write', user_uuid: user_uuid}
+              elsif perm_mask[:read]
+                perms << {name: 'can_read', user_uuid: user_uuid}
+              end
+            end
+          end
+        else
+          perms << {name: perm.name, user_uuid: perm.tail_uuid}
+        end
+      end
+      perms.each do |perm|
+        user_uuid = perm[:user_uuid]
+        @user_aks[user_uuid] = @users[user_uuid].andand.authorized_keys.andand.
+          collect do |ak|
+          {
+            public_key: ak.public_key,
+            authorized_key_uuid: ak.uuid
+          }
+        end || []
+        if @user_aks[user_uuid].any?
+          @repo_info[repo.uuid] ||= {
+            uuid: repo.uuid,
+            name: repo.name,
+            push_url: repo.push_url,
+            fetch_url: repo.fetch_url,
+            user_permissions: {}
+          }
+          ri = (@repo_info[repo.uuid][:user_permissions][user_uuid] ||= {})
+          ri[perm[:name]] = true
+        end
+      end
+    end
+    @repo_info.values.each do |repo_users|
+      repo_users[:user_permissions].each do |user_uuid,perms|
+        if perms['can_write']
+          perms[:gitolite_permissions] = 'RW'
+          perms['can_read'] = true
+        elsif perms['can_read']
+          perms[:gitolite_permissions] = 'R'
+        end
+      end
+    end
+    render json: {
+      kind: 'arvados#RepositoryPermissionSnapshot',
+      repositories: @repo_info.values,
+      user_keys: @user_aks
+    }
+  end
 end