return res.count
- def create(self, name, realname=None):
+ async def create(self, name, realname=None):
# XXX check if username has the correct name
# Check if name is already taken
if user:
raise ValueError("Username %s already taken" % name)
+ # Generate a new key for this user
+ key = await self.backend.keys.generate(name)
+
# Create new user
- user = self._get_user("INSERT INTO users(name, realname) \
- VALUES(%s, %s) RETURNING *", name, realname)
+ user = self._get_user("INSERT INTO users(name, realname, key_id) \
+ VALUES(%s, %s, %s) RETURNING *", name, realname, key)
log.debug("Created user %s" % user.name)
return user
- def create_from_ldap(self, name):
+ async def create_from_ldap(self, name):
log.debug("Creating user %s from LDAP" % name)
# Get required attributes from LDAP
assert dn
# Create regular user
- user = self.create(name, realname=attr["cn"][0])
+ user = await self.create(name, realname=attr["cn"][0])
# Add all email addresses and activate them
for email in attr["mail"]:
LEFT JOIN users_emails ON users.id = users_emails.user_id \
WHERE users_emails.email = %s", email)
- def find(self, username):
+ async def find(self, username):
# Search for a user object
user = self.get_by_name(username)
# If not user exists, yet, we can import it from LDAP
if not user:
- user = self.create_from_ldap(username)
+ user = await self.create_from_ldap(username)
# If we found a user which has been deleted, we won't return it
if user and user.deleted:
return list(sessions)
+ # Key Management
+
+ @lazy_property
+ def key(self):
+ if self.data.key_id:
+ return self.backend.keys.get_by_id(self.data.key_id)
+
# Quota
def get_quota(self):
registered_at timestamp without time zone DEFAULT now() NOT NULL,
admin boolean DEFAULT false NOT NULL,
quota bigint,
- perms text[] DEFAULT ARRAY[]::text[] NOT NULL
+ perms text[] DEFAULT ARRAY[]::text[] NOT NULL,
+ key_id integer NOT NULL
);
ADD CONSTRAINT users_emails_user_id FOREIGN KEY (user_id) REFERENCES public.users(id) ON DELETE CASCADE;
+--
+-- Name: users users_key_id; Type: FK CONSTRAINT; Schema: public; Owner: pakfire
+--
+
+ALTER TABLE ONLY public.users
+ ADD CONSTRAINT users_key_id FOREIGN KEY (key_id) REFERENCES public.keys(id);
+
+
--
-- PostgreSQL database dump complete
--
class LoginHandler(KerberosAuthMixin, base.BaseHandler):
- def get(self):
+ async def get(self):
username = self.get_authenticated_user()
if not username:
# Ask to authenticate
with self.db.transaction():
# Otherwise fetch the authenticated user
- user = self.backend.users.find(username)
+ user = await self.backend.users.find(username)
if not user:
raise tornado.web.HTTPError(500, "Could not find user %s" % username)