diff --git a/contrib/cmdclient/console.py b/contrib/cmdclient/console.py
index 462f146113..af8f39c8c2 100755
--- a/contrib/cmdclient/console.py
+++ b/contrib/cmdclient/console.py
@@ -37,9 +37,8 @@ from signedjson.sign import verify_signed_json, SignatureVerifyException
CONFIG_JSON = "cmdclient_config.json"
-TRUSTED_ID_SERVERS = [
- 'localhost:8001'
-]
+TRUSTED_ID_SERVERS = ["localhost:8001"]
+
class SynapseCmd(cmd.Cmd):
@@ -59,7 +58,7 @@ class SynapseCmd(cmd.Cmd):
"token": token,
"verbose": "on",
"complete_usernames": "on",
- "send_delivery_receipts": "on"
+ "send_delivery_receipts": "on",
}
self.path_prefix = "/_matrix/client/api/v1"
self.event_stream_token = "END"
@@ -120,12 +119,11 @@ class SynapseCmd(cmd.Cmd):
config_rules = [ # key, valid_values
("verbose", ["on", "off"]),
("complete_usernames", ["on", "off"]),
- ("send_delivery_receipts", ["on", "off"])
+ ("send_delivery_receipts", ["on", "off"]),
]
for key, valid_vals in config_rules:
if key == args["key"] and args["val"] not in valid_vals:
- print("%s value must be one of %s" % (args["key"],
- valid_vals))
+ print("%s value must be one of %s" % (args["key"], valid_vals))
return
# toggle the http client verbosity
@@ -159,16 +157,13 @@ class SynapseCmd(cmd.Cmd):
else:
password = pwd
- body = {
- "type": "m.login.password"
- }
+ body = {"type": "m.login.password"}
if "userid" in args:
body["user"] = args["userid"]
if password:
body["password"] = password
- reactor.callFromThread(self._do_register, body,
- "noupdate" not in args)
+ reactor.callFromThread(self._do_register, body, "noupdate" not in args)
@defer.inlineCallbacks
def _do_register(self, data, update_config):
@@ -179,7 +174,9 @@ class SynapseCmd(cmd.Cmd):
passwordFlow = None
for flow in json_res["flows"]:
- if flow["type"] == "m.login.recaptcha" or ("stages" in flow and "m.login.recaptcha" in flow["stages"]):
+ if flow["type"] == "m.login.recaptcha" or (
+ "stages" in flow and "m.login.recaptcha" in flow["stages"]
+ ):
print("Unable to register: Home server requires captcha.")
return
if flow["type"] == "m.login.password" and "stages" not in flow:
@@ -202,9 +199,7 @@ class SynapseCmd(cmd.Cmd):
"""
try:
args = self._parse(line, ["user_id"], force_keys=True)
- can_login = threads.blockingCallFromThread(
- reactor,
- self._check_can_login)
+ can_login = threads.blockingCallFromThread(reactor, self._check_can_login)
if can_login:
p = getpass.getpass("Enter your password: ")
user = args["user_id"]
@@ -212,20 +207,16 @@ class SynapseCmd(cmd.Cmd):
domain = self._domain()
if domain:
user = "@" + user + ":" + domain
-
+
reactor.callFromThread(self._do_login, user, p)
- #print " got %s " % p
+ # print " got %s " % p
except Exception as e:
print(e)
@defer.inlineCallbacks
def _do_login(self, user, password):
path = "/login"
- data = {
- "user": user,
- "password": password,
- "type": "m.login.password"
- }
+ data = {"user": user, "password": password, "type": "m.login.password"}
url = self._url() + path
json_res = yield self.http_client.do_request("POST", url, data=data)
print(json_res)
@@ -249,12 +240,13 @@ class SynapseCmd(cmd.Cmd):
print("Failed to find any login flows.")
defer.returnValue(False)
- flow = json_res["flows"][0] # assume first is the one we want.
- if ("type" not in flow or "m.login.password" != flow["type"] or
- "stages" in flow):
+ flow = json_res["flows"][0] # assume first is the one we want.
+ if "type" not in flow or "m.login.password" != flow["type"] or "stages" in flow:
fallback_url = self._url() + "/login/fallback"
- print ("Unable to login via the command line client. Please visit "
- "%s to login." % fallback_url)
+ print(
+ "Unable to login via the command line client. Please visit "
+ "%s to login." % fallback_url
+ )
defer.returnValue(False)
defer.returnValue(True)
@@ -264,21 +256,33 @@ class SynapseCmd(cmd.Cmd):
<clientSecret> A string of characters generated when requesting an email that you'll supply in subsequent calls to identify yourself
<sendAttempt> The number of times the user has requested an email. Leave this the same between requests to retry the request at the transport level. Increment it to request that the email be sent again.
"""
- args = self._parse(line, ['address', 'clientSecret', 'sendAttempt'])
+ args = self._parse(line, ["address", "clientSecret", "sendAttempt"])
- postArgs = {'email': args['address'], 'clientSecret': args['clientSecret'], 'sendAttempt': args['sendAttempt']}
+ postArgs = {
+ "email": args["address"],
+ "clientSecret": args["clientSecret"],
+ "sendAttempt": args["sendAttempt"],
+ }
reactor.callFromThread(self._do_emailrequest, postArgs)
@defer.inlineCallbacks
def _do_emailrequest(self, args):
- url = self._identityServerUrl()+"/_matrix/identity/api/v1/validate/email/requestToken"
-
- json_res = yield self.http_client.do_request("POST", url, data=urllib.urlencode(args), jsonreq=False,
- headers={'Content-Type': ['application/x-www-form-urlencoded']})
+ url = (
+ self._identityServerUrl()
+ + "/_matrix/identity/api/v1/validate/email/requestToken"
+ )
+
+ json_res = yield self.http_client.do_request(
+ "POST",
+ url,
+ data=urllib.urlencode(args),
+ jsonreq=False,
+ headers={"Content-Type": ["application/x-www-form-urlencoded"]},
+ )
print(json_res)
- if 'sid' in json_res:
- print("Token sent. Your session ID is %s" % (json_res['sid']))
+ if "sid" in json_res:
+ print("Token sent. Your session ID is %s" % (json_res["sid"]))
def do_emailvalidate(self, line):
"""Validate and associate a third party ID
@@ -286,18 +290,30 @@ class SynapseCmd(cmd.Cmd):
<token> The token sent to your third party identifier address
<clientSecret> The same clientSecret you supplied in requestToken
"""
- args = self._parse(line, ['sid', 'token', 'clientSecret'])
+ args = self._parse(line, ["sid", "token", "clientSecret"])
- postArgs = { 'sid' : args['sid'], 'token' : args['token'], 'clientSecret': args['clientSecret'] }
+ postArgs = {
+ "sid": args["sid"],
+ "token": args["token"],
+ "clientSecret": args["clientSecret"],
+ }
reactor.callFromThread(self._do_emailvalidate, postArgs)
@defer.inlineCallbacks
def _do_emailvalidate(self, args):
- url = self._identityServerUrl()+"/_matrix/identity/api/v1/validate/email/submitToken"
-
- json_res = yield self.http_client.do_request("POST", url, data=urllib.urlencode(args), jsonreq=False,
- headers={'Content-Type': ['application/x-www-form-urlencoded']})
+ url = (
+ self._identityServerUrl()
+ + "/_matrix/identity/api/v1/validate/email/submitToken"
+ )
+
+ json_res = yield self.http_client.do_request(
+ "POST",
+ url,
+ data=urllib.urlencode(args),
+ jsonreq=False,
+ headers={"Content-Type": ["application/x-www-form-urlencoded"]},
+ )
print(json_res)
def do_3pidbind(self, line):
@@ -305,19 +321,24 @@ class SynapseCmd(cmd.Cmd):
<sid> The session ID (sid) given to you in the response to requestToken
<clientSecret> The same clientSecret you supplied in requestToken
"""
- args = self._parse(line, ['sid', 'clientSecret'])
+ args = self._parse(line, ["sid", "clientSecret"])
- postArgs = { 'sid' : args['sid'], 'clientSecret': args['clientSecret'] }
- postArgs['mxid'] = self.config["user"]
+ postArgs = {"sid": args["sid"], "clientSecret": args["clientSecret"]}
+ postArgs["mxid"] = self.config["user"]
reactor.callFromThread(self._do_3pidbind, postArgs)
@defer.inlineCallbacks
def _do_3pidbind(self, args):
- url = self._identityServerUrl()+"/_matrix/identity/api/v1/3pid/bind"
-
- json_res = yield self.http_client.do_request("POST", url, data=urllib.urlencode(args), jsonreq=False,
- headers={'Content-Type': ['application/x-www-form-urlencoded']})
+ url = self._identityServerUrl() + "/_matrix/identity/api/v1/3pid/bind"
+
+ json_res = yield self.http_client.do_request(
+ "POST",
+ url,
+ data=urllib.urlencode(args),
+ jsonreq=False,
+ headers={"Content-Type": ["application/x-www-form-urlencoded"]},
+ )
print(json_res)
def do_join(self, line):
@@ -356,9 +377,7 @@ class SynapseCmd(cmd.Cmd):
if "topic" not in args:
print("Must specify a new topic.")
return
- body = {
- "topic": args["topic"]
- }
+ body = {"topic": args["topic"]}
reactor.callFromThread(self._run_and_pprint, "PUT", path, body)
elif args["action"].lower() == "get":
reactor.callFromThread(self._run_and_pprint, "GET", path)
@@ -378,45 +397,60 @@ class SynapseCmd(cmd.Cmd):
@defer.inlineCallbacks
def _do_invite(self, roomid, userstring):
- if (not userstring.startswith('@') and
- self._is_on("complete_usernames")):
- url = self._identityServerUrl()+"/_matrix/identity/api/v1/lookup"
+ if not userstring.startswith("@") and self._is_on("complete_usernames"):
+ url = self._identityServerUrl() + "/_matrix/identity/api/v1/lookup"
- json_res = yield self.http_client.do_request("GET", url, qparams={'medium':'email','address':userstring})
+ json_res = yield self.http_client.do_request(
+ "GET", url, qparams={"medium": "email", "address": userstring}
+ )
mxid = None
- if 'mxid' in json_res and 'signatures' in json_res:
- url = self._identityServerUrl()+"/_matrix/identity/api/v1/pubkey/ed25519"
+ if "mxid" in json_res and "signatures" in json_res:
+ url = (
+ self._identityServerUrl()
+ + "/_matrix/identity/api/v1/pubkey/ed25519"
+ )
pubKey = None
pubKeyObj = yield self.http_client.do_request("GET", url)
- if 'public_key' in pubKeyObj:
- pubKey = nacl.signing.VerifyKey(pubKeyObj['public_key'], encoder=nacl.encoding.HexEncoder)
+ if "public_key" in pubKeyObj:
+ pubKey = nacl.signing.VerifyKey(
+ pubKeyObj["public_key"], encoder=nacl.encoding.HexEncoder
+ )
else:
print("No public key found in pubkey response!")
sigValid = False
if pubKey:
- for signame in json_res['signatures']:
+ for signame in json_res["signatures"]:
if signame not in TRUSTED_ID_SERVERS:
- print("Ignoring signature from untrusted server %s" % (signame))
+ print(
+ "Ignoring signature from untrusted server %s"
+ % (signame)
+ )
else:
try:
verify_signed_json(json_res, signame, pubKey)
sigValid = True
- print("Mapping %s -> %s correctly signed by %s" % (userstring, json_res['mxid'], signame))
+ print(
+ "Mapping %s -> %s correctly signed by %s"
+ % (userstring, json_res["mxid"], signame)
+ )
break
except SignatureVerifyException as e:
print("Invalid signature from %s" % (signame))
print(e)
if sigValid:
- print("Resolved 3pid %s to %s" % (userstring, json_res['mxid']))
- mxid = json_res['mxid']
+ print("Resolved 3pid %s to %s" % (userstring, json_res["mxid"]))
+ mxid = json_res["mxid"]
else:
- print("Got association for %s but couldn't verify signature" % (userstring))
+ print(
+ "Got association for %s but couldn't verify signature"
+ % (userstring)
+ )
if not mxid:
mxid = "@" + userstring + ":" + self._domain()
@@ -435,12 +469,11 @@ class SynapseCmd(cmd.Cmd):
"""Sends a message. "send <roomid> <body>" """
args = self._parse(line, ["roomid", "body"])
txn_id = "txn%s" % int(time.time())
- path = "/rooms/%s/send/m.room.message/%s" % (urllib.quote(args["roomid"]),
- txn_id)
- body_json = {
- "msgtype": "m.text",
- "body": args["body"]
- }
+ path = "/rooms/%s/send/m.room.message/%s" % (
+ urllib.quote(args["roomid"]),
+ txn_id,
+ )
+ body_json = {"msgtype": "m.text", "body": args["body"]}
reactor.callFromThread(self._run_and_pprint, "PUT", path, body_json)
def do_list(self, line):
@@ -472,8 +505,7 @@ class SynapseCmd(cmd.Cmd):
print("Bad query param: %s" % key_value)
return
- reactor.callFromThread(self._run_and_pprint, "GET", path,
- query_params=qp)
+ reactor.callFromThread(self._run_and_pprint, "GET", path, query_params=qp)
def do_create(self, line):
"""Creates a room.
@@ -513,8 +545,16 @@ class SynapseCmd(cmd.Cmd):
return
args["method"] = args["method"].upper()
- valid_methods = ["PUT", "GET", "POST", "DELETE",
- "XPUT", "XGET", "XPOST", "XDELETE"]
+ valid_methods = [
+ "PUT",
+ "GET",
+ "POST",
+ "DELETE",
+ "XPUT",
+ "XGET",
+ "XPOST",
+ "XDELETE",
+ ]
if args["method"] not in valid_methods:
print("Unsupported method: %s" % args["method"])
return
@@ -541,10 +581,13 @@ class SynapseCmd(cmd.Cmd):
except:
pass
- reactor.callFromThread(self._run_and_pprint, args["method"],
- args["path"],
- args["data"],
- query_params=qp)
+ reactor.callFromThread(
+ self._run_and_pprint,
+ args["method"],
+ args["path"],
+ args["data"],
+ query_params=qp,
+ )
def do_stream(self, line):
"""Stream data from the server: "stream <longpoll timeout ms>" """
@@ -561,19 +604,22 @@ class SynapseCmd(cmd.Cmd):
@defer.inlineCallbacks
def _do_event_stream(self, timeout):
res = yield self.http_client.get_json(
- self._url() + "/events",
- {
- "access_token": self._tok(),
- "timeout": str(timeout),
- "from": self.event_stream_token
- })
+ self._url() + "/events",
+ {
+ "access_token": self._tok(),
+ "timeout": str(timeout),
+ "from": self.event_stream_token,
+ },
+ )
print(json.dumps(res, indent=4))
if "chunk" in res:
for event in res["chunk"]:
- if (event["type"] == "m.room.message" and
- self._is_on("send_delivery_receipts") and
- event["user_id"] != self._usr()): # not sent by us
+ if (
+ event["type"] == "m.room.message"
+ and self._is_on("send_delivery_receipts")
+ and event["user_id"] != self._usr()
+ ): # not sent by us
self._send_receipt(event, "d")
# update the position in the stram
@@ -581,18 +627,28 @@ class SynapseCmd(cmd.Cmd):
self.event_stream_token = res["end"]
def _send_receipt(self, event, feedback_type):
- path = ("/rooms/%s/messages/%s/%s/feedback/%s/%s" %
- (urllib.quote(event["room_id"]), event["user_id"], event["msg_id"],
- self._usr(), feedback_type))
+ path = "/rooms/%s/messages/%s/%s/feedback/%s/%s" % (
+ urllib.quote(event["room_id"]),
+ event["user_id"],
+ event["msg_id"],
+ self._usr(),
+ feedback_type,
+ )
data = {}
- reactor.callFromThread(self._run_and_pprint, "PUT", path, data=data,
- alt_text="Sent receipt for %s" % event["msg_id"])
+ reactor.callFromThread(
+ self._run_and_pprint,
+ "PUT",
+ path,
+ data=data,
+ alt_text="Sent receipt for %s" % event["msg_id"],
+ )
def _do_membership_change(self, roomid, membership, userid):
- path = "/rooms/%s/state/m.room.member/%s" % (urllib.quote(roomid), urllib.quote(userid))
- data = {
- "membership": membership
- }
+ path = "/rooms/%s/state/m.room.member/%s" % (
+ urllib.quote(roomid),
+ urllib.quote(userid),
+ )
+ data = {"membership": membership}
reactor.callFromThread(self._run_and_pprint, "PUT", path, data=data)
def do_displayname(self, line):
@@ -645,15 +701,20 @@ class SynapseCmd(cmd.Cmd):
for i, arg in enumerate(line_args):
for config_key in self.config:
if ("$" + config_key) in arg:
- arg = arg.replace("$" + config_key,
- self.config[config_key])
+ arg = arg.replace("$" + config_key, self.config[config_key])
line_args[i] = arg
return dict(zip(keys, line_args))
@defer.inlineCallbacks
- def _run_and_pprint(self, method, path, data=None,
- query_params={"access_token": None}, alt_text=None):
+ def _run_and_pprint(
+ self,
+ method,
+ path,
+ data=None,
+ query_params={"access_token": None},
+ alt_text=None,
+ ):
""" Runs an HTTP request and pretty prints the output.
Args:
@@ -666,9 +727,9 @@ class SynapseCmd(cmd.Cmd):
if "access_token" in query_params:
query_params["access_token"] = self._tok()
- json_res = yield self.http_client.do_request(method, url,
- data=data,
- qparams=query_params)
+ json_res = yield self.http_client.do_request(
+ method, url, data=data, qparams=query_params
+ )
if alt_text:
print(alt_text)
else:
@@ -676,7 +737,7 @@ class SynapseCmd(cmd.Cmd):
def save_config(config):
- with open(CONFIG_JSON, 'w') as out:
+ with open(CONFIG_JSON, "w") as out:
json.dump(config, out)
@@ -700,7 +761,7 @@ def main(server_url, identity_server_url, username, token, config_path):
global CONFIG_JSON
CONFIG_JSON = config_path # bit cheeky, but just overwrite the global
try:
- with open(config_path, 'r') as config:
+ with open(config_path, "r") as config:
syn_cmd.config = json.load(config)
try:
http_client.verbose = "on" == syn_cmd.config["verbose"]
@@ -717,23 +778,33 @@ def main(server_url, identity_server_url, username, token, config_path):
reactor.run()
-if __name__ == '__main__':
+if __name__ == "__main__":
parser = argparse.ArgumentParser("Starts a synapse client.")
parser.add_argument(
- "-s", "--server", dest="server", default="http://localhost:8008",
- help="The URL of the home server to talk to.")
- parser.add_argument(
- "-i", "--identity-server", dest="identityserver", default="http://localhost:8090",
- help="The URL of the identity server to talk to.")
+ "-s",
+ "--server",
+ dest="server",
+ default="http://localhost:8008",
+ help="The URL of the home server to talk to.",
+ )
parser.add_argument(
- "-u", "--username", dest="username",
- help="Your username on the server.")
+ "-i",
+ "--identity-server",
+ dest="identityserver",
+ default="http://localhost:8090",
+ help="The URL of the identity server to talk to.",
+ )
parser.add_argument(
- "-t", "--token", dest="token",
- help="Your access token.")
+ "-u", "--username", dest="username", help="Your username on the server."
+ )
+ parser.add_argument("-t", "--token", dest="token", help="Your access token.")
parser.add_argument(
- "-c", "--config", dest="config", default=CONFIG_JSON,
- help="The location of the config.json file to read from.")
+ "-c",
+ "--config",
+ dest="config",
+ default=CONFIG_JSON,
+ help="The location of the config.json file to read from.",
+ )
args = parser.parse_args()
if not args.server:
diff --git a/contrib/cmdclient/http.py b/contrib/cmdclient/http.py
index 1bd600e148..0e101d2be5 100644
--- a/contrib/cmdclient/http.py
+++ b/contrib/cmdclient/http.py
@@ -73,9 +73,7 @@ class TwistedHttpClient(HttpClient):
@defer.inlineCallbacks
def put_json(self, url, data):
response = yield self._create_put_request(
- url,
- data,
- headers_dict={"Content-Type": ["application/json"]}
+ url, data, headers_dict={"Content-Type": ["application/json"]}
)
body = yield readBody(response)
defer.returnValue((response.code, body))
@@ -95,40 +93,34 @@ class TwistedHttpClient(HttpClient):
"""
if "Content-Type" not in headers_dict:
- raise defer.error(
- RuntimeError("Must include Content-Type header for PUTs"))
+ raise defer.error(RuntimeError("Must include Content-Type header for PUTs"))
return self._create_request(
- "PUT",
- url,
- producer=_JsonProducer(json_data),
- headers_dict=headers_dict
+ "PUT", url, producer=_JsonProducer(json_data), headers_dict=headers_dict
)
def _create_get_request(self, url, headers_dict={}):
""" Wrapper of _create_request to issue a GET request
"""
- return self._create_request(
- "GET",
- url,
- headers_dict=headers_dict
- )
+ return self._create_request("GET", url, headers_dict=headers_dict)
@defer.inlineCallbacks
- def do_request(self, method, url, data=None, qparams=None, jsonreq=True, headers={}):
+ def do_request(
+ self, method, url, data=None, qparams=None, jsonreq=True, headers={}
+ ):
if qparams:
url = "%s?%s" % (url, urllib.urlencode(qparams, True))
if jsonreq:
prod = _JsonProducer(data)
- headers['Content-Type'] = ["application/json"];
+ headers["Content-Type"] = ["application/json"]
else:
prod = _RawProducer(data)
if method in ["POST", "PUT"]:
- response = yield self._create_request(method, url,
- producer=prod,
- headers_dict=headers)
+ response = yield self._create_request(
+ method, url, producer=prod, headers_dict=headers
+ )
else:
response = yield self._create_request(method, url)
@@ -155,10 +147,7 @@ class TwistedHttpClient(HttpClient):
while True:
try:
response = yield self.agent.request(
- method,
- url.encode("UTF8"),
- Headers(headers_dict),
- producer
+ method, url.encode("UTF8"), Headers(headers_dict), producer
)
break
except Exception as e:
@@ -179,6 +168,7 @@ class TwistedHttpClient(HttpClient):
reactor.callLater(seconds, d.callback, seconds)
return d
+
class _RawProducer(object):
def __init__(self, data):
self.data = data
@@ -195,9 +185,11 @@ class _RawProducer(object):
def stopProducing(self):
pass
+
class _JsonProducer(object):
""" Used by the twisted http client to create the HTTP body from json
"""
+
def __init__(self, jsn):
self.data = jsn
self.body = json.dumps(jsn).encode("utf8")
|