// NewAPIContext returns an API context that will use the given // context for user interactions when authorizing. // The returned API context must be closed after use. // // If ctxt is nil, no command-line authorization // will be supported. // // This function is provided for use by commands that cannot use // JujuCommandBase. Most clients should use that instead. func NewAPIContext(ctxt *cmd.Context) (*APIContext, error) { jar, err := cookiejar.New(&cookiejar.Options{ Filename: cookieFile(), }) if err != nil { return nil, errors.Trace(err) } client := httpbakery.NewClient() client.Jar = jar if ctxt != nil { filler := &form.IOFiller{ In: ctxt.Stdin, Out: ctxt.Stdout, } client.VisitWebPage = ussologin.VisitWebPage( "juju", &http.Client{}, filler, jujuclient.NewTokenStore(), ) } else { client.VisitWebPage = httpbakery.OpenWebBrowser } return &APIContext{ Jar: jar, BakeryClient: client, }, nil }
// NewAPIContext returns an API context that will use the given // context for user interactions when authorizing. // The returned API context must be closed after use. // // If ctxt is nil, no command-line authorization // will be supported. // // This function is provided for use by commands that cannot use // JujuCommandBase. Most clients should use that instead. func NewAPIContext(ctxt *cmd.Context, opts *AuthOpts) (*APIContext, error) { jar, err := cookiejar.New(&cookiejar.Options{ Filename: cookieFile(), }) if err != nil { return nil, errors.Trace(err) } var visitors []httpbakery.Visitor if ctxt != nil && opts != nil && opts.NoBrowser { filler := &form.IOFiller{ In: ctxt.Stdin, Out: ctxt.Stdout, } visitors = append(visitors, ussologin.NewVisitor("juju", filler, jujuclient.NewTokenStore())) } else { visitors = append(visitors, httpbakery.WebBrowserVisitor) } webPageVisitor := httpbakery.NewMultiVisitor(visitors...) return &APIContext{ Jar: jar, WebPageVisitor: webPageVisitor, }, nil }