resource_name.c 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. /**
  2. * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
  3. * SPDX-License-Identifier: Apache-2.0.
  4. */
  5. #include <aws/sdkutils/resource_name.h>
  6. #define ARN_SPLIT_COUNT ((size_t)5)
  7. #define ARN_PARTS_COUNT ((size_t)6)
  8. static const char ARN_DELIMETER[] = ":";
  9. static const char ARN_DELIMETER_CHAR = ':';
  10. static const size_t DELIMETER_LEN = 8; /* strlen("arn:::::") */
  11. int aws_resource_name_init_from_cur(struct aws_resource_name *arn, const struct aws_byte_cursor *input) {
  12. struct aws_byte_cursor arn_parts[ARN_PARTS_COUNT];
  13. struct aws_array_list arn_part_list;
  14. aws_array_list_init_static(&arn_part_list, arn_parts, ARN_PARTS_COUNT, sizeof(struct aws_byte_cursor));
  15. if (aws_byte_cursor_split_on_char_n(input, ARN_DELIMETER_CHAR, ARN_SPLIT_COUNT, &arn_part_list)) {
  16. return aws_raise_error(AWS_ERROR_MALFORMED_INPUT_STRING);
  17. }
  18. struct aws_byte_cursor *arn_prefix;
  19. if (aws_array_list_get_at_ptr(&arn_part_list, (void **)&arn_prefix, 0) ||
  20. !aws_byte_cursor_eq_c_str(arn_prefix, "arn")) {
  21. return aws_raise_error(AWS_ERROR_MALFORMED_INPUT_STRING);
  22. }
  23. if (aws_array_list_get_at(&arn_part_list, &arn->partition, 1)) {
  24. return aws_raise_error(AWS_ERROR_MALFORMED_INPUT_STRING);
  25. }
  26. if (aws_array_list_get_at(&arn_part_list, &arn->service, 2)) {
  27. return aws_raise_error(AWS_ERROR_MALFORMED_INPUT_STRING);
  28. }
  29. if (aws_array_list_get_at(&arn_part_list, &arn->region, 3)) {
  30. return aws_raise_error(AWS_ERROR_MALFORMED_INPUT_STRING);
  31. }
  32. if (aws_array_list_get_at(&arn_part_list, &arn->account_id, 4)) {
  33. return aws_raise_error(AWS_ERROR_MALFORMED_INPUT_STRING);
  34. }
  35. if (aws_array_list_get_at(&arn_part_list, &arn->resource_id, 5)) {
  36. return aws_raise_error(AWS_ERROR_MALFORMED_INPUT_STRING);
  37. }
  38. return AWS_OP_SUCCESS;
  39. }
  40. int aws_resource_name_length(const struct aws_resource_name *arn, size_t *size) {
  41. AWS_PRECONDITION(aws_byte_cursor_is_valid(&arn->partition));
  42. AWS_PRECONDITION(aws_byte_cursor_is_valid(&arn->service));
  43. AWS_PRECONDITION(aws_byte_cursor_is_valid(&arn->region));
  44. AWS_PRECONDITION(aws_byte_cursor_is_valid(&arn->account_id));
  45. AWS_PRECONDITION(aws_byte_cursor_is_valid(&arn->resource_id));
  46. *size = arn->partition.len + arn->region.len + arn->service.len + arn->account_id.len + arn->resource_id.len +
  47. DELIMETER_LEN;
  48. return AWS_OP_SUCCESS;
  49. }
  50. int aws_byte_buf_append_resource_name(struct aws_byte_buf *buf, const struct aws_resource_name *arn) {
  51. AWS_PRECONDITION(aws_byte_buf_is_valid(buf));
  52. AWS_PRECONDITION(aws_byte_cursor_is_valid(&arn->partition));
  53. AWS_PRECONDITION(aws_byte_cursor_is_valid(&arn->service));
  54. AWS_PRECONDITION(aws_byte_cursor_is_valid(&arn->region));
  55. AWS_PRECONDITION(aws_byte_cursor_is_valid(&arn->account_id));
  56. AWS_PRECONDITION(aws_byte_cursor_is_valid(&arn->resource_id));
  57. const struct aws_byte_cursor prefix = AWS_BYTE_CUR_INIT_FROM_STRING_LITERAL("arn:");
  58. const struct aws_byte_cursor colon_cur = AWS_BYTE_CUR_INIT_FROM_STRING_LITERAL(ARN_DELIMETER);
  59. if (aws_byte_buf_append(buf, &prefix)) {
  60. return aws_raise_error(aws_last_error());
  61. }
  62. if (aws_byte_buf_append(buf, &arn->partition)) {
  63. return aws_raise_error(aws_last_error());
  64. }
  65. if (aws_byte_buf_append(buf, &colon_cur)) {
  66. return aws_raise_error(aws_last_error());
  67. }
  68. if (aws_byte_buf_append(buf, &arn->service)) {
  69. return aws_raise_error(aws_last_error());
  70. }
  71. if (aws_byte_buf_append(buf, &colon_cur)) {
  72. return aws_raise_error(aws_last_error());
  73. }
  74. if (aws_byte_buf_append(buf, &arn->region)) {
  75. return aws_raise_error(aws_last_error());
  76. }
  77. if (aws_byte_buf_append(buf, &colon_cur)) {
  78. return aws_raise_error(aws_last_error());
  79. }
  80. if (aws_byte_buf_append(buf, &arn->account_id)) {
  81. return aws_raise_error(aws_last_error());
  82. }
  83. if (aws_byte_buf_append(buf, &colon_cur)) {
  84. return aws_raise_error(aws_last_error());
  85. }
  86. if (aws_byte_buf_append(buf, &arn->resource_id)) {
  87. return aws_raise_error(aws_last_error());
  88. }
  89. AWS_POSTCONDITION(aws_byte_buf_is_valid(buf));
  90. return AWS_OP_SUCCESS;
  91. }