Skip to content

Commit

Permalink
forgot password flow (#4)
Browse files Browse the repository at this point in the history
* complete password registration flow

* dont load .env on prod

* use TLS in db conn

* fix not use SSL

* add error logs + better error http response scheme

* add config object

* tryna see resend_api_key issues

* woops

* use resend api key from config

* don't log it cmon
  • Loading branch information
vuvincent authored Sep 1, 2023
1 parent e85619b commit 016b820
Show file tree
Hide file tree
Showing 37 changed files with 1,686 additions and 132 deletions.
6 changes: 6 additions & 0 deletions apps/api/.dockerignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
# flyctl launch added from .gitignore
**/.idea
**/bin
**/.env
**/gin-bin
fly.toml
6 changes: 5 additions & 1 deletion apps/api/.env.example
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,8 @@ DB_NAME="supernova"
DB_USERNAME="root"
DB_PASSWORD="example"
DB_PORT=5432
JWT_SECRET="A super secret password" # you can use `openssl rand -base64 32` to generate a random string
JWT_SECRET="A super secret password" # you can use `openssl rand -base64 32` to generate a random string
RESEND_API_KEY=""
BASE_URL_WEB_APP="" # for various things that happens not on the desktop
REDIS_URL="127.0.0.1:6379"
REDIS_PASSWORD="example"
17 changes: 17 additions & 0 deletions apps/api/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# Use the official Go base image
FROM golang:1.20 AS build

# Set the working directory inside the container
WORKDIR /app

# Copy the Go application source code into the container
COPY . .

# Build the Go application
RUN go build -o /supernova

# Expose the port that the Go application will listen on
EXPOSE 3001

# Define the command to run your Go application
CMD ["/supernova"]
49 changes: 12 additions & 37 deletions apps/api/db/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,8 @@ package db

import (
"fmt"
"os"

"github.com/joho/godotenv"
"github.com/trysupernova/supernova-api/utils"
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
Expand All @@ -16,20 +15,12 @@ var DB *gorm.DB
* Returns a database connection URL suitable for use with Atlas
*/
func GetDatabaseUrl() string {
// set config file for dev environment only
if os.Getenv("ENVIRONMENT") == "dev" || os.Getenv("ENVIRONMENT") == "" {
err := godotenv.Load(".env")
if err != nil {
panic("Error loading .env file")
}
}

//db config vars
dbHost := os.Getenv("DB_HOST")
dbName := os.Getenv("DB_NAME")
dbUser := os.Getenv("DB_USERNAME")
dbPassword := os.Getenv("DB_PASSWORD")
dbPort := os.Getenv("DB_PORT")
dbHost := utils.GetConfig().DB_HOST
dbName := utils.GetConfig().DB_NAME
dbUser := utils.GetConfig().DB_USERNAME
dbPassword := utils.GetConfig().DB_PASSWORD
dbPort := utils.GetConfig().DB_PORT

//build connection string
var dbConnectionString string = fmt.Sprintf("mysql://%s:%s@%s:%s/%s", dbUser, dbPassword, dbHost, dbPort, dbName)
Expand All @@ -41,20 +32,12 @@ func GetDatabaseUrl() string {
* Returns a database connection DSN suitable for use with GORM
*/
func GetDatabaseDSN() string {
// set config file for dev environment only
if os.Getenv("ENVIRONMENT") == "dev" || os.Getenv("ENVIRONMENT") == "" {
err := godotenv.Load(".env")
if err != nil {
panic("Error loading .env file")
}
}

//db config vars
dbHost := os.Getenv("DB_HOST")
dbName := os.Getenv("DB_NAME")
dbUser := os.Getenv("DB_USERNAME")
dbPassword := os.Getenv("DB_PASSWORD")
dbPort := os.Getenv("DB_PORT")
dbHost := utils.GetConfig().DB_HOST
dbName := utils.GetConfig().DB_NAME
dbUser := utils.GetConfig().DB_USERNAME
dbPassword := utils.GetConfig().DB_PASSWORD
dbPort := utils.GetConfig().DB_PORT

//build connection string
var dbConnectionString string = fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8mb4&parseTime=True&loc=Local", dbUser, dbPassword, dbHost, dbPort, dbName)
Expand All @@ -66,16 +49,8 @@ func GetDatabaseDSN() string {
* Setup database connection and return a pointer to the connection
*/
func SetupDB() *gorm.DB {
// set config file for dev environment only
if os.Getenv("ENVIRONMENT") == "dev" || os.Getenv("ENVIRONMENT") == "" {
err := godotenv.Load(".env")
if err != nil {
panic("Error loading .env file")
}
}

//build connection string
var dbConnectionString string = GetDatabaseDSN()
dbConnectionString := GetDatabaseDSN()
//connect to db
db, dbError := gorm.Open(mysql.Open(dbConnectionString), &gorm.Config{SkipDefaultTransaction: true})
if dbError != nil {
Expand Down
17 changes: 17 additions & 0 deletions apps/api/db/redis.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package db

import (
"github.com/redis/go-redis/v9"
"github.com/trysupernova/supernova-api/utils"
)

var Redis *redis.Client

func SetupRedis() *redis.Client {
Redis = redis.NewClient(&redis.Options{
Addr: utils.GetConfig().REDIS_URL,
Password: utils.GetConfig().REDIS_PASSWORD,
DB: 0,
})
return Redis
}
12 changes: 11 additions & 1 deletion apps/api/docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,16 @@ services:
- "3306:3306"
volumes:
- db:/var/lib/mysql
redis:
image: redis:6
container_name: redis
ports:
- "6379:6379"
volumes:
- redis:/data
environment:
- REDIS_PASSWORD=example

volumes:
db:
db:
redis:
8 changes: 8 additions & 0 deletions apps/api/email/errors.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package email

import "github.com/trysupernova/supernova-api/utils"

const (
ErrEmailSendFailed utils.AppErrorType = "email_send_failed"
ErrEmailCompileFailed utils.AppErrorType = "email_compile_failed"
)
69 changes: 69 additions & 0 deletions apps/api/email/main.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
package email

import (
"bytes"
"context"
"embed"
"text/template"

"github.com/Boostport/mjml-go"
"github.com/resendlabs/resend-go"
"github.com/trysupernova/supernova-api/utils"
)

type EmailClient struct{}

func New() *EmailClient {
return &EmailClient{}
}

type EmailSend struct {
From string
To []string
Subject string
Body string
ReplyTo string
}

func (e *EmailClient) SendEmail(send EmailSend) (string, error) {
apiKey := utils.GetConfig().RESEND_API_KEY
client := resend.NewClient(apiKey)
params := &resend.SendEmailRequest{
To: send.To,
From: send.From,
Html: send.Body,
Subject: send.Subject,
ReplyTo: send.ReplyTo,
}

sent, err := client.Emails.Send(params)
if err != nil {
return "", utils.NewAppError(ErrEmailSendFailed, "Failed to send email: "+err.Error())
}
return sent.Id, nil
}

//go:embed templates/*
var resources embed.FS

var tmpl = template.Must(template.ParseFS(resources, "templates/*"))

func CompileEmailForgotPassword(resetUrl string) (string, error) {
// open a file
// read the contents of the file into a string
var result bytes.Buffer
err := tmpl.Execute(&result, struct {
Url string
}{
Url: resetUrl,
})
if err != nil {
return "", err
}
renderedMjml := result.String()
renderedHtml, err := mjml.ToHTML(context.Background(), renderedMjml, mjml.WithMinify(true))
if err != nil {
return "", utils.NewAppError(ErrEmailSendFailed, "Failed to compile email template to HTML: "+err.Error())
}
return renderedHtml, nil
}
13 changes: 13 additions & 0 deletions apps/api/email/templates/forgot-password.mjml
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
<mjml>
<mj-body>
<mj-section>
<mj-column>
<mj-text font-size="20px" color="#F45E43" font-family="helvetica">Forgot your password?</mj-text>
<mj-text>Please click on the following link to reset your password:</mj-text>
<mj-text>
<a href="{{ .Url }}" target="_blank">Reset Password</a>
</mj-text>
</mj-column>
</mj-section>
</mj-body>
</mjml>
12 changes: 12 additions & 0 deletions apps/api/email/templates/verify-email.mjml
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
<mjml>
<mj-body>
<mj-section>
<mj-column>
<mj-divider border-color="#F45E43"></mj-divider>

<mj-text font-size="20px" color="#F45E43" font-family="helvetica">Hello World</mj-text>

</mj-column>
</mj-section>
</mj-body>
</mjml>
12 changes: 11 additions & 1 deletion apps/api/go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ require (
ariga.io/atlas-go-sdk v0.1.0
ariga.io/atlas-provider-gorm v0.1.0
github.com/dgrijalva/jwt-go v3.2.0+incompatible
github.com/golang-jwt/jwt/v5 v5.0.0
github.com/gorilla/mux v1.8.0
github.com/joho/godotenv v1.5.1
golang.org/x/crypto v0.12.0
Expand All @@ -16,21 +17,26 @@ require (

require (
ariga.io/atlas v0.12.1 // indirect
github.com/Boostport/mjml-go v0.14.3 // indirect
github.com/agext/levenshtein v1.2.1 // indirect
github.com/alecthomas/kong v0.8.0 // indirect
github.com/andybalholm/brotli v1.0.5 // indirect
github.com/apparentlymart/go-textseg/v13 v13.0.0 // indirect
github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 // indirect
github.com/cespare/xxhash/v2 v2.2.0 // indirect
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect
github.com/felixge/httpsnoop v1.0.1 // indirect
github.com/fsnotify/fsnotify v1.6.0 // indirect
github.com/go-openapi/inflect v0.19.0 // indirect
github.com/go-sql-driver/mysql v1.7.1 // indirect
github.com/golang-jwt/jwt/v5 v5.0.0 // indirect
github.com/google/go-cmp v0.5.9 // indirect
github.com/gorilla/handlers v1.5.1 // indirect
github.com/hashicorp/hcl v1.0.0 // indirect
github.com/hashicorp/hcl/v2 v2.10.0 // indirect
github.com/jackc/pgpassfile v1.0.0 // indirect
github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a // indirect
github.com/jackc/pgx/v5 v5.4.3 // indirect
github.com/jackc/puddle/v2 v2.2.1 // indirect
github.com/jinzhu/gorm v1.9.16 // indirect
github.com/jinzhu/inflection v1.0.0 // indirect
github.com/jinzhu/now v1.1.5 // indirect
Expand All @@ -39,14 +45,18 @@ require (
github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7 // indirect
github.com/mitchellh/mapstructure v1.5.0 // indirect
github.com/pelletier/go-toml/v2 v2.0.8 // indirect
github.com/redis/go-redis/v9 v9.1.0 // indirect
github.com/resendlabs/resend-go v1.7.0 // indirect
github.com/spf13/afero v1.9.5 // indirect
github.com/spf13/cast v1.5.1 // indirect
github.com/spf13/jwalterweatherman v1.1.0 // indirect
github.com/spf13/pflag v1.0.5 // indirect
github.com/spf13/viper v1.16.0 // indirect
github.com/subosito/gotenv v1.4.2 // indirect
github.com/tetratelabs/wazero v1.2.1 // indirect
github.com/zclconf/go-cty v1.8.0 // indirect
golang.org/x/mod v0.12.0 // indirect
golang.org/x/sync v0.3.0 // indirect
golang.org/x/sys v0.11.0 // indirect
golang.org/x/text v0.12.0 // indirect
golang.org/x/tools v0.12.0 // indirect
Expand Down
20 changes: 20 additions & 0 deletions apps/api/go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -42,19 +42,27 @@ cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RX
cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=
cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo=
dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
github.com/Boostport/mjml-go v0.14.3 h1:9IrvOzyXYhCAMbuQjZ57exLFu9yL4q1xC24YjUwwkzg=
github.com/Boostport/mjml-go v0.14.3/go.mod h1:AEETIXG89nBhebuWKZUcntNMRlJWgDHK4pT17nEyC74=
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
github.com/PuerkitoBio/goquery v1.5.1/go.mod h1:GsLWisAFVj4WgDibEWF4pvYnkVQBpKBKeU+7zCJoLcc=
github.com/agext/levenshtein v1.2.1 h1:QmvMAjj2aEICytGiWzmxoE0x2KZvE0fvmqMOfy2tjT8=
github.com/agext/levenshtein v1.2.1/go.mod h1:JEDfjyjHDjOF/1e4FlBE/PkbqA9OfWu2ki2W0IB5558=
github.com/alecthomas/kong v0.8.0 h1:ryDCzutfIqJPnNn0omnrgHLbAggDQM2VWHikE1xqK7s=
github.com/alecthomas/kong v0.8.0/go.mod h1:n1iCIO2xS46oE8ZfYCNDqdR0b0wZNrXAIAqro/2132U=
github.com/andybalholm/brotli v1.0.5 h1:8uQZIdzKmjc/iuPu7O2ioW48L81FgatrcpfFmiq/cCs=
github.com/andybalholm/brotli v1.0.5/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig=
github.com/andybalholm/cascadia v1.1.0/go.mod h1:GsXiBklL0woXo1j/WYWtSYYC4ouU9PqHO0sqidkEA4Y=
github.com/apparentlymart/go-dump v0.0.0-20180507223929-23540a00eaa3/go.mod h1:oL81AME2rN47vu18xqj1S1jPIPuN7afo62yKTNn3XMM=
github.com/apparentlymart/go-textseg v1.0.0/go.mod h1:z96Txxhf3xSFMPmb5X/1W05FF/Nj9VFpLOpjS5yuumk=
github.com/apparentlymart/go-textseg/v13 v13.0.0 h1:Y+KvPE1NYz0xl601PVImeQfFyEy6iT90AvPUL1NNfNw=
github.com/apparentlymart/go-textseg/v13 v13.0.0/go.mod h1:ZK2fH7c4NqDTLtiYLvIkEghdlcqw7yxLeM89kiTRPUo=
github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 h1:DklsrG3dyBCFEj5IhUbnKptjxatkF07cF2ak3yi77so=
github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw=
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=
github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
Expand All @@ -67,6 +75,8 @@ github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs
github.com/denisenkom/go-mssqldb v0.0.0-20191124224453-732737034ffd/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU=
github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM=
github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=
github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
Expand Down Expand Up @@ -169,6 +179,8 @@ github.com/jackc/pgx/v5 v5.3.1 h1:Fcr8QJ1ZeLi5zsPZqQeUZhNhxfkkKBOgJuYkJHoBOtU=
github.com/jackc/pgx/v5 v5.3.1/go.mod h1:t3JDKnCBlYIc0ewLF0Q7B8MXmoIaBOZj/ic7iHozM/8=
github.com/jackc/pgx/v5 v5.4.3 h1:cxFyXhxlvAifxnkKKdlxv8XqUf59tDlYjnV5YYfsJJY=
github.com/jackc/pgx/v5 v5.4.3/go.mod h1:Ig06C2Vu0t5qXC60W8sqIthScaEnFvojjj9dSljmHRA=
github.com/jackc/puddle/v2 v2.2.1 h1:RhxXJtFG022u4ibrCSMSiu5aOq1i77R3OHKNJj77OAk=
github.com/jackc/puddle/v2 v2.2.1/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4=
github.com/jinzhu/gorm v1.9.16 h1:+IyIjPEABKRpsu/F8OvDPy9fyQlgsg2luMV2ZIH5i5o=
github.com/jinzhu/gorm v1.9.16/go.mod h1:G3LB3wezTOWM2ITLzPxEXgSkOXAntiLHS7UdBefADcs=
github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=
Expand Down Expand Up @@ -202,6 +214,10 @@ github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINE
github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
github.com/redis/go-redis/v9 v9.1.0 h1:137FnGdk+EQdCbye1FW+qOEcY5S+SpY9T0NiuqvtfMY=
github.com/redis/go-redis/v9 v9.1.0/go.mod h1:urWj3He21Dj5k4TK1y59xH8Uj6ATueP8AH1cY3lZl4c=
github.com/resendlabs/resend-go v1.7.0 h1:DycOqSXtw2q7aB+Nt9DDJUDtaYcrNPGn1t5RFposas0=
github.com/resendlabs/resend-go v1.7.0/go.mod h1:yip1STH7Bqfm4fD0So5HgyNbt5taG5Cplc4xXxETyLI=
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo=
github.com/spf13/afero v1.9.5 h1:stMpOSZFs//0Lv29HduCmli3GUfpFoF3Y1Q/aXj/wVM=
Expand All @@ -228,6 +244,8 @@ github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO
github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
github.com/subosito/gotenv v1.4.2 h1:X1TuBLAMDFbaTAChgCBLu3DU3UPyELpnF2jjJ2cz/S8=
github.com/subosito/gotenv v1.4.2/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0=
github.com/tetratelabs/wazero v1.2.1 h1:J4X2hrGzJvt+wqltuvcSjHQ7ujQxA9gb6PeMs4qlUWs=
github.com/tetratelabs/wazero v1.2.1/go.mod h1:wYx2gNRg8/WihJfSDxA1TIL8H+GkfLYm+bIfbblu9VQ=
github.com/vmihailenco/msgpack v3.3.3+incompatible/go.mod h1:fy3FlTQTDXWkZ7Bh6AcGMlsjHatGryHQYUTf1ShIgkk=
github.com/vmihailenco/msgpack/v4 v4.3.12/go.mod h1:gborTTJjAo/GWTqqRjrLCn9pgNN+NXzzngzBKDPIqw4=
github.com/vmihailenco/tagparser v0.1.1/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI=
Expand Down Expand Up @@ -345,6 +363,8 @@ golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJ
golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E=
golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y=
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
Expand Down
Loading

0 comments on commit 016b820

Please sign in to comment.