Comment by ~joshhansen on ~tsileo/microblog.pub
Alright, this was due to a tweak on my instance that made
/
load the articles rather than the notes. Apparently this interferes with resolving the signing key. I backed out that change, and everything's happy now.
Comment by ~joshhansen on ~tsileo/microblog.pub
Digging into this, it seems the text of the 401 error when I try to follow https://hachyderm.io/@joshhansen (for example) is:
Unable to fetch key JSON at https://joshhansen.tech#main-key
Seems Mastodon on the other end is requesting the key at the wrong address?
My configuration checks out as OK, and the CSS is updated.
I did change my
username
early on. Could that be breaking attempts at federation now?
Ticket created by ~joshhansen on ~tsileo/microblog.pub
On 3fc567861b97fbe08bc605eb9467db48099555ce I'm unable to follow this (or seemingly any) account: https://mastodon.social/@Sheril
It gives
httpx.HTTPStatusError: Client error '401 Unauthorized' for url 'https://mastodon.social/users/Sheril/inbox'
Here's a stack trace from trying to follow https://hachyderm.io/users/mitsuhiko:
2023-01-12 01:48:56.207 | INFO | app.outgoing_activities:fetch_next_outgoing_activity:173 - 1 outgoing activities ready to process 2023-01-12 01:48:56.210 | INFO | app.outgoing_activities:process_next_outgoing_activity:200 - recipient=https://hachyderm.io/users/mitsuhiko/inbox 2023-01-12 01:48:56.211 | INFO | app.outgoing_activities:process_next_outgoing_activity:236 - payload={'@context': 'https://www.w3.org/ns/activitystreams', 'id': 'https://joshhansen.tech/o/2456e466e8ee4bd9b837b74583051930', 'type': 'Follow', 'actor': 'https://joshhansen.tech', 'object': 'https://hachyderm.io/users/mitsuhiko'} 2023-01-12 01:48:56.211 | INFO | app.activitypub:post:394 - Posting https://hachyderm.io/users/mitsuhiko/inbox (payload={'@context': 'https://www.w3.org/ns/activitystreams', 'id': 'https://joshhansen.tech/o/2456e466e8ee4bd9b837b74583051930', 'type': 'Follow', 'actor': 'https://joshhansen.tech', 'object': 'https://hachyderm.io/users/mitsuhiko'}) 2023-01-12 01:48:56.243 | INFO | app.httpsig:auth_flow:318 - keyid=https://joshhansen.tech#main-key 2023-01-12 01:48:56.248 | DEBUG | app.httpsig:auth_flow:346 - signed request sig_value='keyId="https://joshhansen.tech#main-key",algorithm="rsa-sha256",headers="(request-target) user-agent host date digest content-type",signature="T0UVQiYvoC6uKl3F6BUb8wXoKsXPfB9tNup/5Iw/Oa/HvkmrmQfF92b0nUPFGHYr6CvR60hLmFuR3nI6SSmmapmSVZ523x2qV7clNySU1tw6VzTogod855CAPCuZ12kGeO/0PHRMzWN4I/9O/g1k5QjK8fKrc2S0qdI5n1Q0f89sUCs6hhULs6U84Ap34xaEdZgxue8niUcvC9QFI5UVHa/E4QEouuXYQObISrXVw18B5X9unKRmd+wyOFyXHr9Y37Stnq9cDKu/uPa5C0QN2AffLgAqYVuAzkyepDfDj3CdAGLAFTD5kY2uNr84wJKmqsNQEbi7br5/Z9slmhB+WA=="' 2023-01-12 01:48:57.367 | ERROR | app.outgoing_activities:process_next_outgoing_activity:240 - Failed Traceback (most recent call last): File "/home/josh/.cache/pypoetry/virtualenvs/microblogpub-i71lNdgq-py3.10/bin/inv", line 8, in <module> sys.exit(program.run()) │ │ │ └ <function Program.run at 0x7fe079373a30> │ │ └ <invoke.program.Program object at 0x7fe0799102b0> │ └ <built-in function exit> └ <module 'sys' (built-in)> File "/home/josh/.cache/pypoetry/virtualenvs/microblogpub-i71lNdgq-py3.10/lib/python3.10/site-packages/invoke/program.py", line 384, in run self.execute() │ └ <function Program.execute at 0x7fe079373d00> └ <invoke.program.Program object at 0x7fe0799102b0> File "/home/josh/.cache/pypoetry/virtualenvs/microblogpub-i71lNdgq-py3.10/lib/python3.10/site-packages/invoke/program.py", line 569, in execute executor.execute(*self.tasks) │ │ │ └ [<parser/Context 'process-outgoing-activities'>] │ │ └ <invoke.program.Program object at 0x7fe0799102b0> │ └ <function Executor.execute at 0x7fe079353520> └ <invoke.executor.Executor object at 0x7fe077ea1ae0> File "/home/josh/.cache/pypoetry/virtualenvs/microblogpub-i71lNdgq-py3.10/lib/python3.10/site-packages/invoke/executor.py", line 129, in execute result = call.task(*args, **call.kwargs) │ │ │ │ └ {} │ │ │ └ <Call 'process_outgoing_activities' (called as: 'process-outgoing-activities'), args: (), kwargs: {}> │ │ └ (<Context: <Config: {'run': {'asynchronous': False, 'disown': False, 'dry': False, 'echo': False, 'echo_stdin': None, 'encodi... │ └ <Task 'process_outgoing_activities'> └ <Call 'process_outgoing_activities' (called as: 'process-outgoing-activities'), args: (), kwargs: {}> File "/home/josh/.cache/pypoetry/virtualenvs/microblogpub-i71lNdgq-py3.10/lib/python3.10/site-packages/invoke/tasks.py", line 127, in __call__ result = self.body(*args, **kwargs) │ │ │ └ {} │ │ └ (<Context: <Config: {'run': {'asynchronous': False, 'disown': False, 'dry': False, 'echo': False, 'echo_stdin': None, 'encodi... │ └ <function process_outgoing_activities at 0x7fe077e47ac0> └ <Task 'process_outgoing_activities'> File "/home/josh/joshhansen.tech/tasks.py", line 108, in process_outgoing_activities asyncio.run(loop()) │ │ └ <function loop at 0x7fe07470fd90> │ └ <function run at 0x7fe0793a15a0> └ <module 'asyncio' from '/usr/lib/python3.10/asyncio/__init__.py'> File "/usr/lib/python3.10/asyncio/runners.py", line 44, in run return loop.run_until_complete(main) │ │ └ <coroutine object loop at 0x7fe077e16110> │ └ <function BaseEventLoop.run_until_complete at 0x7fe078b22e60> └ <_UnixSelectorEventLoop running=True closed=False debug=False> File "/usr/lib/python3.10/asyncio/base_events.py", line 633, in run_until_complete self.run_forever() │ └ <function BaseEventLoop.run_forever at 0x7fe078b22dd0> └ <_UnixSelectorEventLoop running=True closed=False debug=False> File "/usr/lib/python3.10/asyncio/base_events.py", line 600, in run_forever self._run_once() │ └ <function BaseEventLoop._run_once at 0x7fe078b28940> └ <_UnixSelectorEventLoop running=True closed=False debug=False> File "/usr/lib/python3.10/asyncio/base_events.py", line 1896, in _run_once handle._run() │ └ <function Handle._run at 0x7fe0792983a0> └ <Handle <TaskStepMethWrapper object at 0x7fe073b49c00>()> File "/usr/lib/python3.10/asyncio/events.py", line 80, in _run self._context.run(self._callback, *self._args) │ │ │ │ │ └ <member '_args' of 'Handle' objects> │ │ │ │ └ <Handle <TaskStepMethWrapper object at 0x7fe073b49c00>()> │ │ │ └ <member '_callback' of 'Handle' objects> │ │ └ <Handle <TaskStepMethWrapper object at 0x7fe073b49c00>()> │ └ <member '_context' of 'Handle' objects> └ <Handle <TaskStepMethWrapper object at 0x7fe073b49c00>()> File "/home/josh/joshhansen.tech/app/utils/workers.py", line 32, in _main_loop await self.process_message(db_session, next_message) │ │ │ └ <app.models.OutgoingActivity object at 0x7fe073b488e0> │ │ └ <sqlalchemy.orm.session.AsyncSession object at 0x7fe074785660> │ └ <function OutgoingActivityWorker.process_message at 0x7fe07470fe20> └ <app.outgoing_activities.OutgoingActivityWorker object at 0x7fe074785930> File "/home/josh/joshhansen.tech/app/outgoing_activities.py", line 278, in process_message await process_next_outgoing_activity(db_session, next_activity) │ │ └ <app.models.OutgoingActivity object at 0x7fe073b488e0> │ └ <sqlalchemy.orm.session.AsyncSession object at 0x7fe074785660> └ <function process_next_outgoing_activity at 0x7fe07470fd00> > File "/home/josh/joshhansen.tech/app/outgoing_activities.py", line 238, in process_next_outgoing_activity resp = await ap.post(next_activity.recipient, payload) # type: ignore │ │ │ │ └ {'@context': 'https://www.w3.org/ns/activitystreams', 'id': 'https://joshhansen.tech/o/2456e466e8ee4bd9b837b74583051930', 'ty... │ │ │ └ <sqlalchemy.orm.attributes.InstrumentedAttribute object at 0x7fe07472af70> │ │ └ <app.models.OutgoingActivity object at 0x7fe073b488e0> │ └ <function post at 0x7fe075cae830> └ <module 'app.activitypub' from '/home/josh/joshhansen.tech/app/activitypub.py'> File "/home/josh/joshhansen.tech/app/activitypub.py", line 407, in post resp.raise_for_status() │ └ <function Response.raise_for_status at 0x7fe078723760> └ <Response [401 Unauthorized]> File "/home/josh/.cache/pypoetry/virtualenvs/microblogpub-i71lNdgq-py3.10/lib/python3.10/site-packages/httpx/_models.py", line 736, in raise_for_status raise HTTPStatusError(message, request=request, response=self) │ │ │ └ <Response [401 Unauthorized]> │ │ └ <Request('POST', 'https://hachyderm.io/users/mitsuhiko/inbox')> │ └ "Client error '401 Unauthorized' for url 'https://hachyderm.io/users/mitsuhiko/inbox'\nFor more information check: https://ht... └ <class 'httpx.HTTPStatusError'> httpx.HTTPStatusError: Client error '401 Unauthorized' for url 'https://hachyderm.io/users/mitsuhiko/inbox' For more information check: https://httpstatuses.com/401
Comment by ~joshhansen on ~tsileo/microblog.pub
As these are old posts (sometimes months or years old) I have no problem with them not appearing in the recent timeline. In fact, I would prefer that, since I'd like newer content to take precedence.
I might be wrong about this as I'm not deeply familiar with ActivityPub, but isn't the
Update
activity used to notify followers of changes to existing posts?https://www.w3.org/TR/activitypub/#update-activity-outbox
Mostly though I just want the correct date to appear on the entries when browsing the site; updating existing subscribers by sending an update event might be a different feature.
Ticket created by ~joshhansen on ~tsileo/microblog.pub
I would like to port a number of old entries into my microblog.pub instance, but want to preserve the original dates as I do so. As far as I can see, this would only be possible at present by running custom SQL queries in sqlite, to change the automatically-assigned date/time after publication.
This ticket proposes to add the ability to customize the date and time of posts at post creation time in the admin UI. The note/article creation UI is quite spartan, and it seems a date/time field would fit nicely. This would allow post-dating a post as well as importing of archival posts.
Thanks for your work on this project