module SharepointApi::Permissions

Public Instance Methods

add_group(group_name) click to toggle source
# File lib/sharepoint_api/permissions.rb, line 37
def add_group(group_name)
  site.query(:post, 'SiteGroups', {
    '__metadata' => { 'type': 'SP.Group' },
    'Title' => group_name,
    'Description' => "Access Group for #{group_name}"
  }.to_json)
rescue Sharepoint::SPException => e
  log_as(__method__, e)
  false
end
add_role_assignment(path, principal_id, role_id) click to toggle source

Alternate version would be: def add_role_assignment(library_guid:, list_item_id:, principal_id:, role_id:)

list_item_path = "Lists(guid'#{@library_guid}')/Items(#{@list_item_id})"

You would do it the above way if you had a problem with the file names being too long.

# File lib/sharepoint_api/permissions.rb, line 135
def add_role_assignment(path, principal_id, role_id)
  server_path = server_relative_path(path)
  list_item_path = "GetFolderByServerRelativeUrl('#{server_path}')/ListItemAllFields"

  site.query( # returns nothing on success
    :post,
    "#{list_item_path}/RoleAssignments/AddRoleAssignment(PrincipalId=#{principal_id},RoleDefId=#{role_id})"
  )

  true
rescue Sharepoint::SPException => e
  log_as(__method__, e)
  false
end
add_user_to_group(login_name, group_name) click to toggle source
# File lib/sharepoint_api/permissions.rb, line 57
def add_user_to_group(login_name, group_name)
  user = site.query(:post, "SiteGroups/GetByName('#{group_name}')/Users", {
    '__metadata' => { 'type' => 'SP.User' }, 'LoginName' => login_name
  }.to_json)

  !user.nil?
rescue Sharepoint::SPException => e
  log_as(__method__, e)
  false
end
break_permission_inheritance_for(path, copy_role_assignments: false, clear_subscopes: true) click to toggle source

NO SPACES in url or Addressable::URI.encode the url.

# File lib/sharepoint_api/permissions.rb, line 15
def break_permission_inheritance_for(path, copy_role_assignments: false, clear_subscopes: true)
  server_path = server_relative_path(path)
  site.query(
    :post,
    "GetFolderByServerRelativeUrl('#{server_path}')/ListItemAllFields/" \
    "BreakRoleInheritance(CopyRoleAssignments=#{copy_role_assignments},ClearSubscopes=#{clear_subscopes})"
  )

  true # Anything other than an error is success
rescue Sharepoint::SPException => e
  log_as(__method__, e)
  nil
end
fetch_role_assignments(path, principal_id: nil) click to toggle source
# File lib/sharepoint_api/permissions.rb, line 100
def fetch_role_assignments(path, principal_id: nil)
  server_path = server_relative_path(path)
  list_item_path = "GetFolderByServerRelativeUrl('#{server_path}')/ListItemAllFields"
  query = '$expand=Member,RoleDefinitionBindings&$select=RoleDefinitionBindings/Name&$select=RoleDefinitionBindings/Id,PrincipalId,Member/LoginName'

  unless principal_id.nil?
    principal_filter = encode_path("PrincipalId eq #{principal_id}")
    query += "&$filter=#{principal_filter}"
  end

  response = site.query(:get, "#{list_item_path}/RoleAssignments?#{query}")

  formatted = response.map do |assignment|
    data = assignment.data

    current_roles = data['RoleDefinitionBindings']['results'].map { |rdb| { role_id: rdb['Id'], role_name: rdb['Name'] } }

    {
      login_name: data['Member']['LoginName'],
      principal_id: data['PrincipalId'],
      roles: current_roles
    }
  end

  principal_id.nil? ? formatted : formatted.first
rescue Sharepoint::SPException => e
  log_as(__method__, e)
  false
end
find_group(group_name) click to toggle source
# File lib/sharepoint_api/permissions.rb, line 29
def find_group(group_name)
  escaped_group_name = encode_path(group_name)
  site.query(:get, "SiteGroups/GetByName('#{escaped_group_name}')")
rescue Sharepoint::SPException => e
  log_as(__method__, e)
  nil
end
find_role(role_name = 'Edit') click to toggle source
# File lib/sharepoint_api/permissions.rb, line 92
def find_role(role_name = 'Edit')
  escaped_role_name = encode_path(role_name)
  site.query :get, "RoleDefinitions/GetByName('#{escaped_role_name}')"
rescue Sharepoint::SPException => e
  log_as(__method__, e)
  false
end
list_item_for(path) click to toggle source
# File lib/sharepoint_api/permissions.rb, line 5
def list_item_for(path)
  server_path = server_relative_path(path)
  site.query(:get, "GetFolderByServerRelativeUrl('#{server_path}')/ListItemAllFields")
rescue Sharepoint::SPException => e
  log_as(__method__, e)
  nil
end
remove_group(group_name) click to toggle source

This also removes any role definitions the groups is using.

# File lib/sharepoint_api/permissions.rb, line 50
def remove_group(group_name)
  site.query(:post, "SiteGroups/RemoveByLoginName('#{group_name}')")
rescue Sharepoint::SPException => e
  log_as(__method__, e)
  false
end
remove_role_assignment(path, principal_id, role_id) click to toggle source
# File lib/sharepoint_api/permissions.rb, line 150
def remove_role_assignment(path, principal_id, role_id)
  server_path = server_relative_path(path)
  list_item_path = "GetFolderByServerRelativeUrl('#{server_path}')/ListItemAllFields"

  site.query( # returns nothing on success
    :post,
    "#{list_item_path}/RoleAssignments/RemoveRoleAssignment(PrincipalId=#{principal_id},RoleDefId=#{role_id})"
  )

  true
rescue Sharepoint::SPException => e
  log_as(__method__, e)
  false
end
remove_user_from_group(login_name, group_name) click to toggle source

Addressable::URI.encode does not encode `:#.` characters, which is a must for login names.

# File lib/sharepoint_api/permissions.rb, line 71
def remove_user_from_group(login_name, group_name)
  encoded_login_name = ERB::Util.url_encode(login_name)
  site.query(
    :post,
    "SiteGroups/GetByName('#{group_name}')/" \
    "Users/RemoveByLoginName(@v)?@v='#{encoded_login_name}'"
  )

  true
rescue Sharepoint::SPException => e
  log_as(__method__, e)
  false
end
users_in_group(group_name) click to toggle source
# File lib/sharepoint_api/permissions.rb, line 85
def users_in_group(group_name)
  site.query(:get, "SiteGroups/GetByName('#{group_name}')/Users")
rescue Sharepoint::SPException => e
  log_as(__method__, e)
  nil
end