Skip to content

Commit

Permalink
Merge branch 'main' into dependabot/go_modules/main/go_modules-4d974c…
Browse files Browse the repository at this point in the history
…417d
  • Loading branch information
jakubmkowalski authored Feb 12, 2025
2 parents 96dfe96 + 06d7a0c commit e15aa38
Show file tree
Hide file tree
Showing 10 changed files with 77 additions and 57 deletions.
42 changes: 31 additions & 11 deletions errors/http_response.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,26 +2,46 @@ package errors

import (
"errors"
"net/http"

"github.com/gin-gonic/gin"
"github.com/rs/zerolog"
)

// ErrorResponse is a standard way to return errors to the client
func ErrorResponse(c *gin.Context, err error) {
response, statusCode := getError(err)
func ErrorResponse(c *gin.Context, err error, log *zerolog.Logger) {
response, statusCode := mapAndLog(err, log)
c.JSON(statusCode, response)
}

func getError(err error) (ResponseError, int) {
func mapAndLog(err error, log *zerolog.Logger) (ResponseError, int) {
var res ResponseError
res.Code = UnknownErrorCode
statusCode := 500

logLevel := zerolog.WarnLevel
exposedInternalError := false
var extendedErr ExtendedError
if errors.As(err, &extendedErr) {
return ResponseError{
Code: extendedErr.GetCode(),
Message: extendedErr.GetMessage(),
}, extendedErr.GetStatusCode()
res.Code = extendedErr.GetCode()
res.Message = extendedErr.GetMessage()
statusCode = extendedErr.GetStatusCode()
if statusCode >= http.StatusInternalServerError {
logLevel = zerolog.ErrorLevel
}
} else {
// we should wrap all internal errors into SPVError (with proper code, message and status code)
// if you find out that some endpoint produces this warning, feel free to fix it
exposedInternalError = true
}

if log != nil {
logInstance := log.WithLevel(logLevel).Str("module", "errors")
if exposedInternalError {
logInstance.Str("warning", "internal error returned as HTTP response")
}
logInstance.Err(err).Msgf("Error HTTP response, returning %d", statusCode)
}

return ResponseError{
Code: UnknownErrorCode,
Message: "Unable to get information about error",
}, 500
return res, statusCode
}
4 changes: 2 additions & 2 deletions server/capabilities.go
Original file line number Diff line number Diff line change
Expand Up @@ -140,13 +140,13 @@ func (c *Configuration) showCapabilities(context *gin.Context) {
}

if !c.IsAllowedDomain(host) {
errors.ErrorResponse(context, errors.ErrDomainUnknown)
errors.ErrorResponse(context, errors.ErrDomainUnknown, c.Logger)
return
}

capabilities, err := c.EnrichCapabilities(host)
if err != nil {
errors.ErrorResponse(context, err)
errors.ErrorResponse(context, err, c.Logger)
return
}

Expand Down
4 changes: 2 additions & 2 deletions server/p2p_payment_destination.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ func (c *Configuration) p2pDestination(context *gin.Context) {
var b p2pDestinationRequestBody
err := context.Bind(&b)
if err != nil {
errors.ErrorResponse(context, errors.ErrCannotBindRequest)
errors.ErrorResponse(context, errors.ErrCannotBindRequest, c.Logger)
return
}

Expand All @@ -40,7 +40,7 @@ func (c *Configuration) p2pDestination(context *gin.Context) {
if response, err = c.actions.CreateP2PDestinationResponse(
context.Request.Context(), alias, domain, b.Satoshis, md,
); err != nil {
errors.ErrorResponse(context, err)
errors.ErrorResponse(context, err, c.Logger)
return
}

Expand Down
10 changes: 5 additions & 5 deletions server/p2p_receive_transaction.go
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ func (c *Configuration) p2pReceiveTx(context *gin.Context) {

requestPayload, _, md, err := processP2pReceiveTxRequest(c, context.Request, incomingPaymail, p2pFormat)
if err != nil {
errors.ErrorResponse(context, err)
errors.ErrorResponse(context, err, c.Logger)
return
}

Expand All @@ -52,7 +52,7 @@ func (c *Configuration) p2pReceiveTx(context *gin.Context) {
if response, err = c.actions.RecordTransaction(
context.Request.Context(), requestPayload.P2PTransaction, md,
); err != nil {
errors.ErrorResponse(context, err)
errors.ErrorResponse(context, err, c.Logger)
return
}

Expand All @@ -79,7 +79,7 @@ func (c *Configuration) p2pReceiveBeefTx(context *gin.Context) {

requestPayload, dBeef, md, err := processP2pReceiveTxRequest(c, context.Request, incomingPaymail, p2pFormat)
if err != nil {
errors.ErrorResponse(context, err)
errors.ErrorResponse(context, err, c.Logger)
return
}

Expand All @@ -93,15 +93,15 @@ func (c *Configuration) p2pReceiveBeefTx(context *gin.Context) {

err = spv.ExecuteSimplifiedPaymentVerification(context.Request.Context(), dBeef, c.actions)
if err != nil {
errors.ErrorResponse(context, errors.ErrSPVFailed)
errors.ErrorResponse(context, errors.ErrSPVFailed, c.Logger)
return
}

var response *paymail.P2PTransactionPayload
if response, err = c.actions.RecordTransaction(
context.Request.Context(), requestPayload.P2PTransaction, md,
); err != nil {
errors.ErrorResponse(context, err)
errors.ErrorResponse(context, err, c.Logger)
return
}

Expand Down
10 changes: 5 additions & 5 deletions server/payment.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,11 +13,11 @@ func (c *Configuration) GetPaymailAndCreateMetadata(context *gin.Context, satosh
// Parse, sanitize and basic validation
alias, domain, paymailAddress := paymail.SanitizePaymail(incomingPaymail)
if len(paymailAddress) == 0 {
errors.ErrorResponse(context, errors.ErrInvalidPaymail)
errors.ErrorResponse(context, errors.ErrInvalidPaymail, c.Logger)
return
}
if !c.IsAllowedDomain(domain) {
errors.ErrorResponse(context, errors.ErrDomainUnknown)
errors.ErrorResponse(context, errors.ErrDomainUnknown, c.Logger)
return
}

Expand All @@ -28,7 +28,7 @@ func (c *Configuration) GetPaymailAndCreateMetadata(context *gin.Context, satosh

// Did we get some satoshis?
if paymentRequest.Satoshis == 0 {
errors.ErrorResponse(context, errors.ErrMissingFieldSatoshis)
errors.ErrorResponse(context, errors.ErrMissingFieldSatoshis, c.Logger)
return
}

Expand All @@ -39,11 +39,11 @@ func (c *Configuration) GetPaymailAndCreateMetadata(context *gin.Context, satosh
// Get from the data layer
foundPaymail, err := c.actions.GetPaymailByAlias(context.Request.Context(), alias, domain, md)
if err != nil {
errors.ErrorResponse(context, err)
errors.ErrorResponse(context, err, c.Logger)
return
}
if foundPaymail == nil {
errors.ErrorResponse(context, errors.ErrCouldNotFindPaymail)
errors.ErrorResponse(context, errors.ErrCouldNotFindPaymail, c.Logger)
return
}

Expand Down
10 changes: 5 additions & 5 deletions server/pike.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,12 +15,12 @@ func (c *Configuration) pikeNewContact(rc *gin.Context) {
var requesterContact paymail.PikeContactRequestPayload
err := json.NewDecoder(rc.Request.Body).Decode(&requesterContact)
if err != nil {
errors.ErrorResponse(rc, errors.ErrCannotBindRequest)
errors.ErrorResponse(rc, errors.ErrCannotBindRequest, c.Logger)
return
}

if err = c.pikeContactActions.AddContact(rc.Request.Context(), receiverPaymail, &requesterContact); err != nil {
errors.ErrorResponse(rc, err)
errors.ErrorResponse(rc, err, c.Logger)
return
}

Expand All @@ -34,7 +34,7 @@ func (c *Configuration) pikeGetOutputTemplates(rc *gin.Context) {
_ = rc.Request.Body.Close()
}()
if err != nil {
errors.ErrorResponse(rc, errors.ErrCannotBindRequest)
errors.ErrorResponse(rc, errors.ErrCannotBindRequest, c.Logger)
return
}

Expand All @@ -46,15 +46,15 @@ func (c *Configuration) pikeGetOutputTemplates(rc *gin.Context) {

pki, err := getPKI(paymentDestinationRequest.SenderPaymail)
if err != nil {
errors.ErrorResponse(rc, err)
errors.ErrorResponse(rc, err, c.Logger)
return
}

var response *paymail.PikePaymentOutputsResponse
if response, err = c.pikePaymentActions.CreatePikeOutputResponse(
rc.Request.Context(), alias, domain, pki.PubKey, paymentDestinationRequest.Amount, md,
); err != nil {
errors.ErrorResponse(rc, err)
errors.ErrorResponse(rc, err, c.Logger)
return
}

Expand Down
8 changes: 4 additions & 4 deletions server/pki.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,21 +16,21 @@ func (c *Configuration) showPKI(context *gin.Context) {

alias, domain, address := paymail.SanitizePaymail(incomingPaymail)
if len(address) == 0 {
errors.ErrorResponse(context, errors.ErrDomainUnknown)
errors.ErrorResponse(context, errors.ErrDomainUnknown, c.Logger)
return
} else if !c.IsAllowedDomain(domain) {
errors.ErrorResponse(context, errors.ErrDomainUnknown)
errors.ErrorResponse(context, errors.ErrDomainUnknown, c.Logger)
return
}

md := CreateMetadata(context.Request, alias, domain, "")

foundPaymail, err := c.actions.GetPaymailByAlias(context.Request.Context(), alias, domain, md)
if err != nil {
errors.ErrorResponse(context, err)
errors.ErrorResponse(context, err, c.Logger)
return
} else if foundPaymail == nil {
errors.ErrorResponse(context, errors.ErrCouldNotFindPaymail)
errors.ErrorResponse(context, errors.ErrCouldNotFindPaymail, c.Logger)
return
}

Expand Down
8 changes: 4 additions & 4 deletions server/public_profile.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,10 @@ func (c *Configuration) publicProfile(context *gin.Context) {
// Parse, sanitize and basic validation
alias, domain, address := paymail.SanitizePaymail(incomingPaymail)
if len(address) == 0 {
errors.ErrorResponse(context, errors.ErrInvalidPaymail)
errors.ErrorResponse(context, errors.ErrInvalidPaymail, c.Logger)
return
} else if !c.IsAllowedDomain(domain) {
errors.ErrorResponse(context, errors.ErrDomainUnknown)
errors.ErrorResponse(context, errors.ErrDomainUnknown, c.Logger)
return
}

Expand All @@ -30,10 +30,10 @@ func (c *Configuration) publicProfile(context *gin.Context) {
// Get from the data layer
foundPaymail, err := c.actions.GetPaymailByAlias(context.Request.Context(), alias, domain, md)
if err != nil {
errors.ErrorResponse(context, err)
errors.ErrorResponse(context, err, c.Logger)
return
} else if foundPaymail == nil {
errors.ErrorResponse(context, errors.ErrCouldNotFindPaymail)
errors.ErrorResponse(context, errors.ErrCouldNotFindPaymail, c.Logger)
return
}

Expand Down
28 changes: 14 additions & 14 deletions server/resolve_address.go
Original file line number Diff line number Diff line change
Expand Up @@ -39,38 +39,38 @@ func (c *Configuration) resolveAddress(context *gin.Context) {
alias, domain, paymailAddress := paymail.SanitizePaymail(incomingPaymail)
if len(paymailAddress) == 0 {
context.JSON(http.StatusBadRequest, "invalid paymail: "+incomingPaymail)
errors.ErrorResponse(context, errors.ErrInvalidPaymail)
errors.ErrorResponse(context, errors.ErrInvalidPaymail, c.Logger)
return
} else if !c.IsAllowedDomain(domain) {
errors.ErrorResponse(context, errors.ErrDomainUnknown)
errors.ErrorResponse(context, errors.ErrDomainUnknown, c.Logger)
return
}

var senderRequest paymail.SenderRequest
err := context.Bind(&senderRequest)
if err != nil {
errors.ErrorResponse(context, errors.ErrCannotBindRequest)
errors.ErrorResponse(context, errors.ErrCannotBindRequest, c.Logger)
return
}

// Check for required fields
if len(senderRequest.SenderHandle) == 0 {
errors.ErrorResponse(context, errors.ErrSenderHandleEmpty)
errors.ErrorResponse(context, errors.ErrSenderHandleEmpty, c.Logger)
return
} else if len(senderRequest.Dt) == 0 {
errors.ErrorResponse(context, errors.ErrDtEmpty)
errors.ErrorResponse(context, errors.ErrDtEmpty, c.Logger)
return
}

// Validate the timestamp
if err = paymail.ValidateTimestamp(senderRequest.Dt); err != nil {
errors.ErrorResponse(context, errors.ErrInvalidTimestamp)
errors.ErrorResponse(context, errors.ErrInvalidTimestamp, c.Logger)
return
}

// Basic validation on sender handle
if err = paymail.ValidatePaymail(senderRequest.SenderHandle); err != nil {
errors.ErrorResponse(context, errors.ErrInvalidSenderHandle)
errors.ErrorResponse(context, errors.ErrInvalidSenderHandle, c.Logger)
return
}

Expand All @@ -82,24 +82,24 @@ func (c *Configuration) resolveAddress(context *gin.Context) {
var senderPubKey *ec.PublicKey
senderPubKey, err = getSenderPubKey(senderRequest.SenderHandle)
if err != nil {
errors.ErrorResponse(context, err)
errors.ErrorResponse(context, err, c.Logger)
return
}

// Derive address from pubKey
var rawAddress *script.Address
if rawAddress, err = script.NewAddressFromPublicKey(senderPubKey, true); err != nil {
errors.ErrorResponse(context, errors.ErrInvalidSenderHandle)
errors.ErrorResponse(context, errors.ErrInvalidSenderHandle, c.Logger)
return
}

// Verify the signature
if err = senderRequest.Verify(rawAddress.AddressString, senderRequest.Signature); err != nil {
errors.ErrorResponse(context, errors.ErrInvalidSignature)
errors.ErrorResponse(context, errors.ErrInvalidSignature, c.Logger)
return
}
} else {
errors.ErrorResponse(context, errors.ErrMissingFieldSignature)
errors.ErrorResponse(context, errors.ErrMissingFieldSignature, c.Logger)
return
}
}
Expand All @@ -111,10 +111,10 @@ func (c *Configuration) resolveAddress(context *gin.Context) {
// Get from the data layer
foundPaymail, err := c.actions.GetPaymailByAlias(context.Request.Context(), alias, domain, md)
if err != nil {
errors.ErrorResponse(context, err)
errors.ErrorResponse(context, err, c.Logger)
return
} else if foundPaymail == nil {
errors.ErrorResponse(context, errors.ErrCouldNotFindPaymail)
errors.ErrorResponse(context, errors.ErrCouldNotFindPaymail, c.Logger)
return
}

Expand All @@ -123,7 +123,7 @@ func (c *Configuration) resolveAddress(context *gin.Context) {
if response, err = c.actions.CreateAddressResolutionResponse(
context.Request.Context(), alias, domain, c.SenderValidationEnabled, md,
); err != nil {
errors.ErrorResponse(context, err)
errors.ErrorResponse(context, err, c.Logger)
return
}

Expand Down
10 changes: 5 additions & 5 deletions server/verify.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,16 +18,16 @@ func (c *Configuration) verifyPubKey(context *gin.Context) {
// Parse, sanitize and basic validation
alias, domain, address := paymail.SanitizePaymail(incomingPaymail)
if len(address) == 0 {
errors.ErrorResponse(context, errors.ErrInvalidPaymail)
errors.ErrorResponse(context, errors.ErrInvalidPaymail, c.Logger)
return
} else if !c.IsAllowedDomain(domain) {
errors.ErrorResponse(context, errors.ErrDomainUnknown)
errors.ErrorResponse(context, errors.ErrDomainUnknown, c.Logger)
return
}

// Basic validation on pubkey
if len(incomingPubKey) != paymail.PubKeyLength {
errors.ErrorResponse(context, errors.ErrInvalidPubKey)
errors.ErrorResponse(context, errors.ErrInvalidPubKey, c.Logger)
return
}

Expand All @@ -37,10 +37,10 @@ func (c *Configuration) verifyPubKey(context *gin.Context) {
// Get from the data layer
foundPaymail, err := c.actions.GetPaymailByAlias(context.Request.Context(), alias, domain, md)
if err != nil {
errors.ErrorResponse(context, err)
errors.ErrorResponse(context, err, c.Logger)
return
} else if foundPaymail == nil {
errors.ErrorResponse(context, errors.ErrCouldNotFindPaymail)
errors.ErrorResponse(context, errors.ErrCouldNotFindPaymail, c.Logger)
return
}

Expand Down

0 comments on commit e15aa38

Please sign in to comment.