swift 2.23.3__py3-none-any.whl → 2.35.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (206) hide show
  1. swift/__init__.py +29 -50
  2. swift/account/auditor.py +21 -118
  3. swift/account/backend.py +33 -28
  4. swift/account/reaper.py +37 -28
  5. swift/account/replicator.py +22 -0
  6. swift/account/server.py +60 -26
  7. swift/account/utils.py +28 -11
  8. swift-2.23.3.data/scripts/swift-account-audit → swift/cli/account_audit.py +23 -13
  9. swift-2.23.3.data/scripts/swift-config → swift/cli/config.py +2 -2
  10. swift/cli/container_deleter.py +5 -11
  11. swift-2.23.3.data/scripts/swift-dispersion-populate → swift/cli/dispersion_populate.py +8 -7
  12. swift/cli/dispersion_report.py +10 -9
  13. swift-2.23.3.data/scripts/swift-drive-audit → swift/cli/drive_audit.py +63 -21
  14. swift/cli/form_signature.py +3 -7
  15. swift-2.23.3.data/scripts/swift-get-nodes → swift/cli/get_nodes.py +8 -2
  16. swift/cli/info.py +154 -14
  17. swift/cli/manage_shard_ranges.py +705 -37
  18. swift-2.23.3.data/scripts/swift-oldies → swift/cli/oldies.py +25 -14
  19. swift-2.23.3.data/scripts/swift-orphans → swift/cli/orphans.py +7 -3
  20. swift/cli/recon.py +196 -67
  21. swift-2.23.3.data/scripts/swift-recon-cron → swift/cli/recon_cron.py +17 -20
  22. swift-2.23.3.data/scripts/swift-reconciler-enqueue → swift/cli/reconciler_enqueue.py +2 -3
  23. swift/cli/relinker.py +807 -126
  24. swift/cli/reload.py +135 -0
  25. swift/cli/ringbuilder.py +217 -20
  26. swift/cli/ringcomposer.py +0 -1
  27. swift/cli/shard-info.py +4 -3
  28. swift/common/base_storage_server.py +9 -20
  29. swift/common/bufferedhttp.py +48 -74
  30. swift/common/constraints.py +20 -15
  31. swift/common/container_sync_realms.py +9 -11
  32. swift/common/daemon.py +25 -8
  33. swift/common/db.py +195 -128
  34. swift/common/db_auditor.py +168 -0
  35. swift/common/db_replicator.py +95 -55
  36. swift/common/digest.py +141 -0
  37. swift/common/direct_client.py +144 -33
  38. swift/common/error_limiter.py +93 -0
  39. swift/common/exceptions.py +25 -1
  40. swift/common/header_key_dict.py +2 -9
  41. swift/common/http_protocol.py +373 -0
  42. swift/common/internal_client.py +129 -59
  43. swift/common/linkat.py +3 -4
  44. swift/common/manager.py +284 -67
  45. swift/common/memcached.py +390 -145
  46. swift/common/middleware/__init__.py +4 -0
  47. swift/common/middleware/account_quotas.py +211 -46
  48. swift/common/middleware/acl.py +3 -8
  49. swift/common/middleware/backend_ratelimit.py +230 -0
  50. swift/common/middleware/bulk.py +22 -34
  51. swift/common/middleware/catch_errors.py +1 -3
  52. swift/common/middleware/cname_lookup.py +6 -11
  53. swift/common/middleware/container_quotas.py +1 -1
  54. swift/common/middleware/container_sync.py +39 -17
  55. swift/common/middleware/copy.py +12 -0
  56. swift/common/middleware/crossdomain.py +22 -9
  57. swift/common/middleware/crypto/__init__.py +2 -1
  58. swift/common/middleware/crypto/crypto_utils.py +11 -15
  59. swift/common/middleware/crypto/decrypter.py +28 -11
  60. swift/common/middleware/crypto/encrypter.py +12 -17
  61. swift/common/middleware/crypto/keymaster.py +8 -15
  62. swift/common/middleware/crypto/kms_keymaster.py +2 -1
  63. swift/common/middleware/dlo.py +15 -11
  64. swift/common/middleware/domain_remap.py +5 -4
  65. swift/common/middleware/etag_quoter.py +128 -0
  66. swift/common/middleware/formpost.py +73 -70
  67. swift/common/middleware/gatekeeper.py +8 -1
  68. swift/common/middleware/keystoneauth.py +33 -3
  69. swift/common/middleware/list_endpoints.py +4 -4
  70. swift/common/middleware/listing_formats.py +85 -49
  71. swift/common/middleware/memcache.py +4 -95
  72. swift/common/middleware/name_check.py +3 -2
  73. swift/common/middleware/proxy_logging.py +160 -92
  74. swift/common/middleware/ratelimit.py +17 -10
  75. swift/common/middleware/read_only.py +6 -4
  76. swift/common/middleware/recon.py +59 -22
  77. swift/common/middleware/s3api/acl_handlers.py +25 -3
  78. swift/common/middleware/s3api/acl_utils.py +6 -1
  79. swift/common/middleware/s3api/controllers/__init__.py +6 -0
  80. swift/common/middleware/s3api/controllers/acl.py +3 -2
  81. swift/common/middleware/s3api/controllers/bucket.py +242 -137
  82. swift/common/middleware/s3api/controllers/logging.py +2 -2
  83. swift/common/middleware/s3api/controllers/multi_delete.py +43 -20
  84. swift/common/middleware/s3api/controllers/multi_upload.py +219 -133
  85. swift/common/middleware/s3api/controllers/obj.py +112 -8
  86. swift/common/middleware/s3api/controllers/object_lock.py +44 -0
  87. swift/common/middleware/s3api/controllers/s3_acl.py +2 -2
  88. swift/common/middleware/s3api/controllers/tagging.py +57 -0
  89. swift/common/middleware/s3api/controllers/versioning.py +36 -7
  90. swift/common/middleware/s3api/etree.py +22 -9
  91. swift/common/middleware/s3api/exception.py +0 -4
  92. swift/common/middleware/s3api/s3api.py +113 -41
  93. swift/common/middleware/s3api/s3request.py +384 -218
  94. swift/common/middleware/s3api/s3response.py +126 -23
  95. swift/common/middleware/s3api/s3token.py +16 -17
  96. swift/common/middleware/s3api/schema/delete.rng +1 -1
  97. swift/common/middleware/s3api/subresource.py +7 -10
  98. swift/common/middleware/s3api/utils.py +27 -10
  99. swift/common/middleware/slo.py +665 -358
  100. swift/common/middleware/staticweb.py +64 -37
  101. swift/common/middleware/symlink.py +51 -18
  102. swift/common/middleware/tempauth.py +76 -58
  103. swift/common/middleware/tempurl.py +191 -173
  104. swift/common/middleware/versioned_writes/__init__.py +51 -0
  105. swift/common/middleware/{versioned_writes.py → versioned_writes/legacy.py} +27 -26
  106. swift/common/middleware/versioned_writes/object_versioning.py +1482 -0
  107. swift/common/middleware/x_profile/exceptions.py +1 -4
  108. swift/common/middleware/x_profile/html_viewer.py +18 -19
  109. swift/common/middleware/x_profile/profile_model.py +1 -2
  110. swift/common/middleware/xprofile.py +10 -10
  111. swift-2.23.3.data/scripts/swift-container-server → swift/common/recon.py +13 -8
  112. swift/common/registry.py +147 -0
  113. swift/common/request_helpers.py +324 -57
  114. swift/common/ring/builder.py +67 -25
  115. swift/common/ring/composite_builder.py +1 -1
  116. swift/common/ring/ring.py +177 -51
  117. swift/common/ring/utils.py +1 -1
  118. swift/common/splice.py +10 -6
  119. swift/common/statsd_client.py +205 -0
  120. swift/common/storage_policy.py +49 -44
  121. swift/common/swob.py +86 -102
  122. swift/common/{utils.py → utils/__init__.py} +2163 -2772
  123. swift/common/utils/base.py +131 -0
  124. swift/common/utils/config.py +433 -0
  125. swift/common/utils/ipaddrs.py +256 -0
  126. swift/common/utils/libc.py +345 -0
  127. swift/common/utils/logs.py +859 -0
  128. swift/common/utils/timestamp.py +412 -0
  129. swift/common/wsgi.py +553 -535
  130. swift/container/auditor.py +14 -100
  131. swift/container/backend.py +490 -231
  132. swift/container/reconciler.py +126 -37
  133. swift/container/replicator.py +96 -22
  134. swift/container/server.py +358 -165
  135. swift/container/sharder.py +1540 -684
  136. swift/container/sync.py +94 -88
  137. swift/container/updater.py +53 -32
  138. swift/obj/auditor.py +153 -35
  139. swift/obj/diskfile.py +466 -217
  140. swift/obj/expirer.py +406 -124
  141. swift/obj/mem_diskfile.py +7 -4
  142. swift/obj/mem_server.py +1 -0
  143. swift/obj/reconstructor.py +523 -262
  144. swift/obj/replicator.py +249 -188
  145. swift/obj/server.py +207 -122
  146. swift/obj/ssync_receiver.py +145 -85
  147. swift/obj/ssync_sender.py +113 -54
  148. swift/obj/updater.py +652 -139
  149. swift/obj/watchers/__init__.py +0 -0
  150. swift/obj/watchers/dark_data.py +213 -0
  151. swift/proxy/controllers/account.py +11 -11
  152. swift/proxy/controllers/base.py +848 -604
  153. swift/proxy/controllers/container.py +433 -92
  154. swift/proxy/controllers/info.py +3 -2
  155. swift/proxy/controllers/obj.py +1000 -489
  156. swift/proxy/server.py +185 -112
  157. {swift-2.23.3.dist-info → swift-2.35.0.dist-info}/AUTHORS +58 -11
  158. {swift-2.23.3.dist-info → swift-2.35.0.dist-info}/METADATA +51 -56
  159. swift-2.35.0.dist-info/RECORD +201 -0
  160. {swift-2.23.3.dist-info → swift-2.35.0.dist-info}/WHEEL +1 -1
  161. {swift-2.23.3.dist-info → swift-2.35.0.dist-info}/entry_points.txt +43 -0
  162. swift-2.35.0.dist-info/pbr.json +1 -0
  163. swift/locale/de/LC_MESSAGES/swift.po +0 -1216
  164. swift/locale/en_GB/LC_MESSAGES/swift.po +0 -1207
  165. swift/locale/es/LC_MESSAGES/swift.po +0 -1085
  166. swift/locale/fr/LC_MESSAGES/swift.po +0 -909
  167. swift/locale/it/LC_MESSAGES/swift.po +0 -894
  168. swift/locale/ja/LC_MESSAGES/swift.po +0 -965
  169. swift/locale/ko_KR/LC_MESSAGES/swift.po +0 -964
  170. swift/locale/pt_BR/LC_MESSAGES/swift.po +0 -881
  171. swift/locale/ru/LC_MESSAGES/swift.po +0 -891
  172. swift/locale/tr_TR/LC_MESSAGES/swift.po +0 -832
  173. swift/locale/zh_CN/LC_MESSAGES/swift.po +0 -833
  174. swift/locale/zh_TW/LC_MESSAGES/swift.po +0 -838
  175. swift-2.23.3.data/scripts/swift-account-auditor +0 -23
  176. swift-2.23.3.data/scripts/swift-account-info +0 -51
  177. swift-2.23.3.data/scripts/swift-account-reaper +0 -23
  178. swift-2.23.3.data/scripts/swift-account-replicator +0 -34
  179. swift-2.23.3.data/scripts/swift-account-server +0 -23
  180. swift-2.23.3.data/scripts/swift-container-auditor +0 -23
  181. swift-2.23.3.data/scripts/swift-container-info +0 -55
  182. swift-2.23.3.data/scripts/swift-container-reconciler +0 -21
  183. swift-2.23.3.data/scripts/swift-container-replicator +0 -34
  184. swift-2.23.3.data/scripts/swift-container-sharder +0 -37
  185. swift-2.23.3.data/scripts/swift-container-sync +0 -23
  186. swift-2.23.3.data/scripts/swift-container-updater +0 -23
  187. swift-2.23.3.data/scripts/swift-dispersion-report +0 -24
  188. swift-2.23.3.data/scripts/swift-form-signature +0 -20
  189. swift-2.23.3.data/scripts/swift-init +0 -119
  190. swift-2.23.3.data/scripts/swift-object-auditor +0 -29
  191. swift-2.23.3.data/scripts/swift-object-expirer +0 -33
  192. swift-2.23.3.data/scripts/swift-object-info +0 -60
  193. swift-2.23.3.data/scripts/swift-object-reconstructor +0 -33
  194. swift-2.23.3.data/scripts/swift-object-relinker +0 -41
  195. swift-2.23.3.data/scripts/swift-object-replicator +0 -37
  196. swift-2.23.3.data/scripts/swift-object-server +0 -27
  197. swift-2.23.3.data/scripts/swift-object-updater +0 -23
  198. swift-2.23.3.data/scripts/swift-proxy-server +0 -23
  199. swift-2.23.3.data/scripts/swift-recon +0 -24
  200. swift-2.23.3.data/scripts/swift-ring-builder +0 -24
  201. swift-2.23.3.data/scripts/swift-ring-builder-analyzer +0 -22
  202. swift-2.23.3.data/scripts/swift-ring-composer +0 -22
  203. swift-2.23.3.dist-info/RECORD +0 -220
  204. swift-2.23.3.dist-info/pbr.json +0 -1
  205. {swift-2.23.3.dist-info → swift-2.35.0.dist-info}/LICENSE +0 -0
  206. {swift-2.23.3.dist-info → swift-2.35.0.dist-info}/top_level.txt +0 -0
