context.py 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. # Copyright 2016 Cloudbase Solutions Srl
  2. # All Rights Reserved.
  3. import copy
  4. from oslo_context import context
  5. from oslo_db.sqlalchemy import enginefacade
  6. from oslo_utils import timeutils
  7. from coriolis import exception
  8. from coriolis import policy
  9. @enginefacade.transaction_context_provider
  10. class RequestContext(context.RequestContext):
  11. def __init__(self, user, tenant, is_admin=None,
  12. roles=None, project_name=None, remote_address=None,
  13. timestamp=None, request_id=None, auth_token=None,
  14. overwrite=True, domain_name=None, domain_id=None,
  15. user_domain_name=None, user_domain_id=None,
  16. project_domain_name=None, project_domain_id=None,
  17. show_deleted=None, trust_id=None,
  18. delete_trust_id=False, **kwargs):
  19. super(RequestContext, self).__init__(auth_token=auth_token,
  20. user=user,
  21. tenant=tenant,
  22. domain_name=domain_name,
  23. domain_id=domain_id,
  24. user_domain_name=user_domain_name,
  25. user_domain_id=user_domain_id,
  26. project_domain_name=(
  27. project_domain_name),
  28. project_domain_id=(
  29. project_domain_id),
  30. is_admin=is_admin,
  31. show_deleted=show_deleted,
  32. request_id=request_id,
  33. overwrite=overwrite)
  34. self.roles = roles or []
  35. self.project_name = project_name
  36. self.remote_address = remote_address
  37. if not timestamp:
  38. timestamp = timeutils.utcnow()
  39. elif isinstance(timestamp, str):
  40. timestamp = timeutils.parse_isotime(timestamp)
  41. self.timestamp = timestamp
  42. self.trust_id = trust_id
  43. self.delete_trust_id = delete_trust_id
  44. def to_dict(self):
  45. result = super(RequestContext, self).to_dict()
  46. result['user'] = self.user
  47. result['tenant'] = self.tenant
  48. result['project_name'] = self.project_name
  49. result['domain_id'] = self.domain_id
  50. result['domain_name'] = self.domain_name
  51. result['user_domain_id'] = self.user_domain_id
  52. result['user_domain_name'] = self.user_domain_name
  53. result['project_domain_id'] = self.project_domain_id
  54. result['project_domain_name'] = self.project_domain_name
  55. result['roles'] = self.roles
  56. result['remote_address'] = self.remote_address
  57. result['timestamp'] = self.timestamp.isoformat()
  58. result['request_id'] = self.request_id
  59. result['show_deleted'] = self.show_deleted
  60. result['trust_id'] = self.trust_id
  61. return result
  62. @classmethod
  63. def from_dict(cls, values):
  64. return cls(**values)
  65. def to_policy_values(self):
  66. policy = super(RequestContext, self).to_policy_values()
  67. # TODO(aznashwan): determine if there are any other custom
  68. # context params we'd like to be used for policy validation:
  69. return policy
  70. def can(self, action, target=None, fatal=True):
  71. """ Validates policies allow the requested action to be
  72. perfomed in the given context, and raises otherwise.
  73. """
  74. default_target = {
  75. 'project_id': self.project_id, 'user_id': self.user_id}
  76. if target is None:
  77. target = default_target
  78. else:
  79. target = copy.deepcopy(target)
  80. target.update(default_target)
  81. result = False
  82. try:
  83. result = policy.check_policy_for_context(self, action, target)
  84. except exception.PolicyNotAuthorized:
  85. if fatal:
  86. raise
  87. return result
  88. def get_admin_context(trust_id=None):
  89. return RequestContext(
  90. user=None, tenant=None, is_admin=True,
  91. trust_id=trust_id)