{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE DuplicateRecordFields #-}
{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE StrictData #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE NoImplicitPrelude #-}
{-# OPTIONS_GHC -fno-warn-unused-binds #-}
{-# OPTIONS_GHC -fno-warn-unused-imports #-}
{-# OPTIONS_GHC -fno-warn-unused-matches #-}

-- Derived from AWS service descriptions, licensed under Apache 2.0.

-- |
-- Module      : Amazonka.S3.GetBucketAcl
-- Copyright   : (c) 2013-2023 Brendan Hay
-- License     : Mozilla Public License, v. 2.0.
-- Maintainer  : Brendan Hay
-- Stability   : auto-generated
-- Portability : non-portable (GHC extensions)
--
-- This implementation of the @GET@ action uses the @acl@ subresource to
-- return the access control list (ACL) of a bucket. To use @GET@ to return
-- the ACL of the bucket, you must have @READ_ACP@ access to the bucket. If
-- @READ_ACP@ permission is granted to the anonymous user, you can return
-- the ACL of the bucket without using an authorization header.
--
-- If your bucket uses the bucket owner enforced setting for S3 Object
-- Ownership, requests to read ACLs are still supported and return the
-- @bucket-owner-full-control@ ACL with the owner being the account that
-- created the bucket. For more information, see
-- <https://docs.aws.amazon.com/AmazonS3/latest/userguide/about-object-ownership.html Controlling object ownership and disabling ACLs>
-- in the /Amazon S3 User Guide/.
--
-- __Related Resources__
--
-- -   <https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListObjects.html ListObjects>
module Amazonka.S3.GetBucketAcl
  ( -- * Creating a Request
    GetBucketAcl (..),
    newGetBucketAcl,

    -- * Request Lenses
    getBucketAcl_expectedBucketOwner,
    getBucketAcl_bucket,

    -- * Destructuring the Response
    GetBucketAclResponse (..),
    newGetBucketAclResponse,

    -- * Response Lenses
    getBucketAclResponse_grants,
    getBucketAclResponse_owner,
    getBucketAclResponse_httpStatus,
  )
where

import qualified Amazonka.Core as Core
import qualified Amazonka.Core.Lens.Internal as Lens
import qualified Amazonka.Data as Data
import qualified Amazonka.Prelude as Prelude
import qualified Amazonka.Request as Request
import qualified Amazonka.Response as Response
import Amazonka.S3.Types

-- | /See:/ 'newGetBucketAcl' smart constructor.
data GetBucketAcl = GetBucketAcl'
  { -- | The account ID of the expected bucket owner. If the bucket is owned by a
    -- different account, the request fails with the HTTP status code
    -- @403 Forbidden@ (access denied).
    GetBucketAcl -> Maybe Text
expectedBucketOwner :: Prelude.Maybe Prelude.Text,
    -- | Specifies the S3 bucket whose ACL is being requested.
    GetBucketAcl -> BucketName
bucket :: BucketName
  }
  deriving (GetBucketAcl -> GetBucketAcl -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: GetBucketAcl -> GetBucketAcl -> Bool
$c/= :: GetBucketAcl -> GetBucketAcl -> Bool
== :: GetBucketAcl -> GetBucketAcl -> Bool
$c== :: GetBucketAcl -> GetBucketAcl -> Bool
Prelude.Eq, ReadPrec [GetBucketAcl]
ReadPrec GetBucketAcl
Int -> ReadS GetBucketAcl
ReadS [GetBucketAcl]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [GetBucketAcl]
$creadListPrec :: ReadPrec [GetBucketAcl]
readPrec :: ReadPrec GetBucketAcl
$creadPrec :: ReadPrec GetBucketAcl
readList :: ReadS [GetBucketAcl]
$creadList :: ReadS [GetBucketAcl]
readsPrec :: Int -> ReadS GetBucketAcl
$creadsPrec :: Int -> ReadS GetBucketAcl
Prelude.Read, Int -> GetBucketAcl -> ShowS
[GetBucketAcl] -> ShowS
GetBucketAcl -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [GetBucketAcl] -> ShowS
$cshowList :: [GetBucketAcl] -> ShowS
show :: GetBucketAcl -> String
$cshow :: GetBucketAcl -> String
showsPrec :: Int -> GetBucketAcl -> ShowS
$cshowsPrec :: Int -> GetBucketAcl -> ShowS
Prelude.Show, forall x. Rep GetBucketAcl x -> GetBucketAcl
forall x. GetBucketAcl -> Rep GetBucketAcl x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep GetBucketAcl x -> GetBucketAcl
$cfrom :: forall x. GetBucketAcl -> Rep GetBucketAcl x
Prelude.Generic)

-- |
-- Create a value of 'GetBucketAcl' with all optional fields omitted.
--
-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
--
-- The following record fields are available, with the corresponding lenses provided
-- for backwards compatibility:
--
-- 'expectedBucketOwner', 'getBucketAcl_expectedBucketOwner' - The account ID of the expected bucket owner. If the bucket is owned by a
-- different account, the request fails with the HTTP status code
-- @403 Forbidden@ (access denied).
--
-- 'bucket', 'getBucketAcl_bucket' - Specifies the S3 bucket whose ACL is being requested.
newGetBucketAcl ::
  -- | 'bucket'
  BucketName ->
  GetBucketAcl
newGetBucketAcl :: BucketName -> GetBucketAcl
newGetBucketAcl BucketName
pBucket_ =
  GetBucketAcl'
    { $sel:expectedBucketOwner:GetBucketAcl' :: Maybe Text
expectedBucketOwner =
        forall a. Maybe a
Prelude.Nothing,
      $sel:bucket:GetBucketAcl' :: BucketName
bucket = BucketName
pBucket_
    }

-- | The account ID of the expected bucket owner. If the bucket is owned by a
-- different account, the request fails with the HTTP status code
-- @403 Forbidden@ (access denied).
getBucketAcl_expectedBucketOwner :: Lens.Lens' GetBucketAcl (Prelude.Maybe Prelude.Text)
getBucketAcl_expectedBucketOwner :: Lens' GetBucketAcl (Maybe Text)
getBucketAcl_expectedBucketOwner = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\GetBucketAcl' {Maybe Text
expectedBucketOwner :: Maybe Text
$sel:expectedBucketOwner:GetBucketAcl' :: GetBucketAcl -> Maybe Text
expectedBucketOwner} -> Maybe Text
expectedBucketOwner) (\s :: GetBucketAcl
s@GetBucketAcl' {} Maybe Text
a -> GetBucketAcl
s {$sel:expectedBucketOwner:GetBucketAcl' :: Maybe Text
expectedBucketOwner = Maybe Text
a} :: GetBucketAcl)

-- | Specifies the S3 bucket whose ACL is being requested.
getBucketAcl_bucket :: Lens.Lens' GetBucketAcl BucketName
getBucketAcl_bucket :: Lens' GetBucketAcl BucketName
getBucketAcl_bucket = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\GetBucketAcl' {BucketName
bucket :: BucketName
$sel:bucket:GetBucketAcl' :: GetBucketAcl -> BucketName
bucket} -> BucketName
bucket) (\s :: GetBucketAcl
s@GetBucketAcl' {} BucketName
a -> GetBucketAcl
s {$sel:bucket:GetBucketAcl' :: BucketName
bucket = BucketName
a} :: GetBucketAcl)

instance Core.AWSRequest GetBucketAcl where
  type AWSResponse GetBucketAcl = GetBucketAclResponse
  request :: (Service -> Service) -> GetBucketAcl -> Request GetBucketAcl
request Service -> Service
overrides =
    forall a. Request a -> Request a
Request.s3vhost
      forall b c a. (b -> c) -> (a -> b) -> a -> c
Prelude.. forall a. ToRequest a => Service -> a -> Request a
Request.get (Service -> Service
overrides Service
defaultService)
  response :: forall (m :: * -> *).
MonadResource m =>
(ByteStringLazy -> IO ByteStringLazy)
-> Service
-> Proxy GetBucketAcl
-> ClientResponse ClientBody
-> m (Either Error (ClientResponse (AWSResponse GetBucketAcl)))
response =
    forall (m :: * -> *) a.
MonadResource m =>
(Int -> ResponseHeaders -> [Node] -> Either String (AWSResponse a))
-> (ByteStringLazy -> IO ByteStringLazy)
-> Service
-> Proxy a
-> ClientResponse ClientBody
-> m (Either Error (ClientResponse (AWSResponse a)))
Response.receiveXML
      ( \Int
s ResponseHeaders
h [Node]
x ->
          Maybe [Grant] -> Maybe Owner -> Int -> GetBucketAclResponse
GetBucketAclResponse'
            forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
Prelude.<$> ( [Node]
x
                            forall a. FromXML a => [Node] -> Text -> Either String (Maybe a)
Data..@? Text
"AccessControlList"
                            forall (f :: * -> *) a. Functor f => f (Maybe a) -> a -> f a
Core..!@ forall a. Monoid a => a
Prelude.mempty
                            forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
Prelude.>>= forall (f :: * -> *) a b.
Applicative f =>
([a] -> f b) -> [a] -> f (Maybe b)
Core.may (forall a. FromXML a => Text -> [Node] -> Either String [a]
Data.parseXMLList Text
"Grant")
                        )
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
Prelude.<*> ([Node]
x forall a. FromXML a => [Node] -> Text -> Either String (Maybe a)
Data..@? Text
"Owner")
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
Prelude.<*> (forall (f :: * -> *) a. Applicative f => a -> f a
Prelude.pure (forall a. Enum a => a -> Int
Prelude.fromEnum Int
s))
      )

instance Prelude.Hashable GetBucketAcl where
  hashWithSalt :: Int -> GetBucketAcl -> Int
hashWithSalt Int
_salt GetBucketAcl' {Maybe Text
BucketName
bucket :: BucketName
expectedBucketOwner :: Maybe Text
$sel:bucket:GetBucketAcl' :: GetBucketAcl -> BucketName
$sel:expectedBucketOwner:GetBucketAcl' :: GetBucketAcl -> Maybe Text
..} =
    Int