@@ -141,31 +141,41 @@ https://github.com/swiftstack/s3compat in detail.
141
141
 
142
142
  """
143
143
 
144
- from cgi import parse_header
145
144
  import json
146
145
  from paste.deploy import loadwsgi
146
+ from urllib.parse import parse_qs
147
147
 
148
148
  from swift.common.constraints import valid_api_version
149
149
  from swift.common.middleware.listing_formats import \
150
150
  MAX_CONTAINER_LISTING_CONTENT_LENGTH
151
+ from swift.common.request_helpers import append_log_info
151
152
  from swift.common.wsgi import PipelineWrapper, loadcontext, WSGIContext
152
153
 
154
+ from swift.common.middleware import app_property
153
155
  from swift.common.middleware.s3api.exception import NotS3Request, \
154
156
  InvalidSubresource
155
157
  from swift.common.middleware.s3api.s3request import get_request_class
156
158
  from swift.common.middleware.s3api.s3response import ErrorResponse, \
157
159
  InternalError, MethodNotAllowed, S3ResponseBase, S3NotImplemented
158
- from swift.common.utils import get_logger, register_swift_info, \
159
- config_true_value, config_positive_int_value, split_path, \
160
- closing_if_possible
160
+ from swift.common.utils import get_logger, config_true_value, \
161
+ config_positive_int_value, split_path, closing_if_possible, \
162
+ list_from_csv, parse_header
161
163
  from swift.common.middleware.s3api.utils import Config
162
164
  from swift.common.middleware.s3api.acl_handlers import get_acl_handler
165
+ from swift.common.registry import register_swift_info, \
166
+ register_sensitive_header, register_sensitive_param
163
167
 
164
168
 
165
169
  class ListingEtagMiddleware(object):
166
170
  def __init__(self, app):
167
171
  self.app = app
168
172
 
173
+ # Pass these along so get_container_info will have the configured
174
+ # odds to skip cache
175
+ _pipeline_final_app = app_property('_pipeline_final_app')
176
+ _pipeline_request_logging_app = app_property(
177
+ '_pipeline_request_logging_app')
178
+
169
179
  def __call__(self, env, start_response):
170
180
  # a lot of this is cribbed from listing_formats / swob.Request
171
181
  if env['REQUEST_METHOD'] != 'GET':
@@ -242,59 +252,109 @@ class ListingEtagMiddleware(object):
242
252
 
243
253
  class S3ApiMiddleware(object):
244
254
  """S3Api: S3 compatibility middleware"""
245
- def __init__(self, app, conf, *args, **kwargs):
255
+ def __init__(self, app, wsgi_conf, *args, **kwargs):
246
256
  self.app = app
247
257
  self.conf = Config()
248
258
 
249
259
  # Set default values if they are not configured
250
260
  self.conf.allow_no_owner = config_true_value(
251
- conf.get('allow_no_owner', False))
252
- self.conf.location = conf.get('location', 'us-east-1')
261
+ wsgi_conf.get('allow_no_owner', False))
262
+ self.conf.location = wsgi_conf.get('location', 'us-east-1')
253
263
  self.conf.dns_compliant_bucket_names = config_true_value(
254
- conf.get('dns_compliant_bucket_names', True))
264
+ wsgi_conf.get('dns_compliant_bucket_names', True))
255
265
  self.conf.max_bucket_listing = config_positive_int_value(
256
- conf.get('max_bucket_listing', 1000))
266
+ wsgi_conf.get('max_bucket_listing', 1000))
257
267
  self.conf.max_parts_listing = config_positive_int_value(
258
- conf.get('max_parts_listing', 1000))
268
+ wsgi_conf.get('max_parts_listing', 1000))
259
269
  self.conf.max_multi_delete_objects = config_positive_int_value(
260
- conf.get('max_multi_delete_objects', 1000))
270
+ wsgi_conf.get('max_multi_delete_objects', 1000))
261
271
  self.conf.multi_delete_concurrency = config_positive_int_value(
262
- conf.get('multi_delete_concurrency', 2))
272
+ wsgi_conf.get('multi_delete_concurrency', 2))
263
273
  self.conf.s3_acl = config_true_value(
264
- conf.get('s3_acl', False))
265
- self.conf.storage_domain = conf.get('storage_domain', '')
274
+ wsgi_conf.get('s3_acl', False))
275
+ self.conf.storage_domains = list_from_csv(
276
+ wsgi_conf.get('storage_domain', ''))
266
277
  self.conf.auth_pipeline_check = config_true_value(
267
- conf.get('auth_pipeline_check', True))
278
+ wsgi_conf.get('auth_pipeline_check', True))
268
279
  self.conf.max_upload_part_num = config_positive_int_value(
269
- conf.get('max_upload_part_num', 1000))
280
+ wsgi_conf.get('max_upload_part_num', 1000))
270
281
  self.conf.check_bucket_owner = config_true_value(
271
- conf.get('check_bucket_owner', False))
282
+ wsgi_conf.get('check_bucket_owner', False))
272
283
  self.conf.force_swift_request_proxy_log = config_true_value(
273
- conf.get('force_swift_request_proxy_log', False))
284
+ wsgi_conf.get('force_swift_request_proxy_log', False))
274
285
  self.conf.allow_multipart_uploads = config_true_value(
275
- conf.get('allow_multipart_uploads', True))
286
+ wsgi_conf.get('allow_multipart_uploads', True))
276
287
  self.conf.min_segment_size = config_positive_int_value(
277
- conf.get('min_segment_size', 5242880))
288
+ wsgi_conf.get('min_segment_size', 5242880))
289
+ self.conf.allowable_clock_skew = config_positive_int_value(
290
+ wsgi_conf.get('allowable_clock_skew', 15 * 60))
291
+ self.conf.cors_preflight_allow_origin = list_from_csv(wsgi_conf.get(
292
+ 'cors_preflight_allow_origin', ''))
293
+ if '*' in self.conf.cors_preflight_allow_origin and \
294
+ len(self.conf.cors_preflight_allow_origin) > 1:
295
+ raise ValueError('if cors_preflight_allow_origin should include '
296
+ 'all domains, * must be the only entry')
297
+ self.conf.ratelimit_as_client_error = config_true_value(
298
+ wsgi_conf.get('ratelimit_as_client_error', False))
278
299
 
279
300
  self.logger = get_logger(
280
- conf, log_route=conf.get('log_name', 's3api'))
281
- self.slo_enabled = self.conf.allow_multipart_uploads
282
- self.check_pipeline(self.conf)
301
+ wsgi_conf, log_route='s3api', statsd_tail_prefix='s3api')
302
+ self.check_pipeline(wsgi_conf)
303
+
304
+ def is_s3_cors_preflight(self, env):
305
+ if env['REQUEST_METHOD'] != 'OPTIONS' or not env.get('HTTP_ORIGIN'):
306
+ # Not a CORS preflight
307
+ return False
308
+ acrh = env.get('HTTP_ACCESS_CONTROL_REQUEST_HEADERS', '').lower()
309
+ if 'authorization' in acrh and \
310
+ not env['PATH_INFO'].startswith(('/v1/', '/v1.0/')):
311
+ return True
312
+ q = parse_qs(env.get('QUERY_STRING', ''))
313
+ if 'AWSAccessKeyId' in q or 'X-Amz-Credential' in q:
314
+ return True
315
+ # Not S3, apparently
316
+ return False
283
317
 
284
318
  def __call__(self, env, start_response):
319
+ origin = env.get('HTTP_ORIGIN')
320
+ if self.conf.cors_preflight_allow_origin and \
321
+ self.is_s3_cors_preflight(env):
322
+ # I guess it's likely going to be an S3 request? *shrug*
323
+ if self.conf.cors_preflight_allow_origin != ['*'] and \
324
+ origin not in self.conf.cors_preflight_allow_origin:
325
+ start_response('401 Unauthorized', [
326
+ ('Allow', 'GET, HEAD, PUT, POST, DELETE, OPTIONS'),
327
+ ])
328
+ return [b'']
329
+
330
+ headers = [
331
+ ('Allow', 'GET, HEAD, PUT, POST, DELETE, OPTIONS'),
332
+ ('Access-Control-Allow-Origin', origin),
333
+ ('Access-Control-Allow-Methods',
334
+ 'GET, HEAD, PUT, POST, DELETE, OPTIONS'),
335
+ ('Vary', 'Origin, Access-Control-Request-Headers'),
336
+ ]
337
+ acrh = set(list_from_csv(
338
+ env.get('HTTP_ACCESS_CONTROL_REQUEST_HEADERS', '').lower()))
339
+ if acrh:
340
+ headers.append((
341
+ 'Access-Control-Allow-Headers',
342
+ ', '.join(acrh)))
343
+
344
+ start_response('200 OK', headers)
345
+ return [b'']
346
+
285
347
  try:
286
348
  req_class = get_request_class(env, self.conf.s3_acl)
287
- req = req_class(
288
- env, self.app, self.slo_enabled, self.conf.storage_domain,
289
- self.conf.location, self.conf.force_swift_request_proxy_log,
290
- self.conf.dns_compliant_bucket_names,
291
- self.conf.allow_multipart_uploads, self.conf.allow_no_owner)
349
+ req = req_class(env, self.app, self.conf)
292
350
  resp = self.handle_request(req)
293
351
  except NotS3Request:
294
352
  resp = self.app
295
353
  except InvalidSubresource as e:
296
354
  self.logger.debug(e.cause)
297
355
  except ErrorResponse as err_resp:
356
+ self.logger.increment(err_resp.metric_name)
357
+ append_log_info(env, 's3:err:%s' % err_resp.summary)
298
358
  if isinstance(err_resp, InternalError):
299
359
  self.logger.exception(err_resp)
300
360
  resp = err_resp
@@ -306,6 +366,9 @@ class S3ApiMiddleware(object):
306
366
  resp.headers['x-amz-id-2'] = env['swift.trans_id']
307
367
  resp.headers['x-amz-request-id'] = env['swift.trans_id']
308
368
 
369
+ if 's3api.backend_path' in env and 'swift.backend_path' not in env:
370
+ env['swift.backend_path'] = env['s3api.backend_path']
371
+
309
372
  return resp(env, start_response)
310
373
 
311
374
  def handle_request(self, req):
@@ -330,16 +393,19 @@ class S3ApiMiddleware(object):
330
393
  raise MethodNotAllowed(req.method,
331
394
  req.controller.resource_type())
332
395
 
396
+ if req.policy_index is not None:
397
+ res.headers.setdefault('X-Backend-Storage-Policy-Index',
398
+ req.policy_index)
333
399
  return res
334
400
 
335
- def check_pipeline(self, conf):
401
+ def check_pipeline(self, wsgi_conf):
336
402
  """
337
403
  Check that proxy-server.conf has an appropriate pipeline for s3api.
338
404
  """
339
- if conf.get('__file__', None) is None:
405
+ if wsgi_conf.get('__file__', None) is None:
340
406
  return
341
407
 
342
- ctx = loadcontext(loadwsgi.APP, conf.__file__)
408
+ ctx = loadcontext(loadwsgi.APP, wsgi_conf['__file__'])
343
409
  pipeline = str(PipelineWrapper(ctx)).split(' ')
344
410
 
345
411
  # Add compatible with 3rd party middleware.
@@ -349,13 +415,13 @@ class S3ApiMiddleware(object):
349
415
  pipeline.index('proxy-server')]
350
416
 
351
417
  # Check SLO middleware
352
- if self.slo_enabled and 'slo' not in auth_pipeline:
353
- self.slo_enabled = False
418
+ if self.conf.allow_multipart_uploads and 'slo' not in auth_pipeline:
419
+ self.conf.allow_multipart_uploads = False
354
420
  self.logger.warning('s3api middleware requires SLO middleware '
355
421
  'to support multi-part upload, please add it '
356
422
  'in pipeline')
357
423
 
358
- if not conf.auth_pipeline_check:
424
+ if not self.conf.auth_pipeline_check:
359
425
  self.logger.debug('Skip pipeline auth check.')
360
426
  return
361
427
 
@@ -402,15 +468,21 @@ def filter_factory(global_conf, **local_conf):
402
468
  register_swift_info(
403
469
  's3api',
404
470
  # TODO: make default values as variables
405
- max_bucket_listing=conf.get('max_bucket_listing', 1000),
406
- max_parts_listing=conf.get('max_parts_listing', 1000),
407
- max_upload_part_num=conf.get('max_upload_part_num', 1000),
408
- max_multi_delete_objects=conf.get('max_multi_delete_objects', 1000),
409
- allow_multipart_uploads=conf.get('allow_multipart_uploads', True),
410
- min_segment_size=conf.get('min_segment_size', 5242880),
411
- s3_acl=conf.get('s3_acl', False)
471
+ max_bucket_listing=int(conf.get('max_bucket_listing', 1000)),
472
+ max_parts_listing=int(conf.get('max_parts_listing', 1000)),
473
+ max_upload_part_num=int(conf.get('max_upload_part_num', 1000)),
474
+ max_multi_delete_objects=int(
475
+ conf.get('max_multi_delete_objects', 1000)),
476
+ allow_multipart_uploads=config_true_value(
477
+ conf.get('allow_multipart_uploads', True)),
478
+ min_segment_size=int(conf.get('min_segment_size', 5242880)),
479
+ s3_acl=config_true_value(conf.get('s3_acl', False)),
412
480
  )
413
481
 
482
+ register_sensitive_header('authorization')
483
+ register_sensitive_param('Signature')
484
+ register_sensitive_param('X-Amz-Signature')
485
+
414
486
  def s3api_filter(app):
415
487
  return S3ApiMiddleware(ListingEtagMiddleware(app), conf)
416
488