mirror of
https://github.com/MengMengCode/CLICD.git
synced 2026-08-05 05:36:07 +08:00
81 lines
2.4 KiB
Go
81 lines
2.4 KiB
Go
package api
|
|
|
|
import (
|
|
"encoding/json"
|
|
"net/http"
|
|
"strings"
|
|
|
|
"clicd/internal/config"
|
|
)
|
|
|
|
type webSSHOriginSettingsRequest struct {
|
|
Origins []string `json:"origins"`
|
|
WebSSHAllowedOrigins []string `json:"webssh_allowed_origins"`
|
|
}
|
|
|
|
type webSSHOriginSettingsResponse struct {
|
|
Origins []string `json:"origins"`
|
|
CurrentOrigin string `json:"current_origin,omitempty"`
|
|
}
|
|
|
|
func HandleWebSSHOriginSettings(w http.ResponseWriter, r *http.Request) {
|
|
switch r.Method {
|
|
case http.MethodGet:
|
|
jsonResponse(w, http.StatusOK, APIResponse{Success: true, Data: webSSHOriginSettingsStatus(r)})
|
|
case http.MethodPut:
|
|
updateWebSSHOriginSettings(w, r)
|
|
default:
|
|
jsonResponse(w, http.StatusMethodNotAllowed, APIResponse{Success: false, Message: "Method not allowed"})
|
|
}
|
|
}
|
|
|
|
func updateWebSSHOriginSettings(w http.ResponseWriter, r *http.Request) {
|
|
var req webSSHOriginSettingsRequest
|
|
if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
|
|
jsonResponse(w, http.StatusBadRequest, APIResponse{Success: false, Message: "Invalid request body"})
|
|
return
|
|
}
|
|
origins := req.Origins
|
|
if len(origins) == 0 && len(req.WebSSHAllowedOrigins) > 0 {
|
|
origins = req.WebSSHAllowedOrigins
|
|
}
|
|
normalized, err := config.NormalizeAllowedOrigins(origins)
|
|
if err != nil {
|
|
jsonResponse(w, http.StatusBadRequest, APIResponse{Success: false, Message: err.Error()})
|
|
return
|
|
}
|
|
config.AppConfig.WebSSHAllowedOrigins = normalized
|
|
if err := config.SaveConfig(); err != nil {
|
|
jsonResponse(w, http.StatusInternalServerError, APIResponse{Success: false, Message: "Save Origin allowlist failed"})
|
|
return
|
|
}
|
|
auditRequest(r, "settings.webssh_origins", "WebSSH Origin", "origins="+strings.Join(normalized, ","), true, "")
|
|
jsonResponse(w, http.StatusOK, APIResponse{Success: true, Message: "Origin allowlist saved", Data: webSSHOriginSettingsStatus(r)})
|
|
}
|
|
|
|
func webSSHOriginSettingsStatus(r *http.Request) webSSHOriginSettingsResponse {
|
|
origins := config.AppConfig.WebSSHAllowedOrigins
|
|
if origins == nil {
|
|
origins = []string{}
|
|
}
|
|
return webSSHOriginSettingsResponse{
|
|
Origins: origins,
|
|
CurrentOrigin: requestOrigin(r),
|
|
}
|
|
}
|
|
|
|
func requestOrigin(r *http.Request) string {
|
|
host := strings.TrimSpace(r.Host)
|
|
if host == "" {
|
|
return ""
|
|
}
|
|
scheme := "http"
|
|
if r.TLS != nil {
|
|
scheme = "https"
|
|
}
|
|
if forwarded := strings.TrimSpace(r.Header.Get("X-Forwarded-Proto")); forwarded != "" {
|
|
scheme = strings.ToLower(strings.Split(forwarded, ",")[0])
|
|
}
|
|
return scheme + "://" + host
|
|
}
|