diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml new file mode 100644 index 0000000..401a583 --- /dev/null +++ b/.github/workflows/ci.yaml @@ -0,0 +1,40 @@ +name: Continuous Integration + +on: + push: + branches: [ 'master' ] + pull_request: + +permissions: + contents: read + pull-requests: read + +jobs: + + build: + runs-on: ubuntu-latest + steps: + + - uses: actions/setup-go@v3 + with: + go-version: '1.19' + + - uses: actions/checkout@v3 + + - name: Cache build dependencies + uses: actions/cache@v3 + with: + path: ~/go/pkg/mod + key: ${{ runner.os }}-go-${{ hashFiles('**/_go.sum') }} + + - name: Install dependencies + run: go get . + + - name: Build + run: go build -o dbxcli -v + + - uses: actions/upload-artifact@v3 + with: + name: dbxcli + path: dbxcli + diff --git a/cmd/logout.go b/cmd/logout.go index d48dedd..c6b689b 100644 --- a/cmd/logout.go +++ b/cmd/logout.go @@ -40,7 +40,7 @@ func logout(cmd *cobra.Command, args []string) error { for domain, tokens := range tokMap { for _, token := range tokens { config := dropbox.Config{ - Token: token, + Token: token.AccessToken, LogLevel: dropbox.LogOff, Logger: nil, AsMemberID: "", diff --git a/cmd/root.go b/cmd/root.go index 18da322..d536885 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -59,7 +59,7 @@ var ( // TokenMap maps domains to a map of commands to tokens. // For each domain, we want to save different tokens depending on the // command type: personal, team access and team manage -type TokenMap map[string]map[string]string +type TokenMap map[string]map[string]oauth2.Token var config dropbox.Config @@ -169,12 +169,12 @@ func initDbx(cmd *cobra.Command, args []string) (err error) { tokenMap = make(TokenMap) } if tokenMap[domain] == nil { - tokenMap[domain] = make(map[string]string) + tokenMap[domain] = make(map[string]oauth2.Token) } tokens := tokenMap[domain] - if err != nil || tokens[tokType] == "" { - fmt.Printf("1. Go to %v\n", conf.AuthCodeURL("state")) + if err != nil || tokens[tokType].AccessToken == "" { + fmt.Printf("1. Go to %v\n", conf.AuthCodeURL("state", oauth2.SetAuthURLParam("token_access_type", "offline"))) fmt.Printf("2. Click \"Allow\" (you might have to log in first).\n") fmt.Printf("3. Copy the authorization code.\n") fmt.Printf("Enter the authorization code here: ") @@ -189,7 +189,19 @@ func initDbx(cmd *cobra.Command, args []string) (err error) { if err != nil { return } - tokens[tokType] = token.AccessToken + tokens[tokType] = *token + writeTokens(filePath, tokenMap) + } + ctx := context.Background() + + tmpToken := tokens[tokType] + refreshedToken, err := conf.TokenSource(ctx, &tmpToken).Token() + if err != nil { + return err + } + + if refreshedToken.AccessToken != tmpToken.AccessToken || refreshedToken.Expiry != tmpToken.Expiry { + tokens[tokType] = *refreshedToken writeTokens(filePath, tokenMap) } @@ -198,7 +210,7 @@ func initDbx(cmd *cobra.Command, args []string) (err error) { logLevel = dropbox.LogInfo } config = dropbox.Config{ - Token: tokens[tokType], + Token: tokens[tokType].AccessToken, LogLevel: logLevel, Logger: nil, AsMemberID: asMember,