Skip to content

Commit cec7e71

Browse files
committed
Storage/List Handles Access Rights (Azure#4585)
* List Handles Access Rights * Fix ListHandles return empty list bug
1 parent e544371 commit cec7e71

File tree

8 files changed

+176
-55
lines changed

8 files changed

+176
-55
lines changed

sdk/storage/azure-storage-files-shares/inc/azure/storage/files/shares/rest_client.hpp

Lines changed: 16 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1091,25 +1091,23 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares {
10911091
std::string NextMarker;
10921092
Nullable<std::string> DirectoryId;
10931093
};
1094-
} // namespace _detail
1095-
/**
1096-
* @brief Access rights of the access policy.
1097-
*/
1098-
class AccessRight final {
1099-
public:
1100-
AccessRight() = default;
1101-
explicit AccessRight(std::string value) : m_value(std::move(value)) {}
1102-
bool operator==(const AccessRight& other) const { return m_value == other.m_value; }
1103-
bool operator!=(const AccessRight& other) const { return !(*this == other); }
1104-
const std::string& ToString() const { return m_value; }
1105-
AZ_STORAGE_FILES_SHARES_DLLEXPORT const static AccessRight Read;
1106-
AZ_STORAGE_FILES_SHARES_DLLEXPORT const static AccessRight Write;
1107-
AZ_STORAGE_FILES_SHARES_DLLEXPORT const static AccessRight Delete;
1094+
/**
1095+
* @brief Access rights of the access policy.
1096+
*/
1097+
class AccessRight final {
1098+
public:
1099+
AccessRight() = default;
1100+
explicit AccessRight(std::string value) : m_value(std::move(value)) {}
1101+
bool operator==(const AccessRight& other) const { return m_value == other.m_value; }
1102+
bool operator!=(const AccessRight& other) const { return !(*this == other); }
1103+
const std::string& ToString() const { return m_value; }
1104+
AZ_STORAGE_FILES_SHARES_DLLEXPORT const static AccessRight Read;
1105+
AZ_STORAGE_FILES_SHARES_DLLEXPORT const static AccessRight Write;
1106+
AZ_STORAGE_FILES_SHARES_DLLEXPORT const static AccessRight Delete;
11081107

1109-
private:
1110-
std::string m_value;
1111-
};
1112-
namespace _detail {
1108+
private:
1109+
std::string m_value;
1110+
};
11131111
/**
11141112
* @brief A listed Azure Storage handle item.
11151113
*/

sdk/storage/azure-storage-files-shares/inc/azure/storage/files/shares/share_responses.hpp

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,43 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares {
190190
DateTime LastModified;
191191
};
192192

193+
enum class ShareFileHandleAccessRights
194+
{
195+
Read = 1,
196+
Write = 2,
197+
Delete = 4,
198+
};
199+
inline ShareFileHandleAccessRights operator|(
200+
ShareFileHandleAccessRights lhs,
201+
ShareFileHandleAccessRights rhs)
202+
{
203+
using type = std::underlying_type_t<ShareFileHandleAccessRights>;
204+
return static_cast<ShareFileHandleAccessRights>(
205+
static_cast<type>(lhs) | static_cast<type>(rhs));
206+
}
207+
inline ShareFileHandleAccessRights& operator|=(
208+
ShareFileHandleAccessRights& lhs,
209+
ShareFileHandleAccessRights rhs)
210+
{
211+
lhs = lhs | rhs;
212+
return lhs;
213+
}
214+
inline ShareFileHandleAccessRights operator&(
215+
ShareFileHandleAccessRights lhs,
216+
ShareFileHandleAccessRights rhs)
217+
{
218+
using type = std::underlying_type_t<ShareFileHandleAccessRights>;
219+
return static_cast<ShareFileHandleAccessRights>(
220+
static_cast<type>(lhs) & static_cast<type>(rhs));
221+
}
222+
inline ShareFileHandleAccessRights& operator&=(
223+
ShareFileHandleAccessRights& lhs,
224+
ShareFileHandleAccessRights rhs)
225+
{
226+
lhs = lhs & rhs;
227+
return lhs;
228+
}
229+
193230
/**
194231
* @brief A listed directory item.
195232
*/
@@ -251,6 +288,10 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares {
251288
* Time handle was last connected to (UTC).
252289
*/
253290
DateTime LastReconnectedOn;
291+
/**
292+
* Access rights of the handle.
293+
*/
294+
Azure::Nullable<ShareFileHandleAccessRights> accessRights;
254295
};
255296
} // namespace Models
256297

sdk/storage/azure-storage-files-shares/src/rest_client.cpp

Lines changed: 39 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -184,9 +184,11 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares {
184184
const FileAttributes FileAttributes::Offline("Offline");
185185
const FileAttributes FileAttributes::NotContentIndexed("NotContentIndexed");
186186
const FileAttributes FileAttributes::NoScrubData("NoScrubData");
187-
const AccessRight AccessRight::Read("Read");
188-
const AccessRight AccessRight::Write("Write");
189-
const AccessRight AccessRight::Delete("Delete");
187+
namespace _detail {
188+
const AccessRight AccessRight::Read("Read");
189+
const AccessRight AccessRight::Write("Write");
190+
const AccessRight AccessRight::Delete("Delete");
191+
} // namespace _detail
190192
const CopyStatus CopyStatus::Pending("pending");
191193
const CopyStatus CopyStatus::Success("success");
192194
const CopyStatus CopyStatus::Aborted("aborted");
@@ -2436,7 +2438,7 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares {
24362438
{
24372439
kUnknown,
24382440
kEnumerationResults,
2439-
kHandleList,
2441+
kEntries,
24402442
kHandle,
24412443
kHandleId,
24422444
kPath,
@@ -2452,7 +2454,7 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares {
24522454
};
24532455
const std::unordered_map<std::string, XmlTagEnum> XmlTagEnumMap{
24542456
{"EnumerationResults", XmlTagEnum::kEnumerationResults},
2455-
{"HandleList", XmlTagEnum::kHandleList},
2457+
{"Entries", XmlTagEnum::kEntries},
24562458
{"Handle", XmlTagEnum::kHandle},
24572459
{"HandleId", XmlTagEnum::kHandleId},
24582460
{"Path", XmlTagEnum::kPath},
@@ -2468,7 +2470,7 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares {
24682470
};
24692471
std::vector<XmlTagEnum> xmlPath;
24702472
Models::_detail::HandleItem vectorElement1;
2471-
Models::AccessRight vectorElement2;
2473+
Models::_detail::AccessRight vectorElement2;
24722474
while (true)
24732475
{
24742476
auto node = reader.Read();
@@ -2484,69 +2486,69 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares {
24842486
else if (node.Type == _internal::XmlNodeType::Text)
24852487
{
24862488
if (xmlPath.size() == 4 && xmlPath[0] == XmlTagEnum::kEnumerationResults
2487-
&& xmlPath[1] == XmlTagEnum::kHandleList && xmlPath[2] == XmlTagEnum::kHandle
2489+
&& xmlPath[1] == XmlTagEnum::kEntries && xmlPath[2] == XmlTagEnum::kHandle
24882490
&& xmlPath[3] == XmlTagEnum::kHandleId)
24892491
{
24902492
vectorElement1.HandleId = node.Value;
24912493
}
24922494
else if (
24932495
xmlPath.size() == 4 && xmlPath[0] == XmlTagEnum::kEnumerationResults
2494-
&& xmlPath[1] == XmlTagEnum::kHandleList && xmlPath[2] == XmlTagEnum::kHandle
2496+
&& xmlPath[1] == XmlTagEnum::kEntries && xmlPath[2] == XmlTagEnum::kHandle
24952497
&& xmlPath[3] == XmlTagEnum::kPath)
24962498
{
24972499
vectorElement1.Path.Content = node.Value;
24982500
}
24992501
else if (
25002502
xmlPath.size() == 4 && xmlPath[0] == XmlTagEnum::kEnumerationResults
2501-
&& xmlPath[1] == XmlTagEnum::kHandleList && xmlPath[2] == XmlTagEnum::kHandle
2503+
&& xmlPath[1] == XmlTagEnum::kEntries && xmlPath[2] == XmlTagEnum::kHandle
25022504
&& xmlPath[3] == XmlTagEnum::kFileId)
25032505
{
25042506
vectorElement1.FileId = node.Value;
25052507
}
25062508
else if (
25072509
xmlPath.size() == 4 && xmlPath[0] == XmlTagEnum::kEnumerationResults
2508-
&& xmlPath[1] == XmlTagEnum::kHandleList && xmlPath[2] == XmlTagEnum::kHandle
2510+
&& xmlPath[1] == XmlTagEnum::kEntries && xmlPath[2] == XmlTagEnum::kHandle
25092511
&& xmlPath[3] == XmlTagEnum::kParentId)
25102512
{
25112513
vectorElement1.ParentId = node.Value;
25122514
}
25132515
else if (
25142516
xmlPath.size() == 4 && xmlPath[0] == XmlTagEnum::kEnumerationResults
2515-
&& xmlPath[1] == XmlTagEnum::kHandleList && xmlPath[2] == XmlTagEnum::kHandle
2517+
&& xmlPath[1] == XmlTagEnum::kEntries && xmlPath[2] == XmlTagEnum::kHandle
25162518
&& xmlPath[3] == XmlTagEnum::kSessionId)
25172519
{
25182520
vectorElement1.SessionId = node.Value;
25192521
}
25202522
else if (
25212523
xmlPath.size() == 4 && xmlPath[0] == XmlTagEnum::kEnumerationResults
2522-
&& xmlPath[1] == XmlTagEnum::kHandleList && xmlPath[2] == XmlTagEnum::kHandle
2524+
&& xmlPath[1] == XmlTagEnum::kEntries && xmlPath[2] == XmlTagEnum::kHandle
25232525
&& xmlPath[3] == XmlTagEnum::kClientIp)
25242526
{
25252527
vectorElement1.ClientIp = node.Value;
25262528
}
25272529
else if (
25282530
xmlPath.size() == 4 && xmlPath[0] == XmlTagEnum::kEnumerationResults
2529-
&& xmlPath[1] == XmlTagEnum::kHandleList && xmlPath[2] == XmlTagEnum::kHandle
2531+
&& xmlPath[1] == XmlTagEnum::kEntries && xmlPath[2] == XmlTagEnum::kHandle
25302532
&& xmlPath[3] == XmlTagEnum::kOpenTime)
25312533
{
25322534
vectorElement1.OpenedOn
25332535
= DateTime::Parse(node.Value, Azure::DateTime::DateFormat::Rfc1123);
25342536
}
25352537
else if (
25362538
xmlPath.size() == 4 && xmlPath[0] == XmlTagEnum::kEnumerationResults
2537-
&& xmlPath[1] == XmlTagEnum::kHandleList && xmlPath[2] == XmlTagEnum::kHandle
2539+
&& xmlPath[1] == XmlTagEnum::kEntries && xmlPath[2] == XmlTagEnum::kHandle
25382540
&& xmlPath[3] == XmlTagEnum::kLastReconnectTime)
25392541
{
25402542
vectorElement1.LastReconnectedOn
25412543
= DateTime::Parse(node.Value, Azure::DateTime::DateFormat::Rfc1123);
25422544
}
25432545
else if (
25442546
xmlPath.size() == 5 && xmlPath[0] == XmlTagEnum::kEnumerationResults
2545-
&& xmlPath[1] == XmlTagEnum::kHandleList && xmlPath[2] == XmlTagEnum::kHandle
2547+
&& xmlPath[1] == XmlTagEnum::kEntries && xmlPath[2] == XmlTagEnum::kHandle
25462548
&& xmlPath[3] == XmlTagEnum::kAccessRightList
25472549
&& xmlPath[4] == XmlTagEnum::kAccessRight)
25482550
{
2549-
vectorElement2 = Models::AccessRight(node.Value);
2551+
vectorElement2 = Models::_detail::AccessRight(node.Value);
25502552
}
25512553
else if (
25522554
xmlPath.size() == 2 && xmlPath[0] == XmlTagEnum::kEnumerationResults
@@ -2558,7 +2560,7 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares {
25582560
else if (node.Type == _internal::XmlNodeType::Attribute)
25592561
{
25602562
if (xmlPath.size() == 4 && xmlPath[0] == XmlTagEnum::kEnumerationResults
2561-
&& xmlPath[1] == XmlTagEnum::kHandleList && xmlPath[2] == XmlTagEnum::kHandle
2563+
&& xmlPath[1] == XmlTagEnum::kEntries && xmlPath[2] == XmlTagEnum::kHandle
25622564
&& xmlPath[3] == XmlTagEnum::kPath && node.Name == "Encoded")
25632565
{
25642566
vectorElement1.Path.Encoded = node.Value == std::string("true");
@@ -2567,16 +2569,16 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares {
25672569
else if (node.Type == _internal::XmlNodeType::EndTag)
25682570
{
25692571
if (xmlPath.size() == 5 && xmlPath[0] == XmlTagEnum::kEnumerationResults
2570-
&& xmlPath[1] == XmlTagEnum::kHandleList && xmlPath[2] == XmlTagEnum::kHandle
2572+
&& xmlPath[1] == XmlTagEnum::kEntries && xmlPath[2] == XmlTagEnum::kHandle
25712573
&& xmlPath[3] == XmlTagEnum::kAccessRightList
25722574
&& xmlPath[4] == XmlTagEnum::kAccessRight)
25732575
{
25742576
vectorElement1.AccessRightList.push_back(std::move(vectorElement2));
2575-
vectorElement2 = Models::AccessRight();
2577+
vectorElement2 = Models::_detail::AccessRight();
25762578
}
25772579
else if (
25782580
xmlPath.size() == 3 && xmlPath[0] == XmlTagEnum::kEnumerationResults
2579-
&& xmlPath[1] == XmlTagEnum::kHandleList && xmlPath[2] == XmlTagEnum::kHandle)
2581+
&& xmlPath[1] == XmlTagEnum::kEntries && xmlPath[2] == XmlTagEnum::kHandle)
25802582
{
25812583
response.HandleList.push_back(std::move(vectorElement1));
25822584
vectorElement1 = Models::_detail::HandleItem();
@@ -4015,7 +4017,7 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares {
40154017
{
40164018
kUnknown,
40174019
kEnumerationResults,
4018-
kHandleList,
4020+
kEntries,
40194021
kHandle,
40204022
kHandleId,
40214023
kPath,
@@ -4031,7 +4033,7 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares {
40314033
};
40324034
const std::unordered_map<std::string, XmlTagEnum> XmlTagEnumMap{
40334035
{"EnumerationResults", XmlTagEnum::kEnumerationResults},
4034-
{"HandleList", XmlTagEnum::kHandleList},
4036+
{"Entries", XmlTagEnum::kEntries},
40354037
{"Handle", XmlTagEnum::kHandle},
40364038
{"HandleId", XmlTagEnum::kHandleId},
40374039
{"Path", XmlTagEnum::kPath},
@@ -4047,7 +4049,7 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares {
40474049
};
40484050
std::vector<XmlTagEnum> xmlPath;
40494051
Models::_detail::HandleItem vectorElement1;
4050-
Models::AccessRight vectorElement2;
4052+
Models::_detail::AccessRight vectorElement2;
40514053
while (true)
40524054
{
40534055
auto node = reader.Read();
@@ -4063,69 +4065,69 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares {
40634065
else if (node.Type == _internal::XmlNodeType::Text)
40644066
{
40654067
if (xmlPath.size() == 4 && xmlPath[0] == XmlTagEnum::kEnumerationResults
4066-
&& xmlPath[1] == XmlTagEnum::kHandleList && xmlPath[2] == XmlTagEnum::kHandle
4068+
&& xmlPath[1] == XmlTagEnum::kEntries && xmlPath[2] == XmlTagEnum::kHandle
40674069
&& xmlPath[3] == XmlTagEnum::kHandleId)
40684070
{
40694071
vectorElement1.HandleId = node.Value;
40704072
}
40714073
else if (
40724074
xmlPath.size() == 4 && xmlPath[0] == XmlTagEnum::kEnumerationResults
4073-
&& xmlPath[1] == XmlTagEnum::kHandleList && xmlPath[2] == XmlTagEnum::kHandle
4075+
&& xmlPath[1] == XmlTagEnum::kEntries && xmlPath[2] == XmlTagEnum::kHandle
40744076
&& xmlPath[3] == XmlTagEnum::kPath)
40754077
{
40764078
vectorElement1.Path.Content = node.Value;
40774079
}
40784080
else if (
40794081
xmlPath.size() == 4 && xmlPath[0] == XmlTagEnum::kEnumerationResults
4080-
&& xmlPath[1] == XmlTagEnum::kHandleList && xmlPath[2] == XmlTagEnum::kHandle
4082+
&& xmlPath[1] == XmlTagEnum::kEntries && xmlPath[2] == XmlTagEnum::kHandle
40814083
&& xmlPath[3] == XmlTagEnum::kFileId)
40824084
{
40834085
vectorElement1.FileId = node.Value;
40844086
}
40854087
else if (
40864088
xmlPath.size() == 4 && xmlPath[0] == XmlTagEnum::kEnumerationResults
4087-
&& xmlPath[1] == XmlTagEnum::kHandleList && xmlPath[2] == XmlTagEnum::kHandle
4089+
&& xmlPath[1] == XmlTagEnum::kEntries && xmlPath[2] == XmlTagEnum::kHandle
40884090
&& xmlPath[3] == XmlTagEnum::kParentId)
40894091
{
40904092
vectorElement1.ParentId = node.Value;
40914093
}
40924094
else if (
40934095
xmlPath.size() == 4 && xmlPath[0] == XmlTagEnum::kEnumerationResults
4094-
&& xmlPath[1] == XmlTagEnum::kHandleList && xmlPath[2] == XmlTagEnum::kHandle
4096+
&& xmlPath[1] == XmlTagEnum::kEntries && xmlPath[2] == XmlTagEnum::kHandle
40954097
&& xmlPath[3] == XmlTagEnum::kSessionId)
40964098
{
40974099
vectorElement1.SessionId = node.Value;
40984100
}
40994101
else if (
41004102
xmlPath.size() == 4 && xmlPath[0] == XmlTagEnum::kEnumerationResults
4101-
&& xmlPath[1] == XmlTagEnum::kHandleList && xmlPath[2] == XmlTagEnum::kHandle
4103+
&& xmlPath[1] == XmlTagEnum::kEntries && xmlPath[2] == XmlTagEnum::kHandle
41024104
&& xmlPath[3] == XmlTagEnum::kClientIp)
41034105
{
41044106
vectorElement1.ClientIp = node.Value;
41054107
}
41064108
else if (
41074109
xmlPath.size() == 4 && xmlPath[0] == XmlTagEnum::kEnumerationResults
4108-
&& xmlPath[1] == XmlTagEnum::kHandleList && xmlPath[2] == XmlTagEnum::kHandle
4110+
&& xmlPath[1] == XmlTagEnum::kEntries && xmlPath[2] == XmlTagEnum::kHandle
41094111
&& xmlPath[3] == XmlTagEnum::kOpenTime)
41104112
{
41114113
vectorElement1.OpenedOn
41124114
= DateTime::Parse(node.Value, Azure::DateTime::DateFormat::Rfc1123);
41134115
}
41144116
else if (
41154117
xmlPath.size() == 4 && xmlPath[0] == XmlTagEnum::kEnumerationResults
4116-
&& xmlPath[1] == XmlTagEnum::kHandleList && xmlPath[2] == XmlTagEnum::kHandle
4118+
&& xmlPath[1] == XmlTagEnum::kEntries && xmlPath[2] == XmlTagEnum::kHandle
41174119
&& xmlPath[3] == XmlTagEnum::kLastReconnectTime)
41184120
{
41194121
vectorElement1.LastReconnectedOn
41204122
= DateTime::Parse(node.Value, Azure::DateTime::DateFormat::Rfc1123);
41214123
}
41224124
else if (
41234125
xmlPath.size() == 5 && xmlPath[0] == XmlTagEnum::kEnumerationResults
4124-
&& xmlPath[1] == XmlTagEnum::kHandleList && xmlPath[2] == XmlTagEnum::kHandle
4126+
&& xmlPath[1] == XmlTagEnum::kEntries && xmlPath[2] == XmlTagEnum::kHandle
41254127
&& xmlPath[3] == XmlTagEnum::kAccessRightList
41264128
&& xmlPath[4] == XmlTagEnum::kAccessRight)
41274129
{
4128-
vectorElement2 = Models::AccessRight(node.Value);
4130+
vectorElement2 = Models::_detail::AccessRight(node.Value);
41294131
}
41304132
else if (
41314133
xmlPath.size() == 2 && xmlPath[0] == XmlTagEnum::kEnumerationResults
@@ -4137,7 +4139,7 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares {
41374139
else if (node.Type == _internal::XmlNodeType::Attribute)
41384140
{
41394141
if (xmlPath.size() == 4 && xmlPath[0] == XmlTagEnum::kEnumerationResults
4140-
&& xmlPath[1] == XmlTagEnum::kHandleList && xmlPath[2] == XmlTagEnum::kHandle
4142+
&& xmlPath[1] == XmlTagEnum::kEntries && xmlPath[2] == XmlTagEnum::kHandle
41414143
&& xmlPath[3] == XmlTagEnum::kPath && node.Name == "Encoded")
41424144
{
41434145
vectorElement1.Path.Encoded = node.Value == std::string("true");
@@ -4146,16 +4148,16 @@ namespace Azure { namespace Storage { namespace Files { namespace Shares {
41464148
else if (node.Type == _internal::XmlNodeType::EndTag)
41474149
{
41484150
if (xmlPath.size() == 5 && xmlPath[0] == XmlTagEnum::kEnumerationResults
4149-
&& xmlPath[1] == XmlTagEnum::kHandleList && xmlPath[2] == XmlTagEnum::kHandle
4151+
&& xmlPath[1] == XmlTagEnum::kEntries && xmlPath[2] == XmlTagEnum::kHandle
41504152
&& xmlPath[3] == XmlTagEnum::kAccessRightList
41514153
&& xmlPath[4] == XmlTagEnum::kAccessRight)
41524154
{
41534155
vectorElement1.AccessRightList.push_back(std::move(vectorElement2));
4154-
vectorElement2 = Models::AccessRight();
4156+
vectorElement2 = Models::_detail::AccessRight();
41554157
}
41564158
else if (
41574159
xmlPath.size() == 3 && xmlPath[0] == XmlTagEnum::kEnumerationResults
4158-
&& xmlPath[1] == XmlTagEnum::kHandleList && xmlPath[2] == XmlTagEnum::kHandle)
4160+
&& xmlPath[1] == XmlTagEnum::kEntries && xmlPath[2] == XmlTagEnum::kHandle)
41594161
{
41604162
response.HandleList.push_back(std::move(vectorElement1));
41614163
vectorElement1 = Models::_detail::HandleItem();

0 commit comments

Comments
 (0)