Add proper logging

This commit is contained in:
2021-12-06 07:55:30 +01:00
parent 6f91ac3d2d
commit 80b6281564
8 changed files with 147 additions and 23 deletions

View File

@@ -6,16 +6,19 @@ import (
"gitea.benny.dog/torjus/ezshare/pb"
"gitea.benny.dog/torjus/ezshare/store"
"github.com/dustin/go-humanize"
"go.uber.org/zap"
)
type GRPCFileServiceServer struct {
Logger *zap.SugaredLogger
Hostname string
store store.FileStore
pb.UnimplementedFileServiceServer
}
func NewGRPCFileServiceServer(store store.FileStore) *GRPCFileServiceServer {
return &GRPCFileServiceServer{Hostname: "localhost:8051", store: store}
return &GRPCFileServiceServer{Hostname: "localhost:8051", store: store, Logger: zap.NewNop().Sugar()}
}
func (s *GRPCFileServiceServer) UploadFile(ctx context.Context, req *pb.UploadFileRequest) (*pb.UploadFileResponse, error) {
@@ -24,8 +27,10 @@ func (s *GRPCFileServiceServer) UploadFile(ctx context.Context, req *pb.UploadFi
id, err := s.store.StoreFile(&f)
if err != nil {
s.Logger.Warnw("Error storing file.", "error", err)
return nil, err
}
s.Logger.Infow("Received file.", "id", id, "size", humanize.Bytes(uint64(len(f.Data))))
return &pb.UploadFileResponse{Id: id, FileUrl: fmt.Sprintf("%s/files/%s", s.Hostname, id)}, nil
}
@@ -34,13 +39,18 @@ func (s *GRPCFileServiceServer) GetFile(ctx context.Context, req *pb.GetFileRequ
if err != nil {
return nil, err
}
s.Logger.Infow("Sending file to client.", "id", f.FileId, "size", humanize.Bytes(uint64(len(f.Data))))
return &pb.GetFileResponse{File: f}, nil
}
func (s *GRPCFileServiceServer) DeleteFile(ctx context.Context, req *pb.DeleteFileRequest) (*pb.DeleteFileResponse, error) {
err := s.store.DeleteFile(req.Id)
return &pb.DeleteFileResponse{}, err
if err := s.store.DeleteFile(req.Id); err != nil {
s.Logger.Warnw("Error deleting file.", "error", err)
return nil, err
}
s.Logger.Infow("Deleted file.", "id", req.Id)
return &pb.DeleteFileResponse{}, nil
}
func (s *GRPCFileServiceServer) ListFiles(ctx context.Context, req *pb.ListFilesRequest) (*pb.ListFilesResponse, error) {

View File

@@ -7,9 +7,11 @@ import (
"gitea.benny.dog/torjus/ezshare/store"
"github.com/go-chi/chi/v5"
"go.uber.org/zap"
)
type HTTPServer struct {
Logger *zap.SugaredLogger
store store.FileStore
serverGRPCCert []byte
grpcEndpoint string
@@ -23,6 +25,7 @@ type MetadataResponse struct {
func NewHTTPSever(store store.FileStore, certBytes []byte, grpcEndpoint string) *HTTPServer {
srv := &HTTPServer{
Logger: zap.NewNop().Sugar(),
store: store,
serverGRPCCert: certBytes,
grpcEndpoint: grpcEndpoint,
@@ -38,14 +41,21 @@ func NewHTTPSever(store store.FileStore, certBytes []byte, grpcEndpoint string)
}
func (s *HTTPServer) ServerCertHandler(w http.ResponseWriter, r *http.Request) {
w.Write(s.serverGRPCCert)
if _, err := w.Write(s.serverGRPCCert); err != nil {
s.Logger.Warnw("Error sending server certificate.", "error", err, "remote_addr", r.RemoteAddr)
}
s.Logger.Infow("Sent server certificate.", "remote_addr", r.RemoteAddr)
}
func (s *HTTPServer) MetadataHandler(w http.ResponseWriter, r *http.Request) {
md := &MetadataResponse{
GRPCEndpoint: s.grpcEndpoint,
}
encoder := json.NewEncoder(w)
encoder.Encode(md)
if err := encoder.Encode(md); err != nil {
s.Logger.Warnw("Error encoding or sending metadata.", "error", err, "remote_addr", r.RemoteAddr)
}
s.Logger.Infow("Wrote server cert.", "remote_addr", r.RemoteAddr)
}
func (s *HTTPServer) FileHandler(w http.ResponseWriter, r *http.Request) {
@@ -53,15 +63,20 @@ func (s *HTTPServer) FileHandler(w http.ResponseWriter, r *http.Request) {
f, err := s.store.GetFile(id)
if err != nil {
if err == store.ErrNoSuchItem {
s.Logger.Debugw("Tried to get non-existing file.", "remote_addr", r.RemoteAddr)
WriteErrorResponse(w, http.StatusNotFound, "file not found")
return
}
s.Logger.Warnw("Error getting file from store.", "error", err, "remote_addr", r.RemoteAddr)
WriteErrorResponse(w, http.StatusInternalServerError, fmt.Sprintf("error: %s", err))
return
}
w.Header().Add("Content-Type", http.DetectContentType(f.Data))
w.Write(f.Data)
if _, err := w.Write(f.Data); err != nil {
s.Logger.Warnw("Error sending file.", "error", err, "remote_addr", r.RemoteAddr)
}
s.Logger.Infow("Sent file.", "remote_addr", r.RemoteAddr)
}
func WriteErrorResponse(w http.ResponseWriter, status int, message string) {

View File

@@ -5,6 +5,7 @@ import (
"gitea.benny.dog/torjus/ezshare/pb"
"gitea.benny.dog/torjus/ezshare/store"
"go.uber.org/zap"
"google.golang.org/grpc"
"google.golang.org/grpc/credentials"
"google.golang.org/grpc/peer"
@@ -15,7 +16,7 @@ type ContextKey string
var ContextKeyRole ContextKey = "role"
var ContextKeyUserID ContextKey = "userid"
func NewAuthInterceptor(s store.UserStore) grpc.UnaryServerInterceptor {
func NewAuthInterceptor(s store.UserStore, logger *zap.SugaredLogger) grpc.UnaryServerInterceptor {
// TODO: Verify that cert is signed by our ca
return func(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (resp interface{}, err error) {
p, ok := peer.FromContext(ctx)
@@ -31,6 +32,7 @@ func NewAuthInterceptor(s store.UserStore) grpc.UnaryServerInterceptor {
if err == nil {
newCtx := context.WithValue(ctx, ContextKeyRole, user.UserRole)
newCtx = context.WithValue(newCtx, ContextKeyUserID, user.Id)
logger.Debugw("Authenticated user.", "username", user.Username, "role", user.UserRole.String())
return handler(newCtx, req)
}
}

View File

@@ -9,19 +9,21 @@ import (
"gitea.benny.dog/torjus/ezshare/server/interceptors"
"gitea.benny.dog/torjus/ezshare/store"
"github.com/google/uuid"
"go.uber.org/zap"
"golang.org/x/crypto/bcrypt"
"google.golang.org/grpc/codes"
"google.golang.org/grpc/status"
)
type GRPCUserServiceServer struct {
Logger *zap.SugaredLogger
store store.UserStore
certService *certs.CertService
pb.UnimplementedUserServiceServer
}
func NewGRPCUserServiceServer(store store.UserStore, certSvc *certs.CertService) *GRPCUserServiceServer {
return &GRPCUserServiceServer{store: store, certService: certSvc}
return &GRPCUserServiceServer{store: store, certService: certSvc, Logger: zap.NewNop().Sugar()}
}
func (s *GRPCUserServiceServer) Register(ctx context.Context, req *pb.RegisterUserRequest) (*pb.RegisterUserResponse, error) {
// Check if user already exists
@@ -42,9 +44,12 @@ func (s *GRPCUserServiceServer) Register(ctx context.Context, req *pb.RegisterUs
}
if err := s.store.StoreUser(user); err != nil {
s.Logger.Warnw("Error storing registered user.", "error", err)
return nil, status.Error(codes.Internal, fmt.Sprintf("unable to store user: %s", err))
}
s.Logger.Infow("Registered new user.", "username", user.Username)
return &pb.RegisterUserResponse{Id: user.Id, Token: ""}, nil
}
@@ -54,6 +59,7 @@ func (s *GRPCUserServiceServer) Login(_ context.Context, req *pb.LoginUserReques
if err == store.ErrNoSuchItem {
return nil, status.Error(codes.NotFound, "no such user")
}
s.Logger.Warnw("Error retrieving user from store.", "error", err)
return nil, status.Error(codes.Internal, "error getting user from store")
}
@@ -63,6 +69,7 @@ func (s *GRPCUserServiceServer) Login(_ context.Context, req *pb.LoginUserReques
cert, key, err := s.certService.NewClient(user.Id)
if err != nil {
s.Logger.Warnw("Error generating client certificate.", "error", err)
return nil, status.Error(codes.Internal, "unable to generate client certificate")
}
@@ -71,6 +78,7 @@ func (s *GRPCUserServiceServer) Login(_ context.Context, req *pb.LoginUserReques
ClientKey: key,
}
s.Logger.Infow("Logged in user.", "username", user.Username)
return resp, nil
}
@@ -102,8 +110,10 @@ func (s *GRPCUserServiceServer) ChangePassword(ctx context.Context, req *pb.Chan
}
user.HashedPassword = newPasswordHash
if err := s.store.StoreUser(user); err != nil {
s.Logger.Warnw("Error storing user with new password.", "error", err)
return nil, status.Error(codes.Internal, "unable to store new password")
}
s.Logger.Infow("Set new password for user.", "username", user.Username)
return &pb.Empty{}, nil
}