mirror of
https://github.com/h44z/wg-portal
synced 2025-02-26 05:49:14 +00:00
deployment api completed (#11)
This commit is contained in:
parent
9c8a1df01f
commit
7b1f59d86a
@ -732,6 +732,63 @@ func (s *ApiServer) PatchDevice(c *gin.Context) {
|
|||||||
c.JSON(http.StatusNotImplemented, device)
|
c.JSON(http.StatusNotImplemented, device)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type PeerDeploymentInformation struct {
|
||||||
|
PublicKey string
|
||||||
|
Identifier string
|
||||||
|
Device string
|
||||||
|
DeviceIdentifier string
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetPeerDeploymentInformation godoc
|
||||||
|
// @Tags Provisioning
|
||||||
|
// @Summary Retrieves all active peers for the given email address
|
||||||
|
// @Produce json
|
||||||
|
// @Param email path string true "Email Address"
|
||||||
|
// @Success 200 {object} []PeerDeploymentInformation "All active WireGuard peers"
|
||||||
|
// @Failure 401 {object} ApiError
|
||||||
|
// @Failure 403 {object} ApiError
|
||||||
|
// @Failure 404 {object} ApiError
|
||||||
|
// @Router /provisioning/peers/{email} [get]
|
||||||
|
// @Security GeneralBasicAuth
|
||||||
|
func (s *ApiServer) GetPeerDeploymentInformation(c *gin.Context) {
|
||||||
|
email := c.Param("email")
|
||||||
|
if email == "" {
|
||||||
|
c.JSON(http.StatusBadRequest, ApiError{Message: "email parameter must be specified"})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get authenticated user to check permissions
|
||||||
|
username, _, _ := c.Request.BasicAuth()
|
||||||
|
user := s.s.users.GetUser(username)
|
||||||
|
|
||||||
|
if !user.IsAdmin && user.Email != email {
|
||||||
|
c.JSON(http.StatusForbidden, ApiError{Message: "not enough permissions to access this resource"})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
peers := s.s.peers.GetPeersByMail(email)
|
||||||
|
result := make([]PeerDeploymentInformation, 0, len(peers))
|
||||||
|
for i := range peers {
|
||||||
|
if peers[i].DeactivatedAt != nil {
|
||||||
|
continue // skip deactivated peers
|
||||||
|
}
|
||||||
|
|
||||||
|
device := s.s.peers.GetDevice(peers[i].DeviceName)
|
||||||
|
if device.Type != wireguard.DeviceTypeServer {
|
||||||
|
continue // Skip peers on non-server devices
|
||||||
|
}
|
||||||
|
|
||||||
|
result = append(result, PeerDeploymentInformation{
|
||||||
|
PublicKey: peers[i].PublicKey,
|
||||||
|
Identifier: peers[i].Identifier,
|
||||||
|
Device: device.DeviceName,
|
||||||
|
DeviceIdentifier: device.DisplayName,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
c.JSON(http.StatusOK, result)
|
||||||
|
}
|
||||||
|
|
||||||
// GetPeerDeploymentConfig godoc
|
// GetPeerDeploymentConfig godoc
|
||||||
// @Tags Provisioning
|
// @Tags Provisioning
|
||||||
// @Summary Retrieves the peer config for the given public key
|
// @Summary Retrieves the peer config for the given public key
|
||||||
@ -760,7 +817,7 @@ func (s *ApiServer) GetPeerDeploymentConfig(c *gin.Context) {
|
|||||||
username, _, _ := c.Request.BasicAuth()
|
username, _, _ := c.Request.BasicAuth()
|
||||||
user := s.s.users.GetUser(username)
|
user := s.s.users.GetUser(username)
|
||||||
|
|
||||||
if !user.IsAdmin && user.Email == peer.Email {
|
if !user.IsAdmin && user.Email != peer.Email {
|
||||||
c.JSON(http.StatusForbidden, ApiError{Message: "not enough permissions to access this resource"})
|
c.JSON(http.StatusForbidden, ApiError{Message: "not enough permissions to access this resource"})
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -799,7 +856,7 @@ type ProvisioningRequest struct {
|
|||||||
// @Failure 401 {object} ApiError
|
// @Failure 401 {object} ApiError
|
||||||
// @Failure 403 {object} ApiError
|
// @Failure 403 {object} ApiError
|
||||||
// @Failure 404 {object} ApiError
|
// @Failure 404 {object} ApiError
|
||||||
// @Router /provisioning/peer [post]
|
// @Router /provisioning/peers [post]
|
||||||
// @Security GeneralBasicAuth
|
// @Security GeneralBasicAuth
|
||||||
func (s *ApiServer) PostPeerDeploymentConfig(c *gin.Context) {
|
func (s *ApiServer) PostPeerDeploymentConfig(c *gin.Context) {
|
||||||
req := ProvisioningRequest{}
|
req := ProvisioningRequest{}
|
||||||
@ -817,7 +874,7 @@ func (s *ApiServer) PostPeerDeploymentConfig(c *gin.Context) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if !user.IsAdmin && user.Email == req.Email {
|
if !user.IsAdmin && user.Email != req.Email {
|
||||||
c.JSON(http.StatusForbidden, ApiError{Message: "not enough permissions to access this resource"})
|
c.JSON(http.StatusForbidden, ApiError{Message: "not enough permissions to access this resource"})
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -1039,7 +1039,58 @@ var doc = `{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"/provisioning/peer": {
|
"/provisioning/peer/{pkey}": {
|
||||||
|
"get": {
|
||||||
|
"security": [
|
||||||
|
{
|
||||||
|
"GeneralBasicAuth": []
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"produces": [
|
||||||
|
"text/plain"
|
||||||
|
],
|
||||||
|
"tags": [
|
||||||
|
"Provisioning"
|
||||||
|
],
|
||||||
|
"summary": "Retrieves the peer config for the given public key",
|
||||||
|
"parameters": [
|
||||||
|
{
|
||||||
|
"type": "string",
|
||||||
|
"description": "Public Key (Base 64)",
|
||||||
|
"name": "pkey",
|
||||||
|
"in": "path",
|
||||||
|
"required": true
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"responses": {
|
||||||
|
"200": {
|
||||||
|
"description": "The WireGuard configuration file",
|
||||||
|
"schema": {
|
||||||
|
"type": "string"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"401": {
|
||||||
|
"description": "Unauthorized",
|
||||||
|
"schema": {
|
||||||
|
"$ref": "#/definitions/server.ApiError"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"403": {
|
||||||
|
"description": "Forbidden",
|
||||||
|
"schema": {
|
||||||
|
"$ref": "#/definitions/server.ApiError"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"404": {
|
||||||
|
"description": "Not Found",
|
||||||
|
"schema": {
|
||||||
|
"$ref": "#/definitions/server.ApiError"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"/provisioning/peers": {
|
||||||
"post": {
|
"post": {
|
||||||
"security": [
|
"security": [
|
||||||
{
|
{
|
||||||
@ -1095,7 +1146,7 @@ var doc = `{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"/provisioning/peer/{pkey}": {
|
"/provisioning/peers/{email}": {
|
||||||
"get": {
|
"get": {
|
||||||
"security": [
|
"security": [
|
||||||
{
|
{
|
||||||
@ -1103,26 +1154,29 @@ var doc = `{
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
"produces": [
|
"produces": [
|
||||||
"text/plain"
|
"application/json"
|
||||||
],
|
],
|
||||||
"tags": [
|
"tags": [
|
||||||
"Provisioning"
|
"Provisioning"
|
||||||
],
|
],
|
||||||
"summary": "Retrieves the peer config for the given public key",
|
"summary": "Retrieves all active peers for the given email address",
|
||||||
"parameters": [
|
"parameters": [
|
||||||
{
|
{
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"description": "Public Key (Base 64)",
|
"description": "Email Address",
|
||||||
"name": "pkey",
|
"name": "email",
|
||||||
"in": "path",
|
"in": "path",
|
||||||
"required": true
|
"required": true
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"responses": {
|
"responses": {
|
||||||
"200": {
|
"200": {
|
||||||
"description": "The WireGuard configuration file",
|
"description": "All active WireGuard peers",
|
||||||
"schema": {
|
"schema": {
|
||||||
"type": "string"
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"$ref": "#/definitions/server.PeerDeploymentInformation"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"401": {
|
"401": {
|
||||||
@ -1168,6 +1222,23 @@ var doc = `{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"server.PeerDeploymentInformation": {
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"device": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"deviceIdentifier": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"identifier": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"publicKey": {
|
||||||
|
"type": "string"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"server.ProvisioningRequest": {
|
"server.ProvisioningRequest": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"required": [
|
"required": [
|
||||||
|
@ -107,8 +107,9 @@ func SetupApiRoutes(s *Server) {
|
|||||||
apiV1Deployment := s.server.Group("/api/v1/provisioning")
|
apiV1Deployment := s.server.Group("/api/v1/provisioning")
|
||||||
apiV1Deployment.Use(s.RequireApiAuthentication(""))
|
apiV1Deployment.Use(s.RequireApiAuthentication(""))
|
||||||
|
|
||||||
|
apiV1Deployment.GET("/peers/:email", api.GetPeerDeploymentInformation)
|
||||||
apiV1Deployment.GET("/peer/:pkey", api.GetPeerDeploymentConfig)
|
apiV1Deployment.GET("/peer/:pkey", api.GetPeerDeploymentConfig)
|
||||||
apiV1Deployment.POST("/peer", api.PostPeerDeploymentConfig)
|
apiV1Deployment.POST("/peers", api.PostPeerDeploymentConfig)
|
||||||
|
|
||||||
// Swagger doc/ui
|
// Swagger doc/ui
|
||||||
s.server.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler))
|
s.server.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler))
|
||||||
|
Loading…
Reference in New Issue
Block a user