| @@ -4,6 +4,7 @@ import ( | |||
| "fmt" | |||
| "time" | |||
| "github.com/rs/zerolog/log" | |||
| "github.com/spf13/viper" | |||
| "gorm.io/driver/postgres" | |||
| "gorm.io/gorm" | |||
| @@ -39,9 +40,8 @@ type RewardFund struct { | |||
| Price float64 `gorm:"type:decimal(19,7)" json:"price"` | |||
| AmountAvailable float64 `gorm:"type:decimal(19,7)" json:"amountAvailable"` | |||
| MinContribution float64 `gorm:"type:decimal(19,7)" json:"minContribution"` | |||
| TelegramLink string `json:"telegramLink"` | |||
| Contributions []Contribution `json:"contributions"` | |||
| Title string `gorm:"type:varchar(50)" json:"title"` | |||
| Description string `gorm:"type:text" json:"description"` | |||
| Bonuses []Bonus `json:"bonuses"` | |||
| QueueOrder QueueOrder `json:"queueOrder"` | |||
| } | |||
| @@ -81,10 +81,10 @@ func InitializeDatabase() { | |||
| viper.GetString("database.ssl")) | |||
| Db, err = gorm.Open(postgres.Open(dcs), &gorm.Config{}) | |||
| if err != nil { | |||
| panic("Could not open database") | |||
| log.Error().Err(err).Msg("Could not open database") | |||
| } | |||
| err = Db.AutoMigrate(User{}, Queue{}, RewardFund{}, QueueOrder{}, Contribution{}, Bonus{}) | |||
| if err != nil { | |||
| panic("Could not migrate database") | |||
| log.Error().Err(err).Msg("Could not migrate database") | |||
| } | |||
| } | |||
| @@ -6,6 +6,7 @@ import ( | |||
| "github.com/imosed/signet/auth" | |||
| . "github.com/imosed/signet/data" | |||
| "github.com/rs/zerolog/log" | |||
| ) | |||
| type CloseRewardFundRequest struct { | |||
| @@ -17,13 +18,15 @@ func CloseRewardFund(w http.ResponseWriter, r *http.Request) { | |||
| var req CloseRewardFundRequest | |||
| err := json.NewDecoder(r.Body).Decode(&req) | |||
| if err != nil { | |||
| panic("Could not decode body") | |||
| log.Error().Err(err).Msg("Could not decode body in CloseRewardFund call") | |||
| return | |||
| } | |||
| var claims *auth.Claims | |||
| claims, err = auth.GetUserClaims(r) | |||
| if err != nil { | |||
| panic("Could not determine if user is authenticated") | |||
| log.Error().Err(err).Msg("Could not determine if user is authenticated") | |||
| return | |||
| } | |||
| var fund RewardFund | |||
| @@ -38,6 +41,6 @@ func CloseRewardFund(w http.ResponseWriter, r *http.Request) { | |||
| err = json.NewEncoder(w).Encode(resp) | |||
| if err != nil { | |||
| panic("Could not deliver response") | |||
| log.Error().Err(err).Msg("Could not deliver response in CloseRewardFund call") | |||
| } | |||
| } | |||
| @@ -7,6 +7,7 @@ import ( | |||
| "strings" | |||
| . "github.com/imosed/signet/data" | |||
| "github.com/rs/zerolog/log" | |||
| "github.com/stellar/go/clients/horizonclient" | |||
| "github.com/stellar/go/keypair" | |||
| "github.com/stellar/go/network" | |||
| @@ -24,7 +25,8 @@ func Contribute(resp http.ResponseWriter, req *http.Request) { | |||
| var cont ContributeRequest | |||
| err := json.NewDecoder(req.Body).Decode(&cont) | |||
| if err != nil { | |||
| panic("Could not read in contribution") | |||
| log.Error().Err(err).Msg("Could not read in contribution") | |||
| return | |||
| } | |||
| var fund RewardFund | |||
| @@ -34,7 +36,7 @@ func Contribute(resp http.ResponseWriter, req *http.Request) { | |||
| if cont.Amount < fund.MinContribution || !strings.HasPrefix(cont.PrivateKey, "S") || !fund.DeletedAt.Time.IsZero() { | |||
| err = json.NewEncoder(resp).Encode(&SuccessResponse{Success: false}) | |||
| if err != nil { | |||
| panic("Could not deliver unsuccessful contribution response") | |||
| log.Error().Err(err).Msg("Could not deliver unsuccessful contribution response") | |||
| } | |||
| return | |||
| } | |||
| @@ -44,7 +46,8 @@ func Contribute(resp http.ResponseWriter, req *http.Request) { | |||
| var sourceAcct horizon.Account | |||
| sourceAcct, err = client.AccountDetail(sourceReq) | |||
| if err != nil { | |||
| panic("Horizon client: could not get account details") | |||
| log.Error().Err(err).Msg("Could not get account details from Horizon client") | |||
| return | |||
| } | |||
| tx, err := txnbuild.NewTransaction( | |||
| @@ -66,18 +69,21 @@ func Contribute(resp http.ResponseWriter, req *http.Request) { | |||
| }, | |||
| }) | |||
| if err != nil { | |||
| panic("Could not create contribution transaction") | |||
| log.Error().Err(err).Msg("Could not create contribution transaction") | |||
| return | |||
| } | |||
| tx, err = tx.Sign(network.TestNetworkPassphrase, source) | |||
| if err != nil { | |||
| panic("Could not sign contribution transaction") | |||
| log.Error().Err(err).Msg("Could not sign contribution transaction") | |||
| return | |||
| } | |||
| var response horizon.Transaction | |||
| response, err = client.SubmitTransaction(tx) | |||
| if err != nil { | |||
| panic("Could not submit contribution transaction") | |||
| log.Error().Err(err).Msg("Could not submit contribution transaction") | |||
| return | |||
| } | |||
| fmt.Println("Successful Transaction:") | |||
| @@ -89,6 +95,6 @@ func Contribute(resp http.ResponseWriter, req *http.Request) { | |||
| err = json.NewEncoder(resp).Encode(&result) | |||
| if err != nil { | |||
| panic("Could not create response for new contribution") | |||
| log.Error().Err(err).Msg("Could not create response for new contribution") | |||
| } | |||
| } | |||
| @@ -1,13 +1,13 @@ | |||
| package endpoints | |||
| import ( | |||
| "fmt" | |||
| "net/http" | |||
| "strconv" | |||
| "strings" | |||
| "github.com/gorilla/websocket" | |||
| . "github.com/imosed/signet/data" | |||
| "github.com/rs/zerolog/log" | |||
| "github.com/spf13/viper" | |||
| "github.com/stellar/go/clients/horizonclient" | |||
| "github.com/stellar/go/protocols/horizon" | |||
| @@ -36,7 +36,8 @@ func ContributorStream(resp http.ResponseWriter, req *http.Request) { | |||
| var err error | |||
| wsConn, err = upgrader.Upgrade(resp, req, nil) | |||
| if err != nil { | |||
| panic("Could not establish websocket connection") | |||
| log.Error().Err(err).Msg("Could not establish websocket connection") | |||
| return | |||
| } | |||
| } | |||
| @@ -59,11 +60,13 @@ func InitializeContributionStreams() { | |||
| tx, err = client.TransactionDetail(payment.GetTransactionHash()) | |||
| if err != nil { | |||
| panic("Could not get transaction from hash") | |||
| log.Error().Err(err).Msg("Could not get transaction from hash") | |||
| return | |||
| } | |||
| amt, err = strconv.ParseFloat(payment.Amount, 64) | |||
| if err != nil { | |||
| panic("Could not convert payment to float") | |||
| log.Error().Err(err).Msg("Could not convert payment to float") | |||
| return | |||
| } | |||
| if tx.Memo == "" { | |||
| @@ -83,10 +86,10 @@ func InitializeContributionStreams() { | |||
| if wsConn != nil { | |||
| err = wsConn.WriteJSON(contribution) | |||
| if err != nil { | |||
| panic("Unable to write json to contribution stream") | |||
| log.Error().Err(err).Msg("Unable to write json to contribution stream") | |||
| } | |||
| } else { | |||
| fmt.Println("No websocket connections") | |||
| log.Info().Msg("No websocket connections") | |||
| } | |||
| Db.Table("contributions").Create(&contribution) | |||
| @@ -103,7 +106,7 @@ func InitializeContributionStreams() { | |||
| cancellations = append(cancellations, cancellation) | |||
| err = client.StreamOperations(ctx, opReq, contributionUpdateHandler) | |||
| if err != nil { | |||
| panic(err.Error()) | |||
| log.Error().Err(err).Msg("Failed to stream contributions from Horizon client") | |||
| } | |||
| } | |||
| } | |||
| @@ -5,6 +5,7 @@ import ( | |||
| "net/http" | |||
| . "github.com/imosed/signet/data" | |||
| "github.com/rs/zerolog/log" | |||
| ) | |||
| type CreateQueueRequest struct { | |||
| @@ -19,7 +20,8 @@ func CreateQueue(w http.ResponseWriter, r *http.Request) { | |||
| var req CreateQueueRequest | |||
| err := json.NewDecoder(r.Body).Decode(&req) | |||
| if err != nil { | |||
| panic("Could not decode body") | |||
| log.Error().Err(err).Msg("Could not decode body in CreateQueue call") | |||
| return | |||
| } | |||
| var specificQueue Queue | |||
| @@ -41,6 +43,6 @@ func CreateQueue(w http.ResponseWriter, r *http.Request) { | |||
| err = json.NewEncoder(w).Encode(resp) | |||
| if err != nil { | |||
| panic("Could not deliver response") | |||
| log.Error().Err(err).Msg("Could not deliver response in CreateQueue call") | |||
| } | |||
| } | |||
| @@ -8,6 +8,7 @@ import ( | |||
| "github.com/imosed/signet/auth" | |||
| . "github.com/imosed/signet/data" | |||
| "github.com/rs/zerolog/log" | |||
| "github.com/stellar/go/clients/horizonclient" | |||
| "github.com/stellar/go/protocols/horizon" | |||
| ) | |||
| @@ -19,8 +20,7 @@ type CreateRewardFundRequest struct { | |||
| IssuerWallet string `json:"issuerWallet"` | |||
| Memo string `json:"memo"` | |||
| MinContribution float64 `gorm:"type:decimal(19,7)" json:"minContribution"` | |||
| Title string `gorm:"type:varchar(50)" json:"title"` | |||
| Description string `gorm:"type:text" json:"description"` | |||
| TelegramLink string `json:"telegramLink"` | |||
| QueueID uint `json:"queueID"` | |||
| Bonuses []Bonus `json:"bonuses"` | |||
| } | |||
| @@ -34,7 +34,8 @@ func CreateRewardFund(resp http.ResponseWriter, req *http.Request) { | |||
| dec := json.NewDecoder(req.Body) | |||
| err := dec.Decode(&fund) | |||
| if err != nil { | |||
| panic("Could not read submitted reward fund") | |||
| log.Error().Err(err).Msg("Could not read submitted reward fund") | |||
| return | |||
| } | |||
| var bonuses []Bonus | |||
| @@ -48,8 +49,7 @@ func CreateRewardFund(resp http.ResponseWriter, req *http.Request) { | |||
| Price: 0, | |||
| AmountAvailable: 0, | |||
| MinContribution: fund.MinContribution, | |||
| Title: fund.Title, | |||
| Description: fund.Description, | |||
| TelegramLink: fund.TelegramLink, | |||
| Contributions: nil, | |||
| } | |||
| @@ -70,7 +70,8 @@ func CreateRewardFund(resp http.ResponseWriter, req *http.Request) { | |||
| op, err := client.Offers(offerReq) | |||
| if err != nil { | |||
| panic("Could not get offers") | |||
| log.Error().Err(err).Msg("Could not get offers") | |||
| return | |||
| } | |||
| offers := op.Embedded.Records | |||
| var price float64 | |||
| @@ -78,11 +79,13 @@ func CreateRewardFund(resp http.ResponseWriter, req *http.Request) { | |||
| if len(offers) == 1 { | |||
| price, err = strconv.ParseFloat(op.Embedded.Records[0].Price, 64) | |||
| if err != nil { | |||
| panic("Could not parse price to float") | |||
| log.Error().Err(err).Msg("Could not parse price to float") | |||
| return | |||
| } | |||
| amt, err = strconv.ParseFloat(op.Embedded.Records[0].Amount, 64) | |||
| if err != nil { | |||
| panic("Could not parse amount to float") | |||
| log.Error().Err(err).Msg("Could not parse amount to float") | |||
| return | |||
| } | |||
| rewardFund.Price = price | |||
| rewardFund.AmountAvailable = amt | |||
| @@ -92,7 +95,8 @@ func CreateRewardFund(resp http.ResponseWriter, req *http.Request) { | |||
| for _, o := range op.Embedded.Records { | |||
| parsedAmt, err := strconv.ParseFloat(o.Amount, 64) | |||
| if err != nil { | |||
| panic("Could not parse amount to float") | |||
| log.Error().Err(err).Msg("Could not parse amount to float") | |||
| return | |||
| } | |||
| if parsedAmt > maxOffers { | |||
| correctOffer = o | |||
| @@ -101,13 +105,14 @@ func CreateRewardFund(resp http.ResponseWriter, req *http.Request) { | |||
| } | |||
| price, err = strconv.ParseFloat(correctOffer.Price, 64) | |||
| if err != nil { | |||
| panic("Could not parse price to float") | |||
| log.Error().Err(err).Msg("Could not parse price to float") | |||
| return | |||
| } | |||
| rewardFund.Price = price | |||
| amt, err = strconv.ParseFloat(correctOffer.Amount, 64) | |||
| if err != nil { | |||
| panic("Could not parse amount to float") | |||
| log.Error().Err(err).Msg("Could not parse amount to float") | |||
| } | |||
| rewardFund.AmountAvailable = amt | |||
| } else { | |||
| @@ -118,7 +123,8 @@ func CreateRewardFund(resp http.ResponseWriter, req *http.Request) { | |||
| var claims *auth.Claims | |||
| claims, err = auth.GetUserClaims(req) | |||
| if err != nil { | |||
| panic("Could not determine if user is authenticated") | |||
| log.Error().Err(err).Msg("Could not determine if user is authenticated") | |||
| return | |||
| } | |||
| if claims.Privileges <= Admin { | |||
| @@ -138,7 +144,7 @@ func CreateRewardFund(resp http.ResponseWriter, req *http.Request) { | |||
| err = json.NewEncoder(resp).Encode(&SuccessResponse{Success: true}) | |||
| if err != nil { | |||
| panic("Could not create response for created reward fund") | |||
| log.Error().Err(err).Msg("Could not create response for created reward fund") | |||
| } | |||
| } else { | |||
| resp.WriteHeader(403) | |||
| @@ -6,6 +6,7 @@ import ( | |||
| "github.com/imosed/signet/auth" | |||
| . "github.com/imosed/signet/data" | |||
| "github.com/rs/zerolog/log" | |||
| ) | |||
| type EscalatePrivilegesRequest struct { | |||
| @@ -16,7 +17,8 @@ func EscalatePrivileges(w http.ResponseWriter, r *http.Request) { | |||
| var req EscalatePrivilegesRequest | |||
| err := json.NewDecoder(r.Body).Decode(&req) | |||
| if err != nil { | |||
| panic("Could not decode body") | |||
| log.Error().Err(err).Msg("Could not decode body in EscalatePrivileges call") | |||
| return | |||
| } | |||
| var resp SuccessResponse | |||
| @@ -32,7 +34,7 @@ func EscalatePrivileges(w http.ResponseWriter, r *http.Request) { | |||
| err = json.NewEncoder(w).Encode(resp) | |||
| if err != nil { | |||
| panic("Could not deliver failed escalate privileges response") | |||
| log.Error().Err(err).Msg("Could not deliver failed escalate privileges response") | |||
| } | |||
| return | |||
| } | |||
| @@ -45,6 +47,6 @@ func EscalatePrivileges(w http.ResponseWriter, r *http.Request) { | |||
| err = json.NewEncoder(w).Encode(resp) | |||
| if err != nil { | |||
| panic("Could not deliver successful escalate privileges response") | |||
| log.Error().Err(err).Msg("Could not deliver successful escalate privileges response") | |||
| } | |||
| } | |||
| @@ -5,6 +5,7 @@ import ( | |||
| "net/http" | |||
| "strconv" | |||
| "github.com/rs/zerolog/log" | |||
| "github.com/stellar/go/clients/horizonclient" | |||
| "github.com/stellar/go/keypair" | |||
| "github.com/stellar/go/protocols/horizon" | |||
| @@ -22,7 +23,8 @@ func GetBalance(w http.ResponseWriter, r *http.Request) { | |||
| var req GetBalanceRequest | |||
| err := json.NewDecoder(r.Body).Decode(&req) | |||
| if err != nil { | |||
| panic("Could not decode body") | |||
| log.Error().Err(err).Msg("Could not decode body in GetBalance call") | |||
| return | |||
| } | |||
| var kp keypair.KP | |||
| @@ -38,7 +40,8 @@ func GetBalance(w http.ResponseWriter, r *http.Request) { | |||
| var acct horizon.Account | |||
| acct, err = client.AccountDetail(acctReq) | |||
| if err != nil { | |||
| panic("Could not get account data from public key") | |||
| log.Error().Err(err).Msg("Could not get account data from public key") | |||
| return | |||
| } | |||
| var blnce = -1.0 | |||
| @@ -49,7 +52,8 @@ func GetBalance(w http.ResponseWriter, r *http.Request) { | |||
| } | |||
| if blnce == -1.0 { | |||
| panic("Could not get XLM balance") | |||
| log.Error().Err(err).Msg("Could not get XLM balance") | |||
| return | |||
| } | |||
| var resp GetBalanceResponse | |||
| @@ -57,6 +61,6 @@ func GetBalance(w http.ResponseWriter, r *http.Request) { | |||
| err = json.NewEncoder(w).Encode(resp) | |||
| if err != nil { | |||
| panic("Could not deliver response") | |||
| log.Error().Err(err).Msg("Could not deliver response in GetBalance call") | |||
| } | |||
| } | |||
| @@ -5,6 +5,7 @@ import ( | |||
| "net/http" | |||
| . "github.com/imosed/signet/data" | |||
| "github.com/rs/zerolog/log" | |||
| ) | |||
| type QueueMember struct { | |||
| @@ -26,7 +27,8 @@ func GetQueueMembers(w http.ResponseWriter, r *http.Request) { | |||
| var req GetQueueMembersRequest | |||
| err := json.NewDecoder(r.Body).Decode(&req) | |||
| if err != nil { | |||
| panic("Could not decode body") | |||
| log.Error().Err(err).Msg("Could not decode body in GetQueueMembers call") | |||
| return | |||
| } | |||
| var members []QueueMember | |||
| @@ -40,6 +42,6 @@ func GetQueueMembers(w http.ResponseWriter, r *http.Request) { | |||
| err = json.NewEncoder(w).Encode(resp) | |||
| if err != nil { | |||
| panic("Could not deliver response") | |||
| log.Error().Err(err).Msg("Could not deliver response in GetQueueMembers call") | |||
| } | |||
| } | |||
| @@ -5,6 +5,7 @@ import ( | |||
| "net/http" | |||
| . "github.com/imosed/signet/data" | |||
| "github.com/rs/zerolog/log" | |||
| ) | |||
| type GetQueuesResponse struct { | |||
| @@ -18,6 +19,6 @@ func GetQueues(w http.ResponseWriter, _ *http.Request) { | |||
| err := json.NewEncoder(w).Encode(resp) | |||
| if err != nil { | |||
| panic("Could not deliver response") | |||
| log.Error().Err(err).Msg("Could not deliver response in GetQueues call") | |||
| } | |||
| } | |||
| @@ -6,6 +6,7 @@ import ( | |||
| "time" | |||
| . "github.com/imosed/signet/data" | |||
| "github.com/rs/zerolog/log" | |||
| "gorm.io/gorm/clause" | |||
| ) | |||
| @@ -33,7 +34,7 @@ func GetRewardFund(resp http.ResponseWriter, req *http.Request) { | |||
| dec := json.NewDecoder(req.Body) | |||
| err := dec.Decode(&requestedFund) | |||
| if err != nil { | |||
| panic("Could not read requested fund") | |||
| log.Error().Err(err).Msg("Could not read requested fund") | |||
| } | |||
| found := Db.Preload(clause.Associations).Find(&fund, requestedFund.ID).RowsAffected | |||
| @@ -65,8 +66,7 @@ func GetRewardFund(resp http.ResponseWriter, req *http.Request) { | |||
| Price: fund.Price, | |||
| AmountAvailable: fund.AmountAvailable, | |||
| MinContribution: fund.MinContribution, | |||
| Title: fund.Title, | |||
| Description: fund.Description, | |||
| TelegramLink: fund.TelegramLink, | |||
| Bonuses: fund.Bonuses, | |||
| }, | |||
| Contributions: contribs, | |||
| @@ -75,7 +75,7 @@ func GetRewardFund(resp http.ResponseWriter, req *http.Request) { | |||
| err = json.NewEncoder(resp).Encode(r) | |||
| if err != nil { | |||
| panic("Could not deliver requested fund") | |||
| log.Error().Err(err).Msg("Could not deliver requested fund") | |||
| } | |||
| } | |||
| @@ -98,7 +98,8 @@ func GetContributions(w http.ResponseWriter, r *http.Request) { | |||
| var req GetContributionsRequest | |||
| err := json.NewDecoder(r.Body).Decode(&req) | |||
| if err != nil { | |||
| panic("Could not decode body") | |||
| log.Error().Err(err).Msg("Could not decode body in GetContributions call") | |||
| return | |||
| } | |||
| var resp GetContributionsResponse | |||
| @@ -120,7 +121,8 @@ func GetContributions(w http.ResponseWriter, r *http.Request) { | |||
| t, err = time.Parse("2006-Jan-02", req.ForDate) | |||
| t = t.Add(time.Hour * 24) | |||
| if err != nil { | |||
| panic("Could not interpret time") | |||
| log.Error().Err(err).Msg("Could not interpret time") | |||
| return | |||
| } | |||
| if req.ConsolidateContributions { | |||
| baseQuery.Select("wallet, sum(amount) amount").Where("created_at < ?", t).Group("wallet").Scan(&resp.List) | |||
| @@ -133,7 +135,7 @@ func GetContributions(w http.ResponseWriter, r *http.Request) { | |||
| err = json.NewEncoder(w).Encode(resp) | |||
| if err != nil { | |||
| panic("Could not deliver response") | |||
| log.Error().Err(err).Msg("Could not deliver response in GetContributions call") | |||
| } | |||
| } | |||
| @@ -147,7 +149,6 @@ type FundInfo struct { | |||
| Price float64 `json:"price"` | |||
| AmountAvailable float64 `json:"amountAvailable"` | |||
| MinContribution float64 `json:"minContribution"` | |||
| Title string `json:"title"` | |||
| Description string `json:"description"` | |||
| TelegramLink string `json:"telegramLink"` | |||
| Bonuses []Bonus `json:"bonuses"` | |||
| } | |||
| @@ -5,6 +5,7 @@ import ( | |||
| "net/http" | |||
| . "github.com/imosed/signet/data" | |||
| "github.com/rs/zerolog/log" | |||
| ) | |||
| func getQualifiedRewardFunds() []RewardFund { | |||
| @@ -71,7 +72,8 @@ func GetRewardFunds(w http.ResponseWriter, r *http.Request) { | |||
| var req GetRewardFundsRequest | |||
| err := json.NewDecoder(r.Body).Decode(&req) | |||
| if err != nil { | |||
| panic("Could not decode body") | |||
| log.Error().Err(err).Msg("Could not decode body in GetRewardFunds call") | |||
| return | |||
| } | |||
| var resp GetRewardFundsResponse | |||
| @@ -88,15 +90,14 @@ func GetRewardFunds(w http.ResponseWriter, r *http.Request) { | |||
| Memo: f.Memo, | |||
| AmountAvailable: f.AmountAvailable, | |||
| MinContribution: f.MinContribution, | |||
| Title: f.Title, | |||
| Description: f.Description, | |||
| TelegramLink: f.TelegramLink, | |||
| Bonuses: f.Bonuses, | |||
| }) | |||
| } | |||
| err = json.NewEncoder(w).Encode(resp) | |||
| if err != nil { | |||
| panic("Could not deliver response") | |||
| log.Error().Err(err).Msg("Could not deliver response in GetRewardFunds call") | |||
| } | |||
| } | |||
| @@ -8,6 +8,7 @@ import ( | |||
| "github.com/golang-jwt/jwt/v4" | |||
| "github.com/imosed/signet/auth" | |||
| . "github.com/imosed/signet/data" | |||
| "github.com/rs/zerolog/log" | |||
| "github.com/spf13/viper" | |||
| ) | |||
| @@ -19,7 +20,8 @@ func Login(w http.ResponseWriter, r *http.Request) { | |||
| var req AuthenticationRequest | |||
| err := json.NewDecoder(r.Body).Decode(&req) | |||
| if err != nil { | |||
| panic("Could not decode body") | |||
| log.Error().Err(err).Msg("Failed to decode body in login attempt") | |||
| return | |||
| } | |||
| var userData struct { | |||
| @@ -34,11 +36,15 @@ func Login(w http.ResponseWriter, r *http.Request) { | |||
| var passwordMatches bool | |||
| passwordMatches, err = ComparePasswordAndHash(req.Password, userData.Password) | |||
| if err != nil { | |||
| panic("Could not compare password to hash") | |||
| log.Error().Err(err).Msg("Could not compare password to hash in login attempt") | |||
| return | |||
| } | |||
| if !passwordMatches { | |||
| resp.Token = nil | |||
| err = json.NewEncoder(w).Encode(resp) | |||
| if err != nil { | |||
| log.Error().Err(err).Msg("Failed to deliver failed login attempt response") | |||
| } | |||
| return | |||
| } | |||
| @@ -53,12 +59,13 @@ func Login(w http.ResponseWriter, r *http.Request) { | |||
| secret := viper.GetString("app.secretKey") | |||
| tokenString, err := token.SignedString([]byte(secret)) | |||
| if err != nil { | |||
| panic("Could not generate JWT token") | |||
| log.Error().Err(err).Msg("Could not generate JWT token") | |||
| return | |||
| } | |||
| resp.Token = &tokenString | |||
| err = json.NewEncoder(w).Encode(resp) | |||
| if err != nil { | |||
| panic("Could not deliver response") | |||
| log.Error().Err(err).Msg("Could not deliver response in Login call") | |||
| } | |||
| } | |||
| @@ -12,6 +12,7 @@ import ( | |||
| "github.com/imosed/signet/auth" | |||
| . "github.com/imosed/signet/data" | |||
| "github.com/rs/zerolog/log" | |||
| "github.com/spf13/viper" | |||
| "golang.org/x/crypto/argon2" | |||
| ) | |||
| @@ -127,13 +128,15 @@ func Register(w http.ResponseWriter, r *http.Request) { | |||
| var req AuthenticationRequest | |||
| err := json.NewDecoder(r.Body).Decode(&req) | |||
| if err != nil { | |||
| panic("Could not decode body") | |||
| log.Error().Err(err).Msg("Could not decode body in Register call") | |||
| return | |||
| } | |||
| var claims *auth.Claims | |||
| claims, err = auth.GetUserClaims(r) | |||
| if err != nil { | |||
| panic("Could not determine if user is authenticated") | |||
| log.Error().Err(err).Msg("Could not determine if user is authenticated") | |||
| return | |||
| } | |||
| if noUsersRegistered() || claims.Privileges <= AdminPlus { | |||
| @@ -145,7 +148,8 @@ func Register(w http.ResponseWriter, r *http.Request) { | |||
| KeyLength: uint32(viper.GetInt("hashing.keyLength")), | |||
| }) | |||
| if err != nil { | |||
| panic("Could not generate hash for registration") | |||
| log.Error().Err(err).Msg("Could not generate hash for registration") | |||
| return | |||
| } | |||
| Db.Create(&User{ | |||
| @@ -156,12 +160,12 @@ func Register(w http.ResponseWriter, r *http.Request) { | |||
| err = json.NewEncoder(w).Encode(SuccessResponse{Success: true}) | |||
| if err != nil { | |||
| panic("Could not deliver successful account creation response") | |||
| log.Error().Err(err).Msg("Could not deliver successful account creation response") | |||
| } | |||
| } else if !noUsersRegistered() { | |||
| err = json.NewEncoder(w).Encode(SuccessResponse{Success: false}) | |||
| if err != nil { | |||
| panic("Could not deliver unsuccessful account creation response") | |||
| log.Error().Err(err).Msg("Could not deliver unsuccessful account creation response") | |||
| } | |||
| } else if claims.Privileges > SuperUser { | |||
| w.WriteHeader(403) | |||
| @@ -6,6 +6,7 @@ import ( | |||
| "net/http" | |||
| . "github.com/imosed/signet/data" | |||
| "github.com/rs/zerolog/log" | |||
| "github.com/stellar/go/clients/horizonclient" | |||
| "github.com/stellar/go/protocols/horizon" | |||
| ) | |||
| @@ -20,7 +21,7 @@ func SubmitFund(w http.ResponseWriter, r *http.Request) { | |||
| var req SubmitFundRequest | |||
| err := json.NewDecoder(r.Body).Decode(&req) | |||
| if err != nil { | |||
| panic("Could not decode body") | |||
| log.Error().Err(err).Msg("Could not decode body in SubmitFund call") | |||
| } | |||
| var fund RewardFund | |||
| @@ -71,12 +72,12 @@ func SubmitFund(w http.ResponseWriter, r *http.Request) { | |||
| // }, | |||
| // }) | |||
| // if err != nil { | |||
| // panic("Could not submit reward fund") | |||
| // log.Error().Err(err).Msg("Could not submit reward fund") | |||
| // } | |||
| // | |||
| // tx, err = tx.Sign(network.TestNetworkPassphrase, source) | |||
| // if err != nil { | |||
| // panic("Could not submit fund") | |||
| // log.Error().Err(err).Msg("Could not submit fund") | |||
| // } | |||
| // | |||
| // var response horizon.Transaction | |||
| @@ -87,6 +88,6 @@ func SubmitFund(w http.ResponseWriter, r *http.Request) { | |||
| err = json.NewEncoder(w).Encode(resp) | |||
| if err != nil { | |||
| panic("Could not deliver response") | |||
| log.Error().Err(err).Msg("Could not deliver response in SubmitFund call") | |||
| } | |||
| } | |||
| @@ -5,6 +5,7 @@ import ( | |||
| "net/http" | |||
| . "github.com/imosed/signet/data" | |||
| "github.com/rs/zerolog/log" | |||
| ) | |||
| func UsersExist(w http.ResponseWriter, _ *http.Request) { | |||
| @@ -16,6 +17,6 @@ func UsersExist(w http.ResponseWriter, _ *http.Request) { | |||
| err := json.NewEncoder(w).Encode(resp) | |||
| if err != nil { | |||
| panic("Could not deliver response") | |||
| log.Error().Err(err).Msg("Could not deliver response in UsersExist call") | |||
| } | |||
| } | |||
| @@ -6,7 +6,7 @@ require ( | |||
| github.com/golang-jwt/jwt/v4 v4.4.3 | |||
| github.com/gorilla/mux v1.8.0 | |||
| github.com/gorilla/websocket v1.5.0 | |||
| github.com/pdrum/swagger-automation v0.0.0-20190629163613-c8c7c80ba858 | |||
| github.com/rs/zerolog v1.15.0 | |||
| github.com/spf13/viper v0.0.0-20150621231900-db7ff930a189 | |||
| github.com/stellar/go v0.0.0-20221028081946-9308f9531041 | |||
| golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa | |||
| @@ -34,12 +34,8 @@ require ( | |||
| github.com/konsorten/go-windows-terminal-sequences v1.0.2 // indirect | |||
| github.com/kr/pretty v0.1.0 // indirect | |||
| github.com/kr/text v0.1.0 // indirect | |||
| github.com/labstack/echo v3.3.10+incompatible // indirect | |||
| github.com/labstack/gommon v0.2.9 // indirect | |||
| github.com/magiconair/properties v1.5.4 // indirect | |||
| github.com/manucorporat/sse v0.0.0-20160126180136-ee05b128a739 // indirect | |||
| github.com/mattn/go-colorable v0.1.6 // indirect | |||
| github.com/mattn/go-isatty v0.0.12 // indirect | |||
| github.com/mitchellh/mapstructure v0.0.0-20150613213606-2caf8efc9366 // indirect | |||
| github.com/pkg/errors v0.9.1 // indirect | |||
| github.com/pmezard/go-difflib v1.0.0 // indirect | |||
| @@ -51,8 +47,6 @@ require ( | |||
| github.com/stellar/go-xdr v0.0.0-20211103144802-8017fc4bdfee // indirect | |||
| github.com/stretchr/objx v0.4.0 // indirect | |||
| github.com/stretchr/testify v1.8.0 // indirect | |||
| github.com/valyala/bytebufferpool v1.0.0 // indirect | |||
| github.com/valyala/fasttemplate v1.0.1 // indirect | |||
| golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9 // indirect | |||
| golang.org/x/text v0.3.7 // indirect | |||
| gopkg.in/yaml.v2 v2.2.8 // indirect | |||
| @@ -12,7 +12,6 @@ github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7Do | |||
| github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= | |||
| github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= | |||
| github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= | |||
| github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= | |||
| github.com/fatih/structs v1.0.0 h1:BrX964Rv5uQ3wwS+KRUAJCBBw5PQmgJfJ6v4yly5QwU= | |||
| github.com/gavv/monotime v0.0.0-20161010190848-47d58efa6955 h1:gmtGRvSexPU4B1T/yYo0sLOKzER1YT+b4kPxPpm0Ty4= | |||
| github.com/go-chi/chi v4.0.3+incompatible h1:gakN3pDJnzZN5jqFV2TEdF66rTfKeITyR8qu6ekICEY= | |||
| @@ -99,10 +98,6 @@ github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= | |||
| github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= | |||
| github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= | |||
| github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= | |||
| github.com/labstack/echo v3.3.10+incompatible h1:pGRcYk231ExFAyoAjAfD85kQzRJCRI8bbnE7CX5OEgg= | |||
| github.com/labstack/echo v3.3.10+incompatible/go.mod h1:0INS7j/VjnFxD4E2wkz67b8cVwCLbBmJyDaka6Cmk1s= | |||
| github.com/labstack/gommon v0.2.9 h1:heVeuAYtevIQVYkGj6A41dtfT91LrvFG220lavpWhrU= | |||
| github.com/labstack/gommon v0.2.9/go.mod h1:E8ZTmW9vw5az5/ZyHWCp0Lw4OH2ecsaBP1C/NKavGG4= | |||
| github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= | |||
| github.com/lib/pq v1.1.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= | |||
| github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= | |||
| @@ -113,21 +108,15 @@ github.com/magiconair/properties v1.5.4/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czP | |||
| github.com/manucorporat/sse v0.0.0-20160126180136-ee05b128a739 h1:ykXz+pRRTibcSjG1yRhpdSHInF8yZY/mfn+Rz2Nd1rE= | |||
| github.com/manucorporat/sse v0.0.0-20160126180136-ee05b128a739/go.mod h1:zUx1mhth20V3VKgL5jbd1BSQcW4Fy6Qs4PZvQwRFwzM= | |||
| github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= | |||
| github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= | |||
| github.com/mattn/go-colorable v0.1.6 h1:6Su7aK7lXmJ/U79bYtBjLNaha4Fs1Rg9plHpcH+vvnE= | |||
| github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= | |||
| github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= | |||
| github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= | |||
| github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= | |||
| github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY= | |||
| github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= | |||
| github.com/mitchellh/mapstructure v0.0.0-20150613213606-2caf8efc9366 h1:1ypTpKUfEOyX1YsJru6lLq7hrmK+QGECpJQ1PHUHuGo= | |||
| github.com/mitchellh/mapstructure v0.0.0-20150613213606-2caf8efc9366/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= | |||
| github.com/moul/http2curl v0.0.0-20161031194548-4e24498b31db h1:eZgFHVkk9uOTaOQLC6tgjkzdp7Ays8eEVecBcfHZlJQ= | |||
| github.com/onsi/ginkgo v1.7.0 h1:WSHQ+IS43OoUrWtD1/bbclrwK8TTH5hzp+umCiuxHgs= | |||
| github.com/onsi/gomega v1.4.3 h1:RE1xgDvH7imwFD45h+u2SgIfERHlS2yNG4DObb5BSKU= | |||
| github.com/pdrum/swagger-automation v0.0.0-20190629163613-c8c7c80ba858 h1:lgbJiJQx8bXo+eM88AFdd0VxUvaTLzCBXpK+H9poJ+Y= | |||
| github.com/pdrum/swagger-automation v0.0.0-20190629163613-c8c7c80ba858/go.mod h1:y02HeaN0visd95W6cEX2NXDv5sCwyqfzucWTdDGEwYY= | |||
| github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= | |||
| github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= | |||
| github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= | |||
| @@ -136,6 +125,7 @@ github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZN | |||
| github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= | |||
| github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= | |||
| github.com/rs/zerolog v1.13.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU= | |||
| github.com/rs/zerolog v1.15.0 h1:uPRuwkWF4J6fGsJ2R0Gn2jB1EQiav9k3S6CSdygQJXY= | |||
| github.com/rs/zerolog v1.15.0/go.mod h1:xYTKnLHcpfU2225ny5qZjxnj9NvkumZYjJHlAThCjNc= | |||
| github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= | |||
| github.com/segmentio/go-loggly v0.5.1-0.20171222203950-eb91657e62b2 h1:S4OC0+OBKz6mJnzuHioeEat74PuQ4Sgvbf8eus695sc= | |||
| @@ -173,10 +163,7 @@ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ | |||
| github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk= | |||
| github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= | |||
| github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= | |||
| github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= | |||
| github.com/valyala/fasthttp v1.34.0 h1:d3AAQJ2DRcxJYHm7OXNXtXt2as1vMDfxeIcFvhmGGm4= | |||
| github.com/valyala/fasttemplate v1.0.1 h1:tY9CJiPnMXf1ERmG2EyK7gNUd+c6RKGD0IfU8WdUSz8= | |||
| github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= | |||
| github.com/xdrpp/goxdr v0.1.1 h1:E1B2c6E8eYhOVyd7yEpOyopzTPirUeF6mVOfXfGyJyc= | |||
| github.com/xeipuuv/gojsonpointer v0.0.0-20151027082146-e0fe6f683076 h1:KM4T3G70MiR+JtqplcYkNVoNz7pDwYaBxWBXQK804So= | |||
| github.com/xeipuuv/gojsonreference v0.0.0-20150808065054-e02fc20de94c h1:XZWnr3bsDQWAZg4Ne+cPoXRPILrNlPNQfxBuwLl43is= | |||
| @@ -199,7 +186,6 @@ go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= | |||
| golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= | |||
| golang.org/x/crypto v0.0.0-20190411191339-88737f569e3a/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= | |||
| golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= | |||
| golang.org/x/crypto v0.0.0-20190621222207-cc06ce4a13d4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= | |||
| golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= | |||
| golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= | |||
| golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= | |||
| @@ -227,7 +213,6 @@ golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5h | |||
| golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | |||
| golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | |||
| golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | |||
| golang.org/x/sys v0.0.0-20190602015325-4c4f7f33c9ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | |||
| golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | |||
| golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | |||
| golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | |||
| @@ -7,6 +7,8 @@ import ( | |||
| "github.com/gorilla/mux" | |||
| "github.com/imosed/signet/data" | |||
| "github.com/imosed/signet/endpoints" | |||
| "github.com/rs/zerolog" | |||
| "github.com/rs/zerolog/log" | |||
| "github.com/spf13/viper" | |||
| ) | |||
| @@ -19,9 +21,11 @@ func main() { | |||
| viper.SetConfigFile("config.production.json") | |||
| err = viper.ReadInConfig() | |||
| if err != nil { | |||
| panic("Could not read in Viper config") | |||
| log.Error().Err(err).Msg("Could not read in Viper config") | |||
| } | |||
| zerolog.TimeFieldFormat = zerolog.TimeFormatUnix | |||
| data.InitializeDatabase() | |||
| go endpoints.InitializeContributionStreams() | |||
| @@ -48,6 +52,6 @@ func main() { | |||
| fmt.Printf("Running on port %d...\n", port) | |||
| err = http.ListenAndServe(fmt.Sprintf(":%d", port), router) | |||
| if err != nil { | |||
| panic(fmt.Sprintf("Could not bind to port %d", port)) | |||
| log.Error().Err(err).Msg(fmt.Sprintf("Could not bind to port %d", port)) | |||
| } | |||
| } | |||