register_new_matrix_user: read server url from config (#13616)

Fixes https://github.com/matrix-org/synapse/issues/3672:
`https://localhost:8448` is virtually never right.
This commit is contained in:
Richard van der Hoff 2022-08-25 15:29:08 +01:00 committed by GitHub
parent a282446502
commit a2ce614447
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 52 additions and 6 deletions

1
changelog.d/13616.bugfix Normal file
View file

@ -0,0 +1 @@
Fix a longstanding bug in `register_new_matrix_user` which meant it was always necessary to explicitly give a server URL.

View file

@ -20,11 +20,13 @@ import hashlib
import hmac import hmac
import logging import logging
import sys import sys
from typing import Callable, Optional from typing import Any, Callable, Dict, Optional
import requests import requests
import yaml import yaml
_DEFAULT_SERVER_URL = "http://localhost:8008"
def request_registration( def request_registration(
user: str, user: str,
@ -203,31 +205,74 @@ def main() -> None:
parser.add_argument( parser.add_argument(
"server_url", "server_url",
default="https://localhost:8448",
nargs="?", nargs="?",
help="URL to use to talk to the homeserver. Defaults to " help="URL to use to talk to the homeserver. By default, tries to find a "
" 'https://localhost:8448'.", "suitable URL from the configuration file. Otherwise, defaults to "
f"'{_DEFAULT_SERVER_URL}'.",
) )
args = parser.parse_args() args = parser.parse_args()
if "config" in args and args.config: if "config" in args and args.config:
config = yaml.safe_load(args.config) config = yaml.safe_load(args.config)
if args.shared_secret:
secret = args.shared_secret
else:
# argparse should check that we have either config or shared secret
assert config
secret = config.get("registration_shared_secret", None) secret = config.get("registration_shared_secret", None)
if not secret: if not secret:
print("No 'registration_shared_secret' defined in config.") print("No 'registration_shared_secret' defined in config.")
sys.exit(1) sys.exit(1)
if args.server_url:
server_url = args.server_url
elif config:
server_url = _find_client_listener(config)
if not server_url:
server_url = _DEFAULT_SERVER_URL
print(
"Unable to find a suitable HTTP listener in the configuration file. "
f"Trying {server_url} as a last resort.",
file=sys.stderr,
)
else: else:
secret = args.shared_secret server_url = _DEFAULT_SERVER_URL
print(
f"No server url or configuration file given. Defaulting to {server_url}.",
file=sys.stderr,
)
admin = None admin = None
if args.admin or args.no_admin: if args.admin or args.no_admin:
admin = args.admin admin = args.admin
register_new_user( register_new_user(
args.user, args.password, args.server_url, secret, admin, args.user_type args.user, args.password, server_url, secret, admin, args.user_type
) )
def _find_client_listener(config: Dict[str, Any]) -> Optional[str]:
# try to find a listener in the config. Returns a host:port pair
for listener in config.get("listeners", []):
if listener.get("type") != "http" or listener.get("tls", False):
continue
if not any(
name == "client"
for resource in listener.get("resources", [])
for name in resource.get("names", [])
):
continue
# TODO: consider bind_addresses
return f"http://localhost:{listener['port']}"
# no suitable listeners?
return None
if __name__ == "__main__": if __name__ == "__main__":
main() main()