diff options
Diffstat (limited to 'src/acl.c')
-rw-r--r-- | src/acl.c | 482 |
1 files changed, 241 insertions, 241 deletions
@@ -37,313 +37,313 @@ typedef struct GetAclData { - SimpleXml simpleXml; + SimpleXml simpleXml; - S3ResponsePropertiesCallback *responsePropertiesCallback; - S3ResponseCompleteCallback *responseCompleteCallback; - void *callbackData; + S3ResponsePropertiesCallback *responsePropertiesCallback; + S3ResponseCompleteCallback *responseCompleteCallback; + void *callbackData; - int *aclGrantCountReturn; - S3AclGrant *aclGrants; - char *ownerId; - char *ownerDisplayName; - string_buffer(aclXmlDocument, ACL_XML_DOC_MAXSIZE); + int *aclGrantCountReturn; + S3AclGrant *aclGrants; + char *ownerId; + char *ownerDisplayName; + string_buffer(aclXmlDocument, ACL_XML_DOC_MAXSIZE); } GetAclData; static S3Status getAclPropertiesCallback - (const S3ResponseProperties *responseProperties, void *callbackData) + (const S3ResponseProperties *responseProperties, void *callbackData) { - GetAclData *gaData = (GetAclData *) callbackData; - - return (*(gaData->responsePropertiesCallback)) - (responseProperties, gaData->callbackData); + GetAclData *gaData = (GetAclData *) callbackData; + + return (*(gaData->responsePropertiesCallback)) + (responseProperties, gaData->callbackData); } static S3Status getAclDataCallback(int bufferSize, const char *buffer, - void *callbackData) + void *callbackData) { - GetAclData *gaData = (GetAclData *) callbackData; + GetAclData *gaData = (GetAclData *) callbackData; - int fit; + int fit; - string_buffer_append(gaData->aclXmlDocument, buffer, bufferSize, fit); - - return fit ? S3StatusOK : S3StatusXmlDocumentTooLarge; + string_buffer_append(gaData->aclXmlDocument, buffer, bufferSize, fit); + + return fit ? S3StatusOK : S3StatusXmlDocumentTooLarge; } static void getAclCompleteCallback(S3Status requestStatus, - const S3ErrorDetails *s3ErrorDetails, - void *callbackData) + const S3ErrorDetails *s3ErrorDetails, + void *callbackData) { - GetAclData *gaData = (GetAclData *) callbackData; + GetAclData *gaData = (GetAclData *) callbackData; - if (requestStatus == S3StatusOK) { - // Parse the document - requestStatus = S3_convert_acl - (gaData->aclXmlDocument, gaData->ownerId, gaData->ownerDisplayName, - gaData->aclGrantCountReturn, gaData->aclGrants); - } + if (requestStatus == S3StatusOK) { + // Parse the document + requestStatus = S3_convert_acl + (gaData->aclXmlDocument, gaData->ownerId, gaData->ownerDisplayName, + gaData->aclGrantCountReturn, gaData->aclGrants); + } - (*(gaData->responseCompleteCallback)) - (requestStatus, s3ErrorDetails, gaData->callbackData); + (*(gaData->responseCompleteCallback)) + (requestStatus, s3ErrorDetails, gaData->callbackData); - free(gaData); + free(gaData); } void S3_get_acl(const S3BucketContext *bucketContext, const char *key, - char *ownerId, char *ownerDisplayName, - int *aclGrantCountReturn, S3AclGrant *aclGrants, - S3RequestContext *requestContext, - const S3ResponseHandler *handler, void *callbackData) + char *ownerId, char *ownerDisplayName, + int *aclGrantCountReturn, S3AclGrant *aclGrants, + S3RequestContext *requestContext, + const S3ResponseHandler *handler, void *callbackData) { - // Create the callback data - GetAclData *gaData = (GetAclData *) malloc(sizeof(GetAclData)); - if (!gaData) { - (*(handler->completeCallback))(S3StatusOutOfMemory, 0, callbackData); - return; - } - - gaData->responsePropertiesCallback = handler->propertiesCallback; - gaData->responseCompleteCallback = handler->completeCallback; - gaData->callbackData = callbackData; - - gaData->aclGrantCountReturn = aclGrantCountReturn; - gaData->aclGrants = aclGrants; - gaData->ownerId = ownerId; - gaData->ownerDisplayName = ownerDisplayName; - string_buffer_initialize(gaData->aclXmlDocument); - *aclGrantCountReturn = 0; - - // Set up the RequestParams - RequestParams params = - { - HttpRequestTypeGET, // httpRequestType - { bucketContext->bucketName, // bucketName - bucketContext->protocol, // protocol - bucketContext->uriStyle, // uriStyle - bucketContext->accessKeyId, // accessKeyId - bucketContext->secretAccessKey }, // secretAccessKey - key, // key - 0, // queryParams - "acl", // subResource - 0, // copySourceBucketName - 0, // copySourceKey - 0, // getConditions - 0, // startByte - 0, // byteCount - 0, // putProperties - &getAclPropertiesCallback, // propertiesCallback - 0, // toS3Callback - 0, // toS3CallbackTotalSize - &getAclDataCallback, // fromS3Callback - &getAclCompleteCallback, // completeCallback - gaData // callbackData - }; - - // Perform the request - request_perform(¶ms, requestContext); + // Create the callback data + GetAclData *gaData = (GetAclData *) malloc(sizeof(GetAclData)); + if (!gaData) { + (*(handler->completeCallback))(S3StatusOutOfMemory, 0, callbackData); + return; + } + + gaData->responsePropertiesCallback = handler->propertiesCallback; + gaData->responseCompleteCallback = handler->completeCallback; + gaData->callbackData = callbackData; + + gaData->aclGrantCountReturn = aclGrantCountReturn; + gaData->aclGrants = aclGrants; + gaData->ownerId = ownerId; + gaData->ownerDisplayName = ownerDisplayName; + string_buffer_initialize(gaData->aclXmlDocument); + *aclGrantCountReturn = 0; + + // Set up the RequestParams + RequestParams params = + { + HttpRequestTypeGET, // httpRequestType + { bucketContext->bucketName, // bucketName + bucketContext->protocol, // protocol + bucketContext->uriStyle, // uriStyle + bucketContext->accessKeyId, // accessKeyId + bucketContext->secretAccessKey }, // secretAccessKey + key, // key + 0, // queryParams + "acl", // subResource + 0, // copySourceBucketName + 0, // copySourceKey + 0, // getConditions + 0, // startByte + 0, // byteCount + 0, // putProperties + &getAclPropertiesCallback, // propertiesCallback + 0, // toS3Callback + 0, // toS3CallbackTotalSize + &getAclDataCallback, // fromS3Callback + &getAclCompleteCallback, // completeCallback + gaData // callbackData + }; + + // Perform the request + request_perform(¶ms, requestContext); } // set acl ------------------------------------------------------------------- static S3Status generateAclXmlDocument(const char *ownerId, - const char *ownerDisplayName, - int aclGrantCount, - const S3AclGrant *aclGrants, - int *xmlDocumentLenReturn, - char *xmlDocument, - int xmlDocumentBufferSize) + const char *ownerDisplayName, + int aclGrantCount, + const S3AclGrant *aclGrants, + int *xmlDocumentLenReturn, + char *xmlDocument, + int xmlDocumentBufferSize) { - *xmlDocumentLenReturn = 0; - -#define append(fmt, ...) \ - do { \ - *xmlDocumentLenReturn += snprintf \ - (&(xmlDocument[*xmlDocumentLenReturn]), \ - xmlDocumentBufferSize - *xmlDocumentLenReturn - 1, \ - fmt, __VA_ARGS__); \ - if (*xmlDocumentLenReturn >= xmlDocumentBufferSize) { \ - return S3StatusXmlDocumentTooLarge; \ - } \ - } while (0) - - append("<AccessControlPolicy><Owner><ID>%s</ID><DisplayName>%s" - "</DisplayName></Owner><AccessControlList>", ownerId, - ownerDisplayName); - - int i; - for (i = 0; i < aclGrantCount; i++) { - append("%s", "<Grant><Grantee xmlns:xsi=\"http://www.w3.org/2001/" - "XMLSchema-instance\" xsi:type=\""); - const S3AclGrant *grant = &(aclGrants[i]); - switch (grant->granteeType) { - case S3GranteeTypeAmazonCustomerByEmail: - append("AmazonCustomerByEmail\"><EmailAddress>%s</EmailAddress>", - grant->grantee.amazonCustomerByEmail.emailAddress); - break; - case S3GranteeTypeCanonicalUser: - append("CanonicalUser\"><ID>%s</ID><DisplayName>%s</DisplayName>", - grant->grantee.canonicalUser.id, - grant->grantee.canonicalUser.displayName); - break; - default: { // case S3GranteeTypeAllAwsUsers/S3GranteeTypeAllUsers: - const char *grantee; - switch (grant->granteeType) { - case S3GranteeTypeAllAwsUsers: - grantee = "http://acs.amazonaws.com/groups/global/" - "AuthenticatedUsers"; - break; - case S3GranteeTypeAllUsers: - grantee = "http://acs.amazonaws.com/groups/global/" - "AllUsers"; - break; - default: - grantee = "http://acs.amazonaws.com/groups/s3/" - "LogDelivery"; - break; - } - append("Group\"><URI>%s</URI>", grantee); - } - break; - } - append("</Grantee><Permission>%s</Permission></Grant>", - ((grant->permission == S3PermissionRead) ? "READ" : - (grant->permission == S3PermissionWrite) ? "WRITE" : - (grant->permission == S3PermissionReadACP) ? "READ_ACP" : - (grant->permission == S3PermissionWriteACP) ? "WRITE_ACP" : - "FULL_CONTROL")); - } - - append("%s", "</AccessControlList></AccessControlPolicy>"); - - return S3StatusOK; + *xmlDocumentLenReturn = 0; + +#define append(fmt, ...) \ + do { \ + *xmlDocumentLenReturn += snprintf \ + (&(xmlDocument[*xmlDocumentLenReturn]), \ + xmlDocumentBufferSize - *xmlDocumentLenReturn - 1, \ + fmt, __VA_ARGS__); \ + if (*xmlDocumentLenReturn >= xmlDocumentBufferSize) { \ + return S3StatusXmlDocumentTooLarge; \ + } \ + } while (0) + + append("<AccessControlPolicy><Owner><ID>%s</ID><DisplayName>%s" + "</DisplayName></Owner><AccessControlList>", ownerId, + ownerDisplayName); + + int i; + for (i = 0; i < aclGrantCount; i++) { + append("%s", "<Grant><Grantee xmlns:xsi=\"http://www.w3.org/2001/" + "XMLSchema-instance\" xsi:type=\""); + const S3AclGrant *grant = &(aclGrants[i]); + switch (grant->granteeType) { + case S3GranteeTypeAmazonCustomerByEmail: + append("AmazonCustomerByEmail\"><EmailAddress>%s</EmailAddress>", + grant->grantee.amazonCustomerByEmail.emailAddress); + break; + case S3GranteeTypeCanonicalUser: + append("CanonicalUser\"><ID>%s</ID><DisplayName>%s</DisplayName>", + grant->grantee.canonicalUser.id, + grant->grantee.canonicalUser.displayName); + break; + default: { // case S3GranteeTypeAllAwsUsers/S3GranteeTypeAllUsers: + const char *grantee; + switch (grant->granteeType) { + case S3GranteeTypeAllAwsUsers: + grantee = "http://acs.amazonaws.com/groups/global/" + "AuthenticatedUsers"; + break; + case S3GranteeTypeAllUsers: + grantee = "http://acs.amazonaws.com/groups/global/" + "AllUsers"; + break; + default: + grantee = "http://acs.amazonaws.com/groups/s3/" + "LogDelivery"; + break; + } + append("Group\"><URI>%s</URI>", grantee); + } + break; + } + append("</Grantee><Permission>%s</Permission></Grant>", + ((grant->permission == S3PermissionRead) ? "READ" : + (grant->permission == S3PermissionWrite) ? "WRITE" : + (grant->permission == S3PermissionReadACP) ? "READ_ACP" : + (grant->permission == S3PermissionWriteACP) ? "WRITE_ACP" : + "FULL_CONTROL")); + } + + append("%s", "</AccessControlList></AccessControlPolicy>"); + + return S3StatusOK; } typedef struct SetAclData { - S3ResponsePropertiesCallback *responsePropertiesCallback; - S3ResponseCompleteCallback *responseCompleteCallback; - void *callbackData; + S3ResponsePropertiesCallback *responsePropertiesCallback; + S3ResponseCompleteCallback *responseCompleteCallback; + void *callbackData; - int aclXmlDocumentLen; - char aclXmlDocument[ACL_XML_DOC_MAXSIZE]; - int aclXmlDocumentBytesWritten; + int aclXmlDocumentLen; + char aclXmlDocument[ACL_XML_DOC_MAXSIZE]; + int aclXmlDocumentBytesWritten; } SetAclData; static S3Status setAclPropertiesCallback - (const S3ResponseProperties *responseProperties, void *callbackData) + (const S3ResponseProperties *responseProperties, void *callbackData) { - SetAclData *paData = (SetAclData *) callbackData; - - return (*(paData->responsePropertiesCallback)) - (responseProperties, paData->callbackData); + SetAclData *paData = (SetAclData *) callbackData; + + return (*(paData->responsePropertiesCallback)) + (responseProperties, paData->callbackData); } static int setAclDataCallback(int bufferSize, char *buffer, void *callbackData) { - SetAclData *paData = (SetAclData *) callbackData; + SetAclData *paData = (SetAclData *) callbackData; - int remaining = (paData->aclXmlDocumentLen - - paData->aclXmlDocumentBytesWritten); + int remaining = (paData->aclXmlDocumentLen - + paData->aclXmlDocumentBytesWritten); - int toCopy = bufferSize > remaining ? remaining : bufferSize; - - if (!toCopy) { - return 0; - } + int toCopy = bufferSize > remaining ? remaining : bufferSize; + + if (!toCopy) { + return 0; + } - memcpy(buffer, &(paData->aclXmlDocument - [paData->aclXmlDocumentBytesWritten]), toCopy); + memcpy(buffer, &(paData->aclXmlDocument + [paData->aclXmlDocumentBytesWritten]), toCopy); - paData->aclXmlDocumentBytesWritten += toCopy; + paData->aclXmlDocumentBytesWritten += toCopy; - return toCopy; + return toCopy; } static void setAclCompleteCallback(S3Status requestStatus, - const S3ErrorDetails *s3ErrorDetails, - void *callbackData) + const S3ErrorDetails *s3ErrorDetails, + void *callbackData) { - SetAclData *paData = (SetAclData *) callbackData; + SetAclData *paData = (SetAclData *) callbackData; - (*(paData->responseCompleteCallback)) - (requestStatus, s3ErrorDetails, paData->callbackData); + (*(paData->responseCompleteCallback)) + (requestStatus, s3ErrorDetails, paData->callbackData); - free(paData); + free(paData); } void S3_set_acl(const S3BucketContext *bucketContext, const char *key, - const char *ownerId, const char *ownerDisplayName, - int aclGrantCount, const S3AclGrant *aclGrants, - S3RequestContext *requestContext, - const S3ResponseHandler *handler, void *callbackData) + const char *ownerId, const char *ownerDisplayName, + int aclGrantCount, const S3AclGrant *aclGrants, + S3RequestContext *requestContext, + const S3ResponseHandler *handler, void *callbackData) { - if (aclGrantCount > S3_MAX_ACL_GRANT_COUNT) { - (*(handler->completeCallback)) - (S3StatusTooManyGrants, 0, callbackData); - return; - } - - SetAclData *data = (SetAclData *) malloc(sizeof(SetAclData)); - if (!data) { - (*(handler->completeCallback))(S3StatusOutOfMemory, 0, callbackData); - return; - } - - // Convert aclGrants to XML document - S3Status status = generateAclXmlDocument - (ownerId, ownerDisplayName, aclGrantCount, aclGrants, - &(data->aclXmlDocumentLen), data->aclXmlDocument, - sizeof(data->aclXmlDocument)); - if (status != S3StatusOK) { - free(data); - (*(handler->completeCallback))(status, 0, callbackData); - return; - } - - data->responsePropertiesCallback = handler->propertiesCallback; - data->responseCompleteCallback = handler->completeCallback; - data->callbackData = callbackData; - - data->aclXmlDocumentBytesWritten = 0; - - // Set up the RequestParams - RequestParams params = - { - HttpRequestTypePUT, // httpRequestType - { bucketContext->bucketName, // bucketName - bucketContext->protocol, // protocol - bucketContext->uriStyle, // uriStyle - bucketContext->accessKeyId, // accessKeyId - bucketContext->secretAccessKey }, // secretAccessKey - key, // key - 0, // queryParams - "acl", // subResource - 0, // copySourceBucketName - 0, // copySourceKey - 0, // getConditions - 0, // startByte - 0, // byteCount - 0, // putProperties - &setAclPropertiesCallback, // propertiesCallback - &setAclDataCallback, // toS3Callback - data->aclXmlDocumentLen, // toS3CallbackTotalSize - 0, // fromS3Callback - &setAclCompleteCallback, // completeCallback - data // callbackData - }; - - // Perform the request - request_perform(¶ms, requestContext); + if (aclGrantCount > S3_MAX_ACL_GRANT_COUNT) { + (*(handler->completeCallback)) + (S3StatusTooManyGrants, 0, callbackData); + return; + } + + SetAclData *data = (SetAclData *) malloc(sizeof(SetAclData)); + if (!data) { + (*(handler->completeCallback))(S3StatusOutOfMemory, 0, callbackData); + return; + } + + // Convert aclGrants to XML document + S3Status status = generateAclXmlDocument + (ownerId, ownerDisplayName, aclGrantCount, aclGrants, + &(data->aclXmlDocumentLen), data->aclXmlDocument, + sizeof(data->aclXmlDocument)); + if (status != S3StatusOK) { + free(data); + (*(handler->completeCallback))(status, 0, callbackData); + return; + } + + data->responsePropertiesCallback = handler->propertiesCallback; + data->responseCompleteCallback = handler->completeCallback; + data->callbackData = callbackData; + + data->aclXmlDocumentBytesWritten = 0; + + // Set up the RequestParams + RequestParams params = + { + HttpRequestTypePUT, // httpRequestType + { bucketContext->bucketName, // bucketName + bucketContext->protocol, // protocol + bucketContext->uriStyle, // uriStyle + bucketContext->accessKeyId, // accessKeyId + bucketContext->secretAccessKey }, // secretAccessKey + key, // key + 0, // queryParams + "acl", // subResource + 0, // copySourceBucketName + 0, // copySourceKey + 0, // getConditions + 0, // startByte + 0, // byteCount + 0, // putProperties + &setAclPropertiesCallback, // propertiesCallback + &setAclDataCallback, // toS3Callback + data->aclXmlDocumentLen, // toS3CallbackTotalSize + 0, // fromS3Callback + &setAclCompleteCallback, // completeCallback + data // callbackData + }; + + // Perform the request + request_perform(¶ms, requestContext); } |