mirror of
https://github.com/PC-Admin/matrix-moderation-tool.git
synced 2024-12-19 23:20:26 -05:00
Compare commits
No commits in common. "d986fb424e010d03c69664f05922d95bb2963c3d" and "adc32b2b274bc9b434c98a803a63ad82899341bf" have entirely different histories.
d986fb424e
...
adc32b2b27
61
README.md
61
README.md
@ -6,64 +6,6 @@ A Matrix moderation tool to make managing a Synapse server easier.
|
|||||||
Contact me at [@michael:perthchat.org](https://matrix.to/#/@michael:perthchat.org) if you get stuck or have an edit in mind.
|
Contact me at [@michael:perthchat.org](https://matrix.to/#/@michael:perthchat.org) if you get stuck or have an edit in mind.
|
||||||
|
|
||||||
|
|
||||||
***
|
|
||||||
## List of Functions
|
|
||||||
|
|
||||||
This tool abstracts the Synapse API so you can perform common moderation functions easier and in batch.
|
|
||||||
|
|
||||||
Here is a preview of the CLI interface:
|
|
||||||
```
|
|
||||||
##########################
|
|
||||||
# MATRIX MODERATION TOOL #
|
|
||||||
##########################
|
|
||||||
|
|
||||||
A tool for making common Synapse moderation tasks easier. Created by @PC-Admin.
|
|
||||||
|
|
||||||
----------------------------------------------
|
|
||||||
|
|
||||||
#### User Account Commands #### #### Room Commands ####
|
|
||||||
1) Deactivate a user account. 50) List details of a room.
|
|
||||||
2) Deactivate multiple user accounts. 51) List the members of a room.
|
|
||||||
3) Create a user account. 52) Export the state events of a room.
|
|
||||||
4) Create multiple user accounts. 53) Export the state events of multiple rooms.
|
|
||||||
5) Reset a users password. 54) List rooms in public directory.
|
|
||||||
6) Whois user account. 55) Remove a room from the public directory.
|
|
||||||
7) Whois multiple user accounts. 56) Remove multiple rooms from the public directory.
|
|
||||||
8) Query user account. 57) Redact a room event.
|
|
||||||
9) Query multiple user accounts. 58) List/Download all media in a room.
|
|
||||||
10) List room memberships of user. 59) Download media from multiple rooms.
|
|
||||||
11) Promote a user to server admin. 60) Quarantine all media in a room.
|
|
||||||
12) List all user accounts. 61) Shutdown a room.
|
|
||||||
13) Quarantine all media a users uploaded. 62) Shutdown multiple rooms.
|
|
||||||
14) Collect account data. 63) Delete a room.
|
|
||||||
15) List account pushers. 64) Delete multiple rooms.
|
|
||||||
16) Get rate limit of a user account. 65) Purge the event history of a room to a specific timestamp.
|
|
||||||
17) Set rate limit of a user account. 66) Purge the event history of multiple rooms to a specific timestamp.
|
|
||||||
18) Delete rate limit of a user account. 67) Get blocked status for room.
|
|
||||||
19) Check if user account exists. 68) Block a room.
|
|
||||||
20) Shadow ban a user. 69) Unblock a room.
|
|
||||||
21) Find a user by their 3PID.
|
|
||||||
|
|
||||||
#### Server Commands #### #### ipinfo.io ####
|
|
||||||
100) Delete and block a specific media. 140) Analyse a users country of origin.
|
|
||||||
101) Purge remote media repository up to a certain date. 141) Analyse multiple users country of origin.
|
|
||||||
102) Prepare database for copying events of multiple rooms.
|
|
||||||
103) Show last 10 reported events. #### Report Generation ####
|
|
||||||
104) Get all reported events. 150) Generate user report.
|
|
||||||
105) Get details of a reported event. 151) Lookup homeserver admin contact details.
|
|
||||||
152) Send a test email (to yourself).
|
|
||||||
#### rdlist - General #### 153) Send a test Matrix message (to yourself).
|
|
||||||
120) Block all rooms with specific rdlist tags. 154) Send test incident reports (to yourself).
|
|
||||||
121) Get rdlist tags for a room.
|
|
||||||
|
|
||||||
#### rdlist - Recommended Tags ####
|
|
||||||
For rdlist rooms with recommended tags, the following actions are available:
|
|
||||||
130) Collect User Reports on local accounts in rdlist rooms.
|
|
||||||
131) Send Incident Reports on remote accounts in rdlist rooms.
|
|
||||||
132) Block/Purge all rdlist rooms.
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
***
|
***
|
||||||
## Licensing
|
## Licensing
|
||||||
|
|
||||||
@ -193,8 +135,7 @@ To do:
|
|||||||
- https://github.com/matrix-org/synapse/blob/master/docs/admin_api/delete_group.md
|
- https://github.com/matrix-org/synapse/blob/master/docs/admin_api/delete_group.md
|
||||||
- https://matrix-org.github.io/synapse/v1.38/admin_api/rooms.html#make-room-admin-api
|
- https://matrix-org.github.io/synapse/v1.38/admin_api/rooms.html#make-room-admin-api
|
||||||
- https://matrix-org.github.io/synapse/latest/admin_api/server_notices.html
|
- https://matrix-org.github.io/synapse/latest/admin_api/server_notices.html
|
||||||
- https://matrix-org.github.io/synapse/latest/admin_api/event_reports.html
|
https://matrix-org.github.io/synapse/latest/usage/administration/admin_api/federation.html#destination-rooms
|
||||||
- https://matrix-org.github.io/synapse/latest/usage/administration/admin_api/federation.html#destination-rooms
|
|
||||||
2) Add fully automated (should just return a web link and decryption password) reporting functions for users:
|
2) Add fully automated (should just return a web link and decryption password) reporting functions for users:
|
||||||
- Description of why the report was made (what happened), include key information
|
- Description of why the report was made (what happened), include key information
|
||||||
- Any other usernames associated with that IP
|
- Any other usernames associated with that IP
|
||||||
|
@ -11,9 +11,9 @@ This guide provides detailed steps for server-side operations that use the datab
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
100) **Delete and Block Specific Media.**
|
### 1. Delete and Block Specific Media
|
||||||
|
|
||||||
> This command allows an admin to delete a specific media on their Matrix Synapse server and block it to prevent future accesses.
|
This command allows an admin to delete a specific media on their Matrix Synapse server and block it to prevent future accesses.
|
||||||
|
|
||||||
#### Process Flow:
|
#### Process Flow:
|
||||||
|
|
||||||
@ -33,7 +33,7 @@ $ ssh matrix.perthchat.org "true > ...path to file..."
|
|||||||
$ ssh matrix.perthchat.org "chattr +i ...path to file..."
|
$ ssh matrix.perthchat.org "chattr +i ...path to file..."
|
||||||
```
|
```
|
||||||
|
|
||||||
101) **Purge Remote Media Repository**
|
### 2. Purge Remote Media Repository
|
||||||
|
|
||||||
This command purges the remote media repository for a certain range of days.
|
This command purges the remote media repository for a certain range of days.
|
||||||
Process Flow:
|
Process Flow:
|
||||||
@ -49,7 +49,7 @@ $ date --date '149 days ago' +%s
|
|||||||
$ curl -X POST --header "Authorization: Bearer ACCESS_TOKEN" '... Matrix Synapse purge endpoint ...'
|
$ curl -X POST --header "Authorization: Bearer ACCESS_TOKEN" '... Matrix Synapse purge endpoint ...'
|
||||||
```
|
```
|
||||||
|
|
||||||
102) **Prepare Database for Copying Events of Multiple Rooms**
|
### 3. Prepare Database for Copying Events of Multiple Rooms
|
||||||
|
|
||||||
This command prepares the PostgreSQL database to export events from multiple Matrix rooms.
|
This command prepares the PostgreSQL database to export events from multiple Matrix rooms.
|
||||||
Process Flow:
|
Process Flow:
|
||||||
@ -81,20 +81,4 @@ After copying the data, ensure to clean up the RAM disk:
|
|||||||
```bash
|
```bash
|
||||||
$ rm -r /matrix/postgres/data/ramdisk/*
|
$ rm -r /matrix/postgres/data/ramdisk/*
|
||||||
$ umount /matrix/postgres/data/ramdisk
|
$ umount /matrix/postgres/data/ramdisk
|
||||||
```
|
```
|
||||||
|
|
||||||
103) **Show last 10 reported events.**
|
|
||||||
|
|
||||||
> Gets the last 10 reported events using the event reports API and returns it.
|
|
||||||
|
|
||||||
https://matrix-org.github.io/synapse/latest/admin_api/event_reports.html#show-reported-events
|
|
||||||
|
|
||||||
104) **Paginate all reported events.**
|
|
||||||
|
|
||||||
> Combines all the events into a large JSON and returns it.
|
|
||||||
|
|
||||||
105) **Show details of a specific event report**
|
|
||||||
|
|
||||||
> This API returns information about a specific event report.
|
|
||||||
|
|
||||||
https://matrix-org.github.io/synapse/latest/admin_api/event_reports.html#show-details-of-a-specific-event-report
|
|
@ -73,22 +73,21 @@ while pass_token == False:
|
|||||||
print("19) Check if user account exists.\t\t68) Block a room.")
|
print("19) Check if user account exists.\t\t68) Block a room.")
|
||||||
print("20) Shadow ban a user.\t\t\t\t69) Unblock a room.")
|
print("20) Shadow ban a user.\t\t\t\t69) Unblock a room.")
|
||||||
print("21) Find a user by their 3PID.")
|
print("21) Find a user by their 3PID.")
|
||||||
print("\n#### Server Commands ####\t\t\t\t\t#### ipinfo.io ####")
|
print("\n#### Server Commands ####\t\t\t\t\t#### Report Generation ####")
|
||||||
print("100) Delete and block a specific media.\t\t\t\t140) Analyse a users country of origin.")
|
print("100) Delete and block a specific media.\t\t\t\t150) Generate user report.")
|
||||||
print("101) Purge remote media repository up to a certain date.\t141) Analyse multiple users country of origin.")
|
print("101) Purge remote media repository up to a certain date.\t151) Lookup homeserver admin contact details.")
|
||||||
print("102) Prepare database for copying events of multiple rooms.")
|
print("102) Prepare database for copying events of multiple rooms.\t152) Send a test email (to yourself).")
|
||||||
print("103) Show last 10 reported events.\t\t\t\t#### Report Generation ####")
|
print("\t\t\t\t\t\t\t\t153) Sent a test Matrix message (to yourself).")
|
||||||
print("104) Get all reported events.\t\t\t\t\t150) Generate user report.")
|
print("#### rdlist - General ####\t\t\t\t\t154) Send test incident reports (to yourself).")
|
||||||
print("105) Get details of a reported event.\t\t\t\t151) Lookup homeserver admin contact details.")
|
print("120) Block all rooms with specific rdlist tags.")
|
||||||
print("\t\t\t\t\t\t\t\t152) Send a test email (to yourself).")
|
|
||||||
print("#### rdlist - General ####\t\t\t\t\t153) Send a test Matrix message (to yourself).")
|
|
||||||
print("120) Block all rooms with specific rdlist tags.\t\t\t154) Send test incident reports (to yourself).")
|
|
||||||
print("121) Get rdlist tags for a room.")
|
print("121) Get rdlist tags for a room.")
|
||||||
print("\n#### rdlist - Recommended Tags ####")
|
print("\n#### rdlist - Recommended Tags ####\nFor rdlist rooms with recommended tags, the following actions are available:")
|
||||||
print("For rdlist rooms with recommended tags, the following actions are available:")
|
|
||||||
print("130) Collect User Reports on local accounts in rdlist rooms.")
|
print("130) Collect User Reports on local accounts in rdlist rooms.")
|
||||||
print("131) Send Incident Reports on remote accounts in rdlist rooms.")
|
print("131) Send Incident Reports on remote accounts in rdlist rooms.")
|
||||||
print("132) Block/Purge all rdlist rooms.")
|
print("132) Block/Purge all rdlist rooms.")
|
||||||
|
print("\n#### ipinfo.io ####")
|
||||||
|
print("140) Analyse a users country of origin.")
|
||||||
|
print("141) Analyse multiple users country of origin.")
|
||||||
print("\nPlease enter a number from the above menu, or enter 'q' or 'e' to exit.\n")
|
print("\nPlease enter a number from the above menu, or enter 'q' or 'e' to exit.\n")
|
||||||
menu_input = input()
|
menu_input = input()
|
||||||
if menu_input == "1":
|
if menu_input == "1":
|
||||||
@ -203,15 +202,6 @@ while pass_token == False:
|
|||||||
server_commands.purge_remote_media_repo()
|
server_commands.purge_remote_media_repo()
|
||||||
elif menu_input == "102":
|
elif menu_input == "102":
|
||||||
server_commands.prepare_database_copy_of_multiple_rooms()
|
server_commands.prepare_database_copy_of_multiple_rooms()
|
||||||
elif menu_input == "103":
|
|
||||||
reported_events = server_commands.get_reported_events(10)
|
|
||||||
print(json.dumps(reported_events, indent=4, sort_keys=True))
|
|
||||||
elif menu_input == "104":
|
|
||||||
all_reported_events = server_commands.paginate_reported_events() # Again assuming default values are set
|
|
||||||
print(json.dumps(all_reported_events, indent=4, sort_keys=True))
|
|
||||||
elif menu_input == "105":
|
|
||||||
report_details = server_commands.get_event_report_details()
|
|
||||||
print(json.dumps(report_details, indent=4, sort_keys=True))
|
|
||||||
elif menu_input == "120":
|
elif menu_input == "120":
|
||||||
rdlist_commands.block_all_rooms_with_rdlist_tags(False,'','','')
|
rdlist_commands.block_all_rooms_with_rdlist_tags(False,'','','')
|
||||||
elif menu_input == "121":
|
elif menu_input == "121":
|
||||||
|
@ -136,70 +136,3 @@ def prepare_database_copy_of_multiple_rooms():
|
|||||||
print(chown_command_process.stdout)
|
print(chown_command_process.stdout)
|
||||||
|
|
||||||
print("\nThe sql query files have been generated, as postgres user in container run:\n# docker exec -it matrix-postgres /bin/bash\nbash-5.0$ export PGPASSWORD=your-db-password\nbash-5.0$ for f in /var/lib/postgresql/data/ramdisk/*/dump_room_data.sql; do psql --host=127.0.0.1 --port=5432 --username=synapse -w -f $f; done\n\nAfter copying the data to a cloud location law enforcement can access, clean up the ramdisk like so:\n# rm -r /matrix/postgres/data/ramdisk/*\n# umount /matrix/postgres/data/ramdisk")
|
print("\nThe sql query files have been generated, as postgres user in container run:\n# docker exec -it matrix-postgres /bin/bash\nbash-5.0$ export PGPASSWORD=your-db-password\nbash-5.0$ for f in /var/lib/postgresql/data/ramdisk/*/dump_room_data.sql; do psql --host=127.0.0.1 --port=5432 --username=synapse -w -f $f; done\n\nAfter copying the data to a cloud location law enforcement can access, clean up the ramdisk like so:\n# rm -r /matrix/postgres/data/ramdisk/*\n# umount /matrix/postgres/data/ramdisk")
|
||||||
|
|
||||||
def get_reported_events(limit=100, _from=0, dir='b', user_id=None, room_id=None):
|
|
||||||
url = f"https://{hardcoded_variables.homeserver_url}/_synapse/admin/v1/event_reports"
|
|
||||||
|
|
||||||
headers = {
|
|
||||||
"Content-Type": "application/json",
|
|
||||||
"Authorization": f"Bearer {hardcoded_variables.access_token}"
|
|
||||||
}
|
|
||||||
|
|
||||||
params = {
|
|
||||||
'limit': limit,
|
|
||||||
'from': _from,
|
|
||||||
'dir': dir
|
|
||||||
}
|
|
||||||
|
|
||||||
if user_id:
|
|
||||||
params['user_id'] = user_id
|
|
||||||
|
|
||||||
if room_id:
|
|
||||||
params['room_id'] = room_id
|
|
||||||
|
|
||||||
response = requests.get(url, headers=headers, params=params)
|
|
||||||
|
|
||||||
if response.status_code == 200:
|
|
||||||
return response.json()
|
|
||||||
else:
|
|
||||||
print(f"Error fetching reported events: {response.status_code}, {response.text}")
|
|
||||||
return None
|
|
||||||
|
|
||||||
def paginate_reported_events(limit=100, dir='b', user_id=None, room_id=None):
|
|
||||||
_from = 0
|
|
||||||
all_reports = []
|
|
||||||
|
|
||||||
while True:
|
|
||||||
reports = get_reported_events(limit=limit, _from=_from, dir=dir, user_id=user_id, room_id=room_id)
|
|
||||||
if not reports or "event_reports" not in reports:
|
|
||||||
break
|
|
||||||
|
|
||||||
all_reports.extend(reports["event_reports"])
|
|
||||||
|
|
||||||
if "next_token" in reports:
|
|
||||||
_from = reports["next_token"]
|
|
||||||
else:
|
|
||||||
break
|
|
||||||
|
|
||||||
return all_reports
|
|
||||||
|
|
||||||
def get_event_report_details(preset_report_id=''):
|
|
||||||
if preset_report_id == '':
|
|
||||||
report_id = input("\nEnter the report_id of the report you wish to query (Example: 56): ")
|
|
||||||
elif preset_report_id != '':
|
|
||||||
report_id = preset_report_id
|
|
||||||
|
|
||||||
url = f"https://{hardcoded_variables.homeserver_url}/_synapse/admin/v1/event_reports/{report_id}"
|
|
||||||
|
|
||||||
headers = {
|
|
||||||
"Content-Type": "application/json",
|
|
||||||
"Authorization": f"Bearer {hardcoded_variables.access_token}"
|
|
||||||
}
|
|
||||||
|
|
||||||
response = requests.get(url, headers=headers)
|
|
||||||
|
|
||||||
if response.status_code == 200:
|
|
||||||
return response.json()
|
|
||||||
else:
|
|
||||||
print(f"Error fetching event report details: {response.status_code}, {response.text}")
|
|
||||||
return None
|
|
||||||
|
Loading…
Reference in New Issue
Block a user