diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 91e378384b88a26ecee5da1e27438f32af06dce6..d18705f005db8c59b4c8319d528d63bc1239ac3e 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -15,7 +15,7 @@ Unit tests: - "coverage.html" script: - "ln -s $(pwd) $GOPATH/src/dfss" - - "go get gopkg.in/mgo.v2" + - "./build/deps.sh" - "go test -coverprofile auth.part -v ./auth" - "go test -coverprofile mgdb.part -v ./mgdb" - "go test -coverprofile mails.part -v ./mails" @@ -28,7 +28,7 @@ ARM tests: tags: - arm script: - - "go get gopkg.in/mgo.v2" + - "./build/deps.sh" - "go test -cover -short -v ./auth" - "go test -cover -short -v ./mgdb" @@ -41,7 +41,7 @@ Code lint: script: - "ln -s $(pwd) $GOPATH/src/dfss" - "go get github.com/alecthomas/gometalinter" - - "go get gopkg.in/mgo.v2" + - "./build/deps.sh" - "go install ./..." - "gometalinter --install" - "gometalinter -t --deadline=100s -j1 ./..." diff --git a/build/deps.sh b/build/deps.sh new file mode 100755 index 0000000000000000000000000000000000000000..569ce57d4b18f6d07d9f4e9af238d516504445ff --- /dev/null +++ b/build/deps.sh @@ -0,0 +1,7 @@ +#!/bin/sh + +# mongo +go get gopkg.in/mgo.v2 + +# grpc +go get google.golang.org/grpc diff --git a/net/client.go b/net/client.go new file mode 100644 index 0000000000000000000000000000000000000000..ebbce6237acb9cf5318f1eb99c9aa7e726551dec --- /dev/null +++ b/net/client.go @@ -0,0 +1,39 @@ +package net + +import ( + "crypto/tls" + "crypto/x509" + "log" + + "google.golang.org/grpc" + "google.golang.org/grpc/credentials" + "google.golang.org/grpc/grpclog" +) + +// Connect to a peer. +// +// Given parameters cert/key/ca are PEM-encoded array of bytes. +// Closing must be defered after call. +func Connect(addrPort string, cert, key, ca []byte) *grpc.ClientConn { + // load peer cert/key, ca as PEM buffers + peerCert, err := tls.X509KeyPair(cert, key) + if err != nil { + log.Fatalf("Load peer cert/key error: %v", err) + } + caCertPool := x509.NewCertPool() + caCertPool.AppendCertsFromPEM(ca) + + // configure transport authentificator + ta := credentials.NewTLS(&tls.Config{ + Certificates: []tls.Certificate{peerCert}, + RootCAs: caCertPool, + }) + + // let's do the dialing ! + con, err := grpc.Dial(addrPort, grpc.WithTransportCredentials(ta)) + if err != nil { + grpclog.Fatalf("Fail to dial: %v", err) + } + + return con +} diff --git a/net/server.go b/net/server.go new file mode 100644 index 0000000000000000000000000000000000000000..dca1611f393e1a50fb7ab7272d790440da7cb5a1 --- /dev/null +++ b/net/server.go @@ -0,0 +1,57 @@ +package net + +import ( + "crypto/tls" + "crypto/x509" + "log" + "net" + + "google.golang.org/grpc" + "google.golang.org/grpc/credentials" + "google.golang.org/grpc/grpclog" +) + +// NewServer creates a new grpc server with given tls credentials. +// +// cert/key/ca are PEM-encoded array of bytes. +// +// The returned grpcServer must be used in association with server{} to +// register APIs before calling Listen(). +func NewServer(cert, key, ca []byte) *grpc.Server { + // configure gRPC + var opts []grpc.ServerOption + + serverCert, err := tls.X509KeyPair(cert, key) + if err != nil { + log.Fatalf("Load peer cert/key error: %v", err) + } + caCertPool := x509.NewCertPool() + caCertPool.AppendCertsFromPEM(ca) + + // configure transport authentificator + ta := credentials.NewTLS(&tls.Config{ + Certificates: []tls.Certificate{serverCert}, + RootCAs: caCertPool, + ClientCAs: caCertPool, + ClientAuth: tls.RequireAndVerifyClientCert, + }) + + opts = []grpc.ServerOption{grpc.Creds(ta)} + return grpc.NewServer(opts...) +} + +// Listen with specified server on addr:port. +// +// addrPort is formated as 127.0.0.1:8001. +func Listen(addrPort string, grpcServer *grpc.Server) { + // open tcp socket + lis, err := net.Listen("tcp", addrPort) + if err != nil { + grpclog.Fatalf("Failed to open tcp socket: %v", err) + } + + err = grpcServer.Serve(lis) + if err != nil { + grpclog.Fatalf("Failed to bind gRPC server: %v", err) + } +}