_salt
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe Text
expectedBucketOwner
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` BucketName
bucket

instance Prelude.NFData GetBucketAcl where
  rnf :: GetBucketAcl -> ()
rnf GetBucketAcl' {Maybe Text
BucketName
bucket :: BucketName
expectedBucketOwner :: Maybe Text
$sel:bucket:GetBucketAcl' :: GetBucketAcl -> BucketName
$sel:expectedBucketOwner:GetBucketAcl' :: GetBucketAcl -> Maybe Text
..} =
    forall a. NFData a => a -> ()
Prelude.rnf Maybe Text
expectedBucketOwner
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf BucketName
bucket

instance Data.ToHeaders GetBucketAcl where
  toHeaders :: GetBucketAcl -> ResponseHeaders
toHeaders GetBucketAcl' {Maybe Text
BucketName
bucket :: BucketName
expectedBucketOwner :: Maybe Text
$sel:bucket:GetBucketAcl' :: GetBucketAcl -> BucketName
$sel:expectedBucketOwner:GetBucketAcl' :: GetBucketAcl -> Maybe Text
..} =
    forall a. Monoid a => [a] -> a
Prelude.mconcat
      [ HeaderName
"x-amz-expected-bucket-owner"
          forall a. ToHeader a => HeaderName -> a -> ResponseHeaders
Data.=# Maybe Text
expectedBucketOwner
      ]

instance Data.ToPath GetBucketAcl where
  toPath :: GetBucketAcl -> ByteString
toPath GetBucketAcl' {Maybe Text
BucketName
bucket :: BucketName
expectedBucketOwner :: Maybe Text
$sel:bucket:GetBucketAcl' :: GetBucketAcl -> BucketName
$sel:expectedBucketOwner:GetBucketAcl' :: GetBucketAcl -> Maybe Text
..} =
    forall a. Monoid a => [a] -> a
Prelude.mconcat [ByteString
"/", forall a. ToByteString a => a -> ByteString
Data.toBS BucketName
bucket]

instance Data.ToQuery GetBucketAcl where
  toQuery :: GetBucketAcl -> QueryString
toQuery = forall a b. a -> b -> a
Prelude.const (forall a. Monoid a => [a] -> a
Prelude.mconcat [QueryString
"acl"])

-- | /See:/ 'newGetBucketAclResponse' smart constructor.
data GetBucketAclResponse = GetBucketAclResponse'
  { -- | A list of grants.
    GetBucketAclResponse -> Maybe [Grant]
grants :: Prelude.Maybe [Grant],
    -- | Container for the bucket owner\'s display name and ID.
    GetBucketAclResponse -> Maybe Owner
owner :: Prelude.Maybe Owner,
    -- | The response's http status code.
    GetBucketAclResponse -> Int
httpStatus :: Prelude.Int
  }
  deriving (GetBucketAclResponse -> GetBucketAclResponse -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: GetBucketAclResponse -> GetBucketAclResponse -> Bool
$c/= :: GetBucketAclResponse -> GetBucketAclResponse -> Bool
== :: GetBucketAclResponse -> GetBucketAclResponse -> Bool
$c== :: GetBucketAclResponse -> GetBucketAclResponse -> Bool
Prelude.Eq, ReadPrec [GetBucketAclResponse]
ReadPrec GetBucketAclResponse
Int -> ReadS GetBucketAclResponse
ReadS [GetBucketAclResponse]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [GetBucketAclResponse]
$creadListPrec :: ReadPrec [GetBucketAclResponse]
readPrec :: ReadPrec GetBucketAclResponse
$creadPrec :: ReadPrec GetBucketAclResponse
readList :: ReadS [GetBucketAclResponse]
$creadList :: ReadS [GetBucketAclResponse]
readsPrec :: Int -> ReadS GetBucketAclResponse
$creadsPrec :: Int -> ReadS GetBucketAclResponse
Prelude.Read, Int -> GetBucketAclResponse -> ShowS
[GetBucketAclResponse] -> ShowS
GetBucketAclResponse -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [GetBucketAclResponse] -> ShowS
$cshowList :: [GetBucketAclResponse] -> ShowS
show :: GetBucketAclResponse -> String
$cshow :: GetBucketAclResponse -> String
showsPrec :: Int -> GetBucketAclResponse -> ShowS
$cshowsPrec :: Int -> GetBucketAclResponse -> ShowS
Prelude.Show, forall x. Rep GetBucketAclResponse x -> GetBucketAclResponse
forall x. GetBucketAclResponse -> Rep GetBucketAclResponse x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep GetBucketAclResponse x -> GetBucketAclResponse
$cfrom :: forall x. GetBucketAclResponse -> Rep GetBucketAclResponse x
Prelude.Generic)

-- |
-- Create a value of 'GetBucketAclResponse' with all optional fields omitted.
--
-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
--
-- The following record fields are available, with the corresponding lenses provided
-- for backwards compatibility:
--
-- 'grants', 'getBucketAclResponse_grants' - A list of grants.
--
-- 'owner', 'getBucketAclResponse_owner' - Container for the bucket owner\'s display name and ID.
--
-- 'httpStatus', 'getBucketAclResponse_httpStatus' - The response's http status code.
newGetBucketAclResponse ::
  -- | 'httpStatus'
  Prelude.Int ->
  GetBucketAclResponse
newGetBucketAclResponse :: Int -> GetBucketAclResponse
newGetBucketAclResponse Int
pHttpStatus_ =
  GetBucketAclResponse'
    { $sel:grants:GetBucketAclResponse' :: Maybe [Grant]
grants = forall a. Maybe a
Prelude.Nothing,
      $sel:owner:GetBucketAclResponse' :: Maybe Owner
owner = forall a. Maybe a
Prelude.Nothing,
      $sel:httpStatus:GetBucketAclResponse' :: Int
httpStatus = Int
pHttpStatus_
    }

-- | A list of grants.
getBucketAclResponse_grants :: Lens.Lens' GetBucketAclResponse (Prelude.Maybe [Grant])
getBucketAclResponse_grants :: Lens' GetBucketAclResponse (Maybe [Grant])
getBucketAclResponse_grants = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\GetBucketAclResponse' {Maybe [Grant]
grants :: Maybe [Grant]
$sel:grants:GetBucketAclResponse' :: GetBucketAclResponse -> Maybe [Grant]
grants} -> Maybe [Grant]
grants) (\s :: GetBucketAclResponse
s@GetBucketAclResponse' {} Maybe [Grant]
a -> GetBucketAclResponse
s {$sel:grants:GetBucketAclResponse' :: Maybe [Grant]
grants = Maybe [Grant]
a} :: GetBucketAclResponse) forall b c a. (b -> c) -> (a -> b) -> a -> c
Prelude.. forall (f :: * -> *) (g :: * -> *) s t a b.
(Functor f, Functor g) =>
AnIso s t a b -> Iso (f s) (g t) (f a) (g b)
Lens.mapping forall s t a b. (Coercible s a, Coercible t b) => Iso s t a b
Lens.coerced

-- | Container for the bucket owner\'s display name and ID.
getBucketAclResponse_owner :: Lens.Lens' GetBucketAclResponse (Prelude.Maybe Owner)
getBucketAclResponse_owner :: Lens' GetBucketAclResponse (Maybe Owner)
getBucketAclResponse_owner = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\GetBucketAclResponse' {Maybe Owner
owner :: Maybe Owner
$sel:owner:GetBucketAclResponse' :: GetBucketAclResponse -> Maybe Owner
owner} -> Maybe Owner
owner) (\s :: GetBucketAclResponse
s@GetBucketAclResponse' {} Maybe Owner
a -> GetBucketAclResponse
s {$sel:owner:GetBucketAclResponse' :: Maybe Owner
owner = Maybe Owner
a} :: GetBucketAclResponse)

-- | The response's http status code.
getBucketAclResponse_httpStatus :: Lens.Lens' GetBucketAclResponse Prelude.Int
getBucketAclResponse_httpStatus :: Lens' GetBucketAclResponse Int
getBucketAclResponse_httpStatus = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\GetBucketAclResponse' {Int
httpStatus :: Int
$sel:httpStatus:GetBucketAclResponse' :: GetBucketAclResponse -> Int
httpStatus} -> Int
httpStatus) (\s :: GetBucketAclResponse
s@GetBucketAclResponse' {} Int
a -> GetBucketAclResponse
s {$sel:httpStatus:GetBucketAclResponse' :: Int
httpStatus = Int
a} :: GetBucketAclResponse)

instance Prelude.NFData GetBucketAclResponse where
  rnf :: GetBucketAclResponse -> ()
rnf GetBucketAclResponse' {Int
Maybe [Grant]
Maybe Owner
httpStatus :: Int
owner :: Maybe Owner
grants :: Maybe [Grant]
$sel:httpStatus:GetBucketAclResponse' :: GetBucketAclResponse -> Int
$sel:owner:GetBucketAclResponse' :: GetBucketAclResponse -> Maybe Owner
$sel:grants:GetBucketAclResponse' :: GetBucketAclResponse -> Maybe [Grant]
..} =
    forall a. NFData a => a -> ()
Prelude.rnf Maybe [Grant]
grants
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe Owner
owner
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Int
httpStatus