'Convenience method that provides a quick way to add a canonical
user grant to a bucket.  This method retrieves the current ACL,
creates a new grant based on the parameters passed in, adds that
grant to the ACL and then PUT\'s the new ACL back to S3.
:type permission: string
:param permission: The permission being granted. Should be one of:
(READ, WRITE, READ_ACP, WRITE_ACP, FULL_CONTROL).
:type user_id: string
:param user_id:     The canonical user id associated with the AWS
account your are granting the permission to.
:type recursive: boolean
:param recursive: A boolean value to controls whether the
command will apply the grant to all keys within the bucket
or not.  The default value is False.  By passing a True
value, the call will iterate through all keys in the
bucket and apply the same grant to each key.  CAUTION: If
you have a lot of keys, this could take a long time!
:type display_name: string
:param display_name: An option string containing the user\'s
Display Name.  Only required on Walrus.'

def add_user_grant(self, permission, user_id, recursive=False, headers=None, display_name=None):

    if (permission not in S3Permissions):
        raise self.connection.provider.storage_permissions_error(('Unknown    Permission:    %s' % permission))
    policy = self.get_acl(headers=headers)
    policy.acl.add_user_grant(permission, user_id, display_name=display_name)
    self.set_acl(policy, headers=headers)
    if recursive:
        for key in self:
            key.add_user_grant(permission, user_id, headers=headers, display_name=display_name)
