cmd/oauth2.go
author Mikael Berthe <mikael@lilotux.net>
Sun, 30 Jun 2024 17:57:48 +0200
changeset 282 46b37f928ab9
parent 265 05c40b36d3b2
permissions -rw-r--r--
Fix module v3 usage, bump version to 3.0.2
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
265
05c40b36d3b2 Bump to version 3.0.0-dev, using madon v3
Mikael Berthe <mikael@lilotux.net>
parents: 245
diff changeset
     1
// Copyright © 2017-2023 Mikael Berthe <mikael@lilotux.net>
113
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
     2
//
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
     3
// Licensed under the MIT license.
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
     4
// Please see the LICENSE file is this directory.
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
     5
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
     6
package cmd
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
     7
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
     8
import (
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
     9
	"fmt"
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    10
	"os"
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    11
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    12
	"github.com/pkg/errors"
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    13
	"github.com/spf13/cobra"
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    14
)
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    15
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    16
var oauth2Cmd = &cobra.Command{
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    17
	Use:   "oauth2",
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    18
	Short: "OAuth2 authentication/authorization",
127
2b4d0f198a94 Update online documention to config and oauth2 commands
Mikael Berthe <mikael@lilotux.net>
parents: 113
diff changeset
    19
	Example: `  madonctl oauth2                 # Interactive OAuth2 login
2b4d0f198a94 Update online documention to config and oauth2 commands
Mikael Berthe <mikael@lilotux.net>
parents: 113
diff changeset
    20
  madonctl oauth2 get-url         # Display OAuth2 auhtorization URL
2b4d0f198a94 Update online documention to config and oauth2 commands
Mikael Berthe <mikael@lilotux.net>
parents: 113
diff changeset
    21
  madonctl oauth2 code CODE       # Enter OAuth2 code
2b4d0f198a94 Update online documention to config and oauth2 commands
Mikael Berthe <mikael@lilotux.net>
parents: 113
diff changeset
    22
2b4d0f198a94 Update online documention to config and oauth2 commands
Mikael Berthe <mikael@lilotux.net>
parents: 113
diff changeset
    23
  madonctl oauth2 > config.yaml   # Redirect to configuration file`,
113
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    24
	RunE: func(cmd *cobra.Command, args []string) error {
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    25
		return oAuth2Interactive(args)
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    26
	},
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    27
	PersistentPreRunE: func(cmd *cobra.Command, args []string) error {
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    28
		// Initialize application; do not log in yet
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    29
		return madonInit(false)
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    30
	},
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    31
}
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    32
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    33
func init() {
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    34
	RootCmd.AddCommand(oauth2Cmd)
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    35
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    36
	// Subcommands
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    37
	oauth2Cmd.AddCommand(oauth2Subcommands...)
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    38
}
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    39
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    40
var oauth2Subcommands = []*cobra.Command{
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    41
	&cobra.Command{
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    42
		Use:   "get-url",
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    43
		Short: "Get OAuth2 URL",
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    44
		RunE: func(cmd *cobra.Command, args []string) error {
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    45
			return oAuth2GetURL()
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    46
		},
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    47
	},
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    48
	&cobra.Command{
243
1bec7d3d6a85 Improve oauth2 code usage message
Mikael Berthe <mikael@lilotux.net>
parents: 185
diff changeset
    49
		Use:   "code CODE",
113
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    50
		Short: "Log in with OAuth2 code",
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    51
		RunE: func(cmd *cobra.Command, args []string) error {
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    52
			return oAuth2ExchangeCode(args)
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    53
		},
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    54
	},
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    55
}
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    56
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    57
func oAuth2GetURL() error {
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    58
	// (gClient != nil thanks to PreRun)
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    59
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    60
	url, err := gClient.LoginOAuth2("", scopes)
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    61
	if err != nil {
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    62
		return errors.Wrap(err, "OAuth2 authentication failed")
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    63
	}
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    64
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    65
	fmt.Printf("%s\n", url)
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    66
	return nil
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    67
}
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    68
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    69
func oAuth2ExchangeCode(args []string) error {
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    70
	// (gClient != nil thanks to PreRun)
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    71
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    72
	if len(args) != 1 {
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    73
		return errors.New("wrong usage: code needs 1 argument")
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    74
	}
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    75
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    76
	code := args[0]
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    77
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    78
	if code == "" {
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    79
		return errors.New("no code entered")
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    80
	}
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    81
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    82
	// The code has been set; proceed with token exchange
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    83
	_, err := gClient.LoginOAuth2(code, scopes)
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    84
	if err != nil {
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    85
		return err
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    86
	}
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    87
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    88
	if gClient.UserToken != nil {
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    89
		errPrint("Login successful.\n")
245
910f00ab2799 Fix oauth2 not displaying the new token
Mikael Berthe <mikael@lilotux.net>
parents: 244
diff changeset
    90
		errPrint("The new token is %s.\n", gClient.UserToken.AccessToken)
244
a01bc98ae01a Display config details after oauth2
Mikael Berthe <mikael@lilotux.net>
parents: 243
diff changeset
    91
		configDump(true)
113
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    92
	}
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    93
	return nil
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    94
}
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    95
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    96
// oAuth2Interactive is the default behaviour
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    97
func oAuth2Interactive(args []string) error {
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    98
	// (gClient != nil thanks to PreRun)
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    99
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   100
	url, err := gClient.LoginOAuth2("", scopes)
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   101
	if err != nil {
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   102
		return errors.Wrap(err, "OAuth2 authentication failed")
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   103
	}
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   104
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   105
	fmt.Fprintf(os.Stderr, "Visit the URL for the auth dialog:\n%s\n", url)
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   106
	fmt.Fprintf(os.Stderr, "Enter code: ")
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   107
	var code string
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   108
	if _, err := fmt.Scan(&code); err != nil {
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   109
		return err
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   110
	}
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   111
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   112
	if code == "" {
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   113
		return errors.New("no code entered")
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   114
	}
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   115
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   116
	// The code has been set; proceed with token exchange
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   117
	return oAuth2ExchangeCode([]string{code})
2e411da68fd3 Add oauth2 command
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
   118
}