Add proper logging
This commit is contained in:
@@ -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) {
|
||||
|
@@ -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) {
|
||||
|
@@ -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)
|
||||
}
|
||||
}
|
||||
|
@@ -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
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user