AP users: add new User.direct property

direct users signed up or otherwise interacted with BF explicitly, indirect users didn't
circle-datastore-transactions
Ryan Barrett 2023-05-29 19:37:35 -07:00
rodzic 6e834713f1
commit 624355d85a
Nie znaleziono w bazie danych klucza dla tego podpisu
ID klucza GPG: 6BE31FDF4776E9D4
5 zmienionych plików z 19 dodań i 6 usunięć

Wyświetl plik

@ -89,6 +89,12 @@ class User(StringIdModel, metaclass=ProtocolUserMeta):
actor_as2 = JsonProperty()
use_instead = ndb.KeyProperty()
# whether this user signed up or otherwise explicitly, deliberately
# interacted with Bridgy Fed. For example, if fediverse user @a@b.com looks
# up @foo.com@fed.brid.gy via WebFinger, we'll create Users for both,
# @a@b.com will be direct, foo.com will not.
direct = ndb.BooleanProperty(default=False)
created = ndb.DateTimeProperty(auto_now_add=True)
updated = ndb.DateTimeProperty(auto_now=True)
@ -121,6 +127,11 @@ class User(StringIdModel, metaclass=ProtocolUserMeta):
assert cls != User
user = cls.get_by_id(domain)
if user:
# override direct if it's set
direct = kwargs.get('direct')
if direct is not None:
user.direct = direct
user.put()
return user
# generate keys for all protocols _except_ our own

Wyświetl plik

@ -59,7 +59,7 @@ def check_web_site():
flash(f'No domain found in {url}')
return render_template('enter_web_site.html')
g.user = Web.get_or_create(domain)
g.user = Web.get_or_create(domain, direct=True)
try:
g.user = g.user.verify()
except BaseException as e:

Wyświetl plik

@ -33,6 +33,7 @@ class UserTest(TestCase):
def test_get_or_create(self):
user = Fake.get_or_create('a.b')
assert not user.direct
assert user.mod
assert user.public_exponent
assert user.private_exponent
@ -46,8 +47,10 @@ class UserTest(TestCase):
assert isinstance(p256_key, ECC.EccKey)
self.assertEqual('NIST P-256', p256_key.curve)
same = Fake.get_or_create('a.b')
self.assertEqual(same, user)
# direct should get set even if the user exists
same = Fake.get_or_create('a.b', direct=True)
user.direct = True
self.assert_entities_equal(same, user, ignore=['updated'])
def test_get_or_create_use_instead(self):
user = Fake.get_or_create('a.b')

Wyświetl plik

@ -67,7 +67,7 @@ class RedirectTest(testutil.TestCase):
def test_as2_ld(self):
self._test_as2(as2.CONTENT_TYPE_LD)
def test_as2_no_user(self):
def test_as2_creates_user(self):
with self.request_context:
Object(id='https://user.com/repost', as2=EXTERNAL_REPOST_AS2).put()

Wyświetl plik

@ -8,7 +8,6 @@ import urllib.parse
from oauth_dropins.webutil.testutil import requests_response
import common
from models import User
from . import testutil
from .test_web import ACTOR_HTML
@ -204,7 +203,7 @@ class WebfingerTest(testutil.TestCase):
self.assertEqual(404, got.status_code)
@patch('requests.get')
def test_webfinger_external_user_fetch(self, mock_get):
def test_webfinger_external_user_fetch_creates_user(self, mock_get):
self.user.key.delete()
mock_get.return_value = requests_response(ACTOR_HTML)