// Generated by CoffeeScript 1.10.0 /* LemonLDAP::NG Manager client This is the main app file. Other are: - struct.json and js/confTree.js that contains the full tree - translate.json that contains the keywords translation This file contains: - the AngularJS controller */ (function() { var llapp; llapp = angular.module('llngManager', ['ui.tree', 'ui.bootstrap', 'llApp', 'ngCookies']); /* Main AngularJS controller */ llapp.controller('TreeCtrl', [ '$scope', '$http', '$location', '$q', '$uibModal', '$translator', '$cookies', '$htmlParams', function($scope, $http, $location, $q, $uibModal, $translator, $cookies, $htmlParams) { var _checkSaveResponse, _download, _getAll, _stoggle, c, id, pathEvent, readError, setHelp; $scope.links = window.links; $scope.menu = $htmlParams.menu; $scope.menulinks = window.menulinks; $scope.staticPrefix = window.staticPrefix; $scope.formPrefix = window.formPrefix; $scope.availableLanguages = window.availableLanguages; $scope.waiting = true; $scope.showM = false; $scope.showT = false; $scope.form = 'home'; $scope.currentCfg = {}; $scope.confPrefix = window.confPrefix; $scope.message = {}; $scope.result = ''; $scope.translateTitle = function(node) { return $translator.translateField(node, 'title'); }; $scope.translateP = $translator.translateP; $scope.translate = $translator.translate; $scope.helpUrl = 'start.html#configuration'; $scope.setShowHelp = function(val) { var d; if (val == null) { val = !$scope.showH; } $scope.showH = val; d = new Date(Date.now()); d.setFullYear(d.getFullYear() + 1); return $cookies.put('showhelp', (val ? 'true' : 'false'), { "expires": d }); }; $scope.showH = $cookies.get('showhelp') === 'false' ? false : true; if ($scope.showH == null) { $scope.setShowHelp(true); } readError = function(response) { var e, j; e = response.status; j = response.statusLine; $scope.waiting = false; if (e === 403) { $scope.message = { title: 'forbidden', message: '', items: [] }; } else if (e === 401) { console.log('Authentication needed'); $scope.message = { title: 'authenticationNeeded', message: '__waitOrF5__', items: [] }; } else if (e === 400) { $scope.message = { title: 'badRequest', message: j, items: [] }; } else if (e > 0) { $scope.message = { title: 'badRequest', message: j, items: [] }; } else { $scope.message = { title: 'networkProblem', message: '', items: [] }; } return $scope.showModal('message.html'); }; $scope.showModal = function(tpl, init) { var d, modalInstance; modalInstance = $uibModal.open({ templateUrl: tpl, controller: 'ModalInstanceCtrl', size: 'lg', resolve: { elem: function() { return function(s) { return $scope[s]; }; }, set: function() { return function(f, s) { return $scope[f] = s; }; }, init: function() { return init; } } }); d = $q.defer(); modalInstance.result.then(function(msgok) { $scope.message = { title: '', message: '', items: [] }; return d.resolve(msgok); }, function(msgnok) { $scope.message = { title: '', message: '', items: [] }; return d.reject(msgnok); }); return modalInstance.result; }; $scope.menuClick = function(button) { if (button.popup) { window.open(button.popup); } else { if (!button.action) { button.action = button.title; } switch (typeof button.action) { case 'function': button.action($scope.currentNode, $scope); break; case 'string': $scope[button.action](); break; default: console.log(typeof button.action); } } return $scope.showM = false; }; $scope.home = function() { $scope.form = 'home'; return $scope.showM = false; }; _checkSaveResponse = function(data) { var m; $scope.message = { title: '', message: '', items: [] }; if (data.message === '__needConfirmation__') { $scope.confirmNeeded = true; } if (data.message) { $scope.message.message = data.message; } if (data.details) { for (m in data.details) { if (m !== '__changes__') { $scope.message.items.push({ message: m, items: data.details[m] }); } } } $scope.waiting = false; if (data.result === 1) { $location.path('/confs/'); $scope.message.title = 'successfullySaved'; } else { $scope.message.title = 'saveReport'; } return $scope.showModal('message.html'); }; $scope.save = function() { $scope.showModal('save.html').then(function() { $scope.waiting = true; $scope.data.push({ id: "cfgLog", title: "cfgLog", data: $scope.result ? $scope.result : '' }); return $http.post(window.confPrefix + "?cfgNum=" + $scope.currentCfg.cfgNum + ($scope.forceSave ? "&force=1" : ''), $scope.data).then(function(response) { $scope.data.pop(); return _checkSaveResponse(response.data); }, function(response) { readError(response); return $scope.data.pop(); }); }, function() { return console.log('Saving canceled'); }); return $scope.showM = false; }; $scope.saveRawConf = function($fileContent) { $scope.waiting = true; return $http.post(window.confPrefix + "/raw", $fileContent).then(function(response) { return _checkSaveResponse(response.data); }, readError); }; $scope.restore = function() { $scope.currentNode = null; return $scope.form = 'restore'; }; $scope.cancel = function() { $scope.currentNode.data = null; return $scope.getKey($scope.currentNode); }; id = 1; $scope._findContainer = function() { return $scope._findScopeContainer().$modelValue; }; $scope._findScopeContainer = function() { var cs; cs = $scope.currentScope; while (!cs.$modelValue.type.match(/Container$/)) { cs = cs.$parentNodeScope; } return cs; }; $scope._findScopeByKey = function(k) { var cs; cs = $scope.currentScope; while (!(cs.$modelValue.title === k)) { cs = cs.$parentNodeScope; } return cs; }; $scope.newGrantRule = function() { var l, n, node; node = $scope._findContainer(); l = node.nodes.length; n = l > 0 ? l - 1 : 0; return node.nodes.splice(n, 0, { id: node.id + "/n" + (id++), title: 'New rule', re: '1', comment: 'New rule', data: 'Message', type: "grant" }); }; $scope.newRule = function() { var l, n, node; node = $scope._findContainer(); l = node.nodes.length; n = l > 0 ? l - 1 : 0; return node.nodes.splice(n, 0, { id: node.id + "/n" + (id++), title: 'New rule', re: '^/new', comment: 'New rule', data: 'accept', type: "rule" }); }; $scope.newPost = function() { var node; node = $scope._findContainer(); return node.nodes.push({ id: node.id + "/n" + (id++), title: "/absolute/path/to/form", data: {}, type: "post" }); }; $scope.newPostVar = function() { if ($scope.currentNode.data.vars == null) { $scope.currentNode.data.vars = []; } return $scope.currentNode.data.vars.push(['var1', '$uid']); }; $scope.newAuthChoice = function() { var node; node = $scope._findContainer(); node.nodes.push({ id: node.id + "/n" + (id++), title: "1_Key", data: ['Null', 'Null', 'Null'], type: "authChoice" }); return $scope.execFilters($scope._findScopeByKey('authParams')); }; $scope.newHashEntry = function() { var node; node = $scope._findContainer(); return node.nodes.push({ id: node.id + "/n" + (id++), title: 'new', data: '', type: "keyText" }); }; $scope.newCat = function() { var cs; cs = $scope.currentScope; if (cs.$modelValue.type === 'menuApp') { cs = cs.$parentNodeScope; } return cs.$modelValue.nodes.push({ id: cs.$modelValue.id + "/n" + (id++), title: "New category", type: "menuCat", nodes: [] }); }; $scope.newApp = function() { var cs; cs = $scope.currentScope; if (cs.$modelValue.type === 'menuApp') { cs = cs.$parentNodeScope; } return cs.$modelValue.nodes.push({ id: cs.$modelValue.id + "/n" + (id++), title: "New application", type: "menuApp", data: { description: "New app description", uri: "https://test.example.com/", logo: "network.png", display: "auto" } }); }; $scope.addSamlAttribute = function() { var node; node = $scope._findContainer(); return node.nodes.push({ id: node.id + "/n" + (id++), title: 'new', type: 'samlAttribute', data: [0, 'New', '', ''] }); }; $scope.addVhost = function() { var name; name = $scope.domain ? "." + $scope.domain.data : '.example.com'; $scope.message = { title: 'virtualHostName', field: 'hostname' }; return $scope.showModal('prompt.html', name).then(function() { var n, node; n = $scope.result; if (n) { node = $scope.addTemplateNode(n, 'virtualHost'); delete node.nodes[0].cnodes; return node.nodes[0].nodes = [ { id: "virtualHosts/new__" + n + "/locationRules/default", type: "rule", title: "default", comment: "", re: "default", data: "deny" } ]; } }); }; $scope.duplicateVhost = function() { var name; name = $scope.domain ? "." + $scope.domain.data : '.example.com'; $scope.message = { title: 'virtualHostName', field: 'hostname' }; return $scope.showModal('prompt.html', name).then(function() { var n; n = $scope.result; return $scope.duplicateNode(n, 'virtualHost', $scope.currentNode.title); }); }; $scope.addSamlIDP = function() { return $scope.newTemplateNode('samlIDPMetaDataNode', 'samlPartnerName', 'idp-example'); }; $scope.addSamlSP = function() { return $scope.newTemplateNode('samlSPMetaDataNode', 'samlPartnerName', 'sp-example'); }; $scope.addOidcOp = function() { return $scope.newTemplateNode('oidcOPMetaDataNode', 'oidcOPName', 'op-example'); }; $scope.addOidcRp = function() { return $scope.newTemplateNode('oidcRPMetaDataNode', 'oidcRPName', 'rp-example'); }; $scope.newTemplateNode = function(type, title, init) { $scope.message = { title: title, field: 'name' }; return $scope.showModal('prompt.html', init).then(function() { var name; name = $scope.result; if (name) { return $scope.addTemplateNode(name, type); } }); }; $scope.addTemplateNode = function(name, type) { var cs, t; cs = $scope.currentScope; while (cs.$modelValue.title !== (type + "s")) { cs = cs.$parentNodeScope; } t = { id: type + "s/new__" + name, title: name, type: type, nodes: templates(type, "new__" + name) }; cs.$modelValue.nodes.push(t); cs.expand(); return t; }; _getAll = function(node) { var d, d2; d = $q.defer(); d2 = $q.defer(); if (node._nodes) { _stoggle(node); d.resolve(); } else if (node.cnodes) { _download(node).then(function() { return d.resolve(); }); } else if (node.nodes || node.data) { d.resolve(); } else { $scope.getKey(node).then(function() { return d.resolve(); }); } d.promise.then(function() { var len, n, o, ref, t; t = []; if (node.nodes) { ref = node.nodes; for (o = 0, len = ref.length; o < len; o++) { n = ref[o]; t.push(_getAll(n)); } } return $q.all(t).then(function() { return d2.resolve(); }); }); return d2.promise; }; $scope.duplicateNode = function(name, type) { var cs; cs = $scope.currentScope; return _getAll($scope.currentNode).then(function() { var t; while (cs.$modelValue.title !== (type + "s")) { cs = cs.$parentNodeScope; } t = JSON.parse(JSON.stringify($scope.currentNode).replace(new RegExp(idkey, 'g'), 'new__' + name)); t.id = type + "s/new__" + name; t.title = name; cs.$modelValue.nodes.push(t); return t; }); }; $scope.del = function(a, i) { return a.splice(i, 1); }; $scope.deleteEntry = function() { var p; p = $scope.currentScope.$parentNodeScope; $scope.currentScope.remove(); return $scope.displayForm(p); }; $scope.down = function() { var i, ind, len, n, o, p, ref, tmp; id = $scope.currentNode.id; p = $scope.currentScope.$parentNodeScope.$modelValue; ind = p.nodes.length; ref = p.nodes; for (i = o = 0, len = ref.length; o < len; i = ++o) { n = ref[i]; if (n.id === id) { ind = i; } } if (ind < p.nodes.length - 1) { tmp = p.nodes[ind]; p.nodes[ind] = p.nodes[ind + 1]; p.nodes[ind + 1] = tmp; } return ind; }; $scope.up = function() { var i, ind, len, n, o, p, ref, tmp; id = $scope.currentNode.id; p = $scope.currentScope.$parentNodeScope.$modelValue; ind = -1; ref = p.nodes; for (i = o = 0, len = ref.length; o < len; i = ++o) { n = ref[i]; if (n.id === id) { ind = i; } } if (ind > 0) { tmp = p.nodes[ind]; p.nodes[ind] = p.nodes[ind - 1]; p.nodes[ind - 1] = tmp; } return ind; }; $scope.inSelect = function(value) { var len, n, o, ref; ref = $scope.currentNode.select; for (o = 0, len = ref.length; o < len; o++) { n = ref[o]; if (n.k === value) { return true; } } return false; }; $scope.changeRuleTitle = function(node) { return node.title = node.comment.length > 0 ? node.comment : node.re; }; $scope.filters = {}; $scope.execFilters = function(scope) { var filter, func, ref; scope = scope ? scope : $scope; ref = $scope.filters; for (filter in ref) { func = ref[filter]; if ($scope.filters.hasOwnProperty(filter)) { return filterFunctions[filter](scope, $q, func); } } return false; }; $scope.stoggle = function(scope) { var node; node = scope.$modelValue; _stoggle(node); return scope.toggle(); }; _stoggle = function(node) { var a, len, len1, len2, n, o, q, r, ref, ref1, ref2; ref = ['nodes', 'nodes_cond']; for (o = 0, len = ref.length; o < len; o++) { n = ref[o]; if (node["_" + n]) { node[n] = []; ref1 = node["_" + n]; for (q = 0, len1 = ref1.length; q < len1; q++) { a = ref1[q]; node[n].push(a); } delete node["_" + n]; } } if (node._nodes_filter) { if (node.nodes) { ref2 = node.nodes; for (r = 0, len2 = ref2.length; r < len2; r++) { n = ref2[r]; n.onChange = $scope.execFilters; } } $scope.filters[node._nodes_filter] = node; return $scope.execFilters(); } }; $scope.toggle = function(scope) { return scope.toggle(); }; $scope.download = function(scope) { var node; node = scope.$modelValue; return _download(node); }; _download = function(node) { var d; d = $q.defer(); d.notify('Trying to get datas'); $scope.waiting = true; $http.get("" + window.confPrefix + $scope.currentCfg.cfgNum + "/" + node.cnodes).then(function(response) { var a, data, len, o; data = response.data; if (!data) { d.reject('Empty response from server'); } else if (data.error) { if (data.error.match(/setDefault$/)) { if (node['default']) { node.nodes = node['default'].slice(0); } else { node.nodes = []; } delete node.cnodes; d.resolve('Set data to default value'); } else { d.reject("Server return an error: " + data.error); } } else { delete node.cnodes; if (!node.type) { node.type = 'keyTextContainer'; } node.nodes = []; for (o = 0, len = data.length; o < len; o++) { a = data[o]; if (a.template) { a._nodes = templates(a.template, a.title); } node.nodes.push(a); } d.resolve('OK'); } return $scope.waiting = false; }, function(response) { readError(response); return d.reject(''); }); return d.promise; }; $scope.openCnode = function(scope) { return $scope.download(scope).then(function() { return scope.toggle(); }); }; setHelp = function(scope) { while (!scope.$modelValue.help && scope.$parentNodeScope) { scope = scope.$parentNodeScope; } return $scope.helpUrl = scope.$modelValue.help || 'start.html#configuration'; }; $scope.displayForm = function(scope) { var f, len, n, node, o, ref; node = scope.$modelValue; if (node.cnodes) { $scope.download(scope); } if (node._nodes) { $scope.stoggle(scope); } $scope.currentNode = node; $scope.currentScope = scope; f = node.type ? node.type : 'text'; if (node.nodes || node._nodes || node.cnodes) { $scope.form = f !== 'text' ? f : 'mini'; } else { $scope.form = f; $scope.getKey(node); } if (node.type && node.type === 'simpleInputContainer') { ref = node.nodes; for (o = 0, len = ref.length; o < len; o++) { n = ref[o]; $scope.getKey(n); } } $scope.showT = false; return setHelp(scope); }; $scope.keyWritable = function(scope) { var node; node = scope.$modelValue; if (node.type && node.type.match(/^(authChoice|keyText|virtualHost|rule|menuCat|menuApp|saml(Attribute|(IDP|SP)MetaDataNode))$/)) { return true; } else { return false; } }; $scope.newRSAKey = function() { return $scope.showModal('password.html').then(function() { var currentNode, password; $scope.waiting = true; currentNode = $scope.currentNode; password = $scope.result; return $http.post(window.confPrefix + "/newRSAKey", { "password": password }).then(function(response) { currentNode.data[0].data = response.data["private"]; currentNode.data[1].data = password; currentNode.data[2].data = response.data["public"]; return $scope.waiting = false; }, readError); }, function() { return console.log('New key cancelled'); }); }; $scope.newRSAKeyNoPassword = function() { var currentNode; $scope.waiting = true; currentNode = $scope.currentNode; return $http.post(window.confPrefix + "/newRSAKey", { "password": '' }).then(function(response) { currentNode.data[0].data = response.data["private"]; currentNode.data[1].data = response.data["public"]; return $scope.waiting = false; }, readError); }; $scope.getKey = function(node) { var d, i, len, n, o, ref, tmp; d = $q.defer(); if (!node.data) { $scope.waiting = true; if (node.get && typeof node.get === 'object') { node.data = []; tmp = []; ref = node.get; for (i = o = 0, len = ref.length; o < len; i = ++o) { n = ref[i]; node.data[i] = { title: n, id: n }; tmp.push($scope.getKey(node.data[i])); } $q.all(tmp).then(function() { return d.resolve(node.data); }, function(response) { d.reject(response.statusLine); return $scope.waiting = false; }); } else { $http.get("" + window.confPrefix + $scope.currentCfg.cfgNum + "/" + (node.get ? node.get : node.title)).then(function(response) { var data; data = response.data; if ((data.value === null || (data.error && data.error.match(/setDefault$/))) && node['default'] !== null) { node.data = node['default']; } else { node.data = data.value; } if (node.type && node.type.match(/^(int|bool|trool)$/)) { node.data = parseInt(node.data); } else if (node.type && node.type.match(/^(saml(Service|Assertion)|blackWhiteList)$/) && !(typeof node.data === 'object')) { node.data = node.data.split(';'); } $scope.waiting = false; return d.resolve(node.data); }, function(response) { readError(response); return d.reject(response.status); }); } } else { d.resolve(node.data); } return d.promise; }; pathEvent = function(event, next, current) { var n; n = next.match(new RegExp('#/confs/(latest|[0-9]+)')); if (n === null) { return $location.path('/confs/latest'); } else { console.log("Trying to get cfg number " + n[1]); return $scope.getCfg(n[1]); } }; $scope.$on('$locationChangeSuccess', pathEvent); $scope.getCfg = function(n) { if ($scope.currentCfg.cfgNum !== n) { return $http.get("" + window.confPrefix + n).then(function(response) { var d; $scope.currentCfg = response.data; d = new Date($scope.currentCfg.cfgDate * 1000); $scope.currentCfg.date = d.toLocaleString(); console.log("Metadatas of cfg " + n + " loaded"); $location.path("/confs/" + n); return $scope.init(); }, function(response) { return readError(response).then(function() { $scope.currentCfg.cfgNum = 0; return $scope.init(); }); }); } else { return $scope.waiting = false; } }; $scope.getLanguage = function(lang) { $scope.lang = lang; $scope.form = 'white'; $scope.init(); return $scope.showM = false; }; $scope.init = function() { var tmp; tmp = null; $scope.waiting = true; $scope.data = []; $scope.confirmNeeded = false; $scope.forceSave = false; return $q.all([ $translator.init($scope.lang), $http.get(window.staticPrefix + "struct.json").then(function(response) { tmp = response.data; return console.log("Structure loaded"); }) ]).then(function() { console.log("Starting structure binding"); $scope.data = tmp; tmp = null; if ($scope.currentCfg.cfgNum !== 0) { setScopeVars($scope); } else { $scope.message = { title: 'emptyConf', message: '__zeroConfExplanations__' }; $scope.showModal('message.html'); } $scope.form = 'home'; return $scope.waiting = false; }, readError); }; c = $location.path().match(new RegExp('^/confs/(latest|[0-9]+)')); if (!c) { console.log("Redirecting to /confs/latest"); $location.path('/confs/latest'); } $scope.replaceContentByUrl = function(node, url) { $scope.waiting = true; return $http.post(window.scriptname + "prx", { url: url }).then(function(response) { node.data = response.data.content; return $scope.waiting = false; }, readError); }; $scope.replaceContent = function(node, $fileContent) { return node.data = $fileContent; }; return $scope.saveAs = function(content, type, filename) { return saveAs(new Blob([content], { "type": type }), filename); }; } ]); }).call(this);