Skip to content

Commit

Permalink
WIP
Browse files Browse the repository at this point in the history
  • Loading branch information
taratatach committed Nov 21, 2024
1 parent 29d1c86 commit 2ed940d
Show file tree
Hide file tree
Showing 10 changed files with 73 additions and 31 deletions.
7 changes: 4 additions & 3 deletions model/instance/instance_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -59,9 +59,11 @@ func TestInstance(t *testing.T) {
was := cfg.Contexts
defer func() { cfg.Contexts = was }()

cfg.Clouderies["context"] = config.ClouderyConfig{
API: config.ClouderyAPI{URL: "http://manager.example.org", Token: ""},
}
cfg.Contexts = map[string]interface{}{
"context": map[string]interface{}{
"manager_url": "http://manager.example.org",
"logos": map[string]interface{}{
"coachco2": map[string]interface{}{
"light": []interface{}{
Expand Down Expand Up @@ -173,8 +175,7 @@ func TestInstance(t *testing.T) {
}
]
}
},
"manager_url": "http://manager.example.org"
}
}`
assert.Equal(t, expected, string(bytes))
})
Expand Down
35 changes: 24 additions & 11 deletions model/instance/manager.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,22 +19,24 @@ const (
ManagerPremiumURL
// ManagerBlockedURL is the kind for a redirection of a blocked instance.
ManagerBlockedURL
// ManagerBaseURL is the kind for building other manager URLs
ManagerBaseURL
)

// ManagerURL returns an external string for the given ManagerURL kind. It is
// used for redirecting the user to a manager URL.
func (i *Instance) ManagerURL(k ManagerURLKind) (string, error) {
if i.UUID == "" {
c := cloudery(i)
if c == nil {
return "", nil
}

config, ok := i.SettingsContext()
if !ok {
if i.UUID == "" {
return "", nil
}

base, ok := config["manager_url"].(string)
if !ok {
base := c.API.URL
if base == "" {
return "", nil
}

Expand All @@ -51,6 +53,8 @@ func (i *Instance) ManagerURL(k ManagerURLKind) (string, error) {
path = fmt.Sprintf("/cozy/instances/%s/tos", url.PathEscape(i.UUID))
case ManagerBlockedURL:
path = fmt.Sprintf("/cozy/instances/%s/blocked", url.PathEscape(i.UUID))
case ManagerBaseURL:
path = ""
default:
panic("unknown ManagerURLKind")
}
Expand All @@ -61,6 +65,20 @@ func (i *Instance) ManagerURL(k ManagerURLKind) (string, error) {

// APIManagerClient returns a client to talk to the manager via its API.
func APIManagerClient(inst *Instance) *manager.APIClient {
c := cloudery(inst)
if c == nil {
return nil
}

api := c.API
if api.URL == "" || api.Token == "" {
return nil
}

return manager.NewAPIClient(api.URL, api.Token)
}

func cloudery(inst *Instance) *config.ClouderyConfig {
clouderies := config.GetConfig().Clouderies
if clouderies == nil {
return nil
Expand All @@ -75,10 +93,5 @@ func APIManagerClient(inst *Instance) *manager.APIClient {
return nil
}

api := cloudery.API
if api.URL == "" || api.Token == "" {
return nil
}

return manager.NewAPIClient(api.URL, api.Token)
return &cloudery
}
4 changes: 3 additions & 1 deletion model/oauth/client_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,9 @@ func TestClient(t *testing.T) {

config.UseTestFile(t)
conf := config.GetConfig()
conf.Contexts[config.DefaultInstanceContext] = map[string]interface{}{"manager_url": "http://manager.example.org"}
conf.Clouderies[config.DefaultInstanceContext] = config.ClouderyConfig{
API: config.ClouderyAPI{URL: "http://manager.example.org", Token: ""},
}
setup := testutils.NewSetup(t, t.Name())
testInstance := setup.GetTestInstance()

Expand Down
7 changes: 6 additions & 1 deletion pkg/config/config/config_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,6 @@ func TestConfigUnmarshal(t *testing.T) {
// Contexts
assert.EqualValues(t, map[string]interface{}{
"my-context": map[string]interface{}{
"manager_url": "https://manager-url",
"onboarded_redirection": "home/intro",
"default_redirection": "home/",
"help_link": "https://cozy.io/fr/support",
Expand Down Expand Up @@ -216,6 +215,12 @@ func TestConfigUnmarshal(t *testing.T) {
Token: "some-token",
},
},
"my-context": {
API: ClouderyAPI{
URL: "https://manager-url",
Token: "manager-token",
},
},
}, cfg.Clouderies)

// CSPs
Expand Down
5 changes: 4 additions & 1 deletion pkg/config/config/testdata/full_config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,10 @@ clouderies:
api:
url: https://some-url
token: some-token
my-context:
api:
url: https://manager-url
token: manager-token

password_reset_interval: 1h

Expand Down Expand Up @@ -163,7 +167,6 @@ log:

contexts:
my-context:
manager_url: https://manager-url
onboarded_redirection: home/intro
default_redirection: home/
help_link: https://cozy.io/fr/support
Expand Down
8 changes: 4 additions & 4 deletions tests/testutils/test_utils.go
Original file line number Diff line number Diff line change
Expand Up @@ -480,9 +480,9 @@ func WithManager(t *testing.T, inst *instance.Instance) (shouldRemoveUUID bool)
config, ok := inst.SettingsContext()
require.True(t, ok, "Could not enable test instance manager: could not fetch test instance settings context")

managerURL, ok := config["manager_url"].(string)
require.True(t, ok, "Could not enable test instance manager: manager_url config is required")
require.NotEmpty(t, managerURL, "Could not enable test instance manager: manager_url config is required")
managerURL, err := inst.ManagerURL(instance.ManagerBaseURL)
require.NoError(t, err, "Could not enable test instance manager: cloudery config is required")
require.NotEmpty(t, managerURL, "Could not enable test instance manager: cloudery API URL is required")

was := config["enable_premium_links"]
config["enable_premium_links"] = true
Expand All @@ -496,7 +496,7 @@ func WithManager(t *testing.T, inst *instance.Instance) (shouldRemoveUUID bool)
}
})

err := instance.Update(inst)
err = instance.Update(inst)
require.NoError(t, err, "Could not enable test instance manager")

return shouldRemoveUUID
Expand Down
4 changes: 3 additions & 1 deletion web/apps/apps_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,9 @@ func TestApps(t *testing.T) {
Host: "localhost",
Path: tempdir,
}
cfg.Contexts[config.DefaultInstanceContext] = map[string]interface{}{"manager_url": "http://manager.example.org"}
cfg.Clouderies[config.DefaultInstanceContext] = config.ClouderyConfig{
API: config.ClouderyAPI{URL: "http://manager.example.org", Token: ""},
}
was := cfg.Subdomains
cfg.Subdomains = config.NestedSubdomains
defer func() { cfg.Subdomains = was }()
Expand Down
8 changes: 2 additions & 6 deletions web/auth/confirm.go
Original file line number Diff line number Diff line change
Expand Up @@ -149,12 +149,8 @@ func checkRedirectToAuthorized(c echo.Context) (*url.URL, error) {
}

func checkRedirectToManager(inst *instance.Instance, redirect *url.URL) bool {
config, ok := inst.SettingsContext()
if !ok {
return false
}
managerURL, ok := config["manager_url"].(string)
if !ok {
managerURL, err := inst.ManagerURL(instance.ManagerBaseURL)
if err != nil {
return false
}
manager, err := url.Parse(managerURL)
Expand Down
22 changes: 20 additions & 2 deletions web/settings/context.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import (
"encoding/json"
"net/http"

"github.com/cozy/cozy-stack/model/instance"
"github.com/cozy/cozy-stack/model/instance/lifecycle"
"github.com/cozy/cozy-stack/pkg/consts"
"github.com/cozy/cozy-stack/pkg/couchdb"
Expand Down Expand Up @@ -78,6 +79,23 @@ func (h *HTTPHandler) context(c echo.Context) error {
}

i := middlewares.GetInstance(c)
doc := &apiContext{i.GetContextWithSponsorships()}
return jsonapi.Data(c, http.StatusOK, doc, nil)
context := &apiContext{i.GetContextWithSponsorships()}

managerURL, err := i.ManagerURL(instance.ManagerBaseURL)
if err != nil {
return err
}
if managerURL != "" {
// XXX: The manager URL used to be stored in the config in
// `context.<context_name>.manager_url`. It's now stored in
// `clouderies.<context_name>.api.url` and can be retrieved via a call
// to `instance.ManagerURL()`.
//
// However, some external apps and clients (e.g. `cozy-client`) still
// expect to find the `manager_url` attribute in the context document
// so we add it back for backwards compatibility.
context.doc["manager_url"] = managerURL
}

return jsonapi.Data(c, http.StatusOK, context, nil)
}
4 changes: 3 additions & 1 deletion web/settings/settings_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -73,8 +73,10 @@ func TestSettings(t *testing.T) {
config.UseTestFile(t)
conf := config.GetConfig()
conf.Assets = "../../assets"
conf.Clouderies[config.DefaultInstanceContext] = config.ClouderyConfig{
API: config.ClouderyAPI{URL: "http://manager.example.org", Token: ""},
}
conf.Contexts[config.DefaultInstanceContext] = map[string]interface{}{
"manager_url": "http://manager.example.org",
"logos": map[string]interface{}{
"home": map[string]interface{}{
"light": []interface{}{
Expand Down

0 comments on commit 2ed940d

Please sign in to comment.