aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar jesopo2019-08-05 15:41:24 +0100
committerGravatar jesopo2019-08-05 15:41:24 +0100
commit357abba00d0af23ab9a7c53f7b45620eed26312b (patch)
tree000a522bac62d49bf65c0218f09a89d6b4bd8285
parentAllow bypass of content-type check in utils.http.request (diff)
signature
Use host-meta to find webfinger url, indent-flatten by `raise` calls
-rw-r--r--modules/fediverse.py126
1 files changed, 71 insertions, 55 deletions
diff --git a/modules/fediverse.py b/modules/fediverse.py
index ef2c1108..3e61041a 100644
--- a/modules/fediverse.py
+++ b/modules/fediverse.py
@@ -1,7 +1,7 @@
import urllib.parse
from src import ModuleManager, utils
-WEBFINGER = "https://%s/.well-known/webfinger"
+HOSTMETA = "https://%s/.well-known/host-meta"
WEBFINGER_HEADERS = {"Accept": "application/jrd+json"}
ACTIVITY_TYPE = "application/activity+json"
@@ -22,72 +22,88 @@ class Module(ModuleManager.BaseModule):
if not username or not instance:
raise utils.EventError("Please provide @<user>@<instance>")
- webfinger = utils.http.request(WEBFINGER % instance,
+ hostmeta = utils.http.request(HOSTMETA % instance,
+ soup=True, check_content_type=False)
+ print(hostmeta.data)
+ webfinger_url = None
+ for item in hostmeta.data.find_all("link"):
+ if item["rel"] and item["rel"][0] == "lrdd":
+ webfinger_url = item["template"]
+ break
+
+ if webfinger_url == None:
+ raise utils.EventError("host-meta lookup failed for %s" %
+ instance)
+ webfinger_url = webfinger_url.replace("{uri}",
+ "acct:%s" % full_username)
+
+ webfinger = utils.http.request(webfinger_url,
headers=WEBFINGER_HEADERS,
get_params={"resource": "acct:%s" % full_username},
json=True)
+ print(webfinger.data)
- if webfinger.data:
- activity_url = None
- for link in webfinger.data["links"]:
- if link["type"] == ACTIVITY_TYPE:
- activity_url = link["href"]
- break
+ activity_url = None
+ for link in webfinger.data["links"]:
+ if link["type"] == ACTIVITY_TYPE:
+ activity_url = link["href"]
+ break
- if not activity_url:
- raise utils.EventError("Failed to find user activity feed")
+ if not activity_url:
+ raise utils.EventError("Failed to find user activity feed")
- activity = utils.http.request(activity_url,
- headers=ACTIVITY_HEADERS, json=True)
- preferred_username = activity.data["preferredUsername"]
- outbox_url = activity.data["outbox"]
+ activity = utils.http.request(activity_url,
+ headers=ACTIVITY_HEADERS, json=True)
+ preferred_username = activity.data["preferredUsername"]
+ outbox_url = activity.data["outbox"]
+
+ outbox = utils.http.request(outbox_url, headers=ACTIVITY_HEADERS,
+ json=True)
+ items = None
- outbox = utils.http.request(outbox_url, headers=ACTIVITY_HEADERS,
- json=True)
- items = None
- if "first" in outbox.data:
- if type(outbox.data["first"]) == dict:
- items = outbox.data["first"]["orderedItems"]
- else:
- first = utils.http.request(outbox.data["first"],
- headers=ACTIVITY_HEADERS, json=True)
- items = first.data["orderedItems"]
+ if "first" in outbox.data:
+ if type(outbox.data["first"]) == dict:
+ items = outbox.data["first"]["orderedItems"]
else:
- items = outbox.data["orderedItems"]
+ first = utils.http.request(outbox.data["first"],
+ headers=ACTIVITY_HEADERS, json=True)
+ items = first.data["orderedItems"]
+ else:
+ items = outbox.data["orderedItems"]
- if items:
- first_item = items[0]
- if first_item["type"] == "Announce":
- retoot_url = first_item["object"]
- retoot_instance = urllib.parse.urlparse(retoot_url).hostname
- retoot = utils.http.request(retoot_url,
- headers=ACTIVITY_HEADERS, json=True)
+ if not items:
+ raise utils.EventError("No toots found")
- original_tooter_url = retoot.data["attributedTo"]
- original_tooter = utils.http.request(original_tooter_url,
- headers=ACTIVITY_HEADERS, json=True)
+ first_item = items[0]
+ if first_item["type"] == "Announce":
+ retoot_url = first_item["object"]
+ retoot_instance = urllib.parse.urlparse(retoot_url).hostname
+ retoot = utils.http.request(retoot_url,
+ headers=ACTIVITY_HEADERS, json=True)
- retooted_user = "@%s@%s" % (
- original_tooter.data["preferredUsername"],
- retoot_instance)
+ original_tooter_url = retoot.data["attributedTo"]
+ original_tooter = utils.http.request(original_tooter_url,
+ headers=ACTIVITY_HEADERS, json=True)
- shorturl = self.exports.get_one("shorturl")(
- event["server"], retoot_url)
- retoot_content = utils.http.strip_html(
- retoot.data["content"])
+ retooted_user = "@%s@%s" % (
+ original_tooter.data["preferredUsername"],
+ retoot_instance)
- event["stdout"].write("%s (boost %s): %s - %s" % (
- preferred_username, retooted_user, retoot_content,
- shorturl))
+ shorturl = self.exports.get_one("shorturl")(
+ event["server"], retoot_url)
+ retoot_content = utils.http.strip_html(
+ retoot.data["content"])
- elif first_item["type"] == "Create":
- content = utils.http.strip_html(
- first_item["object"]["content"])
- url = first_item["object"]["id"]
- shorturl = self.exports.get_one("shorturl")(
- event["server"], url)
+ event["stdout"].write("%s (boost %s): %s - %s" % (
+ preferred_username, retooted_user, retoot_content,
+ shorturl))
- event["stdout"].write("%s: %s - %s" % (preferred_username,
- content, shorturl))
- else:
- raise utils.EventError("User not found")
+ elif first_item["type"] == "Create":
+ content = utils.http.strip_html(
+ first_item["object"]["content"])
+ url = first_item["object"]["id"]
+ shorturl = self.exports.get_one("shorturl")(
+ event["server"], url)
+
+ event["stdout"].write("%s: %s - %s" % (preferred_username,
+ content, shorturl))