78 lines
1.6 KiB
Go
78 lines
1.6 KiB
Go
package khatru
|
|
|
|
import (
|
|
"net"
|
|
"net/http"
|
|
"strconv"
|
|
"strings"
|
|
|
|
"github.com/nbd-wtf/go-nostr"
|
|
)
|
|
|
|
func isOlder(previous, next *nostr.Event) bool {
|
|
return previous.CreatedAt < next.CreatedAt ||
|
|
(previous.CreatedAt == next.CreatedAt && previous.ID > next.ID)
|
|
}
|
|
|
|
func getServiceBaseURL(r *http.Request) string {
|
|
host := r.Header.Get("X-Forwarded-Host")
|
|
if host == "" {
|
|
host = r.Host
|
|
}
|
|
proto := r.Header.Get("X-Forwarded-Proto")
|
|
if proto == "" {
|
|
if host == "localhost" {
|
|
proto = "http"
|
|
} else if strings.Index(host, ":") != -1 {
|
|
// has a port number
|
|
proto = "http"
|
|
} else if _, err := strconv.Atoi(strings.ReplaceAll(host, ".", "")); err == nil {
|
|
// it's a naked IP
|
|
proto = "http"
|
|
} else {
|
|
proto = "https"
|
|
}
|
|
}
|
|
return proto + "://" + host
|
|
}
|
|
|
|
var privateMasks = func() []net.IPNet {
|
|
privateCIDRs := []string{
|
|
"127.0.0.0/8",
|
|
"10.0.0.0/8",
|
|
"172.16.0.0/12",
|
|
"192.168.0.0/16",
|
|
"fc00::/7",
|
|
}
|
|
masks := make([]net.IPNet, len(privateCIDRs))
|
|
for i, cidr := range privateCIDRs {
|
|
_, netw, err := net.ParseCIDR(cidr)
|
|
if err != nil {
|
|
return nil
|
|
}
|
|
masks[i] = *netw
|
|
}
|
|
return masks
|
|
}()
|
|
|
|
func isPrivate(ip net.IP) bool {
|
|
for _, mask := range privateMasks {
|
|
if mask.Contains(ip) {
|
|
return true
|
|
}
|
|
}
|
|
return false
|
|
}
|
|
|
|
func GetIPFromRequest(r *http.Request) string {
|
|
if xffh := r.Header.Get("X-Forwarded-For"); xffh != "" {
|
|
for _, v := range strings.Split(xffh, ",") {
|
|
if ip := net.ParseIP(strings.TrimSpace(v)); ip != nil && ip.IsGlobalUnicast() && !isPrivate(ip) {
|
|
return ip.String()
|
|
}
|
|
}
|
|
}
|
|
ip, _, _ := net.SplitHostPort(r.RemoteAddr)
|
|
return ip
|
|
}
|