The structure of converge server is now much more clear in the package // structure below pkg/server.
71 lines
2.0 KiB
Go
71 lines
2.0 KiB
Go
package ui
|
|
|
|
import (
|
|
"fmt"
|
|
"github.com/gliderlabs/ssh"
|
|
"math/rand"
|
|
"net/http"
|
|
"regexp"
|
|
"strconv"
|
|
"strings"
|
|
)
|
|
|
|
func GenerateCLIExammples(w http.ResponseWriter, r *http.Request) {
|
|
err := r.ParseForm()
|
|
if err != nil {
|
|
http.Error(w, "Error parsing form", http.StatusBadRequest)
|
|
return
|
|
}
|
|
id := r.FormValue("rendez-vous-id")
|
|
generatedId := false
|
|
if id == "" {
|
|
id = strconv.Itoa(rand.Int() % 1000000)
|
|
generatedId = true
|
|
}
|
|
|
|
remoteShells := r.Form["remote-shell"]
|
|
localShells := r.Form["local-shell"]
|
|
keysString := r.FormValue("ssh-keys")
|
|
access := getConvergeAccess(r)
|
|
|
|
downloadCommand := r.FormValue("download-command")
|
|
certificateValidation := r.FormValue("certificate-validation") != ""
|
|
sshPublicKeys := strings.Split(keysString, "\n")
|
|
usageInputs := NewUsageInputs(id, sshPublicKeys, remoteShells, localShells, downloadCommand,
|
|
certificateValidation)
|
|
if generatedId {
|
|
usageInputs.ErrorMessages = append(usageInputs.ErrorMessages, "rendez-vous id is randomly generated, changes on every page refresh")
|
|
}
|
|
matched, _ := regexp.MatchString("^[a-zA-Z0-9-_]+$", id)
|
|
if !matched {
|
|
usageInputs.ErrorMessages = append(usageInputs.ErrorMessages, "ID may consist only of alphanumeric characters, '-', and '_'")
|
|
}
|
|
validPubKeys := 0
|
|
for index, pubkey := range sshPublicKeys {
|
|
pubkey = strings.TrimSpace(pubkey)
|
|
if pubkey == "" {
|
|
continue
|
|
}
|
|
_, _, _, _, err := ssh.ParseAuthorizedKey([]byte(pubkey))
|
|
if err != nil {
|
|
keysummary := pubkey
|
|
if len(pubkey) > 45 {
|
|
keysummary = keysummary[:20] + " ... " + keysummary[len(pubkey)-20:]
|
|
}
|
|
usageInputs.ErrorMessages = append(usageInputs.ErrorMessages,
|
|
fmt.Sprintf("ssh public key line %d: %s: %s", index+1, keysummary, err.Error()))
|
|
} else {
|
|
validPubKeys++
|
|
}
|
|
}
|
|
if validPubKeys == 0 {
|
|
usageInputs.ErrorMessages = append(usageInputs.ErrorMessages,
|
|
"No valid public keys configured. Without these the agent will not work.")
|
|
}
|
|
|
|
err = ShellUsage(access, usageInputs).Render(r.Context(), w)
|
|
if err != nil {
|
|
http.Error(w, err.Error(), 500)
|
|
}
|
|
}
|