keystone/keystone/logic/types/user.py

265 lines
9.1 KiB
Python

# Copyright (c) 2010-2011 OpenStack, LLC.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
# implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import json
import keystone.logic.types.fault as fault
from lxml import etree
import string
class User(object):
def __init__(self, password, user_id, tenant_id, email, enabled):
self.user_id = user_id
self.tenant_id = tenant_id
self.password = password
self.email = email
self.enabled = enabled and True or False
@staticmethod
def from_xml(xml_str):
try:
dom = etree.Element("root")
dom.append(etree.fromstring(xml_str))
root = dom.find("{http://docs.openstack.org/identity/api/v2.0}user")
if root == None:
raise fault.BadRequestFault("Expecting User")
user_id = root.get("id")
tenant_id = root.get("tenantId")
email = root.get("email")
password = root.get("password")
enabled = root.get("enabled")
if user_id == None:
raise fault.BadRequestFault("Expecting User")
elif tenant_id == None:
raise fault.BadRequestFault("Expecting User tenant")
elif password == None:
raise fault.BadRequestFault("Expecting User password")
elif email == None:
raise fault.BadRequestFault("Expecting User email")
if enabled == None or enabled == "true" or enabled == "yes":
set_enabled = True
elif enabled == "false" or enabled == "no":
set_enabled = False
else:
raise fault.BadRequestFault("Bad enabled attribute!")
if password == '':
password = user_id
return User(password, user_id, tenant_id, email, set_enabled)
except etree.LxmlError as e:
raise fault.BadRequestFault("Cannot parse User", str(e))
@staticmethod
def from_json(json_str):
try:
obj = json.loads(json_str)
if not "user" in obj:
raise fault.BadRequestFault("Expecting User")
user = obj["user"]
if not "id" in user:
user_id = None
else:
user_id = user["id"]
if not "password" in user:
raise fault.BadRequestFault("Expecting User Password")
password = user["password"]
if not "tenantId" in user:
raise fault.BadRequestFault("Expecting User Tenant")
tenant_id = user["tenantId"]
if not "email" in user:
raise fault.BadRequestFault("Expecting User Email")
email = user["email"]
if "enabled" in user:
set_enabled = user["enabled"]
if not isinstance(set_enabled, bool):
raise fault.BadRequestFault("Bad enabled attribute!")
else:
set_enabled = True
if password == '':
password = user_id
return User(password, user_id, tenant_id, email, set_enabled)
except (ValueError, TypeError) as e:
raise fault.BadRequestFault("Cannot parse Tenant", str(e))
def to_dom(self):
dom = etree.Element("user",
xmlns="http://docs.openstack.org/identity/api/v2.0")
if self.email:
dom.set("email", self.email)
if self.tenant_id:
dom.set("tenantId", self.tenant_id)
if self.user_id:
dom.set("id", self.user_id)
if self.enabled:
dom.set("enabled", string.lower(str(self.enabled)))
if self.password:
dom.set("password", self.password)
return dom
def to_xml(self):
return etree.tostring(self.to_dom())
def to_dict(self):
user = {}
if self.user_id:
user["id"] = self.user_id
user["tenantId"] = self.tenant_id
if self.password:
user["password"] = self.password
user["email"] = self.email
user["enabled"] = self.enabled
return {'user': user}
def to_json(self):
return json.dumps(self.to_dict())
class User_Update(object):
def __init__(self, password, user_id, tenant_id, email,
enabled, group=None):
self.user_id = user_id
self.tenant_id = tenant_id
self.password = password
self.email = email
self.enabled = enabled and True or False
self.group = group
@staticmethod
def from_xml(xml_str):
try:
dom = etree.Element("root")
dom.append(etree.fromstring(xml_str))
root = dom.find("{http://docs.openstack.org/identity/api/v2.0}user")
if root == None:
raise fault.BadRequestFault("Expecting User")
user_id = root.get("id")
tenant_id = root.get("tenantId")
email = root.get("email")
password = root.get("password")
enabled = root.get("enabled")
if enabled == None or enabled == "true" or enabled == "yes":
set_enabled = True
elif enabled == "false" or enabled == "no":
set_enabled = False
else:
raise fault.BadRequestFault("Bad enabled attribute!")
if password == '':
password = user_id
return User(password, user_id, tenant_id, email, set_enabled)
except etree.LxmlError as e:
raise fault.BadRequestFault("Cannot parse User", str(e))
@staticmethod
def from_json(json_str):
try:
obj = json.loads(json_str)
if not "user" in obj:
raise fault.BadRequestFault("Expecting User")
user = obj["user"]
if not "id" in user:
user_id = None
else:
user_id = user["id"]
if not "password" in user:
password = None
else:
password = user["password"]
if not "tenantId" in user:
tenant_id = None
else:
tenant_id = user["tenantId"]
if not "email" in user:
email = None
else:
email = user["email"]
if "enabled" in user:
set_enabled = user["enabled"]
if not isinstance(set_enabled, bool):
raise fault.BadRequestFault("Bad enabled attribute!")
else:
set_enabled = True
if password == '':
password = user_id
return User(password, user_id, tenant_id, email, set_enabled)
except (ValueError, TypeError) as e:
raise fault.BadRequestFault("Cannot parse Tenant", str(e))
def to_dom(self):
dom = etree.Element("user",
xmlns="http://docs.openstack.org/identity/api/v2.0")
if self.email:
dom.set("email", self.email)
if self.tenant_id:
dom.set("tenantId", self.tenant_id)
if self.user_id:
dom.set("id", self.user_id)
if self.enabled is not None:
dom.set("enabled", string.lower(str(self.enabled)))
if self.password:
dom.set("password", self.password)
if self.group is not None:
for group in self.group:
dom.append(group.to_dom())
return dom
def to_xml(self):
return etree.tostring(self.to_dom())
def to_dict(self):
user = {}
if self.user_id:
user["id"] = self.user_id
if self.user_id:
user["tenantId"] = self.tenant_id
if self.password:
user["password"] = self.password
if self.email:
user["email"] = self.email
if self.enabled is not None:
user["enabled"] = self.enabled
if self.group is not None:
values = [t.to_dict()["group"] for t in self.group]
user["groups"] = {"values": values}
return {'user': user}
def to_json(self):
return json.dumps(self.to_dict())
class Users(object):
"A collection of users."
def __init__(self, values, links):
self.values = values
self.links = links
def to_xml(self):
dom = etree.Element("users")
dom.set(u"xmlns", "http://docs.openstack.org/identity/api/v2.0")
for t in self.values:
dom.append(t.to_dom())
for t in self.links:
dom.append(t.to_dom())
return etree.tostring(dom)
def to_json(self):
values = [t.to_dict()["user"] for t in self.values]
links = [t.to_dict()["links"] for t in self.links]
return json.dumps({"users": {"values": values, "links": links}})