Improve move support
This commit is contained in:
parent
333fa5dc40
commit
a701d3b06e
5 changed files with 30 additions and 19 deletions
|
@ -11,6 +11,7 @@ from markdown import markdown
|
||||||
from app import config
|
from app import config
|
||||||
from app.config import ALSO_KNOWN_AS
|
from app.config import ALSO_KNOWN_AS
|
||||||
from app.config import AP_CONTENT_TYPE # noqa: F401
|
from app.config import AP_CONTENT_TYPE # noqa: F401
|
||||||
|
from app.config import MOVED_TO
|
||||||
from app.httpsig import auth
|
from app.httpsig import auth
|
||||||
from app.key import get_pubkey_as_pem
|
from app.key import get_pubkey_as_pem
|
||||||
from app.source import hashtagify
|
from app.source import hashtagify
|
||||||
|
@ -131,6 +132,9 @@ ME = {
|
||||||
if ALSO_KNOWN_AS:
|
if ALSO_KNOWN_AS:
|
||||||
ME["alsoKnownAs"] = [ALSO_KNOWN_AS]
|
ME["alsoKnownAs"] = [ALSO_KNOWN_AS]
|
||||||
|
|
||||||
|
if MOVED_TO:
|
||||||
|
ME["movedTo"] = MOVED_TO
|
||||||
|
|
||||||
|
|
||||||
class NotAnObjectError(Exception):
|
class NotAnObjectError(Exception):
|
||||||
def __init__(self, url: str, resp: httpx.Response | None = None) -> None:
|
def __init__(self, url: str, resp: httpx.Response | None = None) -> None:
|
||||||
|
|
|
@ -322,4 +322,7 @@ def _actor_hash(actor: Actor) -> bytes:
|
||||||
h.update(actor.public_key_id.encode())
|
h.update(actor.public_key_id.encode())
|
||||||
h.update(actor.public_key_as_pem.encode())
|
h.update(actor.public_key_as_pem.encode())
|
||||||
|
|
||||||
|
if actor.moved_to:
|
||||||
|
h.update(actor.moved_to.encode())
|
||||||
|
|
||||||
return h.digest()
|
return h.digest()
|
||||||
|
|
|
@ -29,6 +29,7 @@ from app.config import BASE_URL
|
||||||
from app.config import BLOCKED_SERVERS
|
from app.config import BLOCKED_SERVERS
|
||||||
from app.config import ID
|
from app.config import ID
|
||||||
from app.config import MANUALLY_APPROVES_FOLLOWERS
|
from app.config import MANUALLY_APPROVES_FOLLOWERS
|
||||||
|
from app.config import set_moved_to
|
||||||
from app.database import AsyncSession
|
from app.database import AsyncSession
|
||||||
from app.outgoing_activities import new_outgoing_activity
|
from app.outgoing_activities import new_outgoing_activity
|
||||||
from app.source import markdownify
|
from app.source import markdownify
|
||||||
|
@ -394,10 +395,13 @@ async def send_move(
|
||||||
if not outbox_object.id:
|
if not outbox_object.id:
|
||||||
raise ValueError("Should never happen")
|
raise ValueError("Should never happen")
|
||||||
|
|
||||||
recipients = await compute_all_known_recipients(db_session)
|
recipients = await _get_followers_recipients(db_session)
|
||||||
for rcp in recipients:
|
for rcp in recipients:
|
||||||
await new_outgoing_activity(db_session, rcp, outbox_object.id)
|
await new_outgoing_activity(db_session, rcp, outbox_object.id)
|
||||||
|
|
||||||
|
# Store the moved to in order to update the profile
|
||||||
|
set_moved_to(target)
|
||||||
|
|
||||||
await db_session.commit()
|
await db_session.commit()
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -48,6 +48,19 @@ try:
|
||||||
except FileNotFoundError:
|
except FileNotFoundError:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
MOVED_TO_FILE = ROOT_DIR / "data" / "moved_to.dat"
|
||||||
|
|
||||||
|
|
||||||
|
def _get_moved_to() -> str | None:
|
||||||
|
if not MOVED_TO_FILE.exists():
|
||||||
|
return None
|
||||||
|
|
||||||
|
return MOVED_TO_FILE.read_text()
|
||||||
|
|
||||||
|
|
||||||
|
def set_moved_to(moved_to: str) -> None:
|
||||||
|
MOVED_TO_FILE.write_text(moved_to)
|
||||||
|
|
||||||
|
|
||||||
VERSION = f"2.0.0+{VERSION_COMMIT}"
|
VERSION = f"2.0.0+{VERSION_COMMIT}"
|
||||||
USER_AGENT = f"microblogpub/{VERSION}"
|
USER_AGENT = f"microblogpub/{VERSION}"
|
||||||
|
@ -165,6 +178,8 @@ _load_emojis(ROOT_DIR, BASE_URL)
|
||||||
|
|
||||||
CODE_HIGHLIGHTING_THEME = CONFIG.code_highlighting_theme
|
CODE_HIGHLIGHTING_THEME = CONFIG.code_highlighting_theme
|
||||||
|
|
||||||
|
MOVED_TO = _get_moved_to()
|
||||||
|
|
||||||
|
|
||||||
session_serializer = URLSafeTimedSerializer(
|
session_serializer = URLSafeTimedSerializer(
|
||||||
CONFIG.secret,
|
CONFIG.secret,
|
||||||
|
|
|
@ -67,6 +67,7 @@ async def _send_actor_update_if_needed(
|
||||||
logger.info("Will send an Update for the local actor")
|
logger.info("Will send an Update for the local actor")
|
||||||
|
|
||||||
from app.boxes import allocate_outbox_id
|
from app.boxes import allocate_outbox_id
|
||||||
|
from app.boxes import compute_all_known_recipients
|
||||||
from app.boxes import outbox_object_id
|
from app.boxes import outbox_object_id
|
||||||
from app.boxes import save_outbox_object
|
from app.boxes import save_outbox_object
|
||||||
|
|
||||||
|
@ -85,24 +86,8 @@ async def _send_actor_update_if_needed(
|
||||||
|
|
||||||
# Send the update to the followers collection and all the actor we have ever
|
# Send the update to the followers collection and all the actor we have ever
|
||||||
# contacted
|
# contacted
|
||||||
followers = (
|
recipients = await compute_all_known_recipients(db_session)
|
||||||
(
|
for rcp in recipients:
|
||||||
await db_session.scalars(
|
|
||||||
select(models.Follower).options(joinedload(models.Follower.actor))
|
|
||||||
)
|
|
||||||
)
|
|
||||||
.unique()
|
|
||||||
.all()
|
|
||||||
)
|
|
||||||
for rcp in {
|
|
||||||
follower.actor.shared_inbox_url or follower.actor.inbox_url
|
|
||||||
for follower in followers
|
|
||||||
} | {
|
|
||||||
row.recipient
|
|
||||||
for row in await db_session.execute(
|
|
||||||
select(func.distinct(models.OutgoingActivity.recipient).label("recipient"))
|
|
||||||
)
|
|
||||||
}: # type: ignore
|
|
||||||
await new_outgoing_activity(
|
await new_outgoing_activity(
|
||||||
db_session,
|
db_session,
|
||||||
recipient=rcp,
|
recipient=rcp,
|
||||||
|
|
Loading…
Reference in a new issue