mirror of
https://github.com/FrankerFaceZ/FrankerFaceZ.git
synced 2025-08-03 00:18:31 +00:00
Merge branch 'master' of github.com:FrankerFaceZ/FrankerFaceZ
This commit is contained in:
commit
ca0b6b5478
7 changed files with 280 additions and 56 deletions
195
socketserver/Gopkg.lock
generated
Normal file
195
socketserver/Gopkg.lock
generated
Normal file
|
@ -0,0 +1,195 @@
|
|||
# This file is autogenerated, do not edit; changes may be undone by the next 'dep ensure'.
|
||||
|
||||
|
||||
[[projects]]
|
||||
name = "cloud.google.com/go"
|
||||
packages = ["compute/metadata"]
|
||||
revision = "2d3a6656c17a60b0815b7e06ab0be04eacb6e613"
|
||||
version = "v0.16.0"
|
||||
|
||||
[[projects]]
|
||||
name = "github.com/abiosoft/ishell"
|
||||
packages = ["."]
|
||||
revision = "a7612be24192ddf96ba5f1fd5654d2e96a7553c7"
|
||||
version = "v1"
|
||||
|
||||
[[projects]]
|
||||
branch = "master"
|
||||
name = "github.com/c9s/goprocinfo"
|
||||
packages = ["linux"]
|
||||
revision = "0010a05ce49fde7f50669bc7ecda7d41dd6ab824"
|
||||
|
||||
[[projects]]
|
||||
name = "github.com/chzyer/logex"
|
||||
packages = ["."]
|
||||
revision = "cd112f618178aaaf4ea8592c8839f5276145d9cf"
|
||||
version = "v1.1.10"
|
||||
|
||||
[[projects]]
|
||||
name = "github.com/chzyer/readline"
|
||||
packages = ["."]
|
||||
revision = "62c6fe6193755f722b8b8788aa7357be55a50ff1"
|
||||
version = "v1.4"
|
||||
|
||||
[[projects]]
|
||||
branch = "master"
|
||||
name = "github.com/chzyer/test"
|
||||
packages = ["."]
|
||||
revision = "bea8f082b6fd8382588bf6fdc6af9217078af151"
|
||||
|
||||
[[projects]]
|
||||
branch = "master"
|
||||
name = "github.com/clarkduvall/hyperloglog"
|
||||
packages = ["."]
|
||||
revision = "c8a7a0be3536230c0a46ec8d3f6d9aab7c71bb8d"
|
||||
|
||||
[[projects]]
|
||||
branch = "master"
|
||||
name = "github.com/fluffle/goirc"
|
||||
packages = ["client","logging","logging/glog","state"]
|
||||
revision = "a7abc67ac229ff40f2b09dbb4851585d99ec1aca"
|
||||
|
||||
[[projects]]
|
||||
branch = "master"
|
||||
name = "github.com/fluffle/golog"
|
||||
packages = ["logging"]
|
||||
revision = "b962005bd4ccc6c0caee3dac35cdd29a5af92f4c"
|
||||
|
||||
[[projects]]
|
||||
branch = "master"
|
||||
name = "github.com/flynn/go-shlex"
|
||||
packages = ["."]
|
||||
revision = "3f9db97f856818214da2e1057f8ad84803971cff"
|
||||
|
||||
[[projects]]
|
||||
branch = "master"
|
||||
name = "github.com/golang/glog"
|
||||
packages = ["."]
|
||||
revision = "23def4e6c14b4da8ac2ed8007337bc5eb5007998"
|
||||
|
||||
[[projects]]
|
||||
name = "github.com/golang/mock"
|
||||
packages = ["gomock","gomock/mock_matcher","mockgen/model","sample","sample/imp1","sample/imp2","sample/imp3","sample/imp4","sample/mock_user"]
|
||||
revision = "13f360950a79f5864a972c786a10a50e44b69541"
|
||||
version = "v1.0.0"
|
||||
|
||||
[[projects]]
|
||||
branch = "master"
|
||||
name = "github.com/golang/protobuf"
|
||||
packages = ["proto"]
|
||||
revision = "1e59b77b52bf8e4b449a57e6f79f21226d571845"
|
||||
|
||||
[[projects]]
|
||||
name = "github.com/gorilla/websocket"
|
||||
packages = ["."]
|
||||
revision = "ea4d1f681babbce9545c9c5f3d5194a789c89f5b"
|
||||
version = "v1.2.0"
|
||||
|
||||
[[projects]]
|
||||
branch = "master"
|
||||
name = "github.com/hashicorp/golang-lru"
|
||||
packages = [".","simplelru"]
|
||||
revision = "0a025b7e63adc15a622f29b0b2c4c3848243bbf6"
|
||||
|
||||
[[projects]]
|
||||
name = "github.com/nbutton23/zxcvbn-go"
|
||||
packages = [".","adjacency","data","entropy","frequency","match","matching","scoring","utils/math"]
|
||||
revision = "eafdab6b0663b4b528c35975c8b0e78be6e25261"
|
||||
version = "v0.1"
|
||||
|
||||
[[projects]]
|
||||
name = "github.com/patrickmn/go-cache"
|
||||
packages = ["."]
|
||||
revision = "a3647f8e31d79543b2d0f0ae2fe5c379d72cedc0"
|
||||
version = "v2.1.0"
|
||||
|
||||
[[projects]]
|
||||
name = "github.com/pkg/errors"
|
||||
packages = ["."]
|
||||
revision = "645ef00459ed84a119197bfb8d8205042c6df63d"
|
||||
version = "v0.8.0"
|
||||
|
||||
[[projects]]
|
||||
name = "github.com/satori/go.uuid"
|
||||
packages = ["."]
|
||||
revision = "879c5887cd475cd7864858769793b2ceb0d44feb"
|
||||
version = "v1.1.0"
|
||||
|
||||
[[projects]]
|
||||
branch = "master"
|
||||
name = "go4.org"
|
||||
packages = ["syncutil/singleflight"]
|
||||
revision = "034d17a462f7b2dcd1a4a73553ec5357ff6e6c6e"
|
||||
|
||||
[[projects]]
|
||||
branch = "master"
|
||||
name = "golang.org/x/crypto"
|
||||
packages = ["acme","acme/autocert","curve25519","ed25519","ed25519/internal/edwards25519","nacl/auth","nacl/box","nacl/secretbox","pkcs12/internal/rc2","poly1305","salsa20/salsa","ssh","ssh/terminal"]
|
||||
revision = "9f005a07e0d31d45e6656d241bb5c0f2efd4bc94"
|
||||
|
||||
[[projects]]
|
||||
branch = "master"
|
||||
name = "golang.org/x/net"
|
||||
packages = ["context","context/ctxhttp","dns/dnsmessage","http2","http2/hpack","idna","internal/nettest","lex/httplex","proxy"]
|
||||
revision = "a337091b0525af65de94df2eb7e98bd9962dcbe2"
|
||||
|
||||
[[projects]]
|
||||
branch = "master"
|
||||
name = "golang.org/x/oauth2"
|
||||
packages = [".","google","internal","jws","jwt"]
|
||||
revision = "9ff8ebcc8e241d46f52ecc5bff0e5a2f2dbef402"
|
||||
|
||||
[[projects]]
|
||||
branch = "master"
|
||||
name = "golang.org/x/sync"
|
||||
packages = ["errgroup","singleflight","syncmap"]
|
||||
revision = "fd80eb99c8f653c847d294a001bdf2a3a6f768f5"
|
||||
|
||||
[[projects]]
|
||||
branch = "master"
|
||||
name = "golang.org/x/sys"
|
||||
packages = ["unix","windows"]
|
||||
revision = "665f6529cca930e27b831a0d1dafffbe1c172924"
|
||||
|
||||
[[projects]]
|
||||
branch = "master"
|
||||
name = "golang.org/x/text"
|
||||
packages = ["collate","collate/build","internal/colltab","internal/gen","internal/tag","internal/triegen","internal/ucd","language","secure/bidirule","transform","unicode/bidi","unicode/cldr","unicode/norm","unicode/rangetable"]
|
||||
revision = "88f656faf3f37f690df1a32515b479415e1a6769"
|
||||
|
||||
[[projects]]
|
||||
branch = "master"
|
||||
name = "google.golang.org/api"
|
||||
packages = ["compute/v1","gensupport","googleapi","googleapi/internal/uritemplates"]
|
||||
revision = "a0c31fb0028e0111b942a29b9fc2e9235202c48b"
|
||||
|
||||
[[projects]]
|
||||
name = "google.golang.org/appengine"
|
||||
packages = [".","internal","internal/app_identity","internal/base","internal/datastore","internal/log","internal/modules","internal/remote_api","internal/urlfetch","urlfetch"]
|
||||
revision = "150dc57a1b433e64154302bdc40b6bb8aefa313a"
|
||||
version = "v1.0.0"
|
||||
|
||||
[[projects]]
|
||||
name = "gopkg.in/abiosoft/ishell.v1"
|
||||
packages = ["."]
|
||||
revision = "a7612be24192ddf96ba5f1fd5654d2e96a7553c7"
|
||||
version = "v1"
|
||||
|
||||
[[projects]]
|
||||
branch = "v1"
|
||||
name = "gopkg.in/check.v1"
|
||||
packages = ["."]
|
||||
revision = "20d25e2804050c1cd24a7eea1e7a6447dd0e74ec"
|
||||
|
||||
[[projects]]
|
||||
name = "gopkg.in/readline.v1"
|
||||
packages = ["."]
|
||||
revision = "62c6fe6193755f722b8b8788aa7357be55a50ff1"
|
||||
version = "v1.4"
|
||||
|
||||
[solve-meta]
|
||||
analyzer-name = "dep"
|
||||
analyzer-version = 1
|
||||
inputs-digest = "7158fb6cb831d29e75c27e651117426d4763c6ec8fd147a864e4a9eedc0068be"
|
||||
solver-name = "gps-cdcl"
|
||||
solver-version = 1
|
66
socketserver/Gopkg.toml
Normal file
66
socketserver/Gopkg.toml
Normal file
|
@ -0,0 +1,66 @@
|
|||
|
||||
# Gopkg.toml example
|
||||
#
|
||||
# Refer to https://github.com/golang/dep/blob/master/docs/Gopkg.toml.md
|
||||
# for detailed Gopkg.toml documentation.
|
||||
#
|
||||
# required = ["github.com/user/thing/cmd/thing"]
|
||||
# ignored = ["github.com/user/project/pkgX", "bitbucket.org/user/project/pkgA/pkgY"]
|
||||
#
|
||||
# [[constraint]]
|
||||
# name = "github.com/user/project"
|
||||
# version = "1.0.0"
|
||||
#
|
||||
# [[constraint]]
|
||||
# name = "github.com/user/project2"
|
||||
# branch = "dev"
|
||||
# source = "github.com/myfork/project2"
|
||||
#
|
||||
# [[override]]
|
||||
# name = "github.com/x/y"
|
||||
# version = "2.4.0"
|
||||
|
||||
|
||||
[[constraint]]
|
||||
branch = "master"
|
||||
name = "github.com/c9s/goprocinfo"
|
||||
|
||||
[[constraint]]
|
||||
branch = "master"
|
||||
name = "github.com/clarkduvall/hyperloglog"
|
||||
|
||||
[[constraint]]
|
||||
branch = "master"
|
||||
name = "github.com/fluffle/goirc"
|
||||
|
||||
[[constraint]]
|
||||
name = "github.com/gorilla/websocket"
|
||||
version = "1.2.0"
|
||||
|
||||
[[constraint]]
|
||||
branch = "master"
|
||||
name = "github.com/hashicorp/golang-lru"
|
||||
|
||||
[[constraint]]
|
||||
name = "github.com/patrickmn/go-cache"
|
||||
version = "2.1.0"
|
||||
|
||||
[[constraint]]
|
||||
name = "github.com/pkg/errors"
|
||||
version = "0.8.0"
|
||||
|
||||
[[constraint]]
|
||||
name = "github.com/satori/go.uuid"
|
||||
version = "1.1.0"
|
||||
|
||||
[[constraint]]
|
||||
branch = "master"
|
||||
name = "golang.org/x/sync"
|
||||
|
||||
[[constraint]]
|
||||
name = "gopkg.in/abiosoft/ishell.v1"
|
||||
version = "1.0.0"
|
||||
|
||||
[[constraint]]
|
||||
branch = "v1"
|
||||
name = "gopkg.in/check.v1"
|
|
@ -81,8 +81,7 @@ func main() {
|
|||
Addr: conf.SSLListenAddr,
|
||||
Handler: http.DefaultServeMux,
|
||||
TLSConfig: &tls.Config{
|
||||
GetCertificate: reloader.GetCertificateFunc(),
|
||||
GetConfigForClient: server.TLSEarlyReject,
|
||||
GetCertificate: reloader.GetCertificateFunc(),
|
||||
},
|
||||
}
|
||||
go func() {
|
||||
|
|
|
@ -5,7 +5,7 @@ import (
|
|||
"net/http"
|
||||
"time"
|
||||
|
||||
"bitbucket.org/stendec/frankerfacez/socketserver/server"
|
||||
"github.com/FrankerFaceZ/FrankerFaceZ/socketserver/server"
|
||||
)
|
||||
|
||||
type CalendarData struct {
|
||||
|
|
|
@ -10,7 +10,7 @@ import (
|
|||
"sync"
|
||||
"time"
|
||||
|
||||
"bitbucket.org/stendec/frankerfacez/socketserver/server"
|
||||
"github.com/FrankerFaceZ/FrankerFaceZ/socketserver/server"
|
||||
"github.com/clarkduvall/hyperloglog"
|
||||
lru "github.com/hashicorp/golang-lru"
|
||||
)
|
||||
|
|
|
@ -12,7 +12,7 @@ import (
|
|||
"sync"
|
||||
"time"
|
||||
|
||||
"bitbucket.org/stendec/frankerfacez/socketserver/server"
|
||||
"github.com/FrankerFaceZ/FrankerFaceZ/socketserver/server"
|
||||
"github.com/clarkduvall/hyperloglog"
|
||||
)
|
||||
|
||||
|
|
|
@ -2,7 +2,6 @@ package server // import "github.com/FrankerFaceZ/FrankerFaceZ/socketserver/serv
|
|||
|
||||
import (
|
||||
"bytes"
|
||||
"crypto/tls"
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"fmt"
|
||||
|
@ -254,15 +253,6 @@ func shouldRejectConnection() bool {
|
|||
return false
|
||||
}
|
||||
|
||||
var errEarlyTLSReject = errors.New("over capacity")
|
||||
|
||||
func TLSEarlyReject(*tls.ClientHelloInfo) (*tls.Config, error) {
|
||||
if shouldRejectConnection() {
|
||||
return nil, errEarlyTLSReject
|
||||
}
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
// HTTPHandleRootURL is the http.HandleFunc for requests on `/`.
|
||||
// It either uses the SocketUpgrader or writes out the BannerHTML.
|
||||
func HTTPHandleRootURL(w http.ResponseWriter, r *http.Request) {
|
||||
|
@ -283,6 +273,7 @@ func HTTPHandleRootURL(w http.ResponseWriter, r *http.Request) {
|
|||
|
||||
conn, err := SocketUpgrader.Upgrade(w, r, nil)
|
||||
if err != nil {
|
||||
w.WriteHeader(400)
|
||||
fmt.Fprintf(w, "error: %v", err)
|
||||
return
|
||||
}
|
||||
|
@ -440,24 +431,7 @@ func runSocketReader(conn *websocket.Conn, client *ClientInfo, errorChan chan<-
|
|||
defer close(errorChan)
|
||||
defer close(clientChan)
|
||||
|
||||
for {
|
||||
conn.SetReadDeadline(time.Now().Add(1 * time.Minute))
|
||||
messageType, packet, err = conn.ReadMessage()
|
||||
// handle ReadDeadline by sending a ping
|
||||
// writer loop handles repeated ping timeouts
|
||||
if tmErr, ok := err.(interface {
|
||||
Timeout() bool
|
||||
}); ok && tmErr.Timeout() {
|
||||
select {
|
||||
case <-stoppedChan:
|
||||
return
|
||||
case clientChan <- ClientMessage{Command: "__readTimeout"}:
|
||||
}
|
||||
continue // re-set deadline and wait for pong packet
|
||||
}
|
||||
if err != nil {
|
||||
break
|
||||
}
|
||||
for ; err == nil; messageType, packet, err = conn.ReadMessage() {
|
||||
if messageType == websocket.BinaryMessage {
|
||||
err = &CloseGotBinaryMessage
|
||||
break
|
||||
|
@ -480,24 +454,23 @@ func runSocketReader(conn *websocket.Conn, client *ClientInfo, errorChan chan<-
|
|||
} else if msg.MessageID == 0 {
|
||||
continue
|
||||
}
|
||||
|
||||
select {
|
||||
case clientChan <- msg:
|
||||
case <-stoppedChan:
|
||||
return
|
||||
case clientChan <- msg:
|
||||
}
|
||||
}
|
||||
|
||||
select {
|
||||
case <-stoppedChan:
|
||||
case errorChan <- err:
|
||||
case <-stoppedChan:
|
||||
}
|
||||
// exit goroutine
|
||||
}
|
||||
|
||||
var pingPayload = []byte("PING")
|
||||
|
||||
func runSocketWriter(conn *websocket.Conn, client *ClientInfo, errorChan <-chan error, clientChan <-chan ClientMessage, serverMessageChan <-chan ClientMessage) websocket.CloseError {
|
||||
pingTicker := time.NewTicker(1 * time.Minute)
|
||||
defer pingTicker.Stop()
|
||||
lastPacket := time.Now()
|
||||
|
||||
for {
|
||||
|
@ -518,29 +491,12 @@ func runSocketWriter(conn *websocket.Conn, client *ClientInfo, errorChan <-chan
|
|||
}
|
||||
|
||||
case msg := <-clientChan:
|
||||
if msg.Command == "__readTimeout" {
|
||||
// generated on 60 seconds without a message
|
||||
now := time.Now()
|
||||
if lastPacket.Add(5 * time.Minute).Before(now) {
|
||||
return CloseTimedOut
|
||||
}
|
||||
conn.WriteControl(
|
||||
websocket.PingMessage,
|
||||
pingPayload,
|
||||
getDeadline(),
|
||||
)
|
||||
continue
|
||||
}
|
||||
|
||||
if !client.HelloOK && msg.Command != HelloCommand {
|
||||
return CloseFirstMessageNotHello
|
||||
}
|
||||
lastPacket = time.Now()
|
||||
|
||||
if msg.Command == "__ping" {
|
||||
// generated for PONG packets
|
||||
// want to branch AFTER lastPacket is set
|
||||
continue
|
||||
continue // generated by server, not by client
|
||||
}
|
||||
|
||||
for _, char := range msg.Command {
|
||||
|
@ -560,6 +516,14 @@ func runSocketWriter(conn *websocket.Conn, client *ClientInfo, errorChan <-chan
|
|||
}
|
||||
SendMessage(conn, msg)
|
||||
|
||||
case <-pingTicker.C:
|
||||
now := time.Now()
|
||||
if lastPacket.Add(5 * time.Minute).Before(now) {
|
||||
return CloseTimedOut
|
||||
} else if lastPacket.Add(1 * time.Minute).Before(now) {
|
||||
conn.WriteControl(websocket.PingMessage, []byte(strconv.FormatInt(time.Now().Unix(), 10)), getDeadline())
|
||||
}
|
||||
|
||||
case <-StopAcceptingConnectionsCh:
|
||||
return CloseGoingAway
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue