You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

138 lines
3.0 KiB
Go

5 years ago
package service
import (
"io/ioutil"
"log"
5 years ago
"net/http"
"strings"
5 years ago
)
type Status int
const (
OK Status = iota
WAITING
ERROR
)
5 years ago
type HttpServer struct {
5 years ago
manager *Manager
status Status
}
type CreateCSRRequest struct {
*BaseMessage
5 years ago
Hostname string
}
type CreateCSRResponse struct {
*BaseMessage
5 years ago
CSR string `json:"csr"`
}
type UpdateOpenVPNConfigRequest struct {
*BaseMessage
5 years ago
Config string
}
type DeliverCertificateRequest struct {
*BaseMessage
5 years ago
Certificate string
}
5 years ago
func NewHttpServer(manager *Manager) *HttpServer {
return &HttpServer{manager, WAITING}
5 years ago
}
5 years ago
func (it *HttpServer) Start() {
5 years ago
http.HandleFunc("/", func(writer http.ResponseWriter, request *http.Request) {
log.Printf("%s /", strings.ToUpper(request.Method))
5 years ago
writer.WriteHeader(200)
writer.Write([]byte("Don't"))
})
http.HandleFunc("/create-csr", func(writer http.ResponseWriter, request *http.Request) {
log.Printf("%s /create-csr", strings.ToUpper(request.Method))
req := &CreateCSRRequest{
BaseMessage: &BaseMessage{""},
}
5 years ago
err := it.verifyRequest(request, req)
if err != nil {
5 years ago
log.Printf("Error on %s %s: %s", request.Method, request.URL.Path, err)
5 years ago
writer.WriteHeader(400)
return
}
csr, err := it.manager.CreateCSR(req.Hostname)
if err != nil {
writer.WriteHeader(500)
return
}
5 years ago
log.Printf("Sending CSR: %s", csr)
5 years ago
it.writeResponse(writer, CreateCSRResponse{
BaseMessage: &BaseMessage{""},
CSR: string(csr),
5 years ago
})
})
http.HandleFunc("/deliver-crt", func(writer http.ResponseWriter, request *http.Request) {
log.Printf("%s /deliver-crt", strings.ToUpper(request.Method))
req := &DeliverCertificateRequest{
BaseMessage: &BaseMessage{""},
}
5 years ago
err := it.verifyRequest(request, req)
if err != nil {
5 years ago
log.Printf("Error on %s %s: %s", request.Method, request.URL.Path, err)
5 years ago
writer.WriteHeader(400)
return
}
err = it.manager.UpdateCertificate(req.Certificate)
if err != nil {
writer.WriteHeader(500)
return
}
it.manager.openVPN.Start()
})
http.HandleFunc("/update-openvpn-config", func(writer http.ResponseWriter, request *http.Request) {
log.Printf("%s /update-openvpn-config", strings.ToUpper(request.Method))
req := &UpdateOpenVPNConfigRequest{
BaseMessage: &BaseMessage{""},
}
5 years ago
err := it.verifyRequest(request, req)
if err != nil {
5 years ago
log.Printf("Error on %s %s: %s", request.Method, request.URL.Path, err)
5 years ago
writer.WriteHeader(400)
return
}
err = it.manager.openVPN.UpdateConfig(req.Config)
if err != nil {
writer.WriteHeader(500)
return
}
it.manager.openVPN.Restart()
})
http.ListenAndServe(":7864", nil)
}
func (it *HttpServer) writeResponse(writer http.ResponseWriter, v Message) error {
5 years ago
return EncryptAndSign(v, it.manager.privateKey, it.manager.CAPublicKey(), it.manager.GetServerFingerprint(), writer)
5 years ago
}
func (it *HttpServer) verifyRequest(r *http.Request, v Message) (error) {
5 years ago
hexBody, err := ioutil.ReadAll(r.Body)
5 years ago
if err != nil {
return err
}
5 years ago
return DecryptAndVerify(hexBody, it.manager.privateKey, it.manager.CAPublicKey(), it.manager.GetServerFingerprint(), v)
5 years ago
}