)
user.save()
+ # Subscribe to changes right away, so we get sent things like the
+ # ssh key which is not available in the inline data.
+ subscribe_to_user_changes(user.username)
+
# Ok, we have a proper user record. Now tell django that
# we're authenticated so it persists it in the session. Before
# we do that, we have to annotate it with the backend information.
return j
+# Subscribe to any changes about this user on the community auth upstream
+def subscribe_to_user_changes(userid):
+ socket.setdefaulttimeout(10)
+
+ body = json.dumps({
+ 'u': userid,
+ })
+
+ h = hmac.digest(
+ base64.b64decode(settings.PGAUTH_KEY),
+ msg=bytes(body, 'utf-8'),
+ digest='sha512',
+ )
+
+ # Ignore the result code, just post it
+ requests.post(
+ '{0}subscribe/'.format(settings.PGAUTH_REDIRECT),
+ data=body,
+ headers={
+ 'X-pgauth-sig': base64.b64encode(h),
+ },
+ )
+
+
# Import a user into the local authentication system. Will initially
# make a search for it, and if anything other than one entry is returned
# the import will fail.
)
u.save()
+ # Trigger a subscription on the main website so we get updates for this user
+ try:
+ subscribe_to_user_changes(uid)
+ except Exception as e:
+ # We ignore the actual error, but let's log it.
+ print("Exception subscribing new user: %s", e)
+
return u