mirror of
https://github.com/Macrame-App/Macrame
synced 2025-12-29 07:19:26 +00:00
WIP: Update to the go api.
This commit is contained in:
parent
03181cf6a4
commit
3b38372b4b
16 changed files with 317 additions and 30 deletions
|
|
@ -67,6 +67,12 @@ func ApiPost(w http.ResponseWriter, r *http.Request) {
|
||||||
DeviceAccessCheck(w, r)
|
DeviceAccessCheck(w, r)
|
||||||
case "/device/access/request":
|
case "/device/access/request":
|
||||||
DeviceAccessRequest(w, r)
|
DeviceAccessRequest(w, r)
|
||||||
|
case "/device/link/ping":
|
||||||
|
PingLink(w, r)
|
||||||
|
case "/device/link/start":
|
||||||
|
StartLink(w, r)
|
||||||
|
case "/device/handshake":
|
||||||
|
Handshake(w, r)
|
||||||
case "/poll/remote":
|
case "/poll/remote":
|
||||||
PollRemote(w, r)
|
PollRemote(w, r)
|
||||||
|
|
||||||
|
|
|
||||||
79
be/app/certify.go
Normal file
79
be/app/certify.go
Normal file
|
|
@ -0,0 +1,79 @@
|
||||||
|
package app
|
||||||
|
|
||||||
|
import (
|
||||||
|
"crypto/rand"
|
||||||
|
"crypto/rsa"
|
||||||
|
"crypto/tls"
|
||||||
|
"crypto/x509"
|
||||||
|
"crypto/x509/pkix"
|
||||||
|
"encoding/pem"
|
||||||
|
"fmt"
|
||||||
|
"math/big"
|
||||||
|
"os"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
func generateCertificate() tls.Certificate {
|
||||||
|
fmt.Println("Generating certificate")
|
||||||
|
var certError = false
|
||||||
|
// Generate a private key
|
||||||
|
privateKey, err := rsa.GenerateKey(rand.Reader, 2048)
|
||||||
|
if err != nil {
|
||||||
|
// fmt.Println(err)
|
||||||
|
certError = true
|
||||||
|
}
|
||||||
|
|
||||||
|
template := x509.Certificate{
|
||||||
|
SerialNumber: big.NewInt(1),
|
||||||
|
Subject: pkix.Name{
|
||||||
|
Organization: []string{"Macrame-Server"},
|
||||||
|
},
|
||||||
|
NotBefore: time.Now(),
|
||||||
|
NotAfter: time.Now().AddDate(1, 0, 0),
|
||||||
|
|
||||||
|
IsCA: true,
|
||||||
|
ExtKeyUsage: []x509.ExtKeyUsage{x509.ExtKeyUsageServerAuth},
|
||||||
|
KeyUsage: x509.KeyUsageDigitalSignature | x509.KeyUsageKeyEncipherment,
|
||||||
|
}
|
||||||
|
|
||||||
|
certBytes, err := x509.CreateCertificate(rand.Reader, &template, &template, &privateKey.PublicKey, privateKey)
|
||||||
|
if err != nil {
|
||||||
|
// fmt.Println(err)
|
||||||
|
certError = true
|
||||||
|
}
|
||||||
|
|
||||||
|
// Encode the certificate and private key to PEM
|
||||||
|
certPEM := pem.EncodeToMemory(
|
||||||
|
&pem.Block{Type: "CERTIFICATE", Bytes: certBytes},
|
||||||
|
)
|
||||||
|
keyPEM := pem.EncodeToMemory(
|
||||||
|
&pem.Block{Type: "RSA PRIVATE KEY", Bytes: x509.MarshalPKCS1PrivateKey(privateKey)},
|
||||||
|
)
|
||||||
|
|
||||||
|
// Save the certificate and private key to files
|
||||||
|
if err := os.WriteFile("server.crt", certPEM, 0644); err != nil {
|
||||||
|
// fmt.Println(err)
|
||||||
|
certError = true
|
||||||
|
}
|
||||||
|
if err := os.WriteFile("server.key", keyPEM, 0644); err != nil {
|
||||||
|
// fmt.Println(err)
|
||||||
|
certError = true
|
||||||
|
}
|
||||||
|
|
||||||
|
if !certError {
|
||||||
|
return Certify()
|
||||||
|
}
|
||||||
|
|
||||||
|
return tls.Certificate{}
|
||||||
|
}
|
||||||
|
|
||||||
|
func Certify() tls.Certificate {
|
||||||
|
fmt.Println("Loading certificate")
|
||||||
|
cert, err := tls.LoadX509KeyPair("server.crt", "server.key")
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return generateCertificate()
|
||||||
|
}
|
||||||
|
|
||||||
|
return cert
|
||||||
|
}
|
||||||
109
be/app/device.go
109
be/app/device.go
|
|
@ -1,9 +1,12 @@
|
||||||
package app
|
package app
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"be/app/helper"
|
||||||
"be/app/structs"
|
"be/app/structs"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
"log"
|
"log"
|
||||||
|
"math/rand"
|
||||||
"net/http"
|
"net/http"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
|
|
@ -72,10 +75,7 @@ func PollRemote(w http.ResponseWriter, r *http.Request) {
|
||||||
|
|
||||||
func DeviceAccessCheck(w http.ResponseWriter, r *http.Request) {
|
func DeviceAccessCheck(w http.ResponseWriter, r *http.Request) {
|
||||||
log.Println("device access check")
|
log.Println("device access check")
|
||||||
}
|
var req structs.Check
|
||||||
|
|
||||||
func DeviceAccessRequest(w http.ResponseWriter, r *http.Request) {
|
|
||||||
var req structs.RemoteWebhook
|
|
||||||
|
|
||||||
err := json.NewDecoder(r.Body).Decode(&req)
|
err := json.NewDecoder(r.Body).Decode(&req)
|
||||||
|
|
||||||
|
|
@ -84,10 +84,103 @@ func DeviceAccessRequest(w http.ResponseWriter, r *http.Request) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
log.Println(req)
|
_, errSett := os.Stat("devices/" + req.Uuid + ".json")
|
||||||
// mu.Lock()
|
_, errKey := os.Stat("devices/" + req.Uuid + ".pem")
|
||||||
// queue[req.Device] = append(queue[req.Device], req)
|
|
||||||
// mu.Unlock()
|
log.Println(errSett, errKey)
|
||||||
|
|
||||||
|
if (errSett == nil) && (errKey == nil) {
|
||||||
|
log.Println("authorized")
|
||||||
|
json.NewEncoder(w).Encode("authorized")
|
||||||
|
} else if (errSett == nil) && (errKey != nil) {
|
||||||
|
log.Println("requested")
|
||||||
|
json.NewEncoder(w).Encode("requested")
|
||||||
|
} else {
|
||||||
|
log.Println("unauthorized")
|
||||||
|
json.NewEncoder(w).Encode("unauthorized")
|
||||||
|
}
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func DeviceAccessRequest(w http.ResponseWriter, r *http.Request) {
|
||||||
|
var req structs.Request
|
||||||
|
|
||||||
|
err := json.NewDecoder(r.Body).Decode(&req)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
http.Error(w, err.Error(), http.StatusBadRequest)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
deviceSettings := structs.Settings{Name: req.Name, Type: req.Type}
|
||||||
|
|
||||||
|
settingsJSON, err := json.Marshal(deviceSettings)
|
||||||
|
if err != nil {
|
||||||
|
log.Println(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
err = os.WriteFile("devices/"+req.Uuid+".json", settingsJSON, 0644)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
log.Println(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
json.NewEncoder(w).Encode(true)
|
||||||
|
}
|
||||||
|
|
||||||
|
func PingLink(w http.ResponseWriter, r *http.Request) {
|
||||||
|
log.Println("ping link")
|
||||||
|
var req structs.Check
|
||||||
|
err := json.NewDecoder(r.Body).Decode(&req)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
json.NewEncoder(w).Encode(false)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
var filename = "devices/" + req.Uuid + ".tmp"
|
||||||
|
|
||||||
|
_, err = os.ReadFile(filename)
|
||||||
|
|
||||||
|
if err == nil {
|
||||||
|
json.NewEncoder(w).Encode(true)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
json.NewEncoder(w).Encode(false)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func StartLink(w http.ResponseWriter, r *http.Request) {
|
||||||
|
var req structs.Check
|
||||||
|
|
||||||
|
err := json.NewDecoder(r.Body).Decode(&req)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
http.Error(w, err.Error(), http.StatusBadRequest)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
pin := fmt.Sprintf("%04d", rand.Intn(10000))
|
||||||
|
|
||||||
|
if helper.TempPinFile(req.Uuid, pin) {
|
||||||
|
json.NewEncoder(w).Encode(pin)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func Handshake(w http.ResponseWriter, r *http.Request) {
|
||||||
|
var req structs.Handshake
|
||||||
|
|
||||||
|
err := json.NewDecoder(r.Body).Decode(&req)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
http.Error(w, err.Error(), http.StatusBadRequest)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
log.Println(req.Shake)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -10,8 +10,6 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
func EndpointAccess(w http.ResponseWriter, r *http.Request) bool {
|
func EndpointAccess(w http.ResponseWriter, r *http.Request) bool {
|
||||||
log.Println("endpoint access")
|
|
||||||
|
|
||||||
ip, _, err := net.SplitHostPort(r.RemoteAddr)
|
ip, _, err := net.SplitHostPort(r.RemoteAddr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatal(err)
|
log.Fatal(err)
|
||||||
|
|
@ -19,13 +17,13 @@ func EndpointAccess(w http.ResponseWriter, r *http.Request) bool {
|
||||||
|
|
||||||
if (isLocal(ip) && isEndpointAllowed("Local", r.URL.Path)) ||
|
if (isLocal(ip) && isEndpointAllowed("Local", r.URL.Path)) ||
|
||||||
(isLanRemote(ip) && isEndpointAllowed("Remote", r.URL.Path)) {
|
(isLanRemote(ip) && isEndpointAllowed("Remote", r.URL.Path)) {
|
||||||
log.Println("accessible")
|
log.Println(r.URL.Path, "endpoint access: accessible")
|
||||||
return true
|
return true
|
||||||
} else if isLanRemote(ip) && isEndpointAllowed("auth", r.URL.Path) && isDeviceAuthorized() {
|
} else if isLanRemote(ip) && isEndpointAllowed("auth", r.URL.Path) && isDeviceAuthorized() {
|
||||||
log.Println("authorized")
|
log.Println(r.URL.Path, "endpoint access: authorized")
|
||||||
}
|
}
|
||||||
|
|
||||||
log.Println(r.URL.Path, "not authorized or accessible")
|
log.Println(r.URL.Path, "endpoint access: not authorized or accessible")
|
||||||
|
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
|
||||||
27
be/app/helper/device-helper.go
Normal file
27
be/app/helper/device-helper.go
Normal file
|
|
@ -0,0 +1,27 @@
|
||||||
|
package helper
|
||||||
|
|
||||||
|
import (
|
||||||
|
"log"
|
||||||
|
"os"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TempPinFile(Uuid string, pin string) bool {
|
||||||
|
log.Println("temp pin file", Uuid, pin)
|
||||||
|
err := os.WriteFile("devices/"+Uuid+".tmp", []byte(pin), 0644)
|
||||||
|
if err != nil {
|
||||||
|
log.Println(err)
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
time.AfterFunc(1*time.Minute, func() {
|
||||||
|
log.Println("deleting", Uuid, pin)
|
||||||
|
os.Remove("devices/" + Uuid + ".tmp")
|
||||||
|
})
|
||||||
|
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
func CheckPinFile(encryptedData []byte) bool {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
@ -15,11 +15,17 @@ var Endpoints = Allowed{
|
||||||
"/device/list",
|
"/device/list",
|
||||||
"/device/access/check",
|
"/device/access/check",
|
||||||
"/device/access/request",
|
"/device/access/request",
|
||||||
|
"/device/link/ping",
|
||||||
|
"/device/link/start",
|
||||||
|
"/device/handshake",
|
||||||
},
|
},
|
||||||
Remote: []string{
|
Remote: []string{
|
||||||
"/macro/list",
|
"/macro/list",
|
||||||
"/device/access/check",
|
"/device/access/check",
|
||||||
"/device/access/request",
|
"/device/access/request",
|
||||||
|
"/device/link/ping",
|
||||||
|
"/device/link/end",
|
||||||
|
"/device/handshake",
|
||||||
"/device/auth",
|
"/device/auth",
|
||||||
},
|
},
|
||||||
Auth: []string{
|
Auth: []string{
|
||||||
|
|
|
||||||
|
|
@ -9,3 +9,17 @@ type RemoteWebhook struct {
|
||||||
Event string `json:"event"`
|
Event string `json:"event"`
|
||||||
Data string `json:"data"`
|
Data string `json:"data"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type Check struct {
|
||||||
|
Uuid string `json:"uuid"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type Request struct {
|
||||||
|
Uuid string `json:"uuid"`
|
||||||
|
Name string `json:"name"`
|
||||||
|
Type string `json:"type"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type Handshake struct {
|
||||||
|
Shake string `json:"shake"`
|
||||||
|
}
|
||||||
|
|
|
||||||
1
be/devices/a42e16a8-0e99-4bb9-a93f-363740c45b24.json
Normal file
1
be/devices/a42e16a8-0e99-4bb9-a93f-363740c45b24.json
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
{"name":"Unknown desktop","type":"desktop"}
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
{ "name": "moto g84 5G", "type": "phone" }
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
{ "name": "Samsung Galaxy A-tab 8\"", "type": "tablet" }
|
|
||||||
|
|
@ -2,18 +2,20 @@ module be
|
||||||
|
|
||||||
go 1.24.0
|
go 1.24.0
|
||||||
|
|
||||||
|
require github.com/go-vgo/robotgo v0.110.6
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/dblohm7/wingoes v0.0.0-20240820181039-f2b84150679e // indirect
|
github.com/dblohm7/wingoes v0.0.0-20240820181039-f2b84150679e // indirect
|
||||||
github.com/ebitengine/purego v0.8.2 // indirect
|
github.com/ebitengine/purego v0.8.2 // indirect
|
||||||
github.com/gen2brain/shm v0.1.1 // indirect
|
github.com/gen2brain/shm v0.1.1 // indirect
|
||||||
github.com/go-ole/go-ole v1.3.0 // indirect
|
github.com/go-ole/go-ole v1.3.0 // indirect
|
||||||
github.com/go-vgo/robotgo v0.110.6 // indirect
|
|
||||||
github.com/godbus/dbus/v5 v5.1.0 // indirect
|
github.com/godbus/dbus/v5 v5.1.0 // indirect
|
||||||
github.com/jezek/xgb v1.1.1 // indirect
|
github.com/jezek/xgb v1.1.1 // indirect
|
||||||
github.com/kbinani/screenshot v0.0.0-20250118074034-a3924b7bbc8c // indirect
|
github.com/kbinani/screenshot v0.0.0-20250118074034-a3924b7bbc8c // indirect
|
||||||
github.com/lufia/plan9stats v0.0.0-20240909124753-873cd0166683 // indirect
|
github.com/lufia/plan9stats v0.0.0-20240909124753-873cd0166683 // indirect
|
||||||
github.com/lxn/win v0.0.0-20210218163916-a377121e959e // indirect
|
github.com/lxn/win v0.0.0-20210218163916-a377121e959e // indirect
|
||||||
github.com/otiai10/gosseract v2.2.1+incompatible // indirect
|
github.com/otiai10/gosseract v2.2.1+incompatible // indirect
|
||||||
|
github.com/otiai10/mint v1.6.3 // indirect
|
||||||
github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect
|
github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect
|
||||||
github.com/robotn/xgb v0.10.0 // indirect
|
github.com/robotn/xgb v0.10.0 // indirect
|
||||||
github.com/robotn/xgbutil v0.10.0 // indirect
|
github.com/robotn/xgbutil v0.10.0 // indirect
|
||||||
|
|
@ -28,5 +30,6 @@ require (
|
||||||
github.com/yusufpapurcu/wmi v1.2.4 // indirect
|
github.com/yusufpapurcu/wmi v1.2.4 // indirect
|
||||||
golang.org/x/exp v0.0.0-20250215185904-eff6e970281f // indirect
|
golang.org/x/exp v0.0.0-20250215185904-eff6e970281f // indirect
|
||||||
golang.org/x/image v0.24.0 // indirect
|
golang.org/x/image v0.24.0 // indirect
|
||||||
golang.org/x/sys v0.30.0 // indirect
|
golang.org/x/net v0.37.0 // indirect
|
||||||
|
golang.org/x/sys v0.31.0 // indirect
|
||||||
)
|
)
|
||||||
|
|
|
||||||
21
be/go.sum
21
be/go.sum
|
|
@ -1,5 +1,7 @@
|
||||||
github.com/BurntSushi/freetype-go v0.0.0-20160129220410-b763ddbfe298/go.mod h1:D+QujdIlUNfa0igpNMk6UIvlb6C252URs4yupRUV4lQ=
|
github.com/BurntSushi/freetype-go v0.0.0-20160129220410-b763ddbfe298/go.mod h1:D+QujdIlUNfa0igpNMk6UIvlb6C252URs4yupRUV4lQ=
|
||||||
github.com/BurntSushi/graphics-go v0.0.0-20160129215708-b43f31a4a966/go.mod h1:Mid70uvE93zn9wgF92A/r5ixgnvX8Lh68fxp9KQBaI0=
|
github.com/BurntSushi/graphics-go v0.0.0-20160129215708-b43f31a4a966/go.mod h1:Mid70uvE93zn9wgF92A/r5ixgnvX8Lh68fxp9KQBaI0=
|
||||||
|
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||||
|
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
github.com/dblohm7/wingoes v0.0.0-20240820181039-f2b84150679e h1:L+XrFvD0vBIBm+Wf9sFN6aU395t7JROoai0qXZraA4U=
|
github.com/dblohm7/wingoes v0.0.0-20240820181039-f2b84150679e h1:L+XrFvD0vBIBm+Wf9sFN6aU395t7JROoai0qXZraA4U=
|
||||||
github.com/dblohm7/wingoes v0.0.0-20240820181039-f2b84150679e/go.mod h1:SUxUaAK/0UG5lYyZR1L1nC4AaYYvSSYTWQSH3FPcxKU=
|
github.com/dblohm7/wingoes v0.0.0-20240820181039-f2b84150679e/go.mod h1:SUxUaAK/0UG5lYyZR1L1nC4AaYYvSSYTWQSH3FPcxKU=
|
||||||
github.com/ebitengine/purego v0.8.2 h1:jPPGWs2sZ1UgOSgD2bClL0MJIqu58nOmIcBuXr62z1I=
|
github.com/ebitengine/purego v0.8.2 h1:jPPGWs2sZ1UgOSgD2bClL0MJIqu58nOmIcBuXr62z1I=
|
||||||
|
|
@ -13,6 +15,7 @@ github.com/go-vgo/robotgo v0.110.6 h1:1tOxlmTXYg6F3Xs8IT++331MxY2nZ+Q3B6eW312llb
|
||||||
github.com/go-vgo/robotgo v0.110.6/go.mod h1:eBUjTHY1HYjzdi1+UWJUbxB+b9gE+l4Ei7vQU/9SnLw=
|
github.com/go-vgo/robotgo v0.110.6/go.mod h1:eBUjTHY1HYjzdi1+UWJUbxB+b9gE+l4Ei7vQU/9SnLw=
|
||||||
github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk=
|
github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk=
|
||||||
github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
|
github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
|
||||||
|
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/jezek/xgb v1.1.1 h1:bE/r8ZZtSv7l9gk6nU0mYx51aXrvnyb44892TwSaqS4=
|
github.com/jezek/xgb v1.1.1 h1:bE/r8ZZtSv7l9gk6nU0mYx51aXrvnyb44892TwSaqS4=
|
||||||
github.com/jezek/xgb v1.1.1/go.mod h1:nrhwO0FX/enq75I7Y7G8iN1ubpSGZEiA3v9e9GyRFlk=
|
github.com/jezek/xgb v1.1.1/go.mod h1:nrhwO0FX/enq75I7Y7G8iN1ubpSGZEiA3v9e9GyRFlk=
|
||||||
|
|
@ -22,8 +25,14 @@ github.com/lufia/plan9stats v0.0.0-20240909124753-873cd0166683 h1:7UMa6KCCMjZEMD
|
||||||
github.com/lufia/plan9stats v0.0.0-20240909124753-873cd0166683/go.mod h1:ilwx/Dta8jXAgpFYFvSWEMwxmbWXyiUHkd5FwyKhb5k=
|
github.com/lufia/plan9stats v0.0.0-20240909124753-873cd0166683/go.mod h1:ilwx/Dta8jXAgpFYFvSWEMwxmbWXyiUHkd5FwyKhb5k=
|
||||||
github.com/lxn/win v0.0.0-20210218163916-a377121e959e h1:H+t6A/QJMbhCSEH5rAuRxh+CtW96g0Or0Fxa9IKr4uc=
|
github.com/lxn/win v0.0.0-20210218163916-a377121e959e h1:H+t6A/QJMbhCSEH5rAuRxh+CtW96g0Or0Fxa9IKr4uc=
|
||||||
github.com/lxn/win v0.0.0-20210218163916-a377121e959e/go.mod h1:KxxjdtRkfNoYDCUP5ryK7XJJNTnpC8atvtmTheChOtk=
|
github.com/lxn/win v0.0.0-20210218163916-a377121e959e/go.mod h1:KxxjdtRkfNoYDCUP5ryK7XJJNTnpC8atvtmTheChOtk=
|
||||||
|
github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 h1:zYyBkD/k9seD2A7fsi6Oo2LfFZAehjjQMERAvZLEDnQ=
|
||||||
|
github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646/go.mod h1:jpp1/29i3P1S/RLdc7JQKbRpFeM1dOBd8T9ki5s+AY8=
|
||||||
github.com/otiai10/gosseract v2.2.1+incompatible h1:Ry5ltVdpdp4LAa2bMjsSJH34XHVOV7XMi41HtzL8X2I=
|
github.com/otiai10/gosseract v2.2.1+incompatible h1:Ry5ltVdpdp4LAa2bMjsSJH34XHVOV7XMi41HtzL8X2I=
|
||||||
github.com/otiai10/gosseract v2.2.1+incompatible/go.mod h1:XrzWItCzCpFRZ35n3YtVTgq5bLAhFIkascoRo8G32QE=
|
github.com/otiai10/gosseract v2.2.1+incompatible/go.mod h1:XrzWItCzCpFRZ35n3YtVTgq5bLAhFIkascoRo8G32QE=
|
||||||
|
github.com/otiai10/mint v1.6.3 h1:87qsV/aw1F5as1eH1zS/yqHY85ANKVMgkDrf9rcxbQs=
|
||||||
|
github.com/otiai10/mint v1.6.3/go.mod h1:MJm72SBthJjz8qhefc4z1PYEieWmy8Bku7CjcAqyUSM=
|
||||||
|
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||||
|
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||||
github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU=
|
github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU=
|
||||||
github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE=
|
github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE=
|
||||||
github.com/robotn/xgb v0.0.0-20190912153532-2cb92d044934/go.mod h1:SxQhJskUJ4rleVU44YvnrdvxQr0tKy5SRSigBrCgyyQ=
|
github.com/robotn/xgb v0.0.0-20190912153532-2cb92d044934/go.mod h1:SxQhJskUJ4rleVU44YvnrdvxQr0tKy5SRSigBrCgyyQ=
|
||||||
|
|
@ -33,8 +42,12 @@ github.com/robotn/xgbutil v0.10.0 h1:gvf7mGQqCWQ68aHRtCxgdewRk+/KAJui6l3MJQQRCKw
|
||||||
github.com/robotn/xgbutil v0.10.0/go.mod h1:svkDXUDQjUiWzLrA0OZgHc4lbOts3C+uRfP6/yjwYnU=
|
github.com/robotn/xgbutil v0.10.0/go.mod h1:svkDXUDQjUiWzLrA0OZgHc4lbOts3C+uRfP6/yjwYnU=
|
||||||
github.com/shirou/gopsutil/v4 v4.25.1 h1:QSWkTc+fu9LTAWfkZwZ6j8MSUk4A2LV7rbH0ZqmLjXs=
|
github.com/shirou/gopsutil/v4 v4.25.1 h1:QSWkTc+fu9LTAWfkZwZ6j8MSUk4A2LV7rbH0ZqmLjXs=
|
||||||
github.com/shirou/gopsutil/v4 v4.25.1/go.mod h1:RoUCUpndaJFtT+2zsZzzmhvbfGoDCJ7nFXKJf8GqJbI=
|
github.com/shirou/gopsutil/v4 v4.25.1/go.mod h1:RoUCUpndaJFtT+2zsZzzmhvbfGoDCJ7nFXKJf8GqJbI=
|
||||||
|
github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
|
||||||
|
github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
|
||||||
github.com/tailscale/win v0.0.0-20250213223159-5992cb43ca35 h1:wAZbkTZkqDzWsqxPh2qkBd3KvFU7tcxV0BP0Rnhkxog=
|
github.com/tailscale/win v0.0.0-20250213223159-5992cb43ca35 h1:wAZbkTZkqDzWsqxPh2qkBd3KvFU7tcxV0BP0Rnhkxog=
|
||||||
github.com/tailscale/win v0.0.0-20250213223159-5992cb43ca35/go.mod h1:aMd4yDHLjbOuYP6fMxj1d9ACDQlSWwYztcpybGHCQc8=
|
github.com/tailscale/win v0.0.0-20250213223159-5992cb43ca35/go.mod h1:aMd4yDHLjbOuYP6fMxj1d9ACDQlSWwYztcpybGHCQc8=
|
||||||
|
github.com/tc-hib/winres v0.2.1 h1:YDE0FiP0VmtRaDn7+aaChp1KiF4owBiJa5l964l5ujA=
|
||||||
|
github.com/tc-hib/winres v0.2.1/go.mod h1:C/JaNhH3KBvhNKVbvdlDWkbMDO9H4fKKDaN7/07SSuk=
|
||||||
github.com/tklauser/go-sysconf v0.3.14 h1:g5vzr9iPFFz24v2KZXs/pvpvh8/V9Fw6vQK5ZZb78yU=
|
github.com/tklauser/go-sysconf v0.3.14 h1:g5vzr9iPFFz24v2KZXs/pvpvh8/V9Fw6vQK5ZZb78yU=
|
||||||
github.com/tklauser/go-sysconf v0.3.14/go.mod h1:1ym4lWMLUOhuBOPGtRcJm7tEGX4SCYNEEEtghGG/8uY=
|
github.com/tklauser/go-sysconf v0.3.14/go.mod h1:1ym4lWMLUOhuBOPGtRcJm7tEGX4SCYNEEEtghGG/8uY=
|
||||||
github.com/tklauser/numcpus v0.9.0 h1:lmyCHtANi8aRUgkckBgoDk1nHCux3n2cgkJLXdQGPDo=
|
github.com/tklauser/numcpus v0.9.0 h1:lmyCHtANi8aRUgkckBgoDk1nHCux3n2cgkJLXdQGPDo=
|
||||||
|
|
@ -53,9 +66,13 @@ golang.org/x/exp v0.0.0-20250215185904-eff6e970281f h1:oFMYAjX0867ZD2jcNiLBrI9Bd
|
||||||
golang.org/x/exp v0.0.0-20250215185904-eff6e970281f/go.mod h1:BHOTPb3L19zxehTsLoJXVaTktb06DFgmdW6Wb9s8jqk=
|
golang.org/x/exp v0.0.0-20250215185904-eff6e970281f/go.mod h1:BHOTPb3L19zxehTsLoJXVaTktb06DFgmdW6Wb9s8jqk=
|
||||||
golang.org/x/image v0.24.0 h1:AN7zRgVsbvmTfNyqIbbOraYL8mSwcKncEj8ofjgzcMQ=
|
golang.org/x/image v0.24.0 h1:AN7zRgVsbvmTfNyqIbbOraYL8mSwcKncEj8ofjgzcMQ=
|
||||||
golang.org/x/image v0.24.0/go.mod h1:4b/ITuLfqYq1hqZcjofwctIhi7sZh2WaCjvsBNjjya8=
|
golang.org/x/image v0.24.0/go.mod h1:4b/ITuLfqYq1hqZcjofwctIhi7sZh2WaCjvsBNjjya8=
|
||||||
|
golang.org/x/net v0.37.0 h1:1zLorHbz+LYj7MQlSf1+2tPIIgibq2eL5xkrGk6f+2c=
|
||||||
|
golang.org/x/net v0.37.0/go.mod h1:ivrbrMbzFq5J41QOQh0siUuly180yBYtLp+CKbEaFx8=
|
||||||
golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20201018230417-eeed37f84f13/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20201018230417-eeed37f84f13/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc=
|
golang.org/x/sys v0.31.0 h1:ioabZlmFYtWhL+TRYpcnNlLwhyxaM9kWTDEmfnprqik=
|
||||||
golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
golang.org/x/sys v0.31.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
|
||||||
|
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
||||||
|
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||||
|
|
|
||||||
22
be/main.go
22
be/main.go
|
|
@ -9,18 +9,18 @@ import (
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
|
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
apiInit(w, r)
|
||||||
app.ApiCORS(w, r)
|
|
||||||
|
|
||||||
if r.Method == "GET" {
|
|
||||||
app.ApiGet(w, r)
|
|
||||||
} else if r.Method == "POST" {
|
|
||||||
app.ApiPost(w, r)
|
|
||||||
}
|
|
||||||
|
|
||||||
})
|
})
|
||||||
|
|
||||||
// helper.OpenBrowser("http://localhost:6970")
|
|
||||||
|
|
||||||
log.Fatal(http.ListenAndServe(":6970", nil))
|
log.Fatal(http.ListenAndServe(":6970", nil))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func apiInit(w http.ResponseWriter, r *http.Request) {
|
||||||
|
app.ApiCORS(w, r)
|
||||||
|
|
||||||
|
if r.Method == "GET" {
|
||||||
|
app.ApiGet(w, r)
|
||||||
|
} else if r.Method == "POST" {
|
||||||
|
app.ApiPost(w, r)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
18
be/server.crt
Normal file
18
be/server.crt
Normal file
|
|
@ -0,0 +1,18 @@
|
||||||
|
-----BEGIN CERTIFICATE-----
|
||||||
|
MIIC8zCCAdugAwIBAgIBATANBgkqhkiG9w0BAQsFADAZMRcwFQYDVQQKEw5NYWNy
|
||||||
|
YW1lLVNlcnZlcjAeFw0yNTAzMjMxODU4NDhaFw0yNjAzMjMxODU4NDhaMBkxFzAV
|
||||||
|
BgNVBAoTDk1hY3JhbWUtU2VydmVyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
|
||||||
|
CgKCAQEApUcSJKGZjS6ctwOvuGMNDr9bvKQSkHWHeXlhdA8l8MX/kpSBdqe88024
|
||||||
|
7W4lH8SAp9cygEghQX36+DDyGviINBwgmFL5YCTOE1icLvR3MRUjqo8mNplPvClX
|
||||||
|
pH9b90QhZbUn4oKPj7iF71+ti3h+zw0Gv9zAJT7tUKewUO1vQ+oB9QSUpux2tABH
|
||||||
|
mfyGKeojcRoOQg5Ni4oGTiAhm8IIzh/tLRYvZ/fKf+LZp6FoVZkSYytdxT1Pebi/
|
||||||
|
7sK8u1u08Ruot1FvsfurrQMfEOYgZ5Ueqrw+hmG3nG+gHcrgd6HR6tqj1bidp0gw
|
||||||
|
X5WU3fz99EvwDWCo6SkLsO8ie5zF4QIDAQABo0YwRDAOBgNVHQ8BAf8EBAMCBaAw
|
||||||
|
EwYDVR0lBAwwCgYIKwYBBQUHAwEwHQYDVR0OBBYEFEGrgTy900AkXr0fdWN4BnT/
|
||||||
|
uE5OMA0GCSqGSIb3DQEBCwUAA4IBAQAipP80Twc6eg48A9WAk72o8oZiFFxxXGiU
|
||||||
|
AFikYcOGgJb4yHCjk7lf2szm0yARpH2/XIh6XPZSDWWgHSk3/BnwH8wDGCotJINX
|
||||||
|
S0481tISQeOMSzWxkbNg8sfGyUofQpaejrdKjdGL9NvRo5rj2aHMM189VidOJVZa
|
||||||
|
PASYLqDnkFY+np5FJgz0UCr0gg+q0TsW3vvzpebzJWP6EL6fFeHr3q3OAcJ9WmTy
|
||||||
|
c1xrngrKsJt8tYdy7yQrW6ZBe0xNyuB0DJlS6snmT88DJO8Ro7DqSwdtDbEb/IBZ
|
||||||
|
hbsers+al0FqVutJzINE3LVsVARqJNa0xZNqXRk5yzO8iFsMrugt
|
||||||
|
-----END CERTIFICATE-----
|
||||||
27
be/server.key
Normal file
27
be/server.key
Normal file
|
|
@ -0,0 +1,27 @@
|
||||||
|
-----BEGIN RSA PRIVATE KEY-----
|
||||||
|
MIIEpAIBAAKCAQEApUcSJKGZjS6ctwOvuGMNDr9bvKQSkHWHeXlhdA8l8MX/kpSB
|
||||||
|
dqe880247W4lH8SAp9cygEghQX36+DDyGviINBwgmFL5YCTOE1icLvR3MRUjqo8m
|
||||||
|
NplPvClXpH9b90QhZbUn4oKPj7iF71+ti3h+zw0Gv9zAJT7tUKewUO1vQ+oB9QSU
|
||||||
|
pux2tABHmfyGKeojcRoOQg5Ni4oGTiAhm8IIzh/tLRYvZ/fKf+LZp6FoVZkSYytd
|
||||||
|
xT1Pebi/7sK8u1u08Ruot1FvsfurrQMfEOYgZ5Ueqrw+hmG3nG+gHcrgd6HR6tqj
|
||||||
|
1bidp0gwX5WU3fz99EvwDWCo6SkLsO8ie5zF4QIDAQABAoIBAA4rvXBe2zKt1RHD
|
||||||
|
iwbXFkzmBxxx4GYar6CQkdSgwl7mKRs1KLMG34ZoavNPkvcJ8wKBCuNRG+nYvoKW
|
||||||
|
dsGtfsciBMDut1NBIJqryatkek4+6uGSN8NtanbegBVadqUJJkhpS4fKLDs1ReWP
|
||||||
|
6Wo4jP3ddu9PIvnmjvQwBofvza8Pv2qu+QQMtwQN9bjV9aD91gogiij0d3Md7D1n
|
||||||
|
WvXFCRO470ZvU8+EEs6IqEStH/MM979EiukXTxsggeDCNkPy5nqXnZHpByVPgdpI
|
||||||
|
UIelsK+6DO/DW8zPySCiMQ0rIet10ebiUHOOktD0bMl2ZTDRRFUBI0sN8MGMToZs
|
||||||
|
jMhFRZkCgYEA1Tbrrev7+V1nXPkMEWo7XwXgDn4tFsTHC6YcJ+jqVstmlk9uxNbK
|
||||||
|
mu4+6WS9Xp8JM8KD+NG2P8qx6YE/mjCTpsn7CpOisPi28QHiREcGxs7Yu3ocAPUt
|
||||||
|
Ow8CtonNwl1SL8naaOztb+UcqqA7cLb28GE1Dcu3nOXdbJJQVkUWH2kCgYEAxnGT
|
||||||
|
ORaDZXV8u0ebhOhBGbHsog6OWk19fdbOQDTVRr4Ju8LyOsQdzP35kzoEc/KxHSnI
|
||||||
|
o2xZwuFenhrpBSkrjCDwQtyCf9CDdjWCzZEf8VVpgMh6CWIjlNJjAxX/yka4SbUQ
|
||||||
|
ADxRlp81tfzkw37kJootp8GMzyWgb+eTh5TQG7kCgYEAmIN7nGIkUKCmklO3dTGX
|
||||||
|
HIaYWeWZnSLO+p8snsO19LX0QOq64mR+csqfB9Y+u1NpgrPOMQrZodH853nDpCjB
|
||||||
|
RVpPj6ZBhvOx8L2XO53O1CEb2Sckpu66FvfKygXSwAh/BJ4P9GQeB59MnSSWwC6w
|
||||||
|
fwwZpi+lvL6UX9hdTQiIJZkCgYEAhohM9PDsV4ZU72pWZr5GFDNpZ1xS6amLIBrW
|
||||||
|
bPTkejcvxhkduvVl9qlf343/otOve0Puf8xe9h1v1eQMgbEtkqxp9gokdp5X4XXZ
|
||||||
|
nZ97dlMfWW2QPnhIAwa2lUr+xJU5Ls8Pb/l0npaFBUHTnS2TYwVeelJfMbgiknr+
|
||||||
|
q3YZuBECgYA0IT6MksocvQ3iTU4HhzCCzKF1C13L7b6ymYo8wovGA8H4YF91D7mn
|
||||||
|
ADtXTMbYmOyZ6CBA5aO8Jiu0sgjSH/czPJ7DyI5a0RIfBelDBjDBrTQ4VJK4SGn4
|
||||||
|
8uX5v39/DPklwk6fGqx1dhLk0luZb5b11OaPhbrz2RmPggdiyo2LZw==
|
||||||
|
-----END RSA PRIVATE KEY-----
|
||||||
Loading…
Add table
Add a link
Reference in a new issue