UNPKG

scalra

Version:

node.js framework to prototype and scale rapidly

1,885 lines (1,853 loc) 82.6 kB
// TODO: this may be too Hydra-specific, need to move it // module object var l_module = exports.module = {}; // a pool for all message handlers var l_handlers = exports.handlers = {}; var l_checkers = exports.checkers = {}; var l_api = exports.api = {}; var l_name = 'SR.Module.Account'; // module init l_module.start = function (config, onDone) { LOG.warn('Account module started...', l_name); UTIL.safeCall(onDone); } // module shutdown l_module.stop = function (onDone) { UTIL.safeCall(onDone); } //var camLib = require('./video/cameraLib.js'); // TODO: there should not be any dependency over video //require('./video/Core/AeDatabase.js'); //require('./video/Core/AeDate.js'); //require('./video/Core/AeLog.js'); //require('./video/Core/AeObject.js'); //require('./video/Core/AeEventSender.js'); //require('./video/Core/SystemEvent.js'); //require("./video/Core/AeTimeTrigger.js"); //require("./video/Core/pw_recovery.js"); require("./EventTrigger.js"); /* UserInfo UserPermissions AccountData */ //======================================================================================= //使用者資料 function UserInfo() { //使用者帳號(索引用) this.strAccount = ""; //電子信箱 this.strEmail = ""; //信箱通知勾選 this.bEmailNotify = false; //電話資料 this.strPhone = ""; //簡訊通知勾選 this.bSMSNotify = false; //使用者名稱(暱稱?) this.strUserName = ""; //語系控制 this.strLanguages = ""; //系統保護 this.bSystemAegis = false; //登入次數 this.iLoginCount = 0; //登入時間 this.iLogin = 0; //最後登出時間 this.iLastLogout = 0; }; //創造資料 UserInfo.prototype.create = function (i_strUserAccount, i_data, o_onDone, o_onFail) { //更新資料 if (i_strUserAccount != undefined) this.strAccount = i_strUserAccount; aether.copyObj(this, i_data); var that = this; //新增會員資料 DB.insertValue('UserInfo', that, function () { o_onDone(that); }, o_onFail); }; //寫入資料 UserInfo.prototype.set = function (i_data, o_onDone, o_onFail) { //更新資料 aether.copyObj(this, i_data); this.update(this, o_onDone, o_onFail); }; //取得資料 //str i_strUserAccount: 使用者帳號 //function o_onDone(object i_data): 成功處理函式 //function o_onFail(): 失敗處理函式 UserInfo.prototype.get = function (i_strUserAccount, o_onDone, o_onFail) { if (i_strUserAccount != undefined) this.strAccount = i_strUserAccount; //取得不到,就依現有資料直接新增 DB.selectOrInsertValue('UserInfo', { 'strAccount': i_strUserAccount }, this, o_onDone, o_onFail); }; //更新資料 UserInfo.prototype.update = function (i_data, o_onDone, o_onFail) { aether.copyObj(this, i_data); DB.updateValue('UserInfo', { 'strAccount': this.strAccount }, this, o_onDone, o_onFail); }; //登入次數 UserInfo.prototype.addLoginNum = function (o_onDone, o_onFail) { ++this.iLoginCount; this.update(this, o_onDone, o_onFail); }; // UserInfo.prototype.toPacket = function () { var l_obj = { 'strEmail': this.strEmail, //電子信箱 'bEmailNotify': this.bEmailNotify, //信箱通知勾選 'strPhone': this.strPhone, //電話資料 'bSMSNotify': this.bSMSNotify, //簡訊通知勾選 'strUserName': this.strUserName, //使用者名稱 'strLanguages': this.strLanguages, //語系控制 'bSystemAegis': this.bSystemAegis //系統保護 }; return l_obj; }; //------------------------------------------------- //使用者權限 function UserPermissions() { //使用者帳號(索引用) this.strAccount = ""; //控制錄影權限 this.bVideo = false; //操作回放權限 this.bPlayback = false; //設備位移縮放 this.bMoveScale = false; //設定設備名稱 this.bSetDevice = false; //警報事件處理 this.bAlertEvent = false; //下載備份權限 this.bBackup = false; //拍照畫面權限 this.bPhotograph = false; //軟體更新權限 this.bUpdate = false; //登入權限 this.bLogin = true; }; //創造資料 UserPermissions.prototype.create = function (i_strAccount, i_data, o_onDone, o_onFail) { //更新資料 if (i_strAccount != undefined) this.strAccount = i_strAccount; else { LOG.error('no account provided to create permission'); LOG.stack(); } aether.copyObj(this, i_data); var that = this; //LOG.warn('UserPermissions.create [' + i_strAccount + '] with:'); //LOG.warn(that); //新增會員資料 DB.insertValue('UserPermissions', that, function () { o_onDone(that); }, o_onFail); }; //寫入資料 UserPermissions.prototype.set = function (i_data, o_onDone, o_onFail) { //更新資料 aether.copyObj(this, i_data); this.update(o_onDone, o_onFail); }; //取得資料 //str i_strAccount: 使用者帳號 //function o_onDone(object i_data): 成功處理函式 //function o_onFail(): 失敗處理函式 UserPermissions.prototype.get = function (i_strAccount, o_onDone, o_onFail) { if (i_strAccount != undefined) this.strAccount = i_strAccount; DB.selectOrInsertValue('UserPermissions', { 'strAccount': i_strAccount }, this, o_onDone, o_onFail); }; //更新資料 UserPermissions.prototype.update = function (i_data, o_onDone, o_onFail) { aether.copyObj(this, i_data); DB.updateValue('UserPermissions', { 'strAccount': this.strAccount }, this, o_onDone, o_onFail); }; // UserPermissions.prototype.toPacket = function () { var l_obj = { 'bVideo': this.bVideo, //控制錄影權限 'bPlayback': this.bPlayback, //操作回放權限 'bMoveScale': this.bMoveScale, //設備位移縮放 'bSetDevice': this.bSetDevice, //新增編輯設備 'bAlertEvent': this.bAlertEvent, //警報事件處理 'bBackup': this.bBackup, //下載備份權限 'bPhotograph': this.bPhotograph, //拍照畫面權限 'bUpdate': this.bUpdate, //軟體更新權限 'bLogin': this.bLogin //登入權限 }; return l_obj; }; //======================================================================================================= //使用者 function AccountData() { //使用者帳號(索引用) this.strAccount = ""; //str UUID this.strUUID = ""; //int 連線編號 this.connId = 0; //int IP位址 this.connHost = 0; //int 網路窗口 this.connPort = 0; }; //private:----------------------------------------------------------------------------------------------- //AccountData.prototype.into = function (i_data, i_connObj, o_onDone, o_onFail) //{ // var that = this; // this.connId = i_connObj.connID; // this.connHost = i_connObj.host; // this.connPort = i_connObj.port; // that.data.get(i_data.lUserId, o_onDone, o_onFail);//資料庫發生搜尋錯誤 //}; //取得上次登入時間 AccountData.prototype.getLastTime = function (o_onDone, o_onFail) { DB.selectValue('Log_LoginState', { 'strAccount': this.strAccount }, function (i_data) { o_onDone((i_data != null) ? i_data.timeLogin : null); }, o_onFail); }; //用戶登入 AccountData.prototype.loginLog = function (o_onDone, o_onFail) { var l_data = { 'strAccount': this.strAccount, 'iPort': this.connPort, 'strHost': this.connHost, 'timeLogin': AeDate.getAeDateNum(), 'timeLogout': 0 }; DB.insertValue('Log_LoginState', l_data, o_onDone, o_onFail); }; //用戶登出 AccountData.prototype.logoutLog = function (o_onDone, o_onFail) { DB.updateValue('Log_LoginState', { 'strAccount': this.strAccount }, { 'timeLogout': AeDate.getAeDateNum() }, o_onDone, o_onFail); }; //public:------------------------------------------------------------------------------------------------ //創造帳號 //i_data: 會員資料 //function o_onDone(): 成功 //function o_onFail(SysText i_text): 失敗 AccountData.prototype.registerAP = function (i_data, o_onDone, o_onFail) { LOG.warn("AccountData::registerAP in."); //比對帳號是否重覆 DB.selectValue('User_Account', { 'strAccount': i_data.strAccount }, function (ii_data) { LOG.warn("AccountData::registerAP ii_data", ii_data); if (ii_data == null) //無此帳號資料 { //新創帳號密碼 DB.insertValue('User_Account', { 'strAccount': i_data.strAccount, 'strPassword': i_data.strPassword, 'timeNew': AeDate.getAeDateNum() }, function (ii_data) { if (ii_data != null) o_onDone(0); // else o_onDone(1); // }, o_onFail); //創建帳號失敗 } else o_onFail("此帳號已註冊"); //此帳號已註冊 }, o_onFail); //資料庫發生搜尋錯誤 }; //修改用戶密碼 //i_data: 資料 //function o_onDone(): 成功 //function o_onFail(SysText i_text): 失敗 AccountData.prototype.revisePass = function (i_data, o_onDone, o_onFail) { LOG.warn("AccountData::revisePass in."); //帳號 DB.selectValue('User_Account', { 'strAccount': i_data.strAccount }, function (ii_data) { LOG.warn("AccountData::revisePass in ii_data", ii_data); if (ii_data != null) // { ii_data.strPassword = i_data.strPassword; //更新密碼 DB.updateValue('User_Account', { 'strAccount': i_data.strAccount }, ii_data, function () { LOG.warn("AccountData::revisePass out ii_data", ii_data); o_onDone(0); // }, o_onFail); //資料庫發生搜尋錯誤 } else o_onDone(1); // }, o_onFail); //資料庫發生搜尋錯誤 }; //登入帳號 //i_data: 帳號密碼 //ConnObj i_connObj: 連線資料 //function o_onDone(): 成功 //function o_onFail(SysText i_text): 失敗 AccountData.prototype.loginAP = function (i_data, i_connObj, o_onDone, o_onFail) { LOG.warn("AccountData::loginAP in."); //新增資料 var that = this; this.strAccount = i_data.strAccount; this.strUUID = UTIL.createUUID(); this.connId = i_connObj.connID; this.connHost = i_connObj.host; this.connPort = i_connObj.port; //---------------- var l_nowTime = new AeDate(); var l_obj = { 'iReturn': 0, 'strAccount': i_data.strAccount, 'strUUID': this.strUUID, 'iLoginCount': 0, 'strLoginTime': l_nowTime.getFull(), 'strIP': this.connHost, 'objPermissions': null }; var l_userInfo = new UserInfo(); var l_permissions = new UserPermissions(); //查詢帳號是否存在 DB.selectValue('User_Account', { 'strAccount': i_data.strAccount }, function (ii_data) { if (ii_data != null) { //檢查密碼是否正確 if (ii_data.strPassword == i_data.strPassword) { //讀取資料 l_userInfo.get(that.strAccount, function (i_userData) { if (i_userData != null) { l_obj.iLoginCount = i_userData.iLoginCount; l_userInfo.iLogin = l_nowTime.getFullDateNum(); l_userInfo.addLoginNum(function () {}, function () {}); //讀取權限 l_permissions.get(that.strAccount, function (i_permissions) { if (i_permissions != null) { if (i_permissions.bLogin == 'true') i_permissions.bLogin = true; if (i_permissions.bLogin == true) //登入權限檢查 { l_obj.objPermissions = l_permissions.toPacket(); //登入記錄 that.loginLog( function () { l_obj.iReturn = 0; o_onDone(l_obj); }, o_onFail); //資料庫發生新增錯誤 } else o_onFail("無使用者登入權限"); // } else o_onFail("無使用者權限資料"); // }, o_onFail); //資料庫發生搜尋錯誤 } else o_onFail("無使用者資料"); // }, o_onFail); //資料庫發生搜尋錯誤 } else o_onFail("輸入密碼錯誤"); //輸入密碼錯誤 } else o_onFail("此帳號不存在"); //此帳號不存在 }, o_onFail); //資料庫發生搜尋錯誤 }; //修改用戶權限 //i_data: 資料 //function o_onDone(): 創建成功 //function o_onFail(SysText i_text): 創建失敗 AccountData.prototype.revisePermissions = function (i_data, o_onDone, o_onFail) { LOG.warn("AccountData::revisePermissions in."); //權限 var l_permissions = new UserPermissions(); l_permissions.get(i_data.strAccount, function (ii_data) { LOG.warn("AccountData::revisePermissions in ii_data", ii_data); if (ii_data != null) // { aether.copyObj(ii_data, i_data); //更新 DB.updateValue('UserPermissions', { 'strAccount': i_data.strAccount }, ii_data, function () { if (l_permissions.bLogin == false) //取消登入權限 { var l_user = SR.Account.getUserFromAccount(i_data.strAccount); if (l_user != null || l_user != undefined) //在線上 { SR.Account.delUser(l_user); } } LOG.warn("AccountData::revisePermissions out ii_data", ii_data); o_onDone(0); // }, o_onFail); //資料庫發生搜尋錯誤 } else o_onDone(1); // }, o_onFail); //資料庫發生搜尋錯誤 }; //發送封包 AccountData.prototype.send = function (i_strPacket, i_obj) { aether.send(i_strPacket, i_obj, this.connId); }; //======================================================================================================= //Admin function Admin() {}; //管理者註冊用戶 //i_data: 帳號資料 //function o_onDone(): 創建成功 //function o_onFail(): 創建失敗 Admin.prototype.addUser = function (i_data, o_onDone, o_onFail) { ////檢查是不是管理者 //var l_userCheck = SR.Account.getUser(i_connObj.connID); //if (l_userCheck == null || l_userCheck == undefined || l_userCheck.strAccount != "admin") //{ // o_onDone(-100); // return; //} //---------------- var that = this; var l_user = new AccountData(); l_user.registerAP(i_data, function (ii_data) { o_onDone(ii_data); }, o_onFail); }; //管理者刪除用戶 //strAccount: 帳號 //function o_onDone(): 成功 //function o_onFail(): 失敗 Admin.prototype.deleteUser = function (i_data, o_onDone, o_onFail) { //---------------- var that = this; //移除資料 DB.deleteValue('UserInfo', { 'strAccount': i_data.strAccount }, function () { //移除權限 DB.deleteValue('UserPermissions', { 'strAccount': i_data.strAccount }, function () { //從相關群組中移除使用者 DB.deleteValue('GroupUser', { 'strAccount': i_data.strAccount }, function () { //刪除帳號資料 DB.deleteValue('User_Account', { 'strAccount': i_data.strAccount }, function (ii_data) { //檢查是否在現上 var l_user = SR.Account.getUserFromAccount(i_data.strAccount); if (l_user != null || l_user != undefined) { SR.Account.delUser(l_user); } o_onDone(0); // }, o_onFail); //資料庫發生搜尋錯誤 }, o_onFail); }, o_onFail); }, o_onFail); }; //遞回處理帳號資訊 Admin.prototype.getUserInfoList = function (i_dataAr, i_iCount, i_returnAr, o_onDone, o_onFail) { var that = this; var l_userInfo = new UserInfo(); l_userInfo.get(i_dataAr[i_iCount].strAccount, function (i_userData) { //LOG.warn("Admin::getUserInfoList() 取得 第" + i_iCount + "個 帳號資訊 處理成功! "); i_returnAr.push(i_userData); ++i_iCount; if (i_iCount == i_dataAr.length) { o_onDone(i_returnAr); return; } else { that.getUserInfoList(i_dataAr, i_iCount, i_returnAr, o_onDone, o_onFail); } }, o_onFail); //資料庫發生搜尋錯誤 }; Admin.prototype.getLoginPermission = function (users, result, count, onDone, onFail) { var that = this; var userInfo = users[count++]; var l_userPermissions = new UserPermissions(); l_userPermissions.get(userInfo.strAccount, function (ii_data) { if (ii_data != null) { userInfo.bLogin = ii_data.bLogin; result.push(userInfo); if (count == users.length) { onDone(result); } else { that.getLoginPermission(users, result, count, onDone, onFail); } } else { onFail(null); } }, onFail); }; //管理者取得所有使用者列表 Admin.prototype.listUser = function (o_onDone, o_onFail) { var that = this; //列表 DB.fromArray('User_Account', function (ii_dataAr) { var l_iCount = 0; var l_objInfoAr = []; that.getUserInfoList(ii_dataAr, l_iCount, l_objInfoAr, function (ii_infoAr) { that.getLoginPermission(ii_infoAr, [], 0, function (result) { o_onDone(result); }, o_onFail ); }, o_onFail); // }, o_onFail); // }; //管理者修改用戶密碼 //i_data: 帳號資料 //function o_onDone(): 成功 //function o_onFail(): 失敗 Admin.prototype.setUserPassword = function (i_data, o_onDone, o_onFail) { //---------------- var that = this; //要檢查 要新增的使用者是否存在!! DB.selectValue('User_Account', { 'strAccount': i_data.strAccount }, function (ii_dataAccount) { if (ii_dataAccount != null) { var l_user = SR.Account.getUserFromAccount(i_data.strAccount); if (l_user != null || l_user != undefined) { l_user.revisePass(i_data, function (ii_data) { o_onDone(ii_data); }, o_onFail); } else //不在線上 { var l_user = new AccountData(); l_user.revisePass(i_data, function (ii_data) { o_onDone(ii_data); }, o_onFail); } } else o_onDone(false); }, o_onFail); }; //管理者修改用戶權限 Admin.prototype.setUserInfo = function (i_data, o_onDone, o_onFail) { //---------------- var that = this; //要檢查 要新增的使用者是否存在!! DB.selectValue('User_Account', { 'strAccount': i_data.strAccount }, function (ii_dataAccount) { if (ii_dataAccount != null) { SR.Account.user.setInfo(i_data, i_data.strAccount, function (ii_data) { o_onDone(ii_data); }, o_onFail); } else o_onDone(1); }, o_onFail); }; //管理者查看使用者帳號權限 Admin.prototype.getUserInfo = function (i_data, o_onDone, o_onFail) { //---------------- var that = this; //要檢查 要使用者是否存在!! DB.selectValue('User_Account', { 'strAccount': i_data.strAccount }, function (ii_dataAccount) { if (ii_dataAccount != null) { SR.Account.user.getInfo(i_data.strAccount, function (ii_data) { o_onDone(ii_data); // }, o_onFail); // } else o_onDone(null); }, o_onFail); }; //管理者修改用戶權限 Admin.prototype.setUserPermission = function (i_data, o_onDone, o_onFail) { //---------------- var that = this; //要檢查 要新增的使用者是否存在!! DB.selectValue('User_Account', { 'strAccount': i_data.strAccount }, function (ii_dataAccount) { if (ii_dataAccount != null) { var l_user = SR.Account.getUserFromAccount(i_data.strAccount); if (l_user != null || l_user != undefined) { l_user.revisePermissions(i_data, function (ii_data) { o_onDone(ii_data); }, o_onFail); } else //不在線上 { var l_user = new AccountData(); l_user.revisePermissions(i_data, function (ii_data) { o_onDone(ii_data); }, o_onFail); } } else o_onDone(1); }, o_onFail); }; //管理者查看使用者帳號權限 Admin.prototype.getUserPermission = function (i_data, o_onDone, o_onFail) { //---------------- var that = this; //要檢查 要使用者是否存在!! DB.selectValue('User_Account', { 'strAccount': i_data.strAccount }, function (ii_dataAccount) { if (ii_dataAccount != null) { var l_userPermissions = new UserPermissions(); l_userPermissions.get(i_data.strAccount, function (ii_data) { if (ii_data != null) o_onDone(l_userPermissions.toPacket()); // else o_onDone(null); // }, o_onFail); //失敗 } else o_onDone(null); }, o_onFail); }; //管理者忘記密碼-要求版本號 Admin.prototype.resetAdminPassword = function (o_onDone, o_onFail) { var that = this; //列表 DB.selectValue('User_Account', { 'strAccount': "admin" }, function (ii_dataAccount) { if (ii_dataAccount != null) { //產生序號 var l_strVersion = pwRecovery.en({ len: 6, pad: "1215489536" }); LOG.warn("Admin::getVersionNumber 版本號 l_strVersion = " + l_strVersion); //產生新的密碼 var l_strPw = pwRecovery.de(l_strVersion); //LOG.warn("Admin::getVersionNumber l_strPw = " + l_strPw); //要去掉尾數 var l_strPass = l_strPw.slice(0, 6); //LOG.warn("Admin::getVersionNumber 新密碼 strPass = " + l_strPass); //附蓋掉原本的密碼 並更新回DB ii_dataAccount.strPassword = l_strPass; //更新密碼 DB.updateValue('User_Account', { 'strAccount': "admin" }, ii_dataAccount, function () { LOG.warn("Admin::getVersionNumber out ii_data", ii_dataAccount); var l_obj = { 'strVersion': l_strVersion.slice(0, 4) + "-" + l_strVersion.slice(4, 8) + "-" + l_strVersion.slice(8, 12) + "-" + l_strVersion.slice(12), 'strCustomerService': "04-12345678" }; //標記必須修改密碼 SR.Account.bRevise = true; o_onDone(l_obj); // }, o_onFail); //資料庫發生搜尋錯誤 } else o_onFail(); // }, o_onFail); // }; //管理者 - 重設密碼 Admin.prototype.setAdminPassword = function (i_data, o_onDone, o_onFail) { //---------------- var that = this; //取得帳號 DB.selectValue('User_Account', { 'strAccount': l_userCheck.strAccount }, function (ii_data) { LOG.warn("Admin::setAdminPass in ii_data", ii_data); if (ii_data != null) // { ii_data.strPassword = i_data.strNewPassword; //更新密碼 DB.updateValue('User_Account', { 'strAccount': l_userCheck.strAccount }, ii_data, function () { //取消標記修改密碼 SR.Account.bRevise = false; LOG.warn("Admin::setAdminPass out ii_data", ii_data); o_onDone(0); // }, o_onFail); //資料庫發生搜尋錯誤 } else o_onDone(1); //失敗 }, o_onFail); //資料庫發生搜尋錯誤 }; //==================================== //Group /* function Group() {}; //管理者取得所有群組列表 Group.prototype.list = function (o_onDone, o_onFail) { //---------------- //列表 DB.selectArray('GroupName', { 'bDelete': false }, function (ii_dataAr) { LOG.warn("Group::getAllGroupList ii_dataAr", ii_dataAr); var l_objGroupAr = []; var l_iLoop = 0; while (l_iLoop < ii_dataAr.length) { var l_obj = { 'strGroupName': ii_dataAr[l_iLoop].strGroupName, 'groupID': ii_dataAr[l_iLoop].groupID }; l_objGroupAr.push(l_obj); ++l_iLoop; } o_onDone(l_objGroupAr); // }, o_onFail); // }; //管理者新增群組 Group.prototype.add = function (i_data, o_onDone, o_onFail) { //---------------- DB.selectValue('GroupName', { 'strGroupName': i_data.strGroupName, 'bDelete': false }, function (ii_data) { if (ii_data == null) //沒有 { //取得新編號 DB.getCollectionCount('GroupName', function (i_iCount) { if (i_iCount == null) i_iCount = 0; DB.insertValue('GroupName', { 'groupID': ++i_iCount, 'strGroupName': i_data.strGroupName, 'bDelete': false }, function (ii_dataGroupName) { LOG.warn("Group::add ii_dataGroupName", ii_dataGroupName); if (ii_dataGroupName != null) { o_onDone(0); } else o_onDone(1); }, o_onFail); }, o_onFail); } else o_onDone(1); }, o_onFail); }; //管理者刪除群組 Group.prototype.delete = function (i_data, o_onDone, o_onFail) { //---------------- var that = this; DB.selectValue('GroupName', { 'groupID': i_data.groupID, 'bDelete': false }, function (ii_data) { if (ii_data != null) { //移除 DB.deleteValue('GroupUser', { 'groupID': i_data.groupID }, function () { //移除 DB.deleteValue('GroupDevice', { 'groupID': i_data.groupID }, function (ii_data) { DB.updateValue('GroupName', { 'groupID': i_data.groupID, 'bDelete': false }, { 'groupID': i_data.groupID, 'bDelete': true }, function () { //移除 RecordTrigger.onDeleteGroup({ 'groupID': i_data.groupID }, function () { o_onDone(0); // }, o_onFail); }, o_onFail); //資料庫發生搜尋錯誤 }, o_onFail); //資料庫發生搜尋錯誤 }, o_onFail); //資料庫發生搜尋錯誤 } else o_onDone(1); // }, o_onFail); }; //管理者取得群組內使用者 Group.prototype.listUsers = function (i_data, o_onDone, o_onFail) { //---------------- var that = this; //列表 DB.selectArray('GroupUser', { 'groupID': i_data.groupID }, function (ii_data) { LOG.warn("Group::listUsers ii_data", ii_data); if (ii_data != null) { var l_strUserAr = []; var l_iLoop = 0; while (l_iLoop < ii_data.length) { l_strUserAr.push(ii_data[l_iLoop].strAccount); ++l_iLoop; } o_onDone(l_strUserAr); // } else o_onDone(null); // }, o_onFail); // }; //取得群組內設備ID(有別的地方使用 請勿亂動) Group.prototype.listDeviceId = function (i_data, o_onDone, o_onFail) { //---------------- var that = this; //列表 DB.selectArray('GroupDevice', { 'groupID': i_data.groupID }, function (ii_data) { LOG.warn("Group::listDeviceId ii_data", ii_data); if (ii_data.length > 0) { var l_deviceAr = []; var l_iLoop = 0; while (l_iLoop < ii_data.length) { l_deviceAr.push(ii_data[l_iLoop].device); ++l_iLoop; } o_onDone(l_deviceAr); } else o_onDone(null); // }, o_onFail); // }; //遞迴設備ID Group.prototype.getDeviceName = function (i_dataAr, i_iCount, i_returnAr, o_onDone, o_onFail) { //---------------- var that = this; camLib.getNameById(i_dataAr[i_iCount], function (err, ii_strName) { if (!err) { LOG.warn("User::getDeviceName() 取得 第" + i_iCount + "個 設備名稱成功! "); i_returnAr.push({ 'name': ii_strName, 'id': i_dataAr[i_iCount] }); ++i_iCount; if (i_iCount == i_dataAr.length) { o_onDone(i_returnAr); return; } else { that.getDeviceName(i_dataAr, i_iCount, i_returnAr, o_onDone, o_onFail); } } else { LOG.error("getDeviceName error"); o_onFail(); } }); }; //管理者取得群組內設備 Group.prototype.listDevice = function (i_data, o_onDone, o_onFail) { //---------------- var that = this; //列表 DB.selectArray('GroupDevice', { 'groupID': i_data.groupID }, function (ii_data) { LOG.warn("Group::listDevice ii_data", ii_data); if (ii_data.length > 0) { var l_deviceAr = []; var l_iLoop = 0; while (l_iLoop < ii_data.length) { l_deviceAr.push(ii_data[l_iLoop].device); ++l_iLoop; } that.getDeviceName(l_deviceAr, 0, [], function (result) { o_onDone(result); }, o_onFail ); } else o_onDone(null); // }, o_onFail); // }; //管理者新增群組設備 Group.prototype.addDevice = function (i_data, o_onDone, o_onFail) { //---------------- var that = this; //要防止 沒有該群組卻又新增東西的錯誤 DB.selectValue('GroupName', { 'groupID': i_data.groupID, 'bDelete': false }, function (ii_data) { if (ii_data != null) //在的話 { //尋找 DB.selectValue('GroupDevice', { 'groupID': i_data.groupID, 'device': i_data.device }, function (ii_data) { if (ii_data == null) //不存在的話 { //寫入 DB.insertValue('GroupDevice', { 'groupID': i_data.groupID, 'device': i_data.device }, function (ii_dataGroupDevice) { LOG.warn("Group::addDevice ii_dataGroupDevice", ii_dataGroupDevice); if (ii_dataGroupDevice != null) { SR.DB.getData('GroupName', { 'groupID': i_data.groupID }, function (groupName) { SR.DB.getArray('GroupUser', function (groupUsers) { var users = []; for (var k in groupUsers) { users.push(groupUsers[k].strAccount); } SR.DB.getData('camera', { '_id': i_data.device }, function (cameraData) { users.push('admin'); cameraData.permission.read = users; cameraData.update_at = Date.now(); SR.DB.updateData('camera', { '_id': i_data.device }, cameraData, function (updateStatus) { o_onDone(0); }, function () { o_onFail(1); } ); }, function () { o_onFail(1); } ); }, function () { o_onFail(1); }, { 'groupID': i_data.groupID } ); }, function () {} ); } else o_onDone(1); }, o_onFail); } else //重複了 o_onDone(1); }, o_onFail); } else // o_onDone(1); }, o_onFail); }; //管理者刪除群組設備 Group.prototype.deleteDevice = function (i_data, o_onDone, o_onFail) { //---------------- // 從群組中移除 if (i_data.groupID) { DB.deleteValue('GroupDevice', { 'groupID': i_data.groupID, 'device': i_data.device }, function (ii_data) { //移除 SR.DB.getArray('GroupUser', function (groupUsers) { var users = []; for (var k in groupUsers) { users.push(groupUsers[k].strAccount); } SR.DB.getData('camera', { '_id': i_data.device }, function (camera) { var readPermission = camera.permission.read; var updatePermission = readPermission.filter( function (user) { return users.indexOf(user) == -1; } ); LOG.error('new read permission array'); camera.permission.read = updatePermission; camera.update_at = Date.now(); SR.DB.updateData('camera', { '_id': camera._id }, camera, function () { o_onDone(0); // }, function () { LOG.error('group_deleteDevice: update data error'); o_onFail(); } ); }, function (err) { LOG.error('group_deleteDevice: get data error'); o_onFail(); } ); }, function (err) { LOG.error('group_deleteDevice: get dataArray error'); o_onFail(); }, { 'groupID': i_data.groupID } ); }, o_onFail ); //資料庫發生搜尋錯誤 // 從所有群組中移除 } else { if (typeof i_data == 'string') { DB.deleteValue('GroupDevice', { 'device': i_data }, function (ii_data) { o_onDone(ii_data); }, o_onFail ); } else { o_onFail(); } } }; //管理者新增群組使用者 Group.prototype.addUser = function (i_data, o_onDone, o_onFail) { //---------------- var that = this; //要防止 沒有該群組卻又新增東西的錯誤 DB.selectValue('GroupName', { 'groupID': i_data.groupID, 'bDelete': false }, function (ii_data) { if (ii_data != null) //在的話 { //要檢查 要新增的使用者是否存在!! DB.selectValue('User_Account', { 'strAccount': i_data.strAccount }, function (ii_dataAccount) { if (ii_dataAccount != null) { //尋找 DB.selectValue('GroupUser', { 'groupID': i_data.groupID, 'strAccount': i_data.strAccount }, function (ii_data) { if (ii_data == null) //不存在的話 { //寫入 DB.insertValue('GroupUser', { 'groupID': i_data.groupID, 'strAccount': i_data.strAccount }, function (ii_dataGroupUser) { LOG.warn("Group::addUser ii_dataGroupUser", ii_dataGroupUser); if (ii_dataGroupUser != null) { SR.DB.getArray('GroupDevice', function (groupDevices) { for (var k in groupDevices) { var device = groupDevices[k]; SR.DB.getData('camera', { '_id': device.device }, function (camera) { var readPermission = camera.permission.read; if (readPermission.indexOf(i_data.strAccount) == -1) { readPermission.push(i_data.strAccount); } camera.permission.read = readPermission; camera.update_at = Date.now(); SR.DB.updateData('camera', { '_id': camera._id }, camera, function () { LOG.debug('group_addUser: update data success'); }, function () { LOG.error('group_addUser: update data error'); } ); }, function () { } ); } }, function () { }, { 'groupID': i_data.groupID } ); o_onDone(0); } else o_onDone(1); }, o_onFail); } else //重複了 o_onDone(1); }, o_onFail); } else o_onDone(1); }, o_onFail); } else // o_onDone(1); }, o_onFail); }; //管理者刪除群組使用者 Group.prototype.deleteUser = function (i_data, o_onDone, o_onFail) { //---------------- var that = this; //移除 DB.deleteValue('GroupUser', { 'groupID': i_data.groupID, 'strAccount': i_data.strAccount }, function (ii_data) { //移除 SR.DB.getArray('GroupDevice', function (groupDevices) { var devices = []; for (var k in groupDevices) { devices.push(groupDevices[k].device); for (var key in devices) { SR.DB.getData('camera', { '_id': devices[key] }, function (camera) { var readPermission = camera.permission.read.filter( function (user) { return user !== i_data.strAccount; } ); camera.update_at = Date.now(); camera.permission.read = readPermission; SR.DB.updateData('camera', { '_id': devices[key] }, camera, function (data) {}, function (err) { LOG.error('group_removeUser: update camera data error'); } ); }, function (err) { LOG.error('group_removeUser: get camera data error'); } ); } } o_onDone(0); // }, function () { o_onFail; }, { 'groupID': i_data.groupID } ); }, o_onFail); //資料庫發生搜尋錯誤 }; //管理者重設群組設備 Group.prototype.setBulkDevice = function (i_data, o_onDone, o_onFail) { //---------------- var that = this; //要防止 沒有該群組卻又新增東西的錯誤 DB.selectValue('GroupName', { 'groupID': i_data.groupID, 'bDelete': false }, function (ii_data) { if (ii_data != null) //在的話 { //移除群組設備 DB.deleteValue('GroupDevice', { 'groupID': i_data.groupID }, function () { //重新寫入 var l_iLoop = 0; while (l_iLoop < i_data.deviceAr.length) { DB.insertValue('GroupDevice', { 'groupID': i_data.groupID, 'device': i_data.deviceAr[l_iLoop] }, function () {}, function () { o_onFail("資料庫新增錯誤"); return; }); ++l_iLoop; } o_onDone(0); }, o_onFail); //資料庫發生搜尋錯誤 } else // o_onDone(1); }, o_onFail); }; //管理者修改設備名稱 Group.prototype.setDevice = function (i_data, o_onDone, o_onFail) { //---------------- var that = this; //尋找strNewDevice是否重複 DB.selectValue('GroupDevice', { 'device': i_data.strNewDevice }, function (ii_Device) { if (ii_Device != null) //重複了 { o_onDone(1); return; } else { //尋找 DB.selectArray('GroupDevice', { 'device': i_data.device }, function (ii_dataAr) { LOG.warn("Group::setDevice ii_dataAr", ii_dataAr); if (ii_dataAr != null) // { var l_iLoop = 0; while (l_iLoop < ii_dataAr.length) { DB.updateValue('GroupDevice', { 'groupID': ii_dataAr[l_iLoop].groupID, 'device': i_data.device }, { 'device': i_data.strNewDevice }, function () {}, function () { o_onFail("資料庫更新錯誤"); return; }); ++l_iLoop; } o_onDone(0); } else // o_onDone(1); }, o_onFail); } }, o_onFail); }; //管理者修改群組名稱 Group.prototype.renameGroup = function (i_data, o_onDone, o_onFail) { //---------------- var that = this; //尋找strNewGroupName是否重複 DB.selectValue('GroupName', { 'strGroupName': i_data.strNewGroupName, 'bDelete': false }, function (ii_GroupName) { if (ii_GroupName != null) //重複了 { o_onDone(1); return; } else { //要防止 沒有該群組的錯誤 DB.selectValue('GroupName', { 'strGroupName': i_data.strOldGroupName, 'bDelete': false }, function (ii_data) { if (ii_data != null) //在的話 { //更新 DB.updateValue('GroupName', { 'strGroupName': i_data.strOldGroupName, 'bDelete': false }, { 'strGroupName': i_data.strNewGroupName }, function () { o_onDone(0); // }, o_onFail); //資料庫發生搜尋錯誤 } else // o_onDone(1); }, o_onFail); } }, o_onFail); }; //群組ID 查詢 群組名稱 Group.prototype.getNameById = function (i_data, o_onDone, o_onFail) { //---------------- var that = this; //尋找strNewGroupName是否重複 DB.selectValue('GroupName', { 'groupID': i_data.groupID, 'bDelete': false }, function (ii_objGroup) { if (ii_objGroup != null) // { o_onDone(ii_objGroup.strGroupName); // } else { o_onDone(null); } }, o_onFail); }; */ //==================================== //User function User() {}; //登入帳號 //i_data: 帳號密碼 //ConnObj i_connObj: 連線資料 //function o_onDone(): 成功 //function o_onFail(SysText i_text): 失敗 User.prototype.login = function (i_data, i_connObj, o_onDone, o_onFail) { var that = this; var l_user = new AccountData(); l_user.loginAP(i_data, i_connObj, function (ii_data) { if (i_data.strAccount == "admin") SR.Account.iPassErrorCount == 0; //如果標記重設密碼 if (SR.Account.bRevise == true) { ii_data.iReturn = -99; // 要補上特殊狀態 } var now = new AeDate(); Event.onEvent({ 'iType': 2, 'iEventInx': 1, 'strTime': now.getFullDateNum(), 'strText': 'User ' + i_data.strAccount + ' login' }, function () { SR.Account.addUser(l_user); o_onDone(ii_data); }, function () { LOG.error('log event fail'); o_onFail(); }); }, function (i_str) { if (i_data.strAccount == "admin") { if (i_str == "輸入密碼錯誤") { if (++SR.Account.iPassErrorCount >= 3) { o_onDone({ 'bForget': true }); return; } } } o_onFail(); }); }; //登出帳號 User.prototype.logout = function (i_strUUID, o_onDone, o_onFail) { var that = this; var l_user = SR.Account.getUserByUUID(i_strUUID); var now = new AeDate(); if (l_user != undefined) { LOG.warn("User::logoutAP() 用戶登出 strUUID = " + i_strUUID); // log event Event.onEvent({ 'iType': 2, 'iEventInx': 2, 'strTime': now.getFullDateNum(), 'strText': 'User ' + l_user.strAccount + ' logout' }, function () { SR.Account.delUser(l_user); o_onDone(0); }, function () { LOG.error('log event fail'); o_onDone(1); } ); } else { LOG.warn("User::logoutAP() 找不到用戶 strUUID = " + i_strUUID); o_onDone(1); } }; //使用者設定帳號資訊 User.prototype.setInfo = function (i_data, i_strAccount, o_onDone, o_onFail) { //---------------- var that = this; var l_userInfo = new UserInfo(); l_userInfo.get(i_strAccount, function (ii_data) { l_userInfo.set(i_data, function (ii_data) { if (ii_data != null) o_onDone(0); // else o_onDone(1); // }, o_onFail); // }, o_onFail); // }; //使用者取得帳號資訊 User.prototype.getInfo = function (i_strAccount, o_onDone, o_onFail) { //---------------- var that = this; var l_userInfo = new UserInfo(); l_userInfo.get(i_strAccount, function (ii_data) { if (ii_data != null) o_onDone(l_userInfo.toPacket()); // else o_onDone(null); // }, o_onFail); // }; //修改密碼(含管理者) User.prototype.setPassword = function (i_data, i_strAccount, o_onDone, o_onFail) { //---------------- var that = this; //取得帳號 DB.selectValue('User_Account', { 'strAccount': i_strAccount }, function (ii_data) { LOG.warn("User::revisePass in ii_data", ii_data); if (ii_data != null) // { if (ii_data.strPassword == i_data.strOldPassword) { ii_data.strPassword = i_data.strNewPassword; //更新密碼 DB.updateValue('User_Account', { 'strAccount': i_strAccount }, ii_data, function () { LOG.warn("User::revisePass out ii_data", ii_data); o_onDone(0); // }, o_onFail); //資料庫發生搜尋錯誤 } else o_onDone(1); //失敗 } else o_onDone(1); //失敗 }, o_onFail); //資料庫發生搜尋錯誤 }; //使用者查看帳號權限 User.prototype.getPermission = function (i_strAccount, o_onDone, o_onFail) { //---------------- var that = this; var l_userPermissions = new UserPermissions(); l_userPermissions.get(i_strAccount, function (ii_data) { if (ii_data != null) o_onDone(l_userPermissions.toPacket()); // else o_onDone(null); // }, o_onFail); //創建帳號失敗 }; //遞迴群組ID User.prototype.getGroupName = function (i_dataAr, i_iCount, i_returnAr, o_onDone, o_onFail) { //---------------- var that = this; SR.Account.group.getNameById(i_dataAr[i_iCount], function (ii_strName) { LOG.warn("User::getGroupName() 取得 第" + i_iCount + "個 群組ID 名稱成功! "); i_returnAr.push(ii_strName); ++i_iCount; if (i_iCount == i_dataAr.length) { o_onDone(i_returnAr); return; } else { that.getGroupName(i_dataAr, i_iCount, i_returnAr, o_onDone, o_onFail); } }, o_onFail); }; //使用者查看所在哪些群組 User.prototype.listGroup = function (i_data, i_strAccount, o_onDone, o_onFail) { //---------------- var that = this; //列表 DB.selectArray('GroupUser', { 'strAccount': i_strAccount }, function (ii_dataAr) { LOG.warn("User::listGroup ii_dataAr", ii_dataAr); if (ii_dataAr.length > 0) { var l_iCount = 0; var l_returnAr = []; that.getGroupName(ii_dataAr, l_iCount, l_returnAr, function (ii_strNameAr) { o_onDone(l_returnAr); // }, o_onFail); } else o_onDone(null); // }, o_onFail); // }; //取得是否登入中 User.prototype.getLogin = function (i_strUUID, o_onDone, o_onFail) { var that = this; var l_user = SR.Account.getUserByUUID(i_strUUID); LOG.warn("User::getLogin l_user", l_user); l_userInfo = new UserInfo(); if (l_user != undefined) { //LOG.warn("User::getLogin() 在線上 connID = " + i_connObj.connID); l_userInfo.get(l_user.strAccount, function (l_userData) { l_user.iLoginCount = l_userData.iLoginCount; l_user.iLogin = l_userData.iLogin; l_user.IP = l_user.connHost; delete l_user.strUUID; delete l_user.connId; delete l_user.connPort; o_onDone(l_user); } ); } else { //LOG.warn("User::getLogin() 不在線上 connID = " + i_connObj.connID); o_onDone(null); } }; //======================================================================================================= //線上用戶列表 function AccountPermissions() { this.admin = new Admin(); //this.group = new Group(); this.user = new User(); //管理者密碼錯誤次數 this.iPassErrorCount = 0; //強制管理者修改密碼 this.bRevise = false; //AccountData[] 線上用戶列表 //this.connIdList = {}; //AccountData[] 線上用戶列表 this.strUUIDList = {}; //AccountData[] 線上用戶列表 this.strUserList = {}; }; //private:----------------------------------------------------------------------------------------------- //新增用戶 AccountPermissions.prototype.addUser = function (i_user) { //新增會員資料 LOG.warn("AccountPermissions::addUser() i_user", i_user); if (i_user == undefined) return; if (i_user.strUUID == null || i_user.strUUID == undefined) { LOG.error("AccountPermissions::addUser i_user.strUUID = " + i_user.strUUID); return; } if (i_user.strAccount == null || i_user.strAccount == undefined) { LOG.error("AccountPermissions::addUser i_user.strAccount = " + i_user.strAccount); return; } //檢查是否重複登入 -- 可能會有其他遊戲會需要這個平台登入 //如果同一個會員編號 有在上面則直接取用此資料 //連線搜尋 //this.connIdList[i_user.connId.toString()] = i_user; //登入編號 this.strUUIDList[i_user.strUUID] = i_user; //用戶編號 this.strUserList[i_user.strAccount] = i_user; }; //刪除用戶 AccountPermissions.prototype.delUser = function (i_user) { if (i_user == undefined) return; LOG.sys("AccountPermissions::delUser() strAccount = " + i_user.strAccount); //連線搜尋 //delete this.connIdList[i_user.connId.toString()]; //登入編號 delete this.strUUIDList[i_user.strUUID]; //用戶編號 delete this.strUserList[i_user.strAccount]; //用戶登出 i_user.logoutLog(); //登出時間 var l_userInfo = new UserInfo(); l_userInfo.get(i_user.strAccount, function (i_userData) { if (i_userData != null) { l_userInfo.iLastLogout = AeDate.getFullAeDateNum(); l_userInfo.update(l_userInfo, function () {}, function () {}); } }, function () {}); //資料庫發生搜尋錯誤 }; //public:------------------------------------------------------------------------------------------------ //================================================================== //================================================================== //取得目前上線用戶數量 //return int: 目前人數 AccountPermissions.prototype.getCount = function () { return aether.getObjLength(this.strUUIDList); }; //取得用戶資料 - UUID搜尋 AccountPermissions.prototype.getUserByUUID = function (i_uuid) { if (i_uuid == undefined) return undefined; return this.strUUIDList[i_uuid]; }; //取得用戶資料 - ConnId搜尋 //AccountPermissions.prototype.getUser = function (i_inx) //{ // if (i_inx == undefined) // return undefined; // return this.connIdList[i_inx.toString()]; //}; //取得用戶資料 - 帳號搜尋 AccountPermissions.prototype.getUserFromAccount = function (i_strAccount) { if (i_strAccount == undefined) return undefined; return this.strUserList[i_strAccount]; }; //發送全體用戶 //AccountPermissions.prototype.send = function (i_strPacket, i_obj) //{ // for (var i in this.connIdList) // this.connIdList[i].send(i_strPacket, i_obj); //}; //取得群組內所有帳號列表的使用者資訊 AccountPermissions.prototype.getGroupAccountInfo = function (i_data, o_onDone, o_onFail) { this.group.listUsers({ 'groupID': i_data.groupID }, function (ii_strUserAr) { if (ii_strUserAr != null) { DB.fromArray('UserInfo', function (ii_userInfoAr) { var l_infoAr = []; var l_iLoop = 0; while (l_iLoop < ii_strUserAr.length) { var l_iLoopInfo = 0; while (l_iLoopInfo < ii_userInfoAr.length) { if (ii_strUserAr[l_iLoop] == ii_userInfoAr[l_iLoopInfo].strAccount) { l_infoAr.push(ii_userInfoAr[l_iLoopInfo]); } ++l_iLoopInfo; }; ++l_iLoop; }; o_onDone(l_infoAr); }, o_onFail); } else o_onDone(null); }, o_onFail); }; //Server開啟 //sysEvent.evtServerOpen.register(function () { SR.Callback.onStart(function () { LOG.warn("AccountPermissions::onServerOpen() Server開啟"); //LOG.stack(); // TODO: should not fix account creation here DB.selectValue('User_Account', { 'strAccount': "admin" }, function (ii_data) { LOG.warn("AccountPermissions::registerAP ii_data", ii_data); if (ii_data == null) //無此帳號資料 { //新創帳號密碼 DB.insertValue('User_Account', { 'strAccount': "admin", 'strPassword': "admin-pass", 'timeNew': AeDate.getAeDateNum() }, function (iii_data) { LOG.warn("AccountPermissions::onServerOpen iii_data"); LOG.warn(iii_data); var l_permissions = new UserPermissions(); var l_obj = { 'bVideo': true, //控制錄影權限 'bPlayback': true, //操作回放權限 'bMoveScale': true, //設備位移縮放 'bSetDevice': true, //新增編輯設備 'bAlertEvent': true, //警報事件處理 'bBackup': true, //下載備份權限 'bPhotograph': true, //拍照畫面權限 'bUpdate': true, //軟體更新權限 'bLogin': true //軟體更新權限 }; //寫入權限 // TODO: very bad way to access strAccount l_permissions.create('admin', l_obj, function (i_permissions) { if (i_permissions != null) { LOG.warn("AccountPermissions::onServerOpen i_permissions", i_permissions); } else LOG.error("AccountPermissions::onServerOpen() 寫入權限失敗"); }, function () { LOG.error("AccountPermissions::onServerOpen() 寫入權限失敗"); }); //寫入權限失敗 }, function () { LOG.error("AccountPermissions::onServerOpen() 創建帳號失敗"); }); //創建帳號失敗 } }, function () { LOG.error("AccountPermissions::onServerOpen() 資料庫發生搜尋錯誤"); }); //資料庫發生搜尋錯誤 }); /* //斷線處理 sysEvent.addUserOff(function (i_connObj) { //var l_user = SR.Account.getUser(i_connObj.connID); //if (l_user != undefined) // SR.Account.delUser(l_user); //else // LOG.warn("OnilneUser::addUserOff() 找不到用戶 connID = " + i_connObj.connID); }); */ // // handlers // //管理者註冊用戶 l_handlers.Account_admin_addUser = function (i_event) { var l_data = i_event.data; var l_connId = i_event.conn.connID; /* l_data = { strAccount:帳號, strPassword:密碼 } */ var l_user = SR.Account.getUserByUUID(i_event.session['_strUUID']); if (l_user == null || l_user == undefined) { //未登入 i_event.done(); return; } if (l_user.strAccount != "admin") { //非管理 i_event.done(); return; } //LOG.warn("handlerPermissions::Account_admin_addUser l_data", l_data); //------------------------------------------------------------ SR.Account.admin.addUser(l_data, function (ii_data) { LOG.warn("handlerPermissions::Account_admin_addUser ii_data", ii_data); //回傳 i_event.done("Account_admin_addUser", { 'iReturn': ii_data }); }, function () { LOG.error("handlerPermissions::Account_admin_addUser() 失敗! "); i_event.done("Account_admin_addUser", { 'iReturn': 1 }); }); }; //管理者刪除用戶 l_handlers.Account_admin_deleteUser = function (i_event) { var l_data = i_event.data; var l_connId = i_event.conn.connID; /* l_data = { strAccount:帳號, } */ var l_user = SR.Account.getUserByUUID(i_event.session['_strUUID']); if (l_user == null || l_user == undefined) { //未登入 i_event.done(); return; } if (l_user.strAccount != "admin") { //非管理 i_event.done(); return; } if (l_data.strAccount === 'admin') { i_event.done('error operation'); return; } //LOG.warn("handlerPermissions::Account_admin_deleteUser l_data", l_data); //------------------------------------------------------------ SR.Account.admin.deleteUser(l_data, function (ii_data) { LOG.warn("handlerPermissions::Account_admin_deleteUser ii_data", ii_data); //回傳 i_event.done("Account_admin_deleteUser", { 'iReturn': ii_data }); }, function () { LOG.error("handlerPermissions::Account_admin_deleteUser() 失敗! "); i_event.done("Account_admin_deleteUser", { 'iReturn': 1 }); } ); }; //管理者取得所有使用者列表 l_handlers.Account_admin_listUser = function (i_event) { var l_data = i_event.data; var l_connId = i_event.conn.connID; /* l_data = 不需要資料 */ var l_user = SR.Account.getUserByUUID(i_event.session['_strUUID']); if (l_user == null || l_user == undefined) { //未登入 i_event.done(); return; } if (l_user.strAccount != "admin") { //非管理 i_event.done(); return; } //LOG.warn("handlerPermissions::Account_admin_listUser l_data", l_data); //------------------------------------------------------------ SR.Account.admin.listUser( function (ii_data) { LOG.warn("handlerPermissions::Account_admin_listUser ii_data", ii_data); //回傳 i_event.done("Account_admin_listUser", { 'objUserInfoAr': ii_data }); }, function () { LOG.error("handlerPermissions::Account_admin_listUser() 失敗! "); i_event.done("Account_admin_listUser", { 'objUserInfoAr': null }); }); }; //管理者修改用戶密碼 l_handlers.Account_admin_setUserPassword = function (i_event) { var l_data = i_event.data; var l_connId = i_event.conn.connID; /* l_data = { strAccount:帳號, strPassword:密碼 } */ var l_user = SR.Account.getUserByUUID(i_event.session['_strUUID']); if (l_user == null || l_user == undefined) { //未登入 i_event.done(); return; } if (l_user.strAccount != "admin") { //非管理 i_event.done(