You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

156 regels
5.7 KiB

  1. # Copyright 2021 The Matrix.org Foundation C.I.C.
  2. #
  3. # Licensed under the Apache License, Version 2.0 (the "License");
  4. # you may not use this file except in compliance with the License.
  5. # You may obtain a copy of the License at
  6. #
  7. # http://www.apache.org/licenses/LICENSE-2.0
  8. #
  9. # Unless required by applicable law or agreed to in writing, software
  10. # distributed under the License is distributed on an "AS IS" BASIS,
  11. # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. # See the License for the specific language governing permissions and
  13. # limitations under the License.
  14. import logging
  15. from typing import Any, List, Optional
  16. import attr
  17. from synapse.config._base import Config, ConfigError
  18. from synapse.types import JsonDict
  19. logger = logging.getLogger(__name__)
  20. @attr.s(slots=True, frozen=True, auto_attribs=True)
  21. class RetentionPurgeJob:
  22. """Object describing the configuration of the manhole"""
  23. interval: int
  24. shortest_max_lifetime: Optional[int]
  25. longest_max_lifetime: Optional[int]
  26. class RetentionConfig(Config):
  27. section = "retention"
  28. def read_config(self, config: JsonDict, **kwargs: Any) -> None:
  29. retention_config = config.get("retention")
  30. if retention_config is None:
  31. retention_config = {}
  32. self.retention_enabled = retention_config.get("enabled", False)
  33. retention_default_policy = retention_config.get("default_policy")
  34. if retention_default_policy is not None:
  35. self.retention_default_min_lifetime = retention_default_policy.get(
  36. "min_lifetime"
  37. )
  38. if self.retention_default_min_lifetime is not None:
  39. self.retention_default_min_lifetime = self.parse_duration(
  40. self.retention_default_min_lifetime
  41. )
  42. self.retention_default_max_lifetime = retention_default_policy.get(
  43. "max_lifetime"
  44. )
  45. if self.retention_default_max_lifetime is not None:
  46. self.retention_default_max_lifetime = self.parse_duration(
  47. self.retention_default_max_lifetime
  48. )
  49. if (
  50. self.retention_default_min_lifetime is not None
  51. and self.retention_default_max_lifetime is not None
  52. and (
  53. self.retention_default_min_lifetime
  54. > self.retention_default_max_lifetime
  55. )
  56. ):
  57. raise ConfigError(
  58. "The default retention policy's 'min_lifetime' can not be greater"
  59. " than its 'max_lifetime'"
  60. )
  61. else:
  62. self.retention_default_min_lifetime = None
  63. self.retention_default_max_lifetime = None
  64. if self.retention_enabled:
  65. logger.info(
  66. "Message retention policies support enabled with the following default"
  67. " policy: min_lifetime = %s ; max_lifetime = %s",
  68. self.retention_default_min_lifetime,
  69. self.retention_default_max_lifetime,
  70. )
  71. self.retention_allowed_lifetime_min = retention_config.get(
  72. "allowed_lifetime_min"
  73. )
  74. if self.retention_allowed_lifetime_min is not None:
  75. self.retention_allowed_lifetime_min = self.parse_duration(
  76. self.retention_allowed_lifetime_min
  77. )
  78. self.retention_allowed_lifetime_max = retention_config.get(
  79. "allowed_lifetime_max"
  80. )
  81. if self.retention_allowed_lifetime_max is not None:
  82. self.retention_allowed_lifetime_max = self.parse_duration(
  83. self.retention_allowed_lifetime_max
  84. )
  85. if (
  86. self.retention_allowed_lifetime_min is not None
  87. and self.retention_allowed_lifetime_max is not None
  88. and self.retention_allowed_lifetime_min
  89. > self.retention_allowed_lifetime_max
  90. ):
  91. raise ConfigError(
  92. "Invalid retention policy limits: 'allowed_lifetime_min' can not be"
  93. " greater than 'allowed_lifetime_max'"
  94. )
  95. self.retention_purge_jobs: List[RetentionPurgeJob] = []
  96. for purge_job_config in retention_config.get("purge_jobs", []):
  97. interval_config = purge_job_config.get("interval")
  98. if interval_config is None:
  99. raise ConfigError(
  100. "A retention policy's purge jobs configuration must have the"
  101. " 'interval' key set."
  102. )
  103. interval = self.parse_duration(interval_config)
  104. shortest_max_lifetime = purge_job_config.get("shortest_max_lifetime")
  105. if shortest_max_lifetime is not None:
  106. shortest_max_lifetime = self.parse_duration(shortest_max_lifetime)
  107. longest_max_lifetime = purge_job_config.get("longest_max_lifetime")
  108. if longest_max_lifetime is not None:
  109. longest_max_lifetime = self.parse_duration(longest_max_lifetime)
  110. if (
  111. shortest_max_lifetime is not None
  112. and longest_max_lifetime is not None
  113. and shortest_max_lifetime > longest_max_lifetime
  114. ):
  115. raise ConfigError(
  116. "A retention policy's purge jobs configuration's"
  117. " 'shortest_max_lifetime' value can not be greater than its"
  118. " 'longest_max_lifetime' value."
  119. )
  120. self.retention_purge_jobs.append(
  121. RetentionPurgeJob(interval, shortest_max_lifetime, longest_max_lifetime)
  122. )
  123. if not self.retention_purge_jobs:
  124. self.retention_purge_jobs = [
  125. RetentionPurgeJob(self.parse_duration("1d"), None, None)
  126. ]