summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJoram Wilander <jwawilander@gmail.com>2016-04-15 08:48:14 -0400
committerHarrison Healey <harrisonmhealey@gmail.com>2016-04-15 08:48:14 -0400
commitc6c3f1e47829bba9b332da3d4c61193532e87032 (patch)
treeadbbbf666eb0f25ae98be9e7df8642975bdb46c5
parent9243b8761a8062a864a882dbab2aa4edc2780d73 (diff)
downloadchat-c6c3f1e47829bba9b332da3d4c61193532e87032.tar.gz
chat-c6c3f1e47829bba9b332da3d4c61193532e87032.tar.bz2
chat-c6c3f1e47829bba9b332da3d4c61193532e87032.zip
Update client license etag to handle new features (#2716)
-rw-r--r--api/license.go15
-rw-r--r--api/license_test.go29
-rw-r--r--model/client.go4
-rw-r--r--utils/license.go12
-rw-r--r--utils/license_test.go18
-rw-r--r--webapp/components/admin_console/team_settings.jsx5
6 files changed, 68 insertions, 15 deletions
diff --git a/api/license.go b/api/license.go
index ed0771d17..526f4a4c1 100644
--- a/api/license.go
+++ b/api/license.go
@@ -153,20 +153,13 @@ func removeLicense(c *Context, w http.ResponseWriter, r *http.Request) {
}
func getClientLicenceConfig(c *Context, w http.ResponseWriter, r *http.Request) {
- config := utils.ClientLicense
-
- var etag string
- if config["IsLicensed"] == "false" {
- etag = model.Etag(config["IsLicensed"])
- } else {
- etag = model.Etag(config["IsLicensed"], config["IssuedAt"])
- }
-
+ etag := utils.GetClientLicenseEtag()
if HandleEtag(etag, w, r) {
return
}
- w.Header().Set(model.HEADER_ETAG_SERVER, etag)
+ clientLicense := utils.ClientLicense
- w.Write([]byte(model.MapToJson(config)))
+ w.Header().Set(model.HEADER_ETAG_SERVER, etag)
+ w.Write([]byte(model.MapToJson(clientLicense)))
}
diff --git a/api/license_test.go b/api/license_test.go
index b34aeb7a6..0126d6e54 100644
--- a/api/license_test.go
+++ b/api/license_test.go
@@ -4,13 +4,14 @@
package api
import (
+ "github.com/mattermost/platform/utils"
"testing"
)
func TestGetLicenceConfig(t *testing.T) {
Setup()
- if result, err := Client.GetClientLicenceConfig(); err != nil {
+ if result, err := Client.GetClientLicenceConfig(""); err != nil {
t.Fatal(err)
} else {
cfg := result.Data.(map[string]string)
@@ -18,5 +19,31 @@ func TestGetLicenceConfig(t *testing.T) {
if _, ok := cfg["IsLicensed"]; !ok {
t.Fatal(cfg)
}
+
+ // test etag caching
+ if cache_result, err := Client.GetClientLicenceConfig(result.Etag); err != nil {
+ t.Fatal(err)
+ } else if len(cache_result.Data.(map[string]string)) != 0 {
+ t.Log(cache_result.Data)
+ t.Fatal("cache should be empty")
+ }
+
+ utils.ClientLicense["IsLicensed"] = "true"
+
+ if cache_result, err := Client.GetClientLicenceConfig(result.Etag); err != nil {
+ t.Fatal(err)
+ } else if len(cache_result.Data.(map[string]string)) == 0 {
+ t.Fatal("result should not be empty")
+ }
+
+ utils.ClientLicense["SomeFeature"] = "true"
+
+ if cache_result, err := Client.GetClientLicenceConfig(result.Etag); err != nil {
+ t.Fatal(err)
+ } else if len(cache_result.Data.(map[string]string)) == 0 {
+ t.Fatal("result should not be empty")
+ }
+
+ utils.ClientLicense = map[string]string{"IsLicensed": "false"}
}
}
diff --git a/model/client.go b/model/client.go
index fba4246e2..89b4d134f 100644
--- a/model/client.go
+++ b/model/client.go
@@ -1125,8 +1125,8 @@ func (c *Client) MockSession(sessionToken string) {
c.AuthType = HEADER_BEARER
}
-func (c *Client) GetClientLicenceConfig() (*Result, *AppError) {
- if r, err := c.DoApiGet("/license/client_config", "", ""); err != nil {
+func (c *Client) GetClientLicenceConfig(etag string) (*Result, *AppError) {
+ if r, err := c.DoApiGet("/license/client_config", "", etag); err != nil {
return nil, err
} else {
return &Result{r.Header.Get(HEADER_REQUEST_ID),
diff --git a/utils/license.go b/utils/license.go
index fcc08e6b1..69279fd23 100644
--- a/utils/license.go
+++ b/utils/license.go
@@ -5,11 +5,13 @@ package utils
import (
"crypto"
+ "crypto/md5"
"crypto/rsa"
"crypto/sha512"
"crypto/x509"
"encoding/base64"
"encoding/pem"
+ "fmt"
"strconv"
"strings"
@@ -129,3 +131,13 @@ func getClientLicense(l *model.License) map[string]string {
return props
}
+
+func GetClientLicenseEtag() string {
+ value := ""
+
+ for k, v := range ClientLicense {
+ value += fmt.Sprintf("%s:%s;", k, v)
+ }
+
+ return model.Etag(fmt.Sprintf("%x", md5.Sum([]byte(value))))
+}
diff --git a/utils/license_test.go b/utils/license_test.go
index 826107032..237ee5fb2 100644
--- a/utils/license_test.go
+++ b/utils/license_test.go
@@ -48,3 +48,21 @@ func TestValidateLicense(t *testing.T) {
t.Fatal("should have failed - bad license")
}
}
+
+func TestClientLicenseEtag(t *testing.T) {
+ etag1 := GetClientLicenseEtag()
+
+ ClientLicense["SomeFeature"] = "true"
+
+ etag2 := GetClientLicenseEtag()
+ if etag1 == etag2 {
+ t.Fatal("etags should not match")
+ }
+
+ ClientLicense["SomeFeature"] = "false"
+
+ etag3 := GetClientLicenseEtag()
+ if etag2 == etag3 {
+ t.Fatal("etags should not match")
+ }
+}
diff --git a/webapp/components/admin_console/team_settings.jsx b/webapp/components/admin_console/team_settings.jsx
index d361c989f..6c9828351 100644
--- a/webapp/components/admin_console/team_settings.jsx
+++ b/webapp/components/admin_console/team_settings.jsx
@@ -102,7 +102,10 @@ class TeamSettings extends React.Component {
config.TeamSettings.EnableUserCreation = this.refs.EnableUserCreation.checked;
config.TeamSettings.RestrictTeamNames = this.refs.RestrictTeamNames.checked;
config.TeamSettings.EnableTeamListing = this.refs.EnableTeamListing.checked;
- config.TeamSettings.EnableCustomBrand = this.refs.EnableCustomBrand.checked;
+
+ if (this.refs.EnableCustomBrand) {
+ config.TeamSettings.EnableCustomBrand = this.refs.EnableCustomBrand.checked;
+ }
if (this.refs.CustomBrandText) {
config.TeamSettings.CustomBrandText = this.refs.CustomBrandText.value;