# HG changeset patch # User Mikael Berthe # Date 1492423664 -7200 # Node ID 68ef6504637e474f3eedc99c6d162e1e512fb3c9 # Parent c450bb73f59a3e03fe2ef9126f2358920364a28a Introduce RestoreApp(), bump library version RestoreApp() lets the client provide an existing application ID/Secret pair. The library no longer falls back to mastodon.social, an instance name is required. The version is bumped to 0.1 (we have something that works!). diff -r c450bb73f59a -r 68ef6504637e app.go --- a/app.go Mon Apr 17 10:28:10 2017 +0200 +++ b/app.go Mon Apr 17 12:07:44 2017 +0200 @@ -8,6 +8,7 @@ package gondole import ( + "errors" "net/url" "strings" @@ -20,26 +21,41 @@ ClientSecret string `json:"client_secret"` } -// NewApp registers a new instance -func NewApp(name string, scopes []string, redirectURI, instanceURL string) (g *Client, err error) { - if instanceURL == "" { - instanceURL = defaultInstanceURL +// buildInstanceURL creates the URL from the instance name or cleans up the +// provided URL +func buildInstanceURL(instanceName string) (string, error) { + if instanceName == "" { + return "", errors.New("no instance provided") + } + + instanceURL := instanceName + if !strings.Contains(instanceURL, "/") { + instanceURL = "https://" + instanceName } - if !strings.Contains(instanceURL, "://") { - instanceURL = "https://" + instanceURL + u, err := url.ParseRequestURI(instanceURL) + if err != nil { + return "", err } - apiPath := instanceURL + defaultAPIPath + u.Path = "" + u.RawPath = "" + u.RawQuery = "" + u.Fragment = "" + return u.String(), nil +} - if _, err := url.ParseRequestURI(apiPath); err != nil { +// NewApp registers a new application with a given instance +func NewApp(name string, scopes []string, redirectURI, instanceName string) (g *Client, err error) { + instanceURL, err := buildInstanceURL(instanceName) + if err != nil { return nil, err } g = &Client{ Name: name, - APIBase: apiPath, InstanceURL: instanceURL, + APIBase: instanceURL + currentAPIPath, } params := make(apiCallParams) @@ -61,3 +77,20 @@ return } + +// RestoreApp recreates an application client with existing secrets +func RestoreApp(name, instanceName, appID, appSecret string, userToken *UserToken) (g *Client, err error) { + instanceURL, err := buildInstanceURL(instanceName) + if err != nil { + return nil, err + } + + return &Client{ + Name: name, + InstanceURL: instanceURL, + APIBase: instanceURL + currentAPIPath, + ID: appID, + Secret: appSecret, + UserToken: userToken, + }, nil +} diff -r c450bb73f59a -r 68ef6504637e gondole.go --- a/gondole.go Mon Apr 17 10:28:10 2017 +0200 +++ b/gondole.go Mon Apr 17 12:07:44 2017 +0200 @@ -16,11 +16,11 @@ const ( // GondoleVersion contains the version of the Gondole implementation - GondoleVersion = "0.0" + GondoleVersion = "0.1" - defaultInstanceURL = "https://mastodon.social" - apiVersion = "v1" // That is not overridable - defaultAPIPath = "/api/" + apiVersion + // API version implemented in this library + apiVersion = "v1" + currentAPIPath = "/api/" + apiVersion // NoRedirect is the URI for no redirection in the App registration NoRedirect = "urn:ietf:wg:oauth:2.0:oob" diff -r c450bb73f59a -r 68ef6504637e types.go --- a/types.go Mon Apr 17 10:28:10 2017 +0200 +++ b/types.go Mon Apr 17 12:07:44 2017 +0200 @@ -13,13 +13,13 @@ // Client contains data for a gondole client application type Client struct { - Name string - ID string - Secret string - APIBase string - InstanceURL string + Name string // Name of the client + ID string // Application ID + Secret string // Application secret + APIBase string // API prefix URL + InstanceURL string // Instance base URL - UserToken *UserToken + UserToken *UserToken // User token } /*