483 lines
13 KiB
JavaScript
483 lines
13 KiB
JavaScript
angular.module("AdLinApp", ["ngRoute", "ngResource", "ngSanitize"])
|
|
.config(function($routeProvider, $locationProvider) {
|
|
$routeProvider
|
|
.when("/auth", {
|
|
controller: "AuthController",
|
|
templateUrl: "views/auth.html"
|
|
})
|
|
.when("/domains", {
|
|
controller: "DomainsController",
|
|
templateUrl: "views/domains.html"
|
|
})
|
|
.when("/tunnels", {
|
|
controller: "TunnelsController",
|
|
templateUrl: "views/tunnels.html"
|
|
})
|
|
.when("/", {
|
|
templateUrl: "views/home.html"
|
|
});
|
|
$locationProvider.html5Mode(true);
|
|
});
|
|
|
|
angular.module("AdLinApp")
|
|
.factory("Student", function($resource) {
|
|
return $resource("/api/students/:studentId", { studentId: '@id' }, {
|
|
'update': {method: 'PUT'},
|
|
})
|
|
})
|
|
.factory("Progression", function($resource) {
|
|
return $resource("/api/progress")
|
|
})
|
|
.factory("Challenge", function($resource) {
|
|
return $resource("/challenge/:challengeId", { challengeId: '@id' })
|
|
});
|
|
|
|
angular.module("AdLinApp")
|
|
.filter("since", function() {
|
|
return function(passed) {
|
|
passed -= Date.now()/1000
|
|
if (passed < 120) {
|
|
return Math.floor(-passed) + " seconds ago";
|
|
} else {
|
|
return Math.floor(-passed/60) + " minutes ago";
|
|
}
|
|
}
|
|
})
|
|
|
|
.component('toast', {
|
|
bindings: {
|
|
date: '=',
|
|
msg: '=',
|
|
title: '=',
|
|
variant: '=',
|
|
},
|
|
controller: function($element) {
|
|
$element.children(0).toast('show')
|
|
},
|
|
template: `<div class="toast mb-2" role="alert" aria-live="assertive" aria-atomic="true" data-delay="7000">
|
|
<div class="toast-header">
|
|
<span ng-if="$ctrl.variant" class="badge badge-pill badge-{{ $ctrl.variant }}" style="padding: .25em .66em"> </span>
|
|
<strong class="mr-auto" ng-bind="$ctrl.title"></strong>
|
|
<small class="text-muted" ng-bind="$ctrl.date">just now</small>
|
|
<button type="button" class="ml-2 mb-1 close" data-dismiss="toast" aria-label="Close">
|
|
<span aria-hidden="true">×</span>
|
|
</button>
|
|
</div>
|
|
<div class="toast-body" ng-bind-html="$ctrl.msg"></div>
|
|
</div>`
|
|
})
|
|
|
|
.run(function($rootScope, $interval, $http) {
|
|
$rootScope.toasts = [];
|
|
|
|
$rootScope.addToast = function(toast) {
|
|
$rootScope.toasts.unshift(toast);
|
|
}
|
|
|
|
$rootScope.checkLoginState = function() {
|
|
$http({
|
|
method: 'GET',
|
|
url: "api/auth",
|
|
}).then(function(response) {
|
|
$rootScope.isLogged = response.data;
|
|
$rootScope.student = response.data;
|
|
}, function(response) {
|
|
$rootScope.isLogged = false;
|
|
});
|
|
};
|
|
$rootScope.checkLoginState();
|
|
$interval($rootScope.checkLoginState, 40000);
|
|
|
|
$rootScope.disconnectCurrentUser = function() {
|
|
$http({
|
|
method: 'POST',
|
|
url: "api/auth/logout"
|
|
}).then(function(response) {
|
|
$rootScope.isLogged = false;
|
|
$rootScope.student = null;
|
|
});
|
|
}
|
|
})
|
|
|
|
.controller("ProgressionController", function($scope, $interval, $http) {
|
|
$scope.mychallenges = {};
|
|
var refreshChal = function() {
|
|
$http.get("api/students/" + $scope.student.id + "/progress").then(function(response) {
|
|
$scope.mychallenges = response.data
|
|
});
|
|
}
|
|
refreshChal();
|
|
var myinterval = $interval(refreshChal, 15750);
|
|
$scope.$on('$destroy', function () { $interval.cancel(myinterval); });
|
|
})
|
|
|
|
.controller("AuthController", function($scope, $rootScope, $http, $location) {
|
|
$scope.auth = {
|
|
"username": "",
|
|
"password": "",
|
|
};
|
|
|
|
$scope.logmein = function() {
|
|
$scope.pleaseWait = true;
|
|
$http({
|
|
method: 'POST',
|
|
url: "api/auth",
|
|
data: $scope.auth
|
|
}).then(function(response) {
|
|
$scope.pleaseWait = false;
|
|
$rootScope.checkLoginState();
|
|
$location.url("/");
|
|
}, function(response) {
|
|
$scope.pleaseWait = false;
|
|
if (response.data)
|
|
$scope.addToast({
|
|
variant: "danger",
|
|
title: "Connexion impossible",
|
|
msg: (response.data ? response.data.errmsg : "Impossible de contacter le serveur"),
|
|
});
|
|
});
|
|
}
|
|
})
|
|
|
|
.controller("TunnelsController", function($scope, $http, $interval) {
|
|
$scope.updateTunnelInfo = function() {
|
|
$http({
|
|
method: 'GET',
|
|
url: "api/wginfo",
|
|
}).then(function(response) {
|
|
$scope.wginfo = response.data;
|
|
});
|
|
};
|
|
$scope.updateTunnelInfo();
|
|
|
|
$scope.updateTunnelsList = function() {
|
|
$http({
|
|
method: 'GET',
|
|
url: "api/wg/",
|
|
}).then(function(response) {
|
|
$scope.tunnels = response.data;
|
|
}, function(response) {
|
|
$scope.addToast({
|
|
variant: "warning",
|
|
title: "Maatma Tunnels",
|
|
msg: "Nous rencontrons actuellement des difficultés avec la gestion des tunnels : " + (response.data ? response.data.errmsg : "Impossible de contacter le serveur") + "<br>Veuillez réessayer dans quelques instants.",
|
|
});
|
|
});
|
|
};
|
|
$scope.updateTunnelsList();
|
|
var myinterval = $interval($scope.updateTunnelsList, 12000);
|
|
$scope.$on('$destroy', function () { $interval.cancel(myinterval); });
|
|
|
|
$scope.PING_ok = false;
|
|
$scope.PING_time = '';
|
|
$scope.PING = false;
|
|
var refreshPing = function() {
|
|
$http.get("/api/students/" + $scope.student.id + "/ping").then(function(response) {
|
|
$scope.PING_ok = response.data.State;
|
|
$scope.PING_time = new Date(response.data.Date);
|
|
$scope.PING = (Date.now() - $scope.PING_time)/1000;
|
|
});
|
|
}
|
|
var myPingInterval
|
|
$scope.$watch("student", function(student) {
|
|
if (student == null) return;
|
|
$interval.cancel(myPingInterval);
|
|
refreshPing();
|
|
myPingInterval = $interval(refreshPing, 15000);
|
|
})
|
|
$scope.$on('$destroy', function () { $interval.cancel(myPingInterval); });
|
|
|
|
$scope.newTunnel = function() {
|
|
$scope.pleaseWaitNew = true;
|
|
$http({
|
|
method: 'POST',
|
|
url: "api/wg/",
|
|
data: {}
|
|
}).then(function(response) {
|
|
$scope.updateTunnelsList();
|
|
$scope.pleaseWaitNew = false;
|
|
$scope.addToast({
|
|
variant: "success",
|
|
title: "Maatma Tunnels",
|
|
msg: "Tunnel créé avec succès !",
|
|
});
|
|
}, function(response) {
|
|
$scope.pleaseWaitNew = false;
|
|
$scope.addToast({
|
|
variant: "danger",
|
|
title: "Maatma Tunnels",
|
|
msg: (response.data ? response.data.errmsg : "Impossible de contacter le serveur"),
|
|
});
|
|
});
|
|
}
|
|
|
|
$scope.dropTunnel = function(tunnel) {
|
|
tunnel.pleaseWaitDrop = true;
|
|
$http({
|
|
method: 'DELETE',
|
|
url: "api/wg/" + tunnel.TokenText,
|
|
data: {}
|
|
}).then(function(response) {
|
|
$scope.updateTunnelsList();
|
|
tunnel.pleaseWaitDrop = false;
|
|
$scope.addToast({
|
|
variant: "success",
|
|
title: "Maatma Tunnels",
|
|
msg: "Tunnel supprimé avec succès !",
|
|
});
|
|
}, function(response) {
|
|
tunnel.pleaseWaitDrop = false;
|
|
$scope.addToast({
|
|
variant: "danger",
|
|
title: "Maatma Tunnels",
|
|
msg: (response.data ? response.data.errmsg : "Impossible de contacter le serveur"),
|
|
});
|
|
});
|
|
}
|
|
})
|
|
|
|
.controller("DomainsController", function($scope, $http, $location) {
|
|
var onUpdateEvt = [];
|
|
var callOnUpdateEvt = function() {
|
|
angular.forEach(onUpdateEvt, function(cb) {
|
|
cb();
|
|
});
|
|
}
|
|
|
|
$scope.addOnUpdateEvent = function(cb) {
|
|
onUpdateEvt.push(cb);
|
|
}
|
|
|
|
$scope.updateAssociationD = function() {
|
|
$http({
|
|
method: 'GET',
|
|
url: "api/adomains/",
|
|
}).then(function(response) {
|
|
$scope.adomains = [];
|
|
response.data.forEach(function(domain) {
|
|
$http({
|
|
method: 'GET',
|
|
url: "api/adomains/" + domain,
|
|
}).then(function(response) {
|
|
response.data.forEach(function(rr) {
|
|
$scope.adomains.push(rr);
|
|
});
|
|
});
|
|
}, function(response) {
|
|
console.log(response.data.errmsg);
|
|
});
|
|
});
|
|
};
|
|
$scope.updateAssociationD();
|
|
|
|
$scope.updateDelegatedD = function() {
|
|
$http({
|
|
method: 'GET',
|
|
url: "api/ddomains/",
|
|
}).then(function(response) {
|
|
response.data.forEach(function(domain) {
|
|
$scope.ddomains = response.data;
|
|
}, function(response) {
|
|
alert(response.data.errmsg);
|
|
});
|
|
});
|
|
};
|
|
$scope.updateDelegatedD();
|
|
|
|
$scope.askAssociationD = function() {
|
|
if ($scope.adomains.length == 0) {
|
|
return $scope.newAssociationD({})
|
|
}
|
|
|
|
var aaaa = ""
|
|
if ($scope.adomains.length >= 1) {
|
|
$scope.adomains.forEach(function (adomain) {
|
|
if (adomain.values.join("").slice(0, 5) == "2a01:")
|
|
aaaa = adomain.values.join("")
|
|
})
|
|
}
|
|
|
|
$scope.assoc = {
|
|
"domain": $scope.adomains[0].domain,
|
|
"a": "82.64.31.248",
|
|
"aaaa": aaaa,
|
|
}
|
|
$('#AssocModal').modal('show');
|
|
}
|
|
|
|
$scope.newAssociationD = function(assoc) {
|
|
$('#AssocModal').modal('hide');
|
|
$scope.pleaseWaitNewAssociation = true;
|
|
$http({
|
|
method: 'POST',
|
|
url: "api/adomains/",
|
|
data: assoc,
|
|
}).then(function(response) {
|
|
$scope.updateAssociationD();
|
|
$scope.pleaseWaitNewAssociation = false;
|
|
$scope.addToast({
|
|
variant: "success",
|
|
title: "Maatma Domain Names",
|
|
msg: "Nouvelle association créée avec succès !",
|
|
});
|
|
}, function(response) {
|
|
$scope.pleaseWaitNewAssociation = false;
|
|
$scope.addToast({
|
|
variant: "danger",
|
|
title: "Maatma Domain Names",
|
|
msg: "Erreur durant l'attribution du domaine : " + response.data.errmsg,
|
|
});
|
|
});
|
|
}
|
|
|
|
$scope.addNS = function(domain) {
|
|
$scope.nsrr = {
|
|
"domain": domain,
|
|
"ttl": 900,
|
|
"rr": "NS",
|
|
"values": [""],
|
|
}
|
|
$('#NSModal').modal('show');
|
|
}
|
|
$scope.updateNS = function(domain, rr) {
|
|
$scope.nsrr = {
|
|
"domain": domain,
|
|
"ttl": rr.ttl,
|
|
"rr": "NS",
|
|
"valuesfrom": rr.values.join(" "),
|
|
"values": rr.values,
|
|
}
|
|
$('#NSModal').modal('show');
|
|
}
|
|
$scope.addGLUE = function(domain) {
|
|
$scope.nsrr = {
|
|
"domain": domain,
|
|
"ttl": 900,
|
|
"rr": "AAAA",
|
|
"values": [""],
|
|
}
|
|
$('#NSModal').modal('show');
|
|
}
|
|
$scope.updateGLUE = function(domain, rr) {
|
|
$scope.nsrr = {
|
|
"domain": domain,
|
|
"ttl": rr.ttl,
|
|
"rr": "AAAA",
|
|
"valuesfrom": rr.values.join(" "),
|
|
"values": rr.values,
|
|
}
|
|
$('#NSModal').modal('show');
|
|
}
|
|
$scope.addDS = function(domain) {
|
|
$scope.nsrr = {
|
|
"domain": domain,
|
|
"ttl": 900,
|
|
"rr": "DS",
|
|
"labels": ["Key Tag", "Flag", "Algorithme", "Clef publique (base64)"],
|
|
"values": ["", "", "", ""],
|
|
}
|
|
$('#NSModal').modal('show');
|
|
}
|
|
$scope.updateDS = function(domain, rr) {
|
|
$scope.nsrr = {
|
|
"domain": domain,
|
|
"ttl": rr.ttl,
|
|
"rr": "DS",
|
|
"labels": ["Key Tag", "Algo clef", "Algo hash", "Hash (hex)"],
|
|
"valuesfrom": rr.values.join(" "),
|
|
"values": rr.values,
|
|
}
|
|
$('#NSModal').modal('show');
|
|
}
|
|
|
|
$scope.saveNSRR = function(nsrr) {
|
|
if (nsrr.ttl)
|
|
nsrr.ttl = parseInt(nsrr.ttl)
|
|
$http({
|
|
method: (nsrr.valuesfrom !== undefined)?'PATCH':'POST',
|
|
url: "api/ddomains/" + nsrr.domain + "/" + nsrr.rr,
|
|
data: nsrr,
|
|
}).then(function(response) {
|
|
$('#NSModal').modal('hide');
|
|
callOnUpdateEvt();
|
|
}, function(response) {
|
|
alert(response.data.errmsg);
|
|
});
|
|
}
|
|
|
|
$scope.deleteRR = function(domain, rr) {
|
|
rr["pleaseWait" + rr.rr + "del"] = true;
|
|
$http({
|
|
method: 'DELETE',
|
|
url: "api/ddomains/" + domain + "/" + rr.rr,
|
|
data: rr,
|
|
}).then(function(response) {
|
|
callOnUpdateEvt();
|
|
rr["pleaseWait" + rr.rr + "del"] = false;
|
|
}, function(response) {
|
|
rr["pleaseWait" + rr.rr + "del"] = false;
|
|
alert(response.data.errmsg);
|
|
});
|
|
}
|
|
})
|
|
|
|
.controller("NSDomainsController", function($scope, $http) {
|
|
var updateNS = function() {
|
|
$http({
|
|
method: 'GET',
|
|
url: "api/ddomains/" + $scope.domain + "/NS",
|
|
}).then(function(response) {
|
|
$scope.domainNS = response.data;
|
|
});
|
|
}
|
|
updateNS();
|
|
$scope.addOnUpdateEvent(updateNS);
|
|
})
|
|
|
|
.controller("GLUEDomainsController", function($scope, $http) {
|
|
var updateGLUE = function() {
|
|
$http({
|
|
method: 'GET',
|
|
url: "api/ddomains/" + $scope.domain + "/GLUE",
|
|
}).then(function(response) {
|
|
$scope.domainGLUE = response.data;
|
|
});
|
|
}
|
|
updateGLUE();
|
|
$scope.addOnUpdateEvent(updateGLUE);
|
|
})
|
|
|
|
.controller("GLUEController", function($scope, $http) {
|
|
var updateGLUE = function() {
|
|
$scope.GLUEpending = true;
|
|
$http({
|
|
method: 'POST',
|
|
url: "api/check/GLUE",
|
|
data: {domain: $scope.rr.domain, ip: $scope.rr.values.join("")}
|
|
}).then(function(response) {
|
|
$scope.GLUEpending = false;
|
|
$scope.GLUEok = response.data;
|
|
$scope.GLUEerr = "OK";
|
|
}, function(response) {
|
|
$scope.GLUEpending = false;
|
|
$scope.GLUEok = false;
|
|
$scope.GLUEerr = response.data.errmsg;
|
|
});
|
|
}
|
|
updateGLUE();
|
|
$scope.addOnUpdateEvent(updateGLUE);
|
|
})
|
|
|
|
.controller("DSDomainsController", function($scope, $http) {
|
|
var updateDS = function() {
|
|
$http({
|
|
method: 'GET',
|
|
url: "api/ddomains/" + $scope.domain + "/DS",
|
|
}).then(function(response) {
|
|
$scope.domainDS = response.data;
|
|
});
|
|
}
|
|
updateDS();
|
|
$scope.addOnUpdateEvent(updateDS);
|
|
})
|