Separate server code into multiple files
This commit is contained in:
parent
8ca9aeba69
commit
095c1c88a4
|
@ -1,7 +0,0 @@
|
|||
package main
|
||||
|
||||
import "fmt"
|
||||
|
||||
func main() {
|
||||
fmt.Println("Hello, World!")
|
||||
}
|
|
@ -0,0 +1,13 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"crypto/ed25519"
|
||||
"flag"
|
||||
)
|
||||
|
||||
func main() {
|
||||
flag.Parse()
|
||||
if flag.Arg(0) == "register" {
|
||||
|
||||
}
|
||||
}
|
|
@ -2,36 +2,15 @@ package main
|
|||
|
||||
import (
|
||||
"crypto/ed25519"
|
||||
"crypto/sha256"
|
||||
"encoding/hex"
|
||||
"flag"
|
||||
"encoding/base64"
|
||||
"fmt"
|
||||
"io"
|
||||
"log"
|
||||
"net/http"
|
||||
"sort"
|
||||
"strings"
|
||||
"sync"
|
||||
)
|
||||
|
||||
type user struct {
|
||||
pubkey []byte
|
||||
}
|
||||
|
||||
var mu sync.Mutex
|
||||
var me string
|
||||
var myHash string
|
||||
var myPos int
|
||||
var hashToDomain map[string]string
|
||||
var peerHashes []string
|
||||
var kvstore map[string]string
|
||||
|
||||
// Get the sha256sum of string as a hex string
|
||||
func sha256sum(s string) string {
|
||||
b := sha256.Sum256([]byte(s))
|
||||
return hex.EncodeToString(b[:])
|
||||
}
|
||||
|
||||
// Try to peer with another server
|
||||
func addPeer(peer string) error {
|
||||
peerHash := sha256sum(peer)
|
||||
|
@ -66,7 +45,6 @@ func addPeer(peer string) error {
|
|||
myPos = sort.SearchStrings(peerHashes, me)
|
||||
mu.Unlock()
|
||||
// Read response body
|
||||
defer resp.Body.Close()
|
||||
body, err := io.ReadAll(resp.Body)
|
||||
if err != nil {
|
||||
return err
|
||||
|
@ -97,7 +75,8 @@ func peerHandler(w http.ResponseWriter, r *http.Request) {
|
|||
func dhtHandler(w http.ResponseWriter, r *http.Request) {
|
||||
key := r.URL.String()[5:]
|
||||
keyHash := sha256sum(key)
|
||||
fmt.Println(key, keyHash)
|
||||
pubKey := asPubKey(key)
|
||||
fmt.Println(key, keyHash, pubKey)
|
||||
mu.Lock()
|
||||
keyPos := sort.SearchStrings(peerHashes, keyHash)
|
||||
if keyPos < myPos {
|
||||
|
@ -133,56 +112,28 @@ func dhtHandler(w http.ResponseWriter, r *http.Request) {
|
|||
|
||||
}
|
||||
} else if r.Method == "PUT" {
|
||||
// Read request body
|
||||
b, err := io.ReadAll(r.Body)
|
||||
if err != nil {
|
||||
w.WriteHeader(http.StatusInternalServerError)
|
||||
return
|
||||
}
|
||||
// Extract signature
|
||||
valSplit := strings.Split(string(b), "\n")
|
||||
sig := valSplit[len(valSplit)-1]
|
||||
// Verify signature
|
||||
if !ed25519.Verify(pubKey, b[:len(b)-len(sig)-1], []byte(sig)) {
|
||||
w.WriteHeader(http.StatusUnauthorized)
|
||||
return
|
||||
}
|
||||
|
||||
|
||||
if keyPos - myPos < 5 {
|
||||
mu.Lock()
|
||||
kvstore[key] = string(b)
|
||||
kvstore[key] = string(b[:len(b)-len(sig)-1])
|
||||
mu.Unlock()
|
||||
} else {
|
||||
|
||||
}
|
||||
} else {
|
||||
w.WriteHeader(http.StatusMethodNotAllowed)
|
||||
}
|
||||
}
|
||||
|
||||
// Handle storage requests
|
||||
func storageHandler(w http.ResponseWriter, r *http.Request) {
|
||||
filename := r.URL.String()[5:]
|
||||
if r.Method == "GET" {
|
||||
|
||||
} else if r.Method == "PUT" {
|
||||
|
||||
} else if r.Method == "DELETE" {
|
||||
|
||||
} else {
|
||||
w.WriteHeader(http.StatusMethodNotAllowed)
|
||||
}
|
||||
}
|
||||
|
||||
func main() {
|
||||
bindAddr := flag.String("b", ":4200", "bind address")
|
||||
domain := flag.String("d", "http://localhost:4200", "full domain name")
|
||||
peer := flag.String("i", "", "initial peer")
|
||||
flag.Parse()
|
||||
|
||||
log.Printf("Starting %s %s %s", *bindAddr, *domain, *peer)
|
||||
|
||||
// Record myself
|
||||
me = *domain
|
||||
myHash = sha256sum(me)
|
||||
myPos = 0
|
||||
peerHashes = append(peerHashes, sha256sum(me))
|
||||
hashToDomain = map[string]string{peerHashes[0]: me}
|
||||
|
||||
if *peer != "" {
|
||||
go addPeer(*peer)
|
||||
}
|
||||
|
||||
http.HandleFunc("/peer", peerHandler)
|
||||
http.HandleFunc("/dht", dhtHandler)
|
||||
http.HandleFunc("/storage", storageHandler)
|
||||
log.Fatal(http.ListenAndServe(*bindAddr, nil))
|
||||
}
|
|
@ -0,0 +1,63 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"crypto/ed25519"
|
||||
"crypto/sha256"
|
||||
"encoding/base64"
|
||||
"flag"
|
||||
"log"
|
||||
"net/http"
|
||||
"sync"
|
||||
)
|
||||
|
||||
type user struct {
|
||||
pubkey []byte
|
||||
}
|
||||
|
||||
var mu sync.Mutex
|
||||
var me string
|
||||
var myHash string
|
||||
var myPos int
|
||||
var hashToDomain map[string]string
|
||||
var peerHashes []string
|
||||
var kvstore map[string]string
|
||||
|
||||
// Get the sha256sum of string as a URL-safe unpadded base64 string
|
||||
func sha256sum(s string) string {
|
||||
b := sha256.Sum256([]byte(s))
|
||||
return base64.RawURLEncoding.EncodeToString(b[:])
|
||||
}
|
||||
|
||||
// Decode an ID to a public key
|
||||
func asPubKey(s string) ed25519.PublicKey {
|
||||
b, err := base64.RawURLEncoding.DecodeString(s)
|
||||
if err != nil {
|
||||
return nil
|
||||
}
|
||||
return ed25519.PublicKey(b)
|
||||
}
|
||||
|
||||
func main() {
|
||||
bindAddr := flag.String("b", ":4200", "bind address")
|
||||
publicURL := flag.String("u", "http://localhost:4200", "public URL")
|
||||
peer := flag.String("i", "", "initial peer")
|
||||
flag.Parse()
|
||||
log.Printf("Starting %s %s %s", *bindAddr, *publicURL, *peer)
|
||||
|
||||
// Record myself
|
||||
me = *publicURL
|
||||
myHash = sha256sum(me)
|
||||
myPos = 0
|
||||
peerHashes = append(peerHashes, sha256sum(me))
|
||||
hashToDomain = map[string]string{peerHashes[0]: me}
|
||||
|
||||
if *peer != "" {
|
||||
go addPeer(*peer)
|
||||
}
|
||||
|
||||
http.HandleFunc("/peer", peerHandler)
|
||||
http.HandleFunc("/dht", dhtHandler)
|
||||
http.HandleFunc("/storage", storageHandler)
|
||||
http.HandleFunc("/message", messageHandler)
|
||||
log.Fatal(http.ListenAndServe(*bindAddr, nil))
|
||||
}
|
|
@ -0,0 +1,10 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"net/http"
|
||||
)
|
||||
|
||||
// Handle message requests
|
||||
func messageHandler(w http.ResponseWriter, r *http.Request) {
|
||||
|
||||
}
|
|
@ -0,0 +1,19 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"net/http"
|
||||
)
|
||||
|
||||
// Handle storage requests
|
||||
func storageHandler(w http.ResponseWriter, r *http.Request) {
|
||||
// filename := r.URL.String()[5:]
|
||||
if r.Method == "GET" {
|
||||
|
||||
} else if r.Method == "PUT" {
|
||||
|
||||
} else if r.Method == "DELETE" {
|
||||
|
||||
} else {
|
||||
w.WriteHeader(http.StatusMethodNotAllowed)
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue