config.py 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  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("metrics.enabled")
  48. copy("metrics.listen_port")
  49. copy("bridge.username_template")
  50. copy("bridge.displayname_template")
  51. copy("bridge.allow_contact_list_name_updates")
  52. copy("bridge.displayname_preference")
  53. copy("bridge.autocreate_group_portal")
  54. copy("bridge.autocreate_contact_portal")
  55. copy("bridge.sync_with_custom_puppets")
  56. copy("bridge.sync_direct_chat_list")
  57. copy("bridge.login_shared_secret")
  58. copy("bridge.federate_rooms")
  59. copy("bridge.encryption.allow")
  60. copy("bridge.encryption.default")
  61. copy("bridge.encryption.key_sharing.allow")
  62. copy("bridge.encryption.key_sharing.require_cross_signing")
  63. copy("bridge.encryption.key_sharing.require_verification")
  64. copy("bridge.private_chat_portal_meta")
  65. copy("bridge.delivery_receipts")
  66. copy("bridge.delivery_error_reports")
  67. copy("bridge.resend_bridge_info")
  68. copy("bridge.command_prefix")
  69. copy_dict("bridge.permissions")
  70. def _get_permissions(self, key: str) -> Permissions:
  71. level = self["bridge.permissions"].get(key, "")
  72. admin = level == "admin"
  73. user = level == "user" or admin
  74. return Permissions(user, admin, level)
  75. def get_permissions(self, mxid: UserID) -> Permissions:
  76. permissions = self["bridge.permissions"]
  77. if mxid in permissions:
  78. return self._get_permissions(mxid)
  79. _, homeserver = Client.parse_user_id(mxid)
  80. if homeserver in permissions:
  81. return self._get_permissions(homeserver)
  82. return self._get_permissions("*")