Separate server code into multiple files

This commit is contained in:
Anthony Wang 2023-05-10 22:31:59 -04:00
parent 8ca9aeba69
commit 095c1c88a4
Signed by: a
GPG Key ID: 42A5B952E6DD8D38
6 changed files with 122 additions and 73 deletions

View File

@ -1,7 +0,0 @@
package main
import "fmt"
func main() {
fmt.Println("Hello, World!")
}

13
client/main.go Normal file
View File

@ -0,0 +1,13 @@
package main
import (
"crypto/ed25519"
"flag"
)
func main() {
flag.Parse()
if flag.Arg(0) == "register" {
}
}

View File

@ -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))
}

63
server/main.go Normal file
View File

@ -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))
}

10
server/message.go Normal file
View File

@ -0,0 +1,10 @@
package main
import (
"net/http"
)
// Handle message requests
func messageHandler(w http.ResponseWriter, r *http.Request) {
}

19
server/storage.go Normal file
View File

@ -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)
}
}