mirror of
https://github.com/luscis/openlan.git
synced 2025-10-06 17:17:00 +08:00
fea: support import profile from openvpn client
This commit is contained in:
70
pkg/api/openapi.go
Executable file
70
pkg/api/openapi.go
Executable file
@@ -0,0 +1,70 @@
|
|||||||
|
package api
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"net/http"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"github.com/gorilla/mux"
|
||||||
|
"github.com/luscis/openlan/pkg/cache"
|
||||||
|
)
|
||||||
|
|
||||||
|
type OpenAPI struct {
|
||||||
|
}
|
||||||
|
|
||||||
|
func (h OpenAPI) Router(router *mux.Router) {
|
||||||
|
router.HandleFunc("/openvpn-api/profile", h.Get).Methods("HEAD")
|
||||||
|
router.HandleFunc("/rest/{action}", h.Rest).Methods("GET")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (h OpenAPI) Get(w http.ResponseWriter, r *http.Request) {
|
||||||
|
w.Write([]byte("TODO"))
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetNetwork(name string) string {
|
||||||
|
values := strings.SplitN(name, "@", 2)
|
||||||
|
if len(values) < 2 {
|
||||||
|
return "default"
|
||||||
|
}
|
||||||
|
return values[1]
|
||||||
|
}
|
||||||
|
|
||||||
|
func (h OpenAPI) Error(w http.ResponseWriter, kind, message string) {
|
||||||
|
w.Header().Set("Content-Type", "text/xml")
|
||||||
|
context := fmt.Sprintf(`<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<Error>
|
||||||
|
<Type>%s</Type>
|
||||||
|
<Synopsis>REST method failed</Synopsis>
|
||||||
|
<Message>%s</Message>
|
||||||
|
</Error>
|
||||||
|
`, kind, message)
|
||||||
|
_, _ = w.Write([]byte(context))
|
||||||
|
}
|
||||||
|
|
||||||
|
func (h OpenAPI) Rest(w http.ResponseWriter, r *http.Request) {
|
||||||
|
vars := mux.Vars(r)
|
||||||
|
|
||||||
|
user, pass, ok := r.BasicAuth()
|
||||||
|
if !ok {
|
||||||
|
h.Error(w, "Authorization Required", "AUTH: not have auth")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if UserCheck(user, pass) != nil {
|
||||||
|
h.Error(w, "Authorization Required", "AUTH: wrong username or password")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
name := GetNetwork(user)
|
||||||
|
server := strings.SplitN(r.Host, ":", 2)[0]
|
||||||
|
|
||||||
|
data, _ := cache.VPNClient.GetClientProfile(name, server)
|
||||||
|
|
||||||
|
action := vars["action"]
|
||||||
|
if action == "GetUserlogin" {
|
||||||
|
w.Header().Set("Content-Type", "text/plain")
|
||||||
|
_, _ = w.Write([]byte(data))
|
||||||
|
} else {
|
||||||
|
h.Error(w, "Internal Server Error", "ACTION: not support "+action)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
@@ -21,4 +21,5 @@ func Add(router *mux.Router, switcher Switcher) {
|
|||||||
Config{Switcher: switcher}.Router(router)
|
Config{Switcher: switcher}.Router(router)
|
||||||
Version{}.Router(router)
|
Version{}.Router(router)
|
||||||
Log{}.Router(router)
|
Log{}.Router(router)
|
||||||
|
OpenAPI{}.Router(router)
|
||||||
}
|
}
|
||||||
|
@@ -22,6 +22,16 @@ import (
|
|||||||
"github.com/luscis/openlan/pkg/schema"
|
"github.com/luscis/openlan/pkg/schema"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
func NotFound(w http.ResponseWriter, r *http.Request) {
|
||||||
|
libol.Info("NotFound %s %s", r.Method, r.URL.Path)
|
||||||
|
http.Error(w, "oops!!!", http.StatusNotFound)
|
||||||
|
}
|
||||||
|
|
||||||
|
func NotAllowed(w http.ResponseWriter, r *http.Request) {
|
||||||
|
libol.Info("NotAllowed %s %s", r.Method, r.URL.Path)
|
||||||
|
http.Error(w, "oops!!!", http.StatusMethodNotAllowed)
|
||||||
|
}
|
||||||
|
|
||||||
type Http struct {
|
type Http struct {
|
||||||
switcher api.Switcher
|
switcher api.Switcher
|
||||||
listen string
|
listen string
|
||||||
@@ -89,6 +99,8 @@ func (h *Http) Middleware(next http.Handler) http.Handler {
|
|||||||
func (h *Http) Router() *mux.Router {
|
func (h *Http) Router() *mux.Router {
|
||||||
if h.router == nil {
|
if h.router == nil {
|
||||||
h.router = mux.NewRouter()
|
h.router = mux.NewRouter()
|
||||||
|
h.router.NotFoundHandler = http.HandlerFunc(NotFound)
|
||||||
|
h.router.MethodNotAllowedHandler = http.HandlerFunc(NotAllowed)
|
||||||
h.router.Use(h.Middleware)
|
h.router.Use(h.Middleware)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -197,6 +209,9 @@ func (h *Http) IsAuth(w http.ResponseWriter, r *http.Request) bool {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if elements[1] == "openvpn-api" || elements[1] == "rest" {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user