def __init__(self): from django.conf import settings self.appServer = getattr(settings, 'APPSERVER_URL') self.authServer = getattr(settings, 'APPSERVER_AUTHSERVER_URL') self.appServerId = getattr(settings, 'APPSERVER_CLIENTID') self.appServerKey = getattr(settings, 'APPSERVER_CLIENTKEY') self.tenantId = getattr(settings, 'APPSERVER_TENANTID') self.userId = getattr(settings, 'APPSERVER_USERID') self.userKey = getattr(settings, 'APPSERVER_USERKEY') self.user_profiles_string = "UserProfiles" self.provider = CloudgustDataProvider(self.appServer, self.appServerId, self.appServerKey, self.tenantId, self.userId, self.userKey) self.authManager = CGAuthUserManger() self.logger_object = CGLogger() self.logger = self.logger_object.get_logger('cg_user_manager')
def __init__(self, host_url): self.host_url = host_url self.logger_object = CGLogger() self.logger = self.logger_object.get_logger("core_lib_rest")
class RestApiProvider: def __init__(self, host_url): self.host_url = host_url self.logger_object = CGLogger() self.logger = self.logger_object.get_logger("core_lib_rest") def get_headers(self, credentials): headers = {"content-type": "application/json"} if credentials: self.logger.info("Using Credentials", extra=credentials) headers["CG-CLIENTID"] = credentials["CLIENTID"] headers["CG-CLIENTKEY"] = credentials["CLIENTKEY"] headers["CG-TENANTID"] = credentials["TENANTID"] headers["CG-USERID"] = credentials["USERID"] headers["CG-USERKEY"] = credentials["USERKEY"] return headers def get(self, relative_path, query=None, credentials=None): entityUrl = self.host_url + relative_path self.logger.info("entity URL is:", extra={"entity_url": entityUrl}) if query: encoded_query = urllib.urlencode(query) entityUrl = entityUrl + "?" + encoded_query self.logger.info("entity URL is:", extra={"entity_url": entityUrl}) # print "entityUrl is ",entityUrl headers = self.get_headers(credentials) # print headers response = requests.get(entityUrl, headers=headers) if response.status_code > 299: print response.content response.raise_for_status() data = response.json() self.logger.info("this is the data for the url", extra={"entity_url": entityUrl, "data_url": str(data)}) # print "this is the data: {0} for the url: {1}".format(data,entityUrl) return data def post(self, relative_path, data, credentials=None): entityUrl = self.host_url + relative_path self.logger.info("entity URL is:", extra={"entity_url": entityUrl}) headers = self.get_headers(credentials) try: response = requests.post(entityUrl, data=data.to_json(), headers=headers) if response.status_code > 299: print response.content response.raise_for_status() data = response.json() return data except Exception as e: print e self.logger.error("Unexpected error: ", extra={"Message": e.message}) # print "Unexpected error:", e raise def put(self, relative_path, data, credentials=None): entityUrl = self.host_url + relative_path self.logger.info("entity URL is:", extra={"entity_url": entityUrl}) headers = self.get_headers(credentials) req = urllib2.Request(entityUrl, data=data.to_json(), headers=headers) try: response = requests.put(entityUrl, data=data.to_json(), headers=headers) data = response.json() return data except urllib2.HTTPError as e: self.logger.error("Unexpected error: ", extra={"Message": e.message}) raise def delete(self, relative_path, credentials=None): entityUrl = self.host_url + relative_path self.logger.info("entity URL is:", extra={"entity_url": entityUrl}) headers = self.get_headers(credentials) try: resp = requests.delete(entityUrl, headers=headers) # print "this is the response",resp data = resp.json() return data except urllib2.HTTPError as e: self.logger.error("Unexpected error: ", extra={"Message": e.message}) raise
class CGAuthUserManger(): def __init__(self): from django.conf import settings self.authServer = getattr(settings, 'APPSERVER_AUTHSERVER_URL', 'http://localhost:7890/') self.logger_object = CGLogger() self.logger = self.logger_object.get_logger('cg_auth_server_user_manager') def _authenticate_appuser_token(self, token): if not token: raise Exception("Invalid token") if token.startswith('"'): token = token[1:-1] url = self.authServer+"authenticateappuser" token = str(token) data = json.dumps({ "token":token }) self.logger.info("Sending token authenticate request to auth server", extra={"data_to_auth":data}) try: r = requests.post(url, data); if r.status_code >=200 and r.status_code <= 299: res = r.json() self.logger.info("Authenticated with", extra={"auth_server_resp":str(res)}) return {'userName':res['userName']} else: self.logger.warning("Auth server authenticate app user using token rejected",extra={"data_to_auth":data, "auth_server_resp":r.content}) raise Exception(r.content) except Exception as e: self.logger.error("Error with authentication server:", extra={"data_to_auth":data, "Message":e.message}) return e.message def _authenticate_cguser_token(self, token): if not token: self.logger.warning("invalid token. Token empty") raise Exception("Invalid token") url = self.authServer+"authenticatecguser" data = json.dumps({ "token":token }) self.logger.info("Sending cguser token authenticate request to auth server", extra={"data_to_auth":data}) try: r = requests.post(url, data) r.raise_for_status() res = r.json() self.logger.info("Authenticated with", extra={"auth_server_resp":str(res)}) return res['userName'] except Exception as e: self.logger.error("Error with authentication server:", extra={"data_to_auth":data, "Message":e.args[0]}) return None def _authenticate_cg_user(self, username, password): try: if not username: raise Exception("Invalid username") if not password: raise Exception("Invalid password") url = self.authServer+"authenticatecguser" data = json.dumps({ "userName":username, "password":password }) self.logger.info("Sending cguser cred authenticate request to auth server", extra={"data_to_auth":username}) r = requests.post(url, data) if r.status_code >=200 and r.status_code <= 299: res = r.json() self.logger.info("Authenticated with", extra={"auth_server_resp":str(res)}) return res['token'] else: self.logger.warning("Authenticate user failed", extra={"data_to_auth":username, "auth_server_resp":str(r.content)}) raise Exception(r.content) except Exception as e: self.logger.error("Error with authentication server:", extra={"data_to_auth":username, "Message":e.message}) return def _activate_user(self, activation_code): url = self.authServer+"activatecguser" data = json.dumps({ "activation_token":activation_code }) self.logger.info("Sending activate cguser request to auth server", extra={"data_to_auth":data}) r = requests.post(url, data); return r def _activate_app_user(self, activation_code): url = self.authServer+"activateappuser" data = json.dumps({ "activation_token":activation_code }) self.logger.info("Sending activate app user request to auth server", extra={"data_to_auth":data}) r = requests.post(url, data) return r def _create_authentication_user(self,username, password): url = self.authServer+"signupcguser" data = json.dumps({ "userName":username, "password":password }) self.logger.info("Sending authenticate app user request to auth server", extra={"data_to_auth":username}) r = requests.post(url, data) return r def _renew_user_token(self, token, api): if not token: raise Exception("Invalid Token") url = self.authServer+api data = json.dumps({ "token":token }) self.logger.info("Sending renew token request to auth server", extra={"data_to_auth":data}) try: r = requests.post(url, data); r.raise_for_status() res = r.json() self.logger.info("Authenticated with", extra={"auth_server_resp":str(res)}) return res['token'] except Exception as e: self.logger.error("Error with authentication server:", extra={"data_to_auth":data, "Message":e.message}) return def _get_app_user_forgot_password_token(self, username): url = self.authServer+"appuserforgotpassword" print url data = json.dumps({ "userName":username }) self.logger.info("Sending get token for forgot password request to auth server", extra={"data_to_auth":data}) r = requests.post(url, data); return r pass def _get_user_authentication_token(self, username): url = self.authServer+"cguserforgotpassword" print url data = json.dumps({ "userName":username }) self.logger.info("Sending get token for forgot password request to auth server", extra={"data_to_auth":data}) r = requests.post(url, data); return r pass def _validate_reset_token(self, token, api): url = self.authServer+api data = json.dumps({ "reset_token":token }) self.logger.info("Sending validate token request to auth server", extra={"data_to_auth":data}) r = requests.post(url, data); return r pass def _reset_password_user(self, password, username, token, api): url = self.authServer+api data = json.dumps({ "reset_token":token, "password":password, "userName":username }) self.logger.info("Sending password reset request to auth server", extra={"data_to_auth":data}) r = requests.post(url, data) return r pass # --------------------------------------------------------App users and tenants Auth ------------------------------------------------- def _create_app_user(self, clientId, tenantId, userName, password): print "user creation " url = self.authServer + "createuser" data = json.dumps({ "clientId": clientId, "tenantId": tenantId, "userName": userName, "password": password }) self.logger.info("Sending create app user request to auth server", extra={"data_to_auth":userName}) r = requests.post(url, data) return r def _create_app_tenant(self, appid, tenantId): print "auth tenant creation" url = self.authServer + "createtenant" data = json.dumps({ "clientId": appid, "tenantId": tenantId }) self.logger.info("Sending create tenant request to auth server", extra={"data_to_auth":data}) r = requests.post(url, data) return r def _activate_app_tenant(self, clientId, tenantId): print "tenant activation" url = self.authServer+ "activatetenant" data = json.dumps({ "clientId":clientId, "tenantId":tenantId }) self.logger.info("Sending activate tenant request to auth server", extra={"data_to_auth":data}) r = requests.post(url, data) return r def _authetincate_app_user(self, userName, password, clientId, tenantId, clientKey): try: if not userName: self.logger.warning("Empty userName") raise Exception("Invalid username") if not clientId: self.logger.warning("Empty clientId") raise Exception("Invalid clientId") if not tenantId: self.logger.warning("Empty tenantId") raise Exception("Invalid tenantId") if not clientKey: self.logger.warning("Empty clientKey") raise Exception("Invalid clientKey") if not password: self.logger.warning("Empty password") raise Exception("Invalid password") url = self.authServer+"authenticateappuser" data = json.dumps({ "userName":userName, "password":password, "clientId":clientId, "tenantId":tenantId, "clientKey":clientKey }) self.logger.info("Sending authenticate app request to auth server", extra={"data_to_auth":userName}) r = requests.post(url, data); # r.raise_for_status() if r.status_code >=200 and r.status_code <= 299: res = r.json() self.logger.info("Authenticated with", extra={"auth_server_resp":str(res)}) return {'token':res['token']} else: raise Exception(r.content) except Exception as e: self.logger.error("Error with authentication server:", extra={"data_to_auth":userName, "Message":e.message}) return e.message
class AppUserManager(): def __init__(self): from django.conf import settings self.appServer = getattr(settings, 'APPSERVER_URL') self.authServer = getattr(settings, 'APPSERVER_AUTHSERVER_URL') self.appServerId = getattr(settings, 'APPSERVER_CLIENTID') self.appServerKey = getattr(settings, 'APPSERVER_CLIENTKEY') self.tenantId = getattr(settings, 'APPSERVER_TENANTID') self.userId = getattr(settings, 'APPSERVER_USERID') self.userKey = getattr(settings, 'APPSERVER_USERKEY') self.user_profiles_string = "UserProfiles" self.provider = CloudgustDataProvider(self.appServer, self.appServerId, self.appServerKey, self.tenantId, self.userId, self.userKey) self.cgUserManager = CGUserManager() self.authManager = CGAuthUserManger() self.app_user_profiles_string = "AppUserProfiles" self.tenant_profiles_string = "TenantProfiles" self.logger_object = CGLogger() self.logger = self.logger_object.get_logger('app_user_manager') def create_new_cg_app_tenant_profile(self, clientId, data): print "inside create new tenant" if not clientId: print "no app id" raise Exception("App id not specified") if "tenantName" not in data: print "no tenant name" raise Exception("required fields not mentioned") if not data["tenantName"]: print "no tenant name" raise Exception("Invalid tenant name or id") print "creating tenant profile" r = self.authManager._create_app_tenant(clientId, data["tenantName"]) print r.status_code if r.status_code >= 200 and r.status_code <=299: profile = CGObject(self.tenant_profiles_string) for field in data: profile.set(field, data[field]) profile.set("clientId", clientId) profile.save(self.provider) if not profile.get("id"): print "tenant profile creation error" raise Exception("Error in tenant creation") print "profile created", json.loads(profile.to_json()) r = self.authManager._activate_app_tenant(clientId, data["tenantName"]) if r.status_code >= 200 and r.status_code <=299: return json.loads(profile.to_json()) else: profile.delete(self.provider) print r.content return r.content def create_new_cg_app_user(self, user_data): print "Creating new user" if "userName" not in user_data: raise Exception("Required field misssing") if "clientId" not in user_data: raise Exception("Required field missing") if "tenantId" not in user_data: raise Exception("Required field missing") if "password" not in user_data: raise Exception("Required field missing") username = user_data["userName"] clientId = user_data["clientId"] tenantId = user_data["tenantId"] password = user_data["password"] if not username: raise Exception("username not specified") if not clientId: raise Exception("client id not specified") if not tenantId: raise Exception("tenant id not specified") if not password: raise Exception("password not specified") r = self.authManager._create_app_user(clientId, tenantId, username, password) if r.status_code >= 200 and r.status_code <=299: self._delete_app_user(username) return self._create_app_user(clientId, tenantId, user_data, r.text) print r.content return r.content def _delete_app_user(self, userName): print "deleting user", userName user = None try: user = self.get_app_user_profile_by_username(userName) except Exception as e: print e print "this is the user fetched", user profile = CGObject(self.app_user_profiles_string) if user: profile.set("id", user["id"]) profile.delete(self.provider) def get_app_user_profile_by_username(self, userName): if not userName: raise Exception("Invalid username") profiles = CGCollection(self.app_user_profiles_string); profiles.load(self.provider, query={'app_user_name':userName}) print "\nProfiles count", len(profiles.collection) if not profiles.collection: print "No users with user name: ",userName raise Exception("Invalid user") user = filter(lambda active_user: active_user.get('isDeleted') == False, profiles.collection) print "this is the user list", user return user[0].to_dict() def _create_app_user(self, clientId, tenantId, user_data, code): profile = CGObject("%s" % self.app_user_profiles_string) # profile.set("app_user_name", user_name) # this is temporary, here using this id to fetch the name of the tenant. profile.set("tenantId", tenantId) profile.set("clientId", clientId) profile.set("isDeleted", False) for key in user_data: if key == "password": continue profile.set(key, user_data[key]) profile.save(self.provider) if not profile.get("id"): print "usre profile creation error" raise Exception("Error in user creation") profile.set("activation_code", code) return json.loads(profile.to_json()) def list_app_tenants(self, appid): if not appid: print "app id is not present" raise Exception("App id is not present") tenants = CGCollection("%s" % self.tenant_profiles_string) tenants.load(self.provider,{"clientId":appid}) if (len(tenants.collection) == 0): return None tenants = json.loads(tenants.to_json()) # tenants = [t.to_dict for t in tenants.collection] print "these are the tenants fetched",tenants return tenants def list_app_tenant_users(self, appid, tenantid): if not appid: print "app id is not present" raise Exception("App id not present") if not tenantid: print "tenant id is not present" raise Exception("Tenant id not present") users = CGCollection("%s" % self.app_user_profiles_string) users.load(self.provider, {"tenantId":tenantid, "clientId":appid}) if (len(users.collection) == 0): return None print "test of json: ",users.to_json() users = json.loads(users.to_json()) # users = [t.to_json for t in users.collection] print "these are the users fetched", users return users def activate_cg_app_user(self, activation_code): print "User activation started" response = self.authManager._activate_app_user(activation_code) if response.status_code == 200: profile = CGCollection(self.app_user_profiles_string) provider = CloudgustDataProvider(self.appServer, self.appServerId, self.appServerKey, self.tenantId, self.userId, self.userKey) print response.text profile.load(provider, {"userName":response.text}) print profile if profile: if not profile.collection: print "No users with user name: ", response.text raise Exception("Invalid user") user = filter(lambda active_user: active_user.get('isDeleted') == False, profile.collection) print "this is the profile needed: ", str(user[0]) return user[0].to_dict() else: raise Exception("no user") else: raise Exception(response.text) def forgot_password_app_user(self, userName): try: profile = self.get_app_user_profile_by_username(userName) print "Existing profile ", profile if not profile: raise Exception("No such user exists") # if not 'isActive' in profile: # raise Exception("User not activated, re-sign up or activate to continue") token = self.authManager._get_app_user_forgot_password_token(userName) if token.status_code == 200: token = token.text print "got the user token ", token return token else: print token.text raise Exception(token.text) except Exception as e: print "This is the exception ", e raise Exception("Failed for password reset because {0}".format(e.args[0])) def reset_app_user_password_validate_token(self, token): if not token: raise Exception("Invalid token") response = self.authManager._validate_reset_token(token, "validateappuserresettoken") if response.status_code == 200: return response.text else: raise Exception(response.text) # link to auth server to validate the token pass def reset_password_app_user(self, password, userName, token): if not password: raise Exception("required field missing") if not userName: raise Exception("required field missing") if not token: raise Exception("required field missing") response = self.authManager._reset_password_user(password, userName, token, "resetappuserpassword") if response.status_code == 200: return True else: response.raise_for_status() raise Exception(response.text) def authenticate_app_user(self, userName, password, clientId, tenantId, clientKey): return self.authManager._authetincate_app_user(userName, password, clientId, tenantId, clientKey) def authenticate_appuser_token(self, token): return self.authManager._authenticate_appuser_token(token) def renew_appuser_token(self, token): return self.authManager._renew_user_token(token,"renewappusertoken")
class CGUserManager(): def __init__(self): from django.conf import settings self.appServer = getattr(settings, 'APPSERVER_URL') self.authServer = getattr(settings, 'APPSERVER_AUTHSERVER_URL') self.appServerId = getattr(settings, 'APPSERVER_CLIENTID') self.appServerKey = getattr(settings, 'APPSERVER_CLIENTKEY') self.tenantId = getattr(settings, 'APPSERVER_TENANTID') self.userId = getattr(settings, 'APPSERVER_USERID') self.userKey = getattr(settings, 'APPSERVER_USERKEY') self.user_profiles_string = "UserProfiles" self.provider = CloudgustDataProvider(self.appServer, self.appServerId, self.appServerKey, self.tenantId, self.userId, self.userKey) self.authManager = CGAuthUserManger() self.logger_object = CGLogger() self.logger = self.logger_object.get_logger('cg_user_manager') def forgot_password_cg_user(self, userName): try: profile = self.get_cg_user_profile_by_username(userName) if not profile: self.logger.warning("no such user exists", extra={"userName":userName}) raise Exception("No such user exists") # if not 'isActive' in profile: # raise Exception("User not activated, re-sign up or activate to continue") token = self.authManager._get_user_authentication_token(userName) if token.status_code == 200: token = token.text self.logger.info("got the forgot pwd token", extra={"forgot_pwd_token":token}) return token else: self.logger.warning("failed to get the token", extra={"userName":userName, "Message":token.text}) raise Exception(token.text) except Exception as e: self.logger.error("Failed for password reset because", extra={"Message":e.args[0], "userName":userName}) raise Exception("Failed for password reset because {0}".format(e.args[0])) def activate_cg_user(self, activation_code): response = self.authManager._activate_user(activation_code) if response.status_code == 200: profile = CGCollection(self.user_profiles_string); provider = CloudgustDataProvider(self.appServer, self.appServerId, self.appServerKey, self.tenantId, self.userId, self.userKey) print response.text profile.load(provider, {"userName":response.text}) print profile if profile: if not profile.collection: self.logger.warning("No user with user name", extra={"userName":response.text}) raise Exception("Invalid user") user = filter(lambda active_user: active_user.get('isDeleted') == False, profile.collection) self.logger.info("this is the profile needed", extra={"userData":str(user[0])}) return user[0].to_dict() else: raise Exception("no user") else: raise Exception(response.text) def create_new_cg_user(self, user_data): try: print "Creating new user" username = user_data["userName"] password = user_data["password"] if not username: raise Exception("username not specified") if not password: raise Exception("password not specified") response = self.authManager._create_authentication_user(username, password) if response.status_code == 200: self._delete_user_name(username) self._create_new_user_profile(user_data) return response.text else: raise Exception(response.text) except Exception as e: print e raise Exception("Error in creating new user:{0}".format(e.args[0])) def _create_new_user_profile(self, user_data): profile = CGObject(self.user_profiles_string) for pair in user_data.iteritems(): if(pair[0] == "password"): continue profile.set(pair[0], pair[1]) profile.set("isDeleted", False) profile.save(self.provider) return profile.to_dict() def _delete_user_name(self, username): print "deleting user", username user = None try: user = self.get_cg_user_profile_by_username(username) except Exception as e: print e print "this is the user fetched", user profile = CGObject(self.user_profiles_string) if user: profile.set("id", user["id"]) profile.delete(self.provider) def get_cg_user_profile_by_username(self, username): if not username: raise Exception("Invalid username") profiles = CGCollection(self.user_profiles_string); profiles.load(self.provider, query={'userName':username}) print "\nProfiles count", len(profiles.collection) if not profiles.collection: print "No users with user name: ",username raise Exception("Invalid user") user = filter(lambda active_user: active_user.get('isDeleted') == False, profiles.collection) print "this is the user list", user return user[0].to_dict() def reset_cguser_password_validate_token(self, token): if not token: raise Exception("Invalid token") response = self.authManager._validate_reset_token(token, "validateresettoken") if response.status_code == 200: return response.text else: return {"error":response.text} # link to auth server to validate the token pass def reset_password_cguser(self, password, username, token): if not password: raise Exception("required field missing") if not username: raise Exception("required field missing") if not token: raise Exception("required field missing") response = self.authManager._reset_password_user(password, username, token, "resetpassword") if response.status_code == 200: return True else: return {"error": response.text} def authenticate_cg_user(self, userName, password): return self.authManager._authenticate_cg_user(userName, password) def authenticate_cguser_token(self, token): return self.authManager._authenticate_cguser_token(token) def renew_cguser_token(self, token): return self.authManager._renew_user_token(token, "renewcgusertoken")
def __init__(self): from django.conf import settings self.authServer = getattr(settings, 'APPSERVER_AUTHSERVER_URL', 'http://localhost:7890/') self.logger_object = CGLogger() self.logger = self.logger_object.get_logger('cg_auth_server_user_manager')