Compare commits

...

7 Commits
v1.0.0 ... main

Author SHA1 Message Date
raul f07fcd43e0
Fix permission issues when running container 2025-01-08 11:29:09 +01:00
raul 2c84221816 Use regular user for executing service
This is primarily useful in preventing files generated within shared
volumes from being owned by root
2024-06-11 09:53:37 +02:00
raul baf534ea9a Dockerize application 2024-06-11 08:48:49 +02:00
raul 83e90a023c Add sample config folder 2024-06-11 08:48:35 +02:00
raul ee6689d90e Styling changes 2024-06-07 13:50:42 +02:00
raul f241ebb750 Cleanup 2024-06-07 12:15:55 +02:00
raul 425987f350 Generate random number for cert serial number 2024-06-04 15:45:32 +02:00
12 changed files with 261 additions and 110 deletions

22
Dockerfile Normal file
View File

@ -0,0 +1,22 @@
FROM golang:1.22-alpine
ENV USER=cert400
ENV GROUPNAME=$USER
ENV UID=1000
ENV GID=1000
ENV APP_HOME="/home/cert400/app"
RUN addgroup --gid "$GID" "$GROUPNAME"
RUN adduser --gecos "" --disabled-password --ingroup "$GROUPNAME" --uid "$UID" "$USER"
RUN mkdir "$APP_HOME"
ADD . "$APP_HOME"
WORKDIR "$APP_HOME"
RUN go build -o main .
USER cert400
CMD ["./main", "server"]

View File

@ -77,30 +77,7 @@ func generateCA() {
log.Fatalf("Error happened creating certificate: %v\n", err) log.Fatalf("Error happened creating certificate: %v\n", err)
} }
////// log.Printf("Generating %v/.config/cert400/ca.key...\n", home)
//fmt.Printf("Checking %v/.config/\n", home)
// _, err = os.Stat(home + "/.config")
// if err != nil {
// if os.IsNotExist(err) {
// fmt.Printf("$HOME/.config doesn't exist, creating...\n")
// os.Mkdir(home+"/.config", 0700)
// } else {
// log.Fatalf("Error happened accessing .config: %v", err)
// }
// }
//fmt.Printf("Checking %v/.config/cert400\n", home)
// _, err = os.Stat(home + "/.config/cert400")
// if err != nil {
// if os.IsNotExist(err) {
// fmt.Printf("$HOME/.config/cert400 doesn't exist, creating...\n")
// os.Mkdir(home+"/.config/cert400", 0700)
// } else {
// log.Fatalf("Error happened accessing cert400: %v\n", err)
// }
// }
fmt.Printf("Generating %v/.config/cert400/ca.key...\n", home)
// TODO: Check if keys already exist and warn the user about it // TODO: Check if keys already exist and warn the user about it
key, err := os.OpenFile(home+"/.config/cert400/ca.key", os.O_WRONLY|os.O_CREATE, 0600) key, err := os.OpenFile(home+"/.config/cert400/ca.key", os.O_WRONLY|os.O_CREATE, 0600)
if err != nil { if err != nil {
@ -108,7 +85,7 @@ func generateCA() {
} }
defer key.Close() defer key.Close()
fmt.Printf("Generating %v/.config/cert400/ca.cert...\n", home) log.Printf("Generating %v/.config/cert400/ca.cert...\n", home)
cert, err := os.OpenFile(home+"/.config/cert400/ca.crt", os.O_WRONLY|os.O_CREATE, 0600) cert, err := os.OpenFile(home+"/.config/cert400/ca.crt", os.O_WRONLY|os.O_CREATE, 0600)
if err != nil { if err != nil {
log.Fatalf("Error happened opening file: %v\n", err) log.Fatalf("Error happened opening file: %v\n", err)
@ -210,7 +187,7 @@ func generateCert(serNumber int, clientOrg string, clientCountry string,
Bytes: x509.MarshalPKCS1PrivateKey(certPrivKey), Bytes: x509.MarshalPKCS1PrivateKey(certPrivKey),
}) })
fmt.Printf("Generating %v/.config/cert400/clientCertificates/"+clientDomain+".key...\n", home) log.Printf("Generating %v/.config/cert400/clientCertificates/"+clientDomain+".key...\n", home)
clientkey, err := os.OpenFile(home+"/.config/cert400/clientCertificates/"+clientDomain+".key", os.O_WRONLY|os.O_CREATE, 0600) clientkey, err := os.OpenFile(home+"/.config/cert400/clientCertificates/"+clientDomain+".key", os.O_WRONLY|os.O_CREATE, 0600)
if err != nil { if err != nil {
e := fmt.Errorf("Error happened opening file: %v\n", err) e := fmt.Errorf("Error happened opening file: %v\n", err)
@ -218,7 +195,7 @@ func generateCert(serNumber int, clientOrg string, clientCountry string,
} }
defer clientkey.Close() defer clientkey.Close()
fmt.Printf("Generating %v/.config/cert400/clientCertificates/"+clientDomain+".crt...\n", home) log.Printf("Generating %v/.config/cert400/clientCertificates/"+clientDomain+".crt...\n", home)
clientcert, err := os.OpenFile(home+"/.config/cert400/clientCertificates/"+clientDomain+".crt", os.O_WRONLY|os.O_CREATE, 0600) clientcert, err := os.OpenFile(home+"/.config/cert400/clientCertificates/"+clientDomain+".crt", os.O_WRONLY|os.O_CREATE, 0600)
if err != nil { if err != nil {
e := fmt.Errorf("Error happened opening file: %v\n", err) e := fmt.Errorf("Error happened opening file: %v\n", err)

View File

@ -8,6 +8,7 @@ import (
"embed" "embed"
"fmt" "fmt"
"log" "log"
"math/rand/v2"
"net/http" "net/http"
"os" "os"
"strconv" "strconv"
@ -18,7 +19,6 @@ import (
var ( var (
listenPort = "1302" listenPort = "1302"
default_serial_number = 10245
default_organization = "Empresa SL" default_organization = "Empresa SL"
default_country = "ES" default_country = "ES"
default_province = "Valencia" default_province = "Valencia"
@ -34,10 +34,6 @@ var (
var templateFolder embed.FS var templateFolder embed.FS
func defaultHTML() { func defaultHTML() {
vipSerNum := viper.GetInt("Web.default_serial_number")
if vipSerNum != 0 {
default_serial_number = vipSerNum
}
vipDefOrg := viper.GetString("Web.default_organization") vipDefOrg := viper.GetString("Web.default_organization")
if vipDefOrg != "" { if vipDefOrg != "" {
default_organization = vipDefOrg default_organization = vipDefOrg
@ -78,6 +74,7 @@ func defaultHTML() {
func server() { func server() {
defaultHTML() defaultHTML()
log.SetPrefix("[CERT400] ")
gin.SetMode(gin.ReleaseMode) gin.SetMode(gin.ReleaseMode)
home, err := os.UserHomeDir() home, err := os.UserHomeDir()
if err != nil { if err != nil {
@ -91,7 +88,6 @@ func server() {
r := gin.Default() r := gin.Default()
LoadHTMLFromEmbedFS(r, templateFolder, "templates/*.html") LoadHTMLFromEmbedFS(r, templateFolder, "templates/*.html")
//r.Static("/css", "./cmd/templates/css")
r.StaticFileFS("/css/style.css", "./templates/css/style.css", http.FS(templateFolder)) r.StaticFileFS("/css/style.css", "./templates/css/style.css", http.FS(templateFolder))
r.StaticFileFS("/favicon.ico", "./templates/ico/favicon.ico", http.FS(templateFolder)) r.StaticFileFS("/favicon.ico", "./templates/ico/favicon.ico", http.FS(templateFolder))
r.StaticFileFS("/favicon-32x32.png", "./templates/ico/favicon-32x32.png", http.FS(templateFolder)) r.StaticFileFS("/favicon-32x32.png", "./templates/ico/favicon-32x32.png", http.FS(templateFolder))
@ -124,7 +120,7 @@ func returnCacert(c *gin.Context) {
func returnIndex(c *gin.Context) { func returnIndex(c *gin.Context) {
c.HTML(http.StatusOK, "templates/index.html", gin.H{ c.HTML(http.StatusOK, "templates/index.html", gin.H{
"default_serial_number": default_serial_number, "default_serial_number": rand.IntN(20000-1) + 1,
"default_organization": default_organization, "default_organization": default_organization,
"default_country": default_country, "default_country": default_country,
"default_province": default_province, "default_province": default_province,
@ -165,7 +161,7 @@ func getDomainRequest(c *gin.Context) {
return return
} }
DNSName, _ := c.GetPostForm("formDNS") DNSName, _ := c.GetPostForm("formDNS")
certDownload, keyDownload, err := generateCert(serNumInt, Org, _, _, err = generateCert(serNumInt, Org,
Country, Province, Locality, StreetAddr, Country, Province, Locality, StreetAddr,
PostCode, DNSName, ExpiryTimeInt, BitSizeInt) PostCode, DNSName, ExpiryTimeInt, BitSizeInt)
if err != nil { if err != nil {
@ -184,9 +180,6 @@ func getDomainRequest(c *gin.Context) {
</b> </b>
`, DNSName, DNSName) `, DNSName, DNSName)
c.String(http.StatusOK, result) c.String(http.StatusOK, result)
//c.File(keyDownload)
fmt.Println(certDownload, keyDownload)
return return
} }
@ -199,5 +192,4 @@ func returnCerts(c *gin.Context) {
return return
} }
c.FileAttachment(base+"/.config/cert400/clientCertificates/"+domain, domain) c.FileAttachment(base+"/.config/cert400/clientCertificates/"+domain, domain)
//c.File(base + "/.config/cert400/clientCertificates/" + domain + ".key")
} }

View File

@ -6,6 +6,15 @@ input {
margin-bottom: 10px; margin-bottom: 10px;
} }
input:focus {
outline: 2px solid #ff6e00;
}
input::selection {
background: #ff6e00;
color: white;
}
#but { #but {
background-color: #eee; background-color: #eee;
border: 2px black solid; border: 2px black solid;

18
docker-compose.yml Normal file
View File

@ -0,0 +1,18 @@
version: '3'
networks:
cert400:
driver: bridge
services:
default:
container_name: "cert400"
build:
context: .
dockerfile: "Dockerfile"
ports:
- 1302:1302
networks:
- cert400
volumes:
- ./sample-config/:/home/cert400/.config/cert400/

43
go.mod
View File

@ -4,50 +4,49 @@ go 1.22.3
require ( require (
github.com/gin-gonic/gin v1.10.0 github.com/gin-gonic/gin v1.10.0
github.com/spf13/cobra v1.8.0 github.com/spf13/cobra v1.8.1
github.com/spf13/viper v1.18.2 github.com/spf13/viper v1.19.0
) )
require ( require (
github.com/bytedance/sonic v1.11.7 // indirect github.com/bytedance/sonic v1.12.7 // indirect
github.com/bytedance/sonic/loader v0.1.1 // indirect github.com/bytedance/sonic/loader v0.2.2 // indirect
github.com/cloudwego/base64x v0.1.4 // indirect github.com/cloudwego/base64x v0.1.4 // indirect
github.com/cloudwego/iasm v0.2.0 // indirect github.com/fsnotify/fsnotify v1.8.0 // indirect
github.com/fsnotify/fsnotify v1.7.0 // indirect github.com/gabriel-vasile/mimetype v1.4.8 // indirect
github.com/gabriel-vasile/mimetype v1.4.3 // indirect github.com/gin-contrib/sse v1.0.0 // indirect
github.com/gin-contrib/sse v0.1.0 // indirect
github.com/go-playground/locales v0.14.1 // indirect github.com/go-playground/locales v0.14.1 // indirect
github.com/go-playground/universal-translator v0.18.1 // indirect github.com/go-playground/universal-translator v0.18.1 // indirect
github.com/go-playground/validator/v10 v10.20.0 // indirect github.com/go-playground/validator/v10 v10.23.0 // indirect
github.com/goccy/go-json v0.10.3 // indirect github.com/goccy/go-json v0.10.4 // indirect
github.com/hashicorp/hcl v1.0.0 // indirect github.com/hashicorp/hcl v1.0.0 // indirect
github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect
github.com/json-iterator/go v1.1.12 // indirect github.com/json-iterator/go v1.1.12 // indirect
github.com/klauspost/cpuid/v2 v2.2.7 // indirect github.com/klauspost/cpuid/v2 v2.2.9 // indirect
github.com/leodido/go-urn v1.4.0 // indirect github.com/leodido/go-urn v1.4.0 // indirect
github.com/magiconair/properties v1.8.7 // indirect github.com/magiconair/properties v1.8.9 // indirect
github.com/mattn/go-isatty v0.0.20 // indirect github.com/mattn/go-isatty v0.0.20 // indirect
github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.2 // indirect github.com/modern-go/reflect2 v1.0.2 // indirect
github.com/pelletier/go-toml/v2 v2.2.2 // indirect github.com/pelletier/go-toml/v2 v2.2.3 // indirect
github.com/sagikazarmark/locafero v0.4.0 // indirect github.com/sagikazarmark/locafero v0.6.0 // indirect
github.com/sagikazarmark/slog-shim v0.1.0 // indirect github.com/sagikazarmark/slog-shim v0.1.0 // indirect
github.com/sourcegraph/conc v0.3.0 // indirect github.com/sourcegraph/conc v0.3.0 // indirect
github.com/spf13/afero v1.11.0 // indirect github.com/spf13/afero v1.11.0 // indirect
github.com/spf13/cast v1.6.0 // indirect github.com/spf13/cast v1.7.1 // indirect
github.com/spf13/pflag v1.0.5 // indirect github.com/spf13/pflag v1.0.5 // indirect
github.com/subosito/gotenv v1.6.0 // indirect github.com/subosito/gotenv v1.6.0 // indirect
github.com/twitchyliquid64/golang-asm v0.15.1 // indirect github.com/twitchyliquid64/golang-asm v0.15.1 // indirect
github.com/ugorji/go/codec v1.2.12 // indirect github.com/ugorji/go/codec v1.2.12 // indirect
go.uber.org/multierr v1.11.0 // indirect go.uber.org/multierr v1.11.0 // indirect
golang.org/x/arch v0.8.0 // indirect golang.org/x/arch v0.13.0 // indirect
golang.org/x/crypto v0.23.0 // indirect golang.org/x/crypto v0.32.0 // indirect
golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 // indirect golang.org/x/exp v0.0.0-20250106191152-7588d65b2ba8 // indirect
golang.org/x/net v0.25.0 // indirect golang.org/x/net v0.34.0 // indirect
golang.org/x/sys v0.20.0 // indirect golang.org/x/sys v0.29.0 // indirect
golang.org/x/text v0.15.0 // indirect golang.org/x/text v0.21.0 // indirect
google.golang.org/protobuf v1.34.1 // indirect google.golang.org/protobuf v1.36.2 // indirect
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect
gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/ini.v1 v1.67.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect

93
go.sum
View File

@ -1,24 +1,24 @@
github.com/bytedance/sonic v1.11.7 h1:k/l9p1hZpNIMJSk37wL9ltkcpqLfIho1vYthi4xT2t4= github.com/bytedance/sonic v1.12.7 h1:CQU8pxOy9HToxhndH0Kx/S1qU/CuS9GnKYrGioDcU1Q=
github.com/bytedance/sonic v1.11.7/go.mod h1:LysEHSvpvDySVdC2f87zGWf6CIKJcAvqab1ZaiQtds4= github.com/bytedance/sonic v1.12.7/go.mod h1:tnbal4mxOMju17EGfknm2XyYcpyCnIROYOEYuemj13I=
github.com/bytedance/sonic/loader v0.1.1 h1:c+e5Pt1k/cy5wMveRDyk2X4B9hF4g7an8N3zCYjJFNM=
github.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU= github.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU=
github.com/bytedance/sonic/loader v0.2.2 h1:jxAJuN9fOot/cyz5Q6dUuMJF5OqQ6+5GfA8FjjQ0R4o=
github.com/bytedance/sonic/loader v0.2.2/go.mod h1:N8A3vUdtUebEY2/VQC0MyhYeKUFosQU6FxH2JmUe6VI=
github.com/cloudwego/base64x v0.1.4 h1:jwCgWpFanWmN8xoIUHa2rtzmkd5J2plF/dnLS6Xd/0Y= github.com/cloudwego/base64x v0.1.4 h1:jwCgWpFanWmN8xoIUHa2rtzmkd5J2plF/dnLS6Xd/0Y=
github.com/cloudwego/base64x v0.1.4/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w= github.com/cloudwego/base64x v0.1.4/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w=
github.com/cloudwego/iasm v0.2.0 h1:1KNIy1I1H9hNNFEEH3DVnI4UujN+1zjpuk6gwHLTssg=
github.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY= github.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY=
github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8=
github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0=
github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= github.com/fsnotify/fsnotify v1.8.0 h1:dAwr6QBTBZIkG8roQaJjGof0pp0EeF+tNV7YBP3F/8M=
github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= github.com/fsnotify/fsnotify v1.8.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0=
github.com/gabriel-vasile/mimetype v1.4.3 h1:in2uUcidCuFcDKtdcBxlR0rJ1+fsokWf+uqxgUFjbI0= github.com/gabriel-vasile/mimetype v1.4.8 h1:FfZ3gj38NjllZIeJAmMhr+qKL8Wu+nOoI3GqacKw1NM=
github.com/gabriel-vasile/mimetype v1.4.3/go.mod h1:d8uq/6HKRL6CGdk+aubisF/M5GcPfT7nKyLpA0lbSSk= github.com/gabriel-vasile/mimetype v1.4.8/go.mod h1:ByKUIKGjh1ODkGM1asKUbQZOLGrPjydw3hYPU2YU9t8=
github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= github.com/gin-contrib/sse v1.0.0 h1:y3bT1mUWUxDpW4JLQg/HnTqV4rozuW4tC9eFKTxYI9E=
github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= github.com/gin-contrib/sse v1.0.0/go.mod h1:zNuFdwarAygJBht0NTKiSi3jRf6RbqeILZ9Sp6Slhe0=
github.com/gin-gonic/gin v1.10.0 h1:nTuyha1TYqgedzytsKYqna+DfLos46nTv2ygFy86HFU= github.com/gin-gonic/gin v1.10.0 h1:nTuyha1TYqgedzytsKYqna+DfLos46nTv2ygFy86HFU=
github.com/gin-gonic/gin v1.10.0/go.mod h1:4PMNQiOhvDRa013RKVbsiNwoyezlm2rm0uX/T7kzp5Y= github.com/gin-gonic/gin v1.10.0/go.mod h1:4PMNQiOhvDRa013RKVbsiNwoyezlm2rm0uX/T7kzp5Y=
github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s=
@ -27,10 +27,10 @@ github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/o
github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY=
github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY=
github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY=
github.com/go-playground/validator/v10 v10.20.0 h1:K9ISHbSaI0lyB2eWMPJo+kOS/FBExVwjEviJTixqxL8= github.com/go-playground/validator/v10 v10.23.0 h1:/PwmTwZhS0dPkav3cdK9kV1FsAmrL8sThn8IHr/sO+o=
github.com/go-playground/validator/v10 v10.20.0/go.mod h1:dbuPbCMFw/DrkbEynArYaCwl3amGuJotoKCe95atGMM= github.com/go-playground/validator/v10 v10.23.0/go.mod h1:dbuPbCMFw/DrkbEynArYaCwl3amGuJotoKCe95atGMM=
github.com/goccy/go-json v0.10.3 h1:KZ5WoDbxAIgm2HNbYckL0se1fHD6rz5j4ywS6ebzDqA= github.com/goccy/go-json v0.10.4 h1:JSwxQzIqKfmFX1swYPpUThQZp/Ka4wzJdK0LWVytLPM=
github.com/goccy/go-json v0.10.3/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= github.com/goccy/go-json v0.10.4/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M=
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
@ -41,8 +41,8 @@ github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLf
github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
github.com/klauspost/cpuid/v2 v2.2.7 h1:ZWSB3igEs+d0qvnxR/ZBzXVmxkgt8DdzP6m9pfuVLDM= github.com/klauspost/cpuid/v2 v2.2.9 h1:66ze0taIn2H33fBvCkXuv9BmCwDfafmiIVpKV9kKGuY=
github.com/klauspost/cpuid/v2 v2.2.7/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= github.com/klauspost/cpuid/v2 v2.2.9/go.mod h1:rqkxqrZ1EhYM9G+hXH7YdowN5R5RGN6NK4QwQ3WMXF8=
github.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M= github.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=
github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
@ -53,8 +53,8 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ= github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ=
github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI= github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI=
github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= github.com/magiconair/properties v1.8.9 h1:nWcCbLq1N2v/cpNsy5WvQ37Fb+YElfq20WJ/a8RkpQM=
github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= github.com/magiconair/properties v1.8.9/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0=
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=
@ -64,30 +64,30 @@ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=
github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
github.com/pelletier/go-toml/v2 v2.2.2 h1:aYUidT7k73Pcl9nb2gScu7NSrKCSHIDE89b3+6Wq+LM= github.com/pelletier/go-toml/v2 v2.2.3 h1:YmeHyLY8mFWbdkNWwpr+qIL2bEqT0o95WSdkNHvL12M=
github.com/pelletier/go-toml/v2 v2.2.2/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs= github.com/pelletier/go-toml/v2 v2.2.3/go.mod h1:MfCQTFTvCcUyyvvwm1+G6H/jORL20Xlb6rzQu9GuUkc=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8=
github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
github.com/sagikazarmark/locafero v0.4.0 h1:HApY1R9zGo4DBgr7dqsTH/JJxLTTsOt7u6keLGt6kNQ= github.com/sagikazarmark/locafero v0.6.0 h1:ON7AQg37yzcRPU69mt7gwhFEBwxI6P9T4Qu3N51bwOk=
github.com/sagikazarmark/locafero v0.4.0/go.mod h1:Pe1W6UlPYUk/+wc/6KFhbORCfqzgYEpgQ3O5fPuL3H4= github.com/sagikazarmark/locafero v0.6.0/go.mod h1:77OmuIc6VTraTXKXIs/uvUxKGUXjE1GbemJYHqdNjX0=
github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6gto+ugjYE= github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6gto+ugjYE=
github.com/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWRIczQRv+GVI1AkeQ= github.com/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWRIczQRv+GVI1AkeQ=
github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo= github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo=
github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0= github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0=
github.com/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8= github.com/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8=
github.com/spf13/afero v1.11.0/go.mod h1:GH9Y3pIexgf1MTIWtNGyogA5MwRIDXGUr+hbWNoBjkY= github.com/spf13/afero v1.11.0/go.mod h1:GH9Y3pIexgf1MTIWtNGyogA5MwRIDXGUr+hbWNoBjkY=
github.com/spf13/cast v1.6.0 h1:GEiTHELF+vaR5dhz3VqZfFSzZjYbgeKDpBxQVS4GYJ0= github.com/spf13/cast v1.7.1 h1:cuNEagBQEHWN1FnbGEjCXL2szYEXqfJPbP2HNUaca9Y=
github.com/spf13/cast v1.6.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= github.com/spf13/cast v1.7.1/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo=
github.com/spf13/cobra v1.8.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0= github.com/spf13/cobra v1.8.1 h1:e5/vxKd/rZsfSJMUX1agtjeTDf+qv1/JdBF8gg5k9ZM=
github.com/spf13/cobra v1.8.0/go.mod h1:WXLWApfZ71AjXPya3WOlMsY9yMs7YeiHhFVlvLyhcho= github.com/spf13/cobra v1.8.1/go.mod h1:wHxEcudfqmLYa8iTfL+OuZPbBZkmvliBWKIezN3kD9Y=
github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
github.com/spf13/viper v1.18.2 h1:LUXCnvUvSM6FXAsj6nnfc8Q2tp1dIgUfY9Kc8GsSOiQ= github.com/spf13/viper v1.19.0 h1:RWq5SEjt8o25SROyN3z2OrDB9l7RPd3lwTWU8EcEdcI=
github.com/spf13/viper v1.18.2/go.mod h1:EKmWIqdnk5lOcmR72yw6hS+8OPYcwD0jteitLMVB+yk= github.com/spf13/viper v1.19.0/go.mod h1:GQUN9bilAbhU/jgc1bKs99f/suXKeUMct8Adx5+Ntkg=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
@ -98,8 +98,8 @@ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8=
github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU=
github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=
@ -108,23 +108,21 @@ github.com/ugorji/go/codec v1.2.12 h1:9LC83zGrHhuUA9l16C9AHXAqEV/2wBQ4nkvumAE65E
github.com/ugorji/go/codec v1.2.12/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= github.com/ugorji/go/codec v1.2.12/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg=
go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=
go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=
golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= golang.org/x/arch v0.13.0 h1:KCkqVVV1kGg0X87TFysjCJ8MxtZEIU4Ja/yXGeoECdA=
golang.org/x/arch v0.8.0 h1:3wRIsP3pM4yUptoR96otTUOXI367OS0+c9eeRi9doIc= golang.org/x/arch v0.13.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys=
golang.org/x/arch v0.8.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys= golang.org/x/crypto v0.32.0 h1:euUpcYgM8WcP71gNpTqQCn6rC2t6ULUPiOzfWaXVVfc=
golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI= golang.org/x/crypto v0.32.0/go.mod h1:ZnnJkOaASj8g0AjIduWNlq2NRxL0PlBrbKVyZ6V/Ugc=
golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= golang.org/x/exp v0.0.0-20250106191152-7588d65b2ba8 h1:yqrTHse8TCMW1M1ZCP+VAR/l0kKxwaAIqN/il7x4voA=
golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 h1:vr/HnozRka3pE4EsMEg1lgkXJkTFJCVUX+S/ZT6wYzM= golang.org/x/exp v0.0.0-20250106191152-7588d65b2ba8/go.mod h1:tujkw807nyEEAamNbDrEGzRav+ilXA7PCRAd6xsmwiU=
golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842/go.mod h1:XtvwrStGgqGPLc4cjQfWqZHG1YFdYs6swckp8vpsjnc= golang.org/x/net v0.34.0 h1:Mb7Mrk043xzHgnRM88suvJFwzVrRfHEHJEl5/71CKw0=
golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= golang.org/x/net v0.34.0/go.mod h1:di0qlW3YNM5oh6GqDGQr92MyTozJPmybPK4Ev/Gm31k=
golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM=
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= golang.org/x/sys v0.29.0 h1:TPYlXGxvx1MGTn2GiZDhnjPA9wZzZeGKHHmKhHYvgaU=
golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.29.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo=
golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ=
google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= google.golang.org/protobuf v1.36.2 h1:R8FeyR1/eLmkutZOM5CWghmo5itiG9z0ktFlTVLuTmU=
google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= google.golang.org/protobuf v1.36.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
@ -134,4 +132,3 @@ gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50= nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=
rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=

29
sample-config/ca.crt Normal file
View File

@ -0,0 +1,29 @@
-----BEGIN CERTIFICATE-----
MIIE9TCCA12gAwIBAgICKAUwDQYJKoZIhvcNAQELBQAwgYsxCzAJBgNVBAYTAkVT
MREwDwYDVQQIEwhWYWxlbmNpYTERMA8GA1UEBxMIVmFsZW5jaWExGzAZBgNVBAkT
EkMvRmFrZSBBZGRyZXNzIDEyMzEOMAwGA1UEERMFNDYyNTAxEzARBgNVBAoTCkVt
cHJlc2EgU0wxFDASBgNVBAMTC2VtcHJlc2EuY29tMB4XDTI0MDYxMTA2MjMwN1oX
DTM0MDYxMTA2MjMwN1owgYsxCzAJBgNVBAYTAkVTMREwDwYDVQQIEwhWYWxlbmNp
YTERMA8GA1UEBxMIVmFsZW5jaWExGzAZBgNVBAkTEkMvRmFrZSBBZGRyZXNzIDEy
MzEOMAwGA1UEERMFNDYyNTAxEzARBgNVBAoTCkVtcHJlc2EgU0wxFDASBgNVBAMT
C2VtcHJlc2EuY29tMIIBojANBgkqhkiG9w0BAQEFAAOCAY8AMIIBigKCAYEA2PHx
wmYSOPqa0ilVYy22BlAKI9gIBuAiiOdklIJ3/M/oVQsOSuJN2DdiA/lsGMjVuMh6
yMs8k8JEEBy5a6ZxEQ1NUFysfw6n1Kl4vDdBQncKRWNdDi0MhPIOU6c4RPDYnSmg
qYZSo1IAV8fO9Gxyi9+LiwDzoIwPr/U/BXnPTHO+j7/trHzTr2g9gJwYnJA20ysw
ThAYaat5ymS8tYkb27mrBWRERQFccavziJ6r7c5kgj8ONNg7/v89cE/ufve1fo9a
UoSCEn6+frQ+hLwwIAiFLu1LXUfR3J9pjSKKC/bR2KeImxAs16gGynM0C0LDAi+e
hu1xwwvVNhS66pcM+9Ayndtkghq83BlZgmYvSJot9+0wDxyRudOtMac7bubv+OTJ
3JmPZdrTSB4WUA3ogNneeN7ksZg6oBHj53y20NS0Pi4AqyTyVITJeZdpG98/3zq2
hlKDWjma0Hm40hLK7JZVSXLSt7Sno7ThHRms1IiZ3FjpNF5DqpEzYH22AqvbAgMB
AAGjYTBfMA4GA1UdDwEB/wQEAwIChDAdBgNVHSUEFjAUBggrBgEFBQcDAgYIKwYB
BQUHAwEwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUvIOM57LJ4kVoWdqa+C8F
fdrM/1kwDQYJKoZIhvcNAQELBQADggGBAEJhOSc0YwXg3QgLCHj8xzb3kNBik0Wb
pGOgtkCFY/zudIeFQgl6aWR9kDAJ0kDPsMHg/8moxiGHq6+iVsbr27y8KbH6p0lS
IqSJUC8in3Ae26bHXNIJVqQaEoJ8xdGR2Gfbal/EvGp00vM7ql6jo7v6YBanB7dX
szbOc6guPOeKQjWYmFTnyfdeaasiZt4WSUfN4vN1weaPwoOIF+qcqeY0Hkg3Qxt+
aEYbrrc1BuCooV7u0ki/lLPTomk4XsyuJcbcLpO/zK4DNbaOWx8zYMWmaLIt4Jvr
PGmg3IBjGi2CS2xZfDkjW0EtulGMzggKaJuPZihm4QXjhs52rZAEsmiRUhoHlGAb
nQTppo+BzCT8dcJq4elk6kmOAAU5WXmOZL/7OKjAFhbG9r0c8z5NOv93UtcdhpkI
ygJ5gRNdXkXhLzNUuZvtb1JmFrx3oMiRZgKsku3XLdyf6vvWpGDimw0ljMdOoxUu
uUQ3vi/K0kdI/wtkbuIYmoEeLzvo8fnDtQ==
-----END CERTIFICATE-----

40
sample-config/ca.key Normal file
View File

@ -0,0 +1,40 @@
-----BEGIN RSA PRIVATE KEY-----
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
-----END RSA PRIVATE KEY-----
---

View File

@ -14,7 +14,6 @@ common_name = "empresa.com"
port = "1302" port = "1302"
[Web] [Web]
default_serial_number = 10400
default_organization = "Empresa SL" default_organization = "Empresa SL"
default_country = "ES" default_country = "ES"
default_province = "Valencia" default_province = "Valencia"

View File

@ -0,0 +1,30 @@
-----BEGIN CERTIFICATE-----
MIIFIDCCA4igAwIBAgICTc4wDQYJKoZIhvcNAQELBQAwgYsxCzAJBgNVBAYTAkVT
MREwDwYDVQQIEwhWYWxlbmNpYTERMA8GA1UEBxMIVmFsZW5jaWExGzAZBgNVBAkT
EkMvRmFrZSBBZGRyZXNzIDEyMzEOMAwGA1UEERMFNDYyNTAxEzARBgNVBAoTCkVt
cHJlc2EgU0wxFDASBgNVBAMTC2VtcHJlc2EuY29tMB4XDTI0MDYxMTA2MjM0OFoX
DTM0MDYxMTA2MjM0OFowgZMxCzAJBgNVBAYTAkVTMREwDwYDVQQIEwhWYWxlbmNp
YTERMA8GA1UEBxMIVmFsZW5jaWExGzAZBgNVBAkTEkMvRmFrZSBBZGRyZXNzIDEy
MzEOMAwGA1UEERMFNDYyNTAxEzARBgNVBAoTCkVtcHJlc2EgU0wxHDAaBgNVBAMT
E3d3dy55b3VyY29tcGFueS5jb20wggGiMA0GCSqGSIb3DQEBAQUAA4IBjwAwggGK
AoIBgQCofpbE8/wz0M96Yr3l1dc3ScV7UwYLFHLxouHj1EoFKWrstL/NJ+uphpwz
kKyo+UXGWs+SUvEC1RNAQAtvAbrLKfMqFxzwBR4l+DUTI/gJcuIRkehAGj1nVlxb
dzqoVB68LkSL3nfo2omWyhjNLidDvCSmkcBRmRBDxnJYOs58i3nQwvz50+a58hcH
2RYNEVX77yrSfOplGmlUsO2pDYuOC266A2G2Cvi8Viw8Us3uSDYQutGZqv76+IaP
YMx388viwDBc420NeN4F1RSYqK8Gq+xXmOlDx1TdpSCh0SC8DFUJd7LEW3va6/VN
WeaJ/QkMN/E0DDev8zNAUg2M+4JhzR0FRb40lCIcifuP4HCb4PKTPH2uZ7/4QIe/
SSJcx5O+SmXJEZl9BzrDtBL/2lTIdnFxfsE+3O6M1Na6bXedBZ/2EQUAYm9dTTPK
ASXms0qLEoWw2FpanUgKiBwOLJ1NGKXmTK3xK7qXeM9XjkfSS8ceGUi6STKjGYkS
h8lYEjcCAwEAAaOBgzCBgDAOBgNVHQ8BAf8EBAMCB4AwHQYDVR0lBBYwFAYIKwYB
BQUHAwIGCCsGAQUFBwMBMA4GA1UdDgQHBAUBAgMEBjAfBgNVHSMEGDAWgBS8g4zn
ssniRWhZ2pr4LwV92sz/WTAeBgNVHREEFzAVghN3d3cueW91cmNvbXBhbnkuY29t
MA0GCSqGSIb3DQEBCwUAA4IBgQAPkn//HhwTkdiqyKjNQeivTM4nAjrun2AhBvZI
srNd4x8Us9kb3DBGrKhOAlJTuE/+q93V12dFLMd1IPIlHJptaBcFvDys8H4FVQTZ
APeE2LGf/Hap2E5dmZCQymtZGr+qrvrQNMHRDcAvpMYGoNkue0LcHj/i4s6a8rR+
qgrbXNkTaC8dC3QHTpmgHk87GqW3ZF8/rdRSiPbzGtJTRFZGFt1HFBccKrJpE93/
GTiYGVl/wGRNwpvVh1mxIEolTajU0l0tQsl5yhx93xjsVwTEWmnOXjKscDnZvRCj
FTvtbdc6dk2W3UPzZxalIhnjGaDQy+m/EmHKPzRXV6b4f4XfUEFMcfdACJwIk+qf
y9FnWqf6gL0WGShf7+xZcmg6eFLP9gClz5ik47R4qKg6rlE0fy9TImwGfluocAiC
hmS9VeN9K0prSVEpawjWBqtWVmKKYOI7e3LdBGo4LTtZY+/y0I4Ejd/IAzxdmZzF
HR0zraGiOmYOm+O6eKps0H82aj4=
-----END CERTIFICATE-----

View File

@ -0,0 +1,39 @@
-----BEGIN RSA PRIVATE KEY-----
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
-----END RSA PRIVATE KEY-----