diff --git a/scripts-dev/federation_client.py b/scripts-dev/federation_client.py
index d1ab42d3af..3b28417376 100644..100755
--- a/scripts-dev/federation_client.py
+++ b/scripts-dev/federation_client.py
@@ -1,10 +1,30 @@
+#!/usr/bin/env python
+#
+# Copyright 2015, 2016 OpenMarket Ltd
+# Copyright 2017 New Vector Ltd
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+from __future__ import print_function
+
+import argparse
import nacl.signing
import json
import base64
import requests
import sys
import srvlookup
-
+import yaml
def encode_base64(input_bytes):
"""Encode bytes as a base64 string without any padding."""
@@ -103,15 +123,25 @@ def lookup(destination, path):
except:
return "https://%s:%d%s" % (destination, 8448, path)
-def get_json(origin_name, origin_key, destination, path):
- request_json = {
- "method": "GET",
+
+def request_json(method, origin_name, origin_key, destination, path, content):
+ if method is None:
+ if content is None:
+ method = "GET"
+ else:
+ method = "POST"
+
+ json_to_sign = {
+ "method": method,
"uri": path,
"origin": origin_name,
"destination": destination,
}
- signed_json = sign_json(request_json, origin_key, origin_name)
+ if content is not None:
+ json_to_sign["content"] = json.loads(content)
+
+ signed_json = sign_json(json_to_sign, origin_key, origin_name)
authorization_headers = []
@@ -120,30 +150,97 @@ def get_json(origin_name, origin_key, destination, path):
origin_name, key, sig,
)
authorization_headers.append(bytes(header))
- sys.stderr.write(header)
- sys.stderr.write("\n")
+ print ("Authorization: %s" % header, file=sys.stderr)
- result = requests.get(
- lookup(destination, path),
+ dest = lookup(destination, path)
+ print ("Requesting %s" % dest, file=sys.stderr)
+
+ result = requests.request(
+ method=method,
+ url=dest,
headers={"Authorization": authorization_headers[0]},
verify=False,
+ data=content,
)
sys.stderr.write("Status Code: %d\n" % (result.status_code,))
return result.json()
def main():
- origin_name, keyfile, destination, path = sys.argv[1:]
+ parser = argparse.ArgumentParser(
+ description=
+ "Signs and sends a federation request to a matrix homeserver",
+ )
- with open(keyfile) as f:
+ parser.add_argument(
+ "-N", "--server-name",
+ help="Name to give as the local homeserver. If unspecified, will be "
+ "read from the config file.",
+ )
+
+ parser.add_argument(
+ "-k", "--signing-key-path",
+ help="Path to the file containing the private ed25519 key to sign the "
+ "request with.",
+ )
+
+ parser.add_argument(
+ "-c", "--config",
+ default="homeserver.yaml",
+ help="Path to server config file. Ignored if --server-name and "
+ "--signing-key-path are both given.",
+ )
+
+ parser.add_argument(
+ "-d", "--destination",
+ default="matrix.org",
+ help="name of the remote homeserver. We will do SRV lookups and "
+ "connect appropriately.",
+ )
+
+ parser.add_argument(
+ "-X", "--method",
+ help="HTTP method to use for the request. Defaults to GET if --data is"
+ "unspecified, POST if it is."
+ )
+
+ parser.add_argument(
+ "--body",
+ help="Data to send as the body of the HTTP request"
+ )
+
+ parser.add_argument(
+ "path",
+ help="request path. We will add '/_matrix/federation/v1/' to this."
+ )
+
+ args = parser.parse_args()
+
+ if not args.server_name or not args.signing_key_path:
+ read_args_from_config(args)
+
+ with open(args.signing_key_path) as f:
key = read_signing_keys(f)[0]
- result = get_json(
- origin_name, key, destination, "/_matrix/federation/v1/" + path
+ result = request_json(
+ args.method,
+ args.server_name, key, args.destination,
+ "/_matrix/federation/v1/" + args.path,
+ content=args.body,
)
json.dump(result, sys.stdout)
- print ""
+ print ("")
+
+
+def read_args_from_config(args):
+ with open(args.config, 'r') as fh:
+ config = yaml.safe_load(fh)
+ if not args.server_name:
+ args.server_name = config['server_name']
+ if not args.signing_key_path:
+ args.signing_key_path = config['signing_key_path']
+
if __name__ == "__main__":
main()
diff --git a/scripts-dev/nuke-room-from-db.sh b/scripts-dev/nuke-room-from-db.sh
index 58c036c896..1201d176c2 100755
--- a/scripts-dev/nuke-room-from-db.sh
+++ b/scripts-dev/nuke-room-from-db.sh
@@ -9,16 +9,39 @@
ROOMID="$1"
sqlite3 homeserver.db <<EOF
-DELETE FROM context_depth WHERE context = '$ROOMID';
-DELETE FROM current_state WHERE context = '$ROOMID';
-DELETE FROM feedback WHERE room_id = '$ROOMID';
-DELETE FROM messages WHERE room_id = '$ROOMID';
-DELETE FROM pdu_backward_extremities WHERE context = '$ROOMID';
-DELETE FROM pdu_edges WHERE context = '$ROOMID';
-DELETE FROM pdu_forward_extremities WHERE context = '$ROOMID';
-DELETE FROM pdus WHERE context = '$ROOMID';
-DELETE FROM room_data WHERE room_id = '$ROOMID';
+DELETE FROM event_forward_extremities WHERE room_id = '$ROOMID';
+DELETE FROM event_backward_extremities WHERE room_id = '$ROOMID';
+DELETE FROM event_edges WHERE room_id = '$ROOMID';
+DELETE FROM room_depth WHERE room_id = '$ROOMID';
+DELETE FROM state_forward_extremities WHERE room_id = '$ROOMID';
+DELETE FROM events WHERE room_id = '$ROOMID';
+DELETE FROM event_json WHERE room_id = '$ROOMID';
+DELETE FROM state_events WHERE room_id = '$ROOMID';
+DELETE FROM current_state_events WHERE room_id = '$ROOMID';
DELETE FROM room_memberships WHERE room_id = '$ROOMID';
+DELETE FROM feedback WHERE room_id = '$ROOMID';
+DELETE FROM topics WHERE room_id = '$ROOMID';
+DELETE FROM room_names WHERE room_id = '$ROOMID';
DELETE FROM rooms WHERE room_id = '$ROOMID';
-DELETE FROM state_pdus WHERE context = '$ROOMID';
+DELETE FROM room_hosts WHERE room_id = '$ROOMID';
+DELETE FROM room_aliases WHERE room_id = '$ROOMID';
+DELETE FROM state_groups WHERE room_id = '$ROOMID';
+DELETE FROM state_groups_state WHERE room_id = '$ROOMID';
+DELETE FROM receipts_graph WHERE room_id = '$ROOMID';
+DELETE FROM receipts_linearized WHERE room_id = '$ROOMID';
+DELETE FROM event_search_content WHERE c1room_id = '$ROOMID';
+DELETE FROM guest_access WHERE room_id = '$ROOMID';
+DELETE FROM history_visibility WHERE room_id = '$ROOMID';
+DELETE FROM room_tags WHERE room_id = '$ROOMID';
+DELETE FROM room_tags_revisions WHERE room_id = '$ROOMID';
+DELETE FROM room_account_data WHERE room_id = '$ROOMID';
+DELETE FROM event_push_actions WHERE room_id = '$ROOMID';
+DELETE FROM local_invites WHERE room_id = '$ROOMID';
+DELETE FROM pusher_throttle WHERE room_id = '$ROOMID';
+DELETE FROM event_reports WHERE room_id = '$ROOMID';
+DELETE FROM public_room_list_stream WHERE room_id = '$ROOMID';
+DELETE FROM stream_ordering_to_exterm WHERE room_id = '$ROOMID';
+DELETE FROM event_auth WHERE room_id = '$ROOMID';
+DELETE FROM appservice_room_list WHERE room_id = '$ROOMID';
+VACUUM;
EOF
|