@@ -76,6 +76,7 @@ def __init__(self, raz_url, raz_token, username, service='s3', service_name='cm_
76
76
self .raz_token = raz_token
77
77
self .username = username
78
78
self .service = service
79
+
79
80
if self .service == 'adls' :
80
81
self .service_params = {
81
82
'endpoint_prefix' : 'adls' ,
@@ -88,6 +89,7 @@ def __init__(self, raz_url, raz_token, username, service='s3', service_name='cm_
88
89
'service_name' : 's3' ,
89
90
'serviceType' : 's3'
90
91
}
92
+
91
93
self .service_name = service_name
92
94
self .cluster_name = cluster_name
93
95
self .requestid = str (uuid .uuid4 ())
@@ -100,51 +102,34 @@ def check_access(self, method, url, params=None, headers=None):
100
102
params = params if params is not None else {}
101
103
headers = headers if headers is not None else {}
102
104
103
- allparams = [raz_signer .StringListStringMapProto (key = key , value = [val ]) for key , val in url_params .items ()]
104
- allparams .extend ([raz_signer .StringListStringMapProto (key = key , value = [val ]) for key , val in params .items ()])
105
- headers = [raz_signer .StringStringMapProto (key = key , value = val ) for key , val in headers .items ()]
106
105
endpoint = "%s://%s" % (path .scheme , path .netloc )
107
106
resource_path = path .path .lstrip ("/" )
108
107
109
- LOG .debug (
110
- "Preparing sign request with http_method: {%s}, headers: {%s}, parameters: {%s}, endpoint: {%s}, resource_path: {%s}" %
111
- (method , headers , allparams , endpoint , resource_path )
112
- )
113
- raz_req = raz_signer .SignRequestProto (
114
- endpoint_prefix = self .service_params ['endpoint_prefix' ],
115
- service_name = self .service_params ['service_name' ],
116
- endpoint = endpoint ,
117
- http_method = method ,
118
- headers = headers ,
119
- parameters = allparams ,
120
- resource_path = resource_path ,
121
- time_offset = 0
122
- )
123
- raz_req_serialized = raz_req .SerializeToString ()
124
- signed_request = base64 .b64encode (raz_req_serialized )
125
-
126
108
request_data = {
127
109
"requestId" : self .requestid ,
128
110
"serviceType" : self .service_params ['serviceType' ],
129
111
"serviceName" : self .service_name ,
130
112
"user" : self .username ,
131
113
"userGroups" : [],
132
- "accessTime" : "" ,
133
114
"clientIpAddress" : "" ,
134
115
"clientType" : "" ,
135
116
"clusterName" : self .cluster_name ,
136
117
"clusterType" : "" ,
137
118
"sessionId" : "" ,
138
- "context" : {
139
- "S3_SIGN_REQUEST" : signed_request
140
- }
119
+ "accessTime" : "" ,
120
+ "context" : {}
141
121
}
142
- headers = {"Content-Type" :"application/json" , "Accept-Encoding" :"gzip,deflate" }
143
- raz_url = "%s/api/authz/s3/access?delegation=%s" % (self .raz_url , self .raz_token )
144
- LOG .debug ('Raz url: %s' % raz_url )
122
+ request_headers = {"Content-Type" : "application/json" }
123
+ raz_url = "%s/api/authz/%s/access?delegation=%s" % (self .raz_url , self .service , self .raz_token )
145
124
146
- LOG .debug ("Sending access check headers: {%s} request_data: {%s}" % (headers , request_data ))
147
- raz_req = requests .post (raz_url , headers = headers , json = request_data , verify = False )
125
+ if self .service == 'adls' :
126
+ self ._make_adls_request (request_data , path , resource_path )
127
+ elif self .service == 's3' :
128
+ self ._make_s3_request (request_data , request_headers , method , params , headers , url_params , endpoint , resource_path )
129
+
130
+ LOG .debug ('Raz url: %s' % raz_url )
131
+ LOG .debug ("Sending access check headers: {%s} request_data: {%s}" % (request_headers , request_data ))
132
+ raz_req = requests .post (raz_url , headers = request_headers , json = request_data , verify = False )
148
133
149
134
signed_response_result = None
150
135
signed_response = None
@@ -164,21 +149,67 @@ def check_access(self, method, url, params=None, headers=None):
164
149
if result == "ALLOWED" :
165
150
LOG .debug ('Received allowed response %s' % raz_req .json ())
166
151
signed_response_data = raz_req .json ()["operResult" ]["additionalInfo" ]
152
+
167
153
if self .service == 'adls' :
168
154
LOG .debug ("Received SAS %s" % signed_response_data ["ADLS_DSAS" ])
169
155
return {'token' : signed_response_data ["ADLS_DSAS" ]}
170
156
else :
171
157
signed_response_result = signed_response_data ["S3_SIGN_RESPONSE" ]
172
158
173
- if signed_response_result :
159
+ if signed_response_result is not None :
174
160
raz_response_proto = raz_signer .SignResponseProto ()
175
161
signed_response = raz_response_proto .FromString (base64 .b64decode (signed_response_result ))
176
162
LOG .debug ("Received signed Response %s" % signed_response )
177
163
178
164
# Signed headers "only"
179
- if signed_response :
165
+ if signed_response is not None :
180
166
return dict ([(i .key , i .value ) for i in signed_response .signer_generated_headers ])
181
167
168
+ def _make_adls_request (self , request_data , path , resource_path ):
169
+ storage_account = path .netloc .split ('.' )[0 ]
170
+ container , relative_path = resource_path .split ('/' , 1 )
171
+
172
+ request_data .update ({
173
+ "clientType" : "adls" ,
174
+ "operation" : {
175
+ "resource" : {
176
+ "storageaccount" : storage_account ,
177
+ "container" : container ,
178
+ "relativepath" : relative_path ,
179
+ },
180
+ "resourceOwner" : "" ,
181
+ "action" : "read" ,
182
+ "accessTypes" :["read" ]
183
+ }
184
+ })
185
+
186
+ def _make_s3_request (self , request_data , request_headers , method , params , headers , url_params , endpoint , resource_path ):
187
+
188
+ allparams = [raz_signer .StringListStringMapProto (key = key , value = [val ]) for key , val in url_params .items ()]
189
+ allparams .extend ([raz_signer .StringListStringMapProto (key = key , value = [val ]) for key , val in params .items ()])
190
+ headers = [raz_signer .StringStringMapProto (key = key , value = val ) for key , val in headers .items ()]
191
+
192
+ LOG .debug (
193
+ "Preparing sign request with http_method: {%s}, headers: {%s}, parameters: {%s}, endpoint: {%s}, resource_path: {%s}" %
194
+ (method , headers , allparams , endpoint , resource_path )
195
+ )
196
+ raz_req = raz_signer .SignRequestProto (
197
+ endpoint_prefix = self .service_params ['endpoint_prefix' ],
198
+ service_name = self .service_params ['service_name' ],
199
+ endpoint = endpoint ,
200
+ http_method = method ,
201
+ headers = headers ,
202
+ parameters = allparams ,
203
+ resource_path = resource_path ,
204
+ time_offset = 0
205
+ )
206
+ raz_req_serialized = raz_req .SerializeToString ()
207
+ signed_request = base64 .b64encode (raz_req_serialized )
208
+
209
+ request_headers ["Accept-Encoding" ] = {"gzip,deflate" }
210
+ request_data ["context" ] = {
211
+ "S3_SIGN_REQUEST" : signed_request
212
+ }
182
213
183
214
def get_raz_client (raz_url , username , auth = 'kerberos' , service = 's3' , service_name = 'cm_s3' , cluster_name = 'myCluster' ):
184
215
if not username :
0 commit comments