/grouper/plugin/proxy.py

https://github.com/dropbox/merou · Python · 144 lines · 98 code · 25 blank · 21 comment · 24 complexity · eeaa7d4aa6b663d23ca3d4738dfdeeb5 MD5 · raw file

  1. from typing import TYPE_CHECKING
  2. from grouper.plugin.base import BasePlugin
  3. from grouper.plugin.load import load_plugins
  4. if TYPE_CHECKING:
  5. from grouper.models.audit_log import AuditLog
  6. from grouper.models.group import Group
  7. from grouper.models.user import User
  8. from grouper.settings import Settings
  9. from sshpubkeys import SSHKey
  10. from ssl import SSLContext
  11. from sqlalchemy.orm import Session
  12. from tornado.httpserver import HTTPRequest
  13. from types import TracebackType
  14. from typing import Any, Dict, List, Iterable, Optional, Type, Tuple, Union
  15. class PluginProxy:
  16. """Wrapper to proxy a plugin method call to all loaded plugins."""
  17. @classmethod
  18. def load_plugins(cls, settings, service_name):
  19. # type: (Settings, str) -> PluginProxy
  20. plugins = load_plugins(
  21. BasePlugin, settings.plugin_dirs, settings.plugin_module_paths, service_name
  22. )
  23. return cls(plugins)
  24. def __init__(self, plugins):
  25. # type: (List[BasePlugin]) -> None
  26. self._plugins = plugins
  27. def add_plugin(self, plugin):
  28. # type: (BasePlugin) -> None
  29. self._plugins.append(plugin)
  30. def configure(self, service_name):
  31. # type: (str) -> None
  32. for plugin in self._plugins:
  33. plugin.configure(service_name)
  34. def check_machine_set(self, name, machine_set):
  35. # type: (str, str) -> None
  36. for plugin in self._plugins:
  37. plugin.check_machine_set(name, machine_set)
  38. def check_service_account_name(self, name):
  39. # type: (str) -> None
  40. for plugin in self._plugins:
  41. plugin.check_service_account_name(name)
  42. def check_permission_argument(self, permission: str, argument: str) -> None:
  43. for plugin in self._plugins:
  44. plugin.check_permission_argument(permission, argument)
  45. def get_aliases_for_mapped_permission(self, session, permission, argument):
  46. # type: (Session, str, str) -> Iterable[Tuple[str, str]]
  47. for plugin in self._plugins:
  48. aliases = plugin.get_aliases_for_mapped_permission(session, permission, argument)
  49. if aliases is None:
  50. continue
  51. for alias in aliases:
  52. yield alias
  53. def get_github_app_client_secret(self):
  54. # type: () -> bytes
  55. for plugin in self._plugins:
  56. secret = plugin.get_github_app_client_secret()
  57. if secret is not None:
  58. return secret
  59. raise ValueError("no github secret available")
  60. def get_owner_by_arg_by_perm(self, session):
  61. # type: (Session) -> Iterable[Dict[str, Dict[str, List[Group]]]]
  62. for plugin in self._plugins:
  63. owners = plugin.get_owner_by_arg_by_perm(session)
  64. if owners is not None:
  65. yield owners
  66. def get_ssl_context(self):
  67. # type: () -> Optional[SSLContext]
  68. for plugin in self._plugins:
  69. context = plugin.get_ssl_context()
  70. if context is not None:
  71. return context
  72. return None
  73. def log_auditlog_entry(self, entry):
  74. # type: (AuditLog) -> None
  75. for plugin in self._plugins:
  76. plugin.log_auditlog_entry(entry)
  77. def log_background_run(self, success):
  78. # type: (bool) -> None
  79. for plugin in self._plugins:
  80. plugin.log_background_run(success)
  81. def log_exception(
  82. self,
  83. request, # type: Optional[HTTPRequest]
  84. status, # type: Optional[int]
  85. exc_type, # type: Optional[Type[BaseException]]
  86. exc_value, # type: Optional[BaseException]
  87. exc_tb, # type: Optional[TracebackType]
  88. ):
  89. # type: (...) -> None
  90. for plugin in self._plugins:
  91. plugin.log_exception(request, status, exc_type, exc_value, exc_tb)
  92. def log_graph_update_duration(self, duration_ms):
  93. # type: (int) -> None
  94. for plugin in self._plugins:
  95. plugin.log_graph_update_duration(duration_ms)
  96. def log_periodic_graph_update(self, success):
  97. # type: (bool) -> None
  98. for plugin in self._plugins:
  99. plugin.log_periodic_graph_update(success)
  100. def log_request(self, handler, status, duration_ms, request):
  101. # type: (str, int, int, Optional[HTTPRequest]) -> None
  102. for plugin in self._plugins:
  103. plugin.log_request(handler, status, duration_ms, request)
  104. def user_created(self, user, is_service_account=False):
  105. # type: (User, bool) -> None
  106. for plugin in self._plugins:
  107. plugin.user_created(user, is_service_account)
  108. def will_add_public_key(self, key):
  109. # type: (SSHKey) -> None
  110. for plugin in self._plugins:
  111. plugin.will_add_public_key(key)
  112. def will_disable_user(self, session, user):
  113. # type: (Session, User) -> None
  114. for plugin in self._plugins:
  115. plugin.will_disable_user(session, user)
  116. def will_update_group_membership(self, session, group, member, **updates):
  117. # type: (Session, Group, Union[User, Group], **Any) -> None
  118. for plugin in self._plugins:
  119. plugin.will_update_group_membership(session, group, member, **updates)