admin: Replace PKI page by authentication settings, refactor
This commit is contained in:
parent
4dcf1218d8
commit
7e301b8ecb
6 changed files with 114 additions and 33 deletions
|
@ -34,6 +34,11 @@ func declarePasswordRoutes(router *gin.RouterGroup) {
|
|||
|
||||
c.JSON(http.StatusOK, gin.H{"password": passwd})
|
||||
})
|
||||
router.GET("/oauth-status", func(c *gin.Context) {
|
||||
c.JSON(http.StatusOK, gin.H{
|
||||
"secret_defined": OidcSecret != "",
|
||||
})
|
||||
})
|
||||
router.GET("/dex.yaml", func(c *gin.Context) {
|
||||
cfg, err := genDexConfig()
|
||||
if err != nil {
|
||||
|
|
|
@ -95,7 +95,7 @@ const indextpl = `<!DOCTYPE html>
|
|||
<div class="collapse navbar-collapse" id="adminMenu">
|
||||
<ul class="navbar-nav mr-auto">
|
||||
<li class="nav-item" ng-class="{'active': $location.path().startsWith('/teams')}"><a class="nav-link" href="teams">Équipes</a></li>
|
||||
<li class="nav-item" ng-class="{'active': $location.path().startsWith('/pki')}"><a class="nav-link" href="pki">PKI</a></li>
|
||||
<li class="nav-item" ng-class="{'active': $location.path().startsWith('/auth')}"><a class="nav-link" href="auth">Authentification</a></li>
|
||||
<li class="nav-item" ng-class="{'active': $location.path().startsWith('/themes')}"><a class="nav-link" href="themes">Thèmes</a></li>
|
||||
<li class="nav-item" ng-class="{'active': $location.path().startsWith('/exercices')}"><a class="nav-link" href="exercices">Exercices</a></li>
|
||||
<li class="nav-item" ng-class="{'active': $location.path().startsWith('/public')}"><a class="nav-link" href="public/0">Public</a></li>
|
||||
|
|
|
@ -50,6 +50,9 @@ func declareStaticRoutes(router *gin.RouterGroup, cfg *settings.Settings, baseUR
|
|||
router.GET("/", func(c *gin.Context) {
|
||||
serveIndex(c)
|
||||
})
|
||||
router.GET("/auth/*_", func(c *gin.Context) {
|
||||
serveIndex(c)
|
||||
})
|
||||
router.GET("/claims/*_", func(c *gin.Context) {
|
||||
serveIndex(c)
|
||||
})
|
||||
|
|
|
@ -25,6 +25,10 @@ angular.module("FICApp", ["ngRoute", "ngResource", "ngSanitize"])
|
|||
controller: "SettingsController",
|
||||
templateUrl: "views/settings.html"
|
||||
})
|
||||
.when("/auth", {
|
||||
controller: "AuthController",
|
||||
templateUrl: "views/auth.html"
|
||||
})
|
||||
.when("/pki", {
|
||||
controller: "PKIController",
|
||||
templateUrl: "views/pki.html"
|
||||
|
@ -921,6 +925,49 @@ angular.module("FICApp")
|
|||
};
|
||||
})
|
||||
|
||||
.controller("AuthController", function ($scope, $http) {
|
||||
$scope.generateHtpasswd = function () {
|
||||
$http.post("api/htpasswd").then(function () {
|
||||
$scope.addToast('success', 'Fichier htpasswd généré avec succès');
|
||||
}, function (response) {
|
||||
$scope.addToast('danger', 'An error occurs when generating htpasswd file:', response.data.errmsg);
|
||||
});
|
||||
};
|
||||
$scope.removeHtpasswd = function () {
|
||||
$http.delete("api/htpasswd").then(function () {
|
||||
$scope.addToast('success', 'Fichier htpasswd supprimé avec succès');
|
||||
}, function (response) {
|
||||
$scope.addToast('danger', 'An error occurs when deleting htpasswd file:', response.data.errmsg);
|
||||
});
|
||||
};
|
||||
})
|
||||
|
||||
.controller("OAuthController", function ($scope, $http) {
|
||||
$scope.refreshOAuthStatus = function () {
|
||||
$http.get("api/oauth-status").then(function (res) {
|
||||
$scope.oauth_status = response.data;
|
||||
});
|
||||
|
||||
};
|
||||
|
||||
$scope.genDexCfg = function () {
|
||||
$http.post("api/dex.yaml").then(function () {
|
||||
$http.post("api/dex-password.tpl").then(function () {
|
||||
$scope.addToast('success', 'Dex config refreshed.', "Don't forget to reload/reboot frontend host.");
|
||||
}, function (response) {
|
||||
$scope.addToast('danger', 'An error occurs when generating dex password tpl:', response.data.errmsg);
|
||||
});
|
||||
}, function (response) {
|
||||
$scope.addToast('danger', 'An error occurs when generating dex config:', response.data.errmsg);
|
||||
});
|
||||
$http.post("api/vouch-proxy.yaml").then(function () {
|
||||
$scope.addToast('success', 'VouchProxy config refreshed.', "Don't forget to reload/reboot frontend host.");
|
||||
}, function (response) {
|
||||
$scope.addToast('danger', 'An error occurs when generating VouchProxy config:', response.data.errmsg);
|
||||
});
|
||||
}
|
||||
})
|
||||
|
||||
.controller("PKIController", function ($scope, $rootScope, Certificate, CACertificate, Team, $location, $http) {
|
||||
var ts = Date.now() - Date.now() % 86400000;
|
||||
var d = new Date(ts);
|
||||
|
@ -1005,20 +1052,6 @@ angular.module("FICApp")
|
|||
$scope.addToast('danger', 'An error occurs when generating certificate:', response.data.errmsg);
|
||||
});
|
||||
};
|
||||
$scope.generateHtpasswd = function () {
|
||||
$http.post("api/htpasswd").then(function () {
|
||||
$scope.addToast('success', 'Fichier htpasswd généré avec succès');
|
||||
}, function (response) {
|
||||
$scope.addToast('danger', 'An error occurs when generating htpasswd file:', response.data.errmsg);
|
||||
});
|
||||
};
|
||||
$scope.removeHtpasswd = function () {
|
||||
$http.delete("api/htpasswd").then(function () {
|
||||
$scope.addToast('success', 'Fichier htpasswd supprimé avec succès');
|
||||
}, function (response) {
|
||||
$scope.addToast('danger', 'An error occurs when deleting htpasswd file:', response.data.errmsg);
|
||||
});
|
||||
};
|
||||
})
|
||||
|
||||
.controller("PublicController", function ($scope, $rootScope, $routeParams, $location, Scene, Theme, Teams, Exercice) {
|
||||
|
@ -2461,22 +2494,6 @@ angular.module("FICApp")
|
|||
}
|
||||
};
|
||||
|
||||
$scope.genDexCfg = function () {
|
||||
$http.post("api/dex.yaml").then(function () {
|
||||
$http.post("api/dex-password.tpl").then(function () {
|
||||
$scope.addToast('success', 'Dex config refreshed.', "Don't forget to reload/reboot frontend host.");
|
||||
}, function (response) {
|
||||
$scope.addToast('danger', 'An error occurs when generating dex password tpl:', response.data.errmsg);
|
||||
});
|
||||
}, function (response) {
|
||||
$scope.addToast('danger', 'An error occurs when generating dex config:', response.data.errmsg);
|
||||
});
|
||||
$http.post("api/vouch-proxy.yaml").then(function () {
|
||||
$scope.addToast('success', 'VouchProxy config refreshed.', "Don't forget to reload/reboot frontend host.");
|
||||
}, function (response) {
|
||||
$scope.addToast('danger', 'An error occurs when generating VouchProxy config:', response.data.errmsg);
|
||||
});
|
||||
}
|
||||
$scope.desactiveTeams = function () {
|
||||
$http.post("api/disableinactiveteams").then(function () {
|
||||
$scope.teams = Team.query();
|
||||
|
|
57
admin/static/views/auth.html
Normal file
57
admin/static/views/auth.html
Normal file
|
@ -0,0 +1,57 @@
|
|||
<div class="d-flex justify-content-between align-items-center">
|
||||
<h2>
|
||||
Authentification
|
||||
</h2>
|
||||
<div>
|
||||
<div class="btn-group mr-1" role="group">
|
||||
<button type="button" ng-click="generateHtpasswd()" class="btn btn-sm btn-secondary"><span class="glyphicon glyphicon-save-file" aria-hidden="true"></span> Générer <code>fichtpasswd</code></button>
|
||||
<button type="button" ng-click="removeHtpasswd()" class="btn btn-sm btn-danger"><span class="glyphicon glyphicon-trash" aria-hidden="true"></span></button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div ng-controller="OAuthController">
|
||||
<div class="d-flex justify-content-between align-items-center">
|
||||
<h3>
|
||||
OAuth 2
|
||||
<span class="badge badge-success" ng-if="oauth_status.secret_defined">Actif</span>
|
||||
<span class="badge badge-danger" ng-if="!oauth_status.secret_defined">Non configuré</span>
|
||||
</h3>
|
||||
<div>
|
||||
<button type="button" ng-click="genDexCfg()" class="btn btn-success mr-2"><span class="glyphicon glyphicon-refresh" aria-hidden="true"></span> DexIdP</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<hr>
|
||||
|
||||
<div ng-controller="PKIController">
|
||||
<div class="d-flex justify-content-between align-items-center">
|
||||
<h3>
|
||||
Autorité de certification
|
||||
<span class="badge badge-success" ng-if="ca.version">Générée</span>
|
||||
<span class="badge badge-danger" ng-if="!ca.version">Introuvable</span>
|
||||
</h3>
|
||||
<div>
|
||||
<a
|
||||
class="btn btn-primary"
|
||||
href="/pki"
|
||||
>
|
||||
<span class="glyphicon glyphicon-certificate" aria-hidden="true"></span>
|
||||
Gérer la PKI
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="alert alert-info" ng-if="!ca.version">
|
||||
<strong>Aucune CA n'a été générée pour le moment.</strong>
|
||||
</div>
|
||||
|
||||
<dl ng-if="ca.version">
|
||||
<ng-repeat ng-repeat="(k, v) in ca" class="row">
|
||||
<dt class="col-3 text-right">{{ k }}</dt>
|
||||
<dd class="col-9" ng-if="v.CommonName">/CN={{ v.CommonName }}/OU={{ v.OrganizationalUnit }}/O={{ v.Organization }}/L={{ v.Locality }}/P={{ v.Province }}/C={{ v.Country }}/</dd>
|
||||
<dd class="col-9" ng-if="!v.CommonName">{{ v }}</dd>
|
||||
</ng-repeat>
|
||||
</dl>
|
||||
</div>
|
|
@ -1,10 +1,9 @@
|
|||
<h2>
|
||||
Équipes
|
||||
<button type="button" ng-click="show('new')" class="float-right btn btn-sm btn-primary"><span class="glyphicon glyphicon-plus" aria-hidden="true"></span> Ajouter une équipe</button>
|
||||
<button type="button" ng-click="show('print')" class="float-right btn btn-sm btn-secondary mr-2"><span class="glyphicon glyphicon-print" aria-hidden="true"></span> Imprimer les équipes</button>
|
||||
<button type="button" ng-click="show('print')" class="float-right btn btn-sm btn-secondary mr-2" title="Imprimer les équipes et leurs membres"><span class="glyphicon glyphicon-print" aria-hidden="true"></span></button>
|
||||
<button type="button" ng-click="show('export')" class="float-right btn btn-sm btn-secondary mr-2"><span class="glyphicon glyphicon-export" aria-hidden="true"></span> Statistiques générales</button>
|
||||
<button type="button" ng-click="desactiveTeams()" class="float-right btn btn-sm btn-danger mr-2" title="Cliquer pour marquer les équipes sans certificat comme inactives (et ainsi éviter que ses fichiers ne soient générés)"><span class="glyphicon glyphicon-leaf" aria-hidden="true"></span> Désactiver les équipes inactives</button>
|
||||
<button type="button" ng-click="genDexCfg()" class="float-right btn btn-sm btn-success mr-2"><span class="glyphicon glyphicon-refresh" aria-hidden="true"></span> DexIdP</button>
|
||||
</h2>
|
||||
|
||||
<p><input type="search" class="form-control" placeholder="Search" ng-model="query" ng-keypress="validateSearch($event)" autofocus></p>
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue