config.py 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. # mautrix-signal - A Matrix-Signal puppeting bridge
  2. # Copyright (C) 2020 Tulir Asokan
  3. #
  4. # This program is free software: you can redistribute it and/or modify
  5. # it under the terms of the GNU Affero General Public License as published by
  6. # the Free Software Foundation, either version 3 of the License, or
  7. # (at your option) any later version.
  8. #
  9. # This program is distributed in the hope that it will be useful,
  10. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. # GNU Affero General Public License for more details.
  13. #
  14. # You should have received a copy of the GNU Affero General Public License
  15. # along with this program. If not, see <https://www.gnu.org/licenses/>.
  16. from typing import Any, List, NamedTuple
  17. import os
  18. from mautrix.types import UserID
  19. from mautrix.client import Client
  20. from mautrix.bridge.config import (BaseBridgeConfig, ConfigUpdateHelper, ForbiddenKey,
  21. ForbiddenDefault)
  22. Permissions = NamedTuple("Permissions", user=bool, admin=bool, level=str)
  23. class Config(BaseBridgeConfig):
  24. def __getitem__(self, key: str) -> Any:
  25. try:
  26. return os.environ[f"MAUTRIX_SIGNAL_{key.replace('.', '_').upper()}"]
  27. except KeyError:
  28. return super().__getitem__(key)
  29. @property
  30. def forbidden_defaults(self) -> List[ForbiddenDefault]:
  31. return [
  32. *super().forbidden_defaults,
  33. ForbiddenDefault("appservice.database", "postgres://username:password@hostname/db"),
  34. ForbiddenDefault("bridge.permissions", ForbiddenKey("example.com")),
  35. ]
  36. def do_update(self, helper: ConfigUpdateHelper) -> None:
  37. super().do_update(helper)
  38. copy, copy_dict, base = helper
  39. copy("homeserver.asmux")
  40. copy("appservice.provisioning.enabled")
  41. copy("appservice.provisioning.prefix")
  42. copy("appservice.provisioning.shared_secret")
  43. if base["appservice.provisioning.shared_secret"] == "generate":
  44. base["appservice.provisioning.shared_secret"] = self._new_token()
  45. copy("appservice.community_id")
  46. copy("signal.socket_path")
  47. copy("signal.outgoing_attachment_dir")
  48. copy("signal.remove_file_after_handling")
  49. copy("metrics.enabled")
  50. copy("metrics.listen_port")
  51. copy("bridge.username_template")
  52. copy("bridge.displayname_template")
  53. copy("bridge.allow_contact_list_name_updates")
  54. copy("bridge.displayname_preference")
  55. copy("bridge.autocreate_group_portal")
  56. copy("bridge.autocreate_contact_portal")
  57. copy("bridge.sync_with_custom_puppets")
  58. copy("bridge.sync_direct_chat_list")
  59. copy("bridge.login_shared_secret")
  60. copy("bridge.federate_rooms")
  61. copy("bridge.encryption.allow")
  62. copy("bridge.encryption.default")
  63. copy("bridge.encryption.key_sharing.allow")
  64. copy("bridge.encryption.key_sharing.require_cross_signing")
  65. copy("bridge.encryption.key_sharing.require_verification")
  66. copy("bridge.private_chat_portal_meta")
  67. copy("bridge.delivery_receipts")
  68. copy("bridge.delivery_error_reports")
  69. copy("bridge.resend_bridge_info")
  70. copy("bridge.command_prefix")
  71. copy_dict("bridge.permissions")
  72. def _get_permissions(self, key: str) -> Permissions:
  73. level = self["bridge.permissions"].get(key, "")
  74. admin = level == "admin"
  75. user = level == "user" or admin
  76. return Permissions(user, admin, level)
  77. def get_permissions(self, mxid: UserID) -> Permissions:
  78. permissions = self["bridge.permissions"]
  79. if mxid in permissions:
  80. return self._get_permissions(mxid)
  81. _, homeserver = Client.parse_user_id(mxid)
  82. if homeserver in permissions:
  83. return self._get_permissions(homeserver)
  84. return self._get_permissions("*")