context.py 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  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, project_id, 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(
  20. RequestContext, self).__init__(
  21. auth_token=auth_token, user=user, project_id=project_id,
  22. domain_name=domain_name, domain_id=domain_id,
  23. user_domain_name=user_domain_name, user_domain_id=user_domain_id,
  24. project_domain_name=(project_domain_name),
  25. project_domain_id=(project_domain_id),
  26. is_admin=is_admin, show_deleted=show_deleted,
  27. request_id=request_id, overwrite=overwrite)
  28. self.roles = roles or []
  29. self.project_name = project_name
  30. self.remote_address = remote_address
  31. if not timestamp:
  32. timestamp = timeutils.utcnow()
  33. elif isinstance(timestamp, str):
  34. timestamp = timeutils.parse_isotime(timestamp)
  35. self.timestamp = timestamp
  36. self.trust_id = trust_id
  37. self.delete_trust_id = delete_trust_id
  38. def to_dict(self):
  39. result = super(RequestContext, self).to_dict()
  40. result['user'] = self.user
  41. result['project_id'] = self.project_id
  42. result['project_name'] = self.project_name
  43. result['domain_id'] = self.domain_id
  44. result['domain_name'] = self.domain_name
  45. result['user_domain_id'] = self.user_domain_id
  46. result['user_domain_name'] = self.user_domain_name
  47. result['project_domain_id'] = self.project_domain_id
  48. result['project_domain_name'] = self.project_domain_name
  49. result['roles'] = self.roles
  50. result['remote_address'] = self.remote_address
  51. result['timestamp'] = self.timestamp.isoformat()
  52. result['request_id'] = self.request_id
  53. result['show_deleted'] = self.show_deleted
  54. result['trust_id'] = self.trust_id
  55. result['delete_trust_id'] = self.delete_trust_id
  56. return result
  57. @classmethod
  58. def from_dict(cls, values):
  59. return cls(**values)
  60. def to_policy_values(self):
  61. policy = super(RequestContext, self).to_policy_values()
  62. # TODO(aznashwan): determine if there are any other custom
  63. # context params we'd like to be used for policy validation:
  64. return policy
  65. def can(self, action, target=None, fatal=True):
  66. """ Validates policies allow the requested action to be
  67. perfomed in the given context, and raises otherwise.
  68. """
  69. default_target = {
  70. 'project_id': self.project_id, 'user_id': self.user_id}
  71. if target is None:
  72. target = default_target
  73. else:
  74. target = copy.deepcopy(target)
  75. target.update(default_target)
  76. result = False
  77. try:
  78. result = policy.check_policy_for_context(self, action, target)
  79. except exception.PolicyNotAuthorized:
  80. if fatal:
  81. raise
  82. return result
  83. def get_admin_context(trust_id=None):
  84. return RequestContext(
  85. user=None, project_id=None, is_admin=True,
  86. trust_id=trust_id)