summaryrefslogtreecommitdiff
path: root/deprecated-webircgateway/pkg/webircgateway/utils.go
diff options
context:
space:
mode:
Diffstat (limited to 'deprecated-webircgateway/pkg/webircgateway/utils.go')
-rw-r--r--deprecated-webircgateway/pkg/webircgateway/utils.go147
1 files changed, 147 insertions, 0 deletions
diff --git a/deprecated-webircgateway/pkg/webircgateway/utils.go b/deprecated-webircgateway/pkg/webircgateway/utils.go
new file mode 100644
index 0000000..1fc687a
--- /dev/null
+++ b/deprecated-webircgateway/pkg/webircgateway/utils.go
@@ -0,0 +1,147 @@
+package webircgateway
+
+import (
+ "context"
+ "fmt"
+ "net"
+ "strings"
+ "unicode/utf8"
+
+ "golang.org/x/net/html/charset"
+ "golang.org/x/time/rate"
+)
+
+var privateIPBlocks []*net.IPNet
+
+func init() {
+ for _, cidr := range []string{
+ "127.0.0.0/8", // IPv4 loopback
+ "10.0.0.0/8", // RFC1918
+ "172.16.0.0/12", // RFC1918
+ "192.168.0.0/16", // RFC1918
+ "::1/128", // IPv6 loopback
+ "fe80::/10", // IPv6 link-local
+ } {
+ _, block, _ := net.ParseCIDR(cidr)
+ privateIPBlocks = append(privateIPBlocks, block)
+ }
+}
+
+func isPrivateIP(ip net.IP) bool {
+ for _, block := range privateIPBlocks {
+ if block.Contains(ip) {
+ return true
+ }
+ }
+ return false
+}
+
+// Username / realname / webirc hostname can all have configurable replacements
+func makeClientReplacements(format string, client *Client) string {
+ ret := format
+ ret = strings.Replace(ret, "%a", client.RemoteAddr, -1)
+ ret = strings.Replace(ret, "%i", Ipv4ToHex(client.RemoteAddr), -1)
+ ret = strings.Replace(ret, "%h", client.RemoteHostname, -1)
+ ret = strings.Replace(ret, "%n", client.IrcState.Nick, -1)
+ return ret
+}
+
+func Ipv4ToHex(ip string) string {
+ var ipParts [4]int
+ fmt.Sscanf(ip, "%d.%d.%d.%d", &ipParts[0], &ipParts[1], &ipParts[2], &ipParts[3])
+ ipHex := fmt.Sprintf("%02x%02x%02x%02x", ipParts[0], ipParts[1], ipParts[2], ipParts[3])
+ return ipHex
+}
+
+func ensureUtf8(s string, fromEncoding string) string {
+ if utf8.ValidString(s) {
+ return s
+ }
+
+ encoding, encErr := charset.Lookup(fromEncoding)
+ if encoding == nil {
+ println("encErr:", encErr)
+ return ""
+ }
+
+ d := encoding.NewDecoder()
+ s2, _ := d.String(s)
+ return s2
+}
+
+func utf8ToOther(s string, toEncoding string) string {
+ if toEncoding == "UTF-8" && utf8.ValidString(s) {
+ return s
+ }
+
+ encoding, _ := charset.Lookup(toEncoding)
+ if encoding == nil {
+ return ""
+ }
+
+ e := encoding.NewEncoder()
+ s2, _ := e.String(s)
+ return s2
+}
+
+func containsOneOf(s string, substrs []string) bool {
+ for _, substr := range substrs {
+ if strings.Contains(s, substr) {
+ return true
+ }
+ }
+
+ return false
+}
+
+func stringInSlice(s string, slice []string) bool {
+ for _, v := range slice {
+ if v == s {
+ return true
+ }
+ }
+ return false
+}
+
+func stringInSliceOrDefault(s, def string, validStrings []string) string {
+ if stringInSlice(s, validStrings) {
+ return s
+ }
+ return def
+}
+
+type ThrottledStringChannel struct {
+ in chan string
+ Input chan<- string
+ out chan string
+ Output <-chan string
+ *rate.Limiter
+}
+
+func NewThrottledStringChannel(wrappedChan chan string, limiter *rate.Limiter) *ThrottledStringChannel {
+ out := make(chan string, 50)
+
+ c := &ThrottledStringChannel{
+ in: wrappedChan,
+ Input: wrappedChan,
+ out: out,
+ Output: out,
+ Limiter: limiter,
+ }
+
+ go c.run()
+
+ return c
+}
+
+func (c *ThrottledStringChannel) run() {
+ for msg := range c.in {
+ // start := time.Now()
+ c.Wait(context.Background())
+ c.out <- msg
+ // elapsed := time.Since(start)
+ // fmt.Printf("waited %v to send %v\n", elapsed, msg)
+ }
+
+ close(c.out)
+}