Changing the way we mattermost handles URLs. team.domain.com becomes domain.com/team.

Renaming team.Name to team.DisplayName and team.Domain to team.Name.
So: team.Name -> url safe name. team.DisplayName -> nice name for users
Этот коммит содержится в:
Christopher Speller
2015-07-08 11:50:10 -04:00
родитель a1876cf6cc
Коммит c6fb95912b
86 изменённых файлов: 891 добавлений и 1214 удалений

Просмотреть файл

@@ -16,10 +16,10 @@ var ServerTemplates *template.Template
type ServerTemplatePage Page type ServerTemplatePage Page
func NewServerTemplatePage(templateName, teamUrl string) *ServerTemplatePage { func NewServerTemplatePage(templateName, teamURL string) *ServerTemplatePage {
props := make(map[string]string) props := make(map[string]string)
props["AnalyticsUrl"] = utils.Cfg.ServiceSettings.AnalyticsUrl props["AnalyticsUrl"] = utils.Cfg.ServiceSettings.AnalyticsUrl
return &ServerTemplatePage{TemplateName: templateName, SiteName: utils.Cfg.ServiceSettings.SiteName, FeedbackEmail: utils.Cfg.EmailSettings.FeedbackEmail, TeamUrl: teamUrl, Props: props} return &ServerTemplatePage{TemplateName: templateName, SiteName: utils.Cfg.ServiceSettings.SiteName, FeedbackEmail: utils.Cfg.EmailSettings.FeedbackEmail, TeamURL: teamURL, Props: props}
} }
func (me *ServerTemplatePage) Render() string { func (me *ServerTemplatePage) Render() string {

Просмотреть файл

@@ -24,12 +24,12 @@ func Setup() {
func SetupBenchmark() (*model.Team, *model.User, *model.Channel) { func SetupBenchmark() (*model.Team, *model.User, *model.Channel) {
Setup() Setup()
team := &model.Team{Name: "Benchmark Team", Domain: "z-z-" + model.NewId() + "a", Email: "benchmark@nowhere.com", Type: model.TEAM_OPEN} team := &model.Team{DisplayName: "Benchmark Team", Name: "z-z-" + model.NewId() + "a", Email: "benchmark@nowhere.com", Type: model.TEAM_OPEN}
team = Client.Must(Client.CreateTeam(team)).Data.(*model.Team) team = Client.Must(Client.CreateTeam(team)).Data.(*model.Team)
user := &model.User{TeamId: team.Id, Email: model.NewId() + "benchmark@test.com", Nickname: "Mr. Benchmarker", Password: "pwd"} user := &model.User{TeamId: team.Id, Email: model.NewId() + "benchmark@test.com", Nickname: "Mr. Benchmarker", Password: "pwd"}
user = Client.Must(Client.CreateUser(user, "")).Data.(*model.User) user = Client.Must(Client.CreateUser(user, "")).Data.(*model.User)
store.Must(Srv.Store.User().VerifyEmail(user.Id)) store.Must(Srv.Store.User().VerifyEmail(user.Id))
Client.LoginByEmail(team.Domain, user.Email, "pwd") Client.LoginByEmail(team.Name, user.Email, "pwd")
channel := &model.Channel{DisplayName: "Benchmark Channel", Name: "a" + model.NewId() + "a", Type: model.CHANNEL_OPEN, TeamId: team.Id} channel := &model.Channel{DisplayName: "Benchmark Channel", Name: "a" + model.NewId() + "a", Type: model.CHANNEL_OPEN, TeamId: team.Id}
channel = Client.Must(Client.CreateChannel(channel)).Data.(*model.Channel) channel = Client.Must(Client.CreateChannel(channel)).Data.(*model.Channel)

Просмотреть файл

@@ -12,8 +12,8 @@ const (
USER_PASSWORD = "passwd" USER_PASSWORD = "passwd"
CHANNEL_TYPE = model.CHANNEL_OPEN CHANNEL_TYPE = model.CHANNEL_OPEN
FUZZ_USER_EMAIL_PREFIX_LEN = 10 FUZZ_USER_EMAIL_PREFIX_LEN = 10
BTEST_TEAM_NAME = "TestTeam" BTEST_TEAM_DISPLAY_NAME = "TestTeam"
BTEST_TEAM_DOMAIN_NAME = "z-z-testdomaina" BTEST_TEAM_NAME = "z-z-testdomaina"
BTEST_TEAM_EMAIL = "test@nowhere.com" BTEST_TEAM_EMAIL = "test@nowhere.com"
BTEST_TEAM_TYPE = model.TEAM_OPEN BTEST_TEAM_TYPE = model.TEAM_OPEN
BTEST_USER_NAME = "Mr. Testing Tester" BTEST_USER_NAME = "Mr. Testing Tester"

Просмотреть файл

@@ -39,22 +39,22 @@ func NewAutoTeamCreator(client *model.Client) *AutoTeamCreator {
func (cfg *AutoTeamCreator) createRandomTeam() (*model.Team, bool) { func (cfg *AutoTeamCreator) createRandomTeam() (*model.Team, bool) {
var teamEmail string var teamEmail string
var teamDisplayName string
var teamName string var teamName string
var teamDomain string
if cfg.Fuzzy { if cfg.Fuzzy {
teamEmail = utils.FuzzEmail() teamEmail = utils.FuzzEmail()
teamDisplayName = utils.FuzzName()
teamName = utils.FuzzName() teamName = utils.FuzzName()
teamDomain = utils.FuzzName()
} else { } else {
teamEmail = utils.RandomEmail(cfg.EmailLength, cfg.EmailCharset) teamEmail = utils.RandomEmail(cfg.EmailLength, cfg.EmailCharset)
teamName = utils.RandomName(cfg.NameLength, cfg.NameCharset) teamDisplayName = utils.RandomName(cfg.NameLength, cfg.NameCharset)
teamDomain = utils.RandomName(cfg.NameLength, cfg.NameCharset) + model.NewId() teamName = utils.RandomName(cfg.NameLength, cfg.NameCharset) + model.NewId()
} }
team := &model.Team{ team := &model.Team{
Name: teamName, DisplayName: teamDisplayName,
Domain: teamDomain, Name: teamName,
Email: teamEmail, Email: teamEmail,
Type: model.TEAM_OPEN, Type: model.TEAM_OPEN,
} }
result, err := cfg.client.CreateTeam(team) result, err := cfg.client.CreateTeam(team)

Просмотреть файл

@@ -33,9 +33,9 @@ func NewAutoUserCreator(client *model.Client, teamID string) *AutoUserCreator {
// Basic test team and user so you always know one // Basic test team and user so you always know one
func CreateBasicUser(client *model.Client) *model.AppError { func CreateBasicUser(client *model.Client) *model.AppError {
result, _ := client.FindTeamByDomain(BTEST_TEAM_DOMAIN_NAME, true) result, _ := client.FindTeamByName(BTEST_TEAM_NAME, true)
if result.Data.(bool) == false { if result.Data.(bool) == false {
newteam := &model.Team{Name: BTEST_TEAM_NAME, Domain: BTEST_TEAM_DOMAIN_NAME, Email: BTEST_TEAM_EMAIL, Type: BTEST_TEAM_TYPE} newteam := &model.Team{DisplayName: BTEST_TEAM_DISPLAY_NAME, Name: BTEST_TEAM_NAME, Email: BTEST_TEAM_EMAIL, Type: BTEST_TEAM_TYPE}
result, err := client.CreateTeam(newteam) result, err := client.CreateTeam(newteam)
if err != nil { if err != nil {
return err return err

Просмотреть файл

@@ -141,7 +141,7 @@ func BenchmarkJoinChannel(b *testing.B) {
user := &model.User{TeamId: team.Id, Email: model.NewId() + "random@test.com", Nickname: "That Guy", Password: "pwd"} user := &model.User{TeamId: team.Id, Email: model.NewId() + "random@test.com", Nickname: "That Guy", Password: "pwd"}
user = Client.Must(Client.CreateUser(user, "")).Data.(*model.User) user = Client.Must(Client.CreateUser(user, "")).Data.(*model.User)
store.Must(Srv.Store.User().VerifyEmail(user.Id)) store.Must(Srv.Store.User().VerifyEmail(user.Id))
Client.LoginByEmail(team.Domain, user.Email, "pwd") Client.LoginByEmail(team.Name, user.Email, "pwd")
// Benchmark Start // Benchmark Start
b.ResetTimer() b.ResetTimer()

Просмотреть файл

@@ -14,17 +14,17 @@ import (
func TestCreateChannel(t *testing.T) { func TestCreateChannel(t *testing.T) {
Setup() Setup()
team := &model.Team{Name: "Name", Domain: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN} team := &model.Team{DisplayName: "Name", Name: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN}
team = Client.Must(Client.CreateTeam(team)).Data.(*model.Team) team = Client.Must(Client.CreateTeam(team)).Data.(*model.Team)
team2 := &model.Team{Name: "Name Team 2", Domain: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN} team2 := &model.Team{DisplayName: "Name Team 2", Name: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN}
team2 = Client.Must(Client.CreateTeam(team2)).Data.(*model.Team) team2 = Client.Must(Client.CreateTeam(team2)).Data.(*model.Team)
user := &model.User{TeamId: team.Id, Email: model.NewId() + "corey@test.com", Nickname: "Corey Hulen", Password: "pwd"} user := &model.User{TeamId: team.Id, Email: model.NewId() + "corey@test.com", Nickname: "Corey Hulen", Password: "pwd"}
user = Client.Must(Client.CreateUser(user, "")).Data.(*model.User) user = Client.Must(Client.CreateUser(user, "")).Data.(*model.User)
store.Must(Srv.Store.User().VerifyEmail(user.Id)) store.Must(Srv.Store.User().VerifyEmail(user.Id))
Client.LoginByEmail(team.Domain, user.Email, "pwd") Client.LoginByEmail(team.Name, user.Email, "pwd")
channel := model.Channel{DisplayName: "Test API Name", Name: "a" + model.NewId() + "a", Type: model.CHANNEL_OPEN, TeamId: team.Id} channel := model.Channel{DisplayName: "Test API Name", Name: "a" + model.NewId() + "a", Type: model.CHANNEL_OPEN, TeamId: team.Id}
rchannel, err := Client.CreateChannel(&channel) rchannel, err := Client.CreateChannel(&channel)
@@ -94,7 +94,7 @@ func TestCreateChannel(t *testing.T) {
func TestCreateDirectChannel(t *testing.T) { func TestCreateDirectChannel(t *testing.T) {
Setup() Setup()
team := &model.Team{Name: "Name", Domain: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN} team := &model.Team{DisplayName: "Name", Name: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN}
team = Client.Must(Client.CreateTeam(team)).Data.(*model.Team) team = Client.Must(Client.CreateTeam(team)).Data.(*model.Team)
user := &model.User{TeamId: team.Id, Email: model.NewId() + "corey@test.com", Nickname: "Corey Hulen", Password: "pwd"} user := &model.User{TeamId: team.Id, Email: model.NewId() + "corey@test.com", Nickname: "Corey Hulen", Password: "pwd"}
@@ -105,7 +105,7 @@ func TestCreateDirectChannel(t *testing.T) {
user2 = Client.Must(Client.CreateUser(user2, "")).Data.(*model.User) user2 = Client.Must(Client.CreateUser(user2, "")).Data.(*model.User)
store.Must(Srv.Store.User().VerifyEmail(user2.Id)) store.Must(Srv.Store.User().VerifyEmail(user2.Id))
Client.LoginByEmail(team.Domain, user.Email, "pwd") Client.LoginByEmail(team.Name, user.Email, "pwd")
data := make(map[string]string) data := make(map[string]string)
data["user_id"] = user2.Id data["user_id"] = user2.Id
@@ -149,7 +149,7 @@ func TestCreateDirectChannel(t *testing.T) {
func TestUpdateChannel(t *testing.T) { func TestUpdateChannel(t *testing.T) {
Setup() Setup()
team := &model.Team{Name: "Name", Domain: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN} team := &model.Team{DisplayName: "Name", Name: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN}
team = Client.Must(Client.CreateTeam(team)).Data.(*model.Team) team = Client.Must(Client.CreateTeam(team)).Data.(*model.Team)
userTeamAdmin := &model.User{TeamId: team.Id, Email: team.Email, Nickname: "Corey Hulen", Password: "pwd"} userTeamAdmin := &model.User{TeamId: team.Id, Email: team.Email, Nickname: "Corey Hulen", Password: "pwd"}
@@ -165,7 +165,7 @@ func TestUpdateChannel(t *testing.T) {
store.Must(Srv.Store.User().VerifyEmail(userStd.Id)) store.Must(Srv.Store.User().VerifyEmail(userStd.Id))
userStd.Roles = "" userStd.Roles = ""
Client.LoginByEmail(team.Domain, userChannelAdmin.Email, "pwd") Client.LoginByEmail(team.Name, userChannelAdmin.Email, "pwd")
channel1 := &model.Channel{DisplayName: "A Test API Name", Name: "a" + model.NewId() + "a", Type: model.CHANNEL_OPEN, TeamId: team.Id} channel1 := &model.Channel{DisplayName: "A Test API Name", Name: "a" + model.NewId() + "a", Type: model.CHANNEL_OPEN, TeamId: team.Id}
channel1 = Client.Must(Client.CreateChannel(channel1)).Data.(*model.Channel) channel1 = Client.Must(Client.CreateChannel(channel1)).Data.(*model.Channel)
@@ -184,7 +184,7 @@ func TestUpdateChannel(t *testing.T) {
t.Fatal("Channel admin failed to skip displayName") t.Fatal("Channel admin failed to skip displayName")
} }
Client.LoginByEmail(team.Domain, userTeamAdmin.Email, "pwd") Client.LoginByEmail(team.Name, userTeamAdmin.Email, "pwd")
desc = "b" + model.NewId() + "b" desc = "b" + model.NewId() + "b"
upChannel1 = &model.Channel{Id: channel1.Id, Description: desc} upChannel1 = &model.Channel{Id: channel1.Id, Description: desc}
@@ -210,7 +210,7 @@ func TestUpdateChannel(t *testing.T) {
} }
} }
Client.LoginByEmail(team.Domain, userStd.Email, "pwd") Client.LoginByEmail(team.Name, userStd.Email, "pwd")
if _, err := Client.UpdateChannel(upChannel1); err == nil { if _, err := Client.UpdateChannel(upChannel1); err == nil {
t.Fatal("Standard User should have failed to update") t.Fatal("Standard User should have failed to update")
@@ -220,14 +220,14 @@ func TestUpdateChannel(t *testing.T) {
func TestUpdateChannelDesc(t *testing.T) { func TestUpdateChannelDesc(t *testing.T) {
Setup() Setup()
team := &model.Team{Name: "Name", Domain: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN} team := &model.Team{DisplayName: "Name", Name: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN}
team = Client.Must(Client.CreateTeam(team)).Data.(*model.Team) team = Client.Must(Client.CreateTeam(team)).Data.(*model.Team)
user := &model.User{TeamId: team.Id, Email: model.NewId() + "corey@test.com", Nickname: "Corey Hulen", Password: "pwd"} user := &model.User{TeamId: team.Id, Email: model.NewId() + "corey@test.com", Nickname: "Corey Hulen", Password: "pwd"}
user = Client.Must(Client.CreateUser(user, "")).Data.(*model.User) user = Client.Must(Client.CreateUser(user, "")).Data.(*model.User)
store.Must(Srv.Store.User().VerifyEmail(user.Id)) store.Must(Srv.Store.User().VerifyEmail(user.Id))
Client.LoginByEmail(team.Domain, user.Email, "pwd") Client.LoginByEmail(team.Name, user.Email, "pwd")
channel1 := &model.Channel{DisplayName: "A Test API Name", Name: "a" + model.NewId() + "a", Type: model.CHANNEL_OPEN, TeamId: team.Id} channel1 := &model.Channel{DisplayName: "A Test API Name", Name: "a" + model.NewId() + "a", Type: model.CHANNEL_OPEN, TeamId: team.Id}
channel1 = Client.Must(Client.CreateChannel(channel1)).Data.(*model.Channel) channel1 = Client.Must(Client.CreateChannel(channel1)).Data.(*model.Channel)
@@ -270,7 +270,7 @@ func TestUpdateChannelDesc(t *testing.T) {
user2 = Client.Must(Client.CreateUser(user2, "")).Data.(*model.User) user2 = Client.Must(Client.CreateUser(user2, "")).Data.(*model.User)
store.Must(Srv.Store.User().VerifyEmail(user2.Id)) store.Must(Srv.Store.User().VerifyEmail(user2.Id))
Client.LoginByEmail(team.Domain, user2.Email, "pwd") Client.LoginByEmail(team.Name, user2.Email, "pwd")
data["channel_id"] = channel1.Id data["channel_id"] = channel1.Id
data["channel_description"] = "new desc" data["channel_description"] = "new desc"
@@ -282,14 +282,14 @@ func TestUpdateChannelDesc(t *testing.T) {
func TestGetChannel(t *testing.T) { func TestGetChannel(t *testing.T) {
Setup() Setup()
team := &model.Team{Name: "Name", Domain: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN} team := &model.Team{DisplayName: "Name", Name: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN}
team = Client.Must(Client.CreateTeam(team)).Data.(*model.Team) team = Client.Must(Client.CreateTeam(team)).Data.(*model.Team)
user := &model.User{TeamId: team.Id, Email: model.NewId() + "corey@test.com", Nickname: "Corey Hulen", Password: "pwd"} user := &model.User{TeamId: team.Id, Email: model.NewId() + "corey@test.com", Nickname: "Corey Hulen", Password: "pwd"}
user = Client.Must(Client.CreateUser(user, "")).Data.(*model.User) user = Client.Must(Client.CreateUser(user, "")).Data.(*model.User)
store.Must(Srv.Store.User().VerifyEmail(user.Id)) store.Must(Srv.Store.User().VerifyEmail(user.Id))
Client.LoginByEmail(team.Domain, user.Email, "pwd") Client.LoginByEmail(team.Name, user.Email, "pwd")
channel1 := &model.Channel{DisplayName: "A Test API Name", Name: "a" + model.NewId() + "a", Type: model.CHANNEL_OPEN, TeamId: team.Id} channel1 := &model.Channel{DisplayName: "A Test API Name", Name: "a" + model.NewId() + "a", Type: model.CHANNEL_OPEN, TeamId: team.Id}
channel1 = Client.Must(Client.CreateChannel(channel1)).Data.(*model.Channel) channel1 = Client.Must(Client.CreateChannel(channel1)).Data.(*model.Channel)
@@ -324,14 +324,14 @@ func TestGetChannel(t *testing.T) {
func TestGetMoreChannel(t *testing.T) { func TestGetMoreChannel(t *testing.T) {
Setup() Setup()
team := &model.Team{Name: "Name", Domain: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN} team := &model.Team{DisplayName: "Name", Name: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN}
team = Client.Must(Client.CreateTeam(team)).Data.(*model.Team) team = Client.Must(Client.CreateTeam(team)).Data.(*model.Team)
user1 := &model.User{TeamId: team.Id, Email: model.NewId() + "corey@test.com", Nickname: "Corey Hulen", Password: "pwd"} user1 := &model.User{TeamId: team.Id, Email: model.NewId() + "corey@test.com", Nickname: "Corey Hulen", Password: "pwd"}
user1 = Client.Must(Client.CreateUser(user1, "")).Data.(*model.User) user1 = Client.Must(Client.CreateUser(user1, "")).Data.(*model.User)
store.Must(Srv.Store.User().VerifyEmail(user1.Id)) store.Must(Srv.Store.User().VerifyEmail(user1.Id))
Client.LoginByEmail(team.Domain, user1.Email, "pwd") Client.LoginByEmail(team.Name, user1.Email, "pwd")
channel1 := &model.Channel{DisplayName: "A Test API Name", Name: "a" + model.NewId() + "a", Type: model.CHANNEL_OPEN, TeamId: team.Id} channel1 := &model.Channel{DisplayName: "A Test API Name", Name: "a" + model.NewId() + "a", Type: model.CHANNEL_OPEN, TeamId: team.Id}
channel1 = Client.Must(Client.CreateChannel(channel1)).Data.(*model.Channel) channel1 = Client.Must(Client.CreateChannel(channel1)).Data.(*model.Channel)
@@ -343,7 +343,7 @@ func TestGetMoreChannel(t *testing.T) {
user2 = Client.Must(Client.CreateUser(user2, "")).Data.(*model.User) user2 = Client.Must(Client.CreateUser(user2, "")).Data.(*model.User)
store.Must(Srv.Store.User().VerifyEmail(user2.Id)) store.Must(Srv.Store.User().VerifyEmail(user2.Id))
Client.LoginByEmail(team.Domain, user2.Email, "pwd") Client.LoginByEmail(team.Name, user2.Email, "pwd")
rget := Client.Must(Client.GetMoreChannels("")) rget := Client.Must(Client.GetMoreChannels(""))
data := rget.Data.(*model.ChannelList) data := rget.Data.(*model.ChannelList)
@@ -368,14 +368,14 @@ func TestGetMoreChannel(t *testing.T) {
func TestJoinChannel(t *testing.T) { func TestJoinChannel(t *testing.T) {
Setup() Setup()
team := &model.Team{Name: "Name", Domain: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN} team := &model.Team{DisplayName: "Name", Name: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN}
team = Client.Must(Client.CreateTeam(team)).Data.(*model.Team) team = Client.Must(Client.CreateTeam(team)).Data.(*model.Team)
user1 := &model.User{TeamId: team.Id, Email: model.NewId() + "corey@test.com", Nickname: "Corey Hulen", Password: "pwd"} user1 := &model.User{TeamId: team.Id, Email: model.NewId() + "corey@test.com", Nickname: "Corey Hulen", Password: "pwd"}
user1 = Client.Must(Client.CreateUser(user1, "")).Data.(*model.User) user1 = Client.Must(Client.CreateUser(user1, "")).Data.(*model.User)
store.Must(Srv.Store.User().VerifyEmail(user1.Id)) store.Must(Srv.Store.User().VerifyEmail(user1.Id))
Client.LoginByEmail(team.Domain, user1.Email, "pwd") Client.LoginByEmail(team.Name, user1.Email, "pwd")
channel1 := &model.Channel{DisplayName: "A Test API Name", Name: "a" + model.NewId() + "a", Type: model.CHANNEL_OPEN, TeamId: team.Id} channel1 := &model.Channel{DisplayName: "A Test API Name", Name: "a" + model.NewId() + "a", Type: model.CHANNEL_OPEN, TeamId: team.Id}
channel1 = Client.Must(Client.CreateChannel(channel1)).Data.(*model.Channel) channel1 = Client.Must(Client.CreateChannel(channel1)).Data.(*model.Channel)
@@ -387,7 +387,7 @@ func TestJoinChannel(t *testing.T) {
user2 = Client.Must(Client.CreateUser(user2, "")).Data.(*model.User) user2 = Client.Must(Client.CreateUser(user2, "")).Data.(*model.User)
store.Must(Srv.Store.User().VerifyEmail(user2.Id)) store.Must(Srv.Store.User().VerifyEmail(user2.Id))
Client.LoginByEmail(team.Domain, user2.Email, "pwd") Client.LoginByEmail(team.Name, user2.Email, "pwd")
Client.Must(Client.JoinChannel(channel1.Id)) Client.Must(Client.JoinChannel(channel1.Id))
@@ -402,7 +402,7 @@ func TestJoinChannel(t *testing.T) {
user3 := &model.User{TeamId: team.Id, Email: model.NewId() + "corey@test.com", Nickname: "Corey Hulen", Password: "pwd"} user3 := &model.User{TeamId: team.Id, Email: model.NewId() + "corey@test.com", Nickname: "Corey Hulen", Password: "pwd"}
user3 = Client.Must(Client.CreateUser(user3, "")).Data.(*model.User) user3 = Client.Must(Client.CreateUser(user3, "")).Data.(*model.User)
Client.LoginByEmail(team.Domain, user3.Email, "pwd") Client.LoginByEmail(team.Name, user3.Email, "pwd")
if _, err := Client.JoinChannel(rchannel.Id); err == nil { if _, err := Client.JoinChannel(rchannel.Id); err == nil {
t.Fatal("shoudn't be able to join direct channel") t.Fatal("shoudn't be able to join direct channel")
@@ -412,14 +412,14 @@ func TestJoinChannel(t *testing.T) {
func TestLeaveChannel(t *testing.T) { func TestLeaveChannel(t *testing.T) {
Setup() Setup()
team := &model.Team{Name: "Name", Domain: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN} team := &model.Team{DisplayName: "Name", Name: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN}
team = Client.Must(Client.CreateTeam(team)).Data.(*model.Team) team = Client.Must(Client.CreateTeam(team)).Data.(*model.Team)
user1 := &model.User{TeamId: team.Id, Email: model.NewId() + "corey@test.com", Nickname: "Corey Hulen", Password: "pwd"} user1 := &model.User{TeamId: team.Id, Email: model.NewId() + "corey@test.com", Nickname: "Corey Hulen", Password: "pwd"}
user1 = Client.Must(Client.CreateUser(user1, "")).Data.(*model.User) user1 = Client.Must(Client.CreateUser(user1, "")).Data.(*model.User)
store.Must(Srv.Store.User().VerifyEmail(user1.Id)) store.Must(Srv.Store.User().VerifyEmail(user1.Id))
Client.LoginByEmail(team.Domain, user1.Email, "pwd") Client.LoginByEmail(team.Name, user1.Email, "pwd")
channel1 := &model.Channel{DisplayName: "A Test API Name", Name: "a" + model.NewId() + "a", Type: model.CHANNEL_OPEN, TeamId: team.Id} channel1 := &model.Channel{DisplayName: "A Test API Name", Name: "a" + model.NewId() + "a", Type: model.CHANNEL_OPEN, TeamId: team.Id}
channel1 = Client.Must(Client.CreateChannel(channel1)).Data.(*model.Channel) channel1 = Client.Must(Client.CreateChannel(channel1)).Data.(*model.Channel)
@@ -431,7 +431,7 @@ func TestLeaveChannel(t *testing.T) {
user2 = Client.Must(Client.CreateUser(user2, "")).Data.(*model.User) user2 = Client.Must(Client.CreateUser(user2, "")).Data.(*model.User)
store.Must(Srv.Store.User().VerifyEmail(user2.Id)) store.Must(Srv.Store.User().VerifyEmail(user2.Id))
Client.LoginByEmail(team.Domain, user2.Email, "pwd") Client.LoginByEmail(team.Name, user2.Email, "pwd")
Client.Must(Client.JoinChannel(channel1.Id)) Client.Must(Client.JoinChannel(channel1.Id))
@@ -461,7 +461,7 @@ func TestLeaveChannel(t *testing.T) {
func TestDeleteChannel(t *testing.T) { func TestDeleteChannel(t *testing.T) {
Setup() Setup()
team := &model.Team{Name: "Name", Domain: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN} team := &model.Team{DisplayName: "Name", Name: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN}
team = Client.Must(Client.CreateTeam(team)).Data.(*model.Team) team = Client.Must(Client.CreateTeam(team)).Data.(*model.Team)
userTeamAdmin := &model.User{TeamId: team.Id, Email: team.Email, Nickname: "Corey Hulen", Password: "pwd"} userTeamAdmin := &model.User{TeamId: team.Id, Email: team.Email, Nickname: "Corey Hulen", Password: "pwd"}
@@ -472,14 +472,14 @@ func TestDeleteChannel(t *testing.T) {
userChannelAdmin = Client.Must(Client.CreateUser(userChannelAdmin, "")).Data.(*model.User) userChannelAdmin = Client.Must(Client.CreateUser(userChannelAdmin, "")).Data.(*model.User)
store.Must(Srv.Store.User().VerifyEmail(userChannelAdmin.Id)) store.Must(Srv.Store.User().VerifyEmail(userChannelAdmin.Id))
Client.LoginByEmail(team.Domain, userChannelAdmin.Email, "pwd") Client.LoginByEmail(team.Name, userChannelAdmin.Email, "pwd")
channelMadeByCA := &model.Channel{DisplayName: "C Test API Name", Name: "a" + model.NewId() + "a", Type: model.CHANNEL_OPEN, TeamId: team.Id} channelMadeByCA := &model.Channel{DisplayName: "C Test API Name", Name: "a" + model.NewId() + "a", Type: model.CHANNEL_OPEN, TeamId: team.Id}
channelMadeByCA = Client.Must(Client.CreateChannel(channelMadeByCA)).Data.(*model.Channel) channelMadeByCA = Client.Must(Client.CreateChannel(channelMadeByCA)).Data.(*model.Channel)
Client.AddChannelMember(channelMadeByCA.Id, userTeamAdmin.Id) Client.AddChannelMember(channelMadeByCA.Id, userTeamAdmin.Id)
Client.LoginByEmail(team.Domain, userTeamAdmin.Email, "pwd") Client.LoginByEmail(team.Name, userTeamAdmin.Email, "pwd")
channel1 := &model.Channel{DisplayName: "A Test API Name", Name: "a" + model.NewId() + "a", Type: model.CHANNEL_OPEN, TeamId: team.Id} channel1 := &model.Channel{DisplayName: "A Test API Name", Name: "a" + model.NewId() + "a", Type: model.CHANNEL_OPEN, TeamId: team.Id}
channel1 = Client.Must(Client.CreateChannel(channel1)).Data.(*model.Channel) channel1 = Client.Must(Client.CreateChannel(channel1)).Data.(*model.Channel)
@@ -504,7 +504,7 @@ func TestDeleteChannel(t *testing.T) {
userStd = Client.Must(Client.CreateUser(userStd, "")).Data.(*model.User) userStd = Client.Must(Client.CreateUser(userStd, "")).Data.(*model.User)
store.Must(Srv.Store.User().VerifyEmail(userStd.Id)) store.Must(Srv.Store.User().VerifyEmail(userStd.Id))
Client.LoginByEmail(team.Domain, userStd.Email, "pwd") Client.LoginByEmail(team.Name, userStd.Email, "pwd")
if _, err := Client.JoinChannel(channel1.Id); err == nil { if _, err := Client.JoinChannel(channel1.Id); err == nil {
t.Fatal("should have failed to join deleted channel") t.Fatal("should have failed to join deleted channel")
@@ -531,14 +531,14 @@ func TestDeleteChannel(t *testing.T) {
func TestGetChannelExtraInfo(t *testing.T) { func TestGetChannelExtraInfo(t *testing.T) {
Setup() Setup()
team := &model.Team{Name: "Name", Domain: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN} team := &model.Team{DisplayName: "Name", Name: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN}
team = Client.Must(Client.CreateTeam(team)).Data.(*model.Team) team = Client.Must(Client.CreateTeam(team)).Data.(*model.Team)
user := &model.User{TeamId: team.Id, Email: model.NewId() + "corey@test.com", Nickname: "Corey Hulen", Password: "pwd"} user := &model.User{TeamId: team.Id, Email: model.NewId() + "corey@test.com", Nickname: "Corey Hulen", Password: "pwd"}
user = Client.Must(Client.CreateUser(user, "")).Data.(*model.User) user = Client.Must(Client.CreateUser(user, "")).Data.(*model.User)
store.Must(Srv.Store.User().VerifyEmail(user.Id)) store.Must(Srv.Store.User().VerifyEmail(user.Id))
Client.LoginByEmail(team.Domain, user.Email, "pwd") Client.LoginByEmail(team.Name, user.Email, "pwd")
channel1 := &model.Channel{DisplayName: "A Test API Name", Name: "a" + model.NewId() + "a", Type: model.CHANNEL_OPEN, TeamId: team.Id} channel1 := &model.Channel{DisplayName: "A Test API Name", Name: "a" + model.NewId() + "a", Type: model.CHANNEL_OPEN, TeamId: team.Id}
channel1 = Client.Must(Client.CreateChannel(channel1)).Data.(*model.Channel) channel1 = Client.Must(Client.CreateChannel(channel1)).Data.(*model.Channel)
@@ -552,14 +552,14 @@ func TestGetChannelExtraInfo(t *testing.T) {
func TestAddChannelMember(t *testing.T) { func TestAddChannelMember(t *testing.T) {
Setup() Setup()
team := &model.Team{Name: "Name", Domain: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN} team := &model.Team{DisplayName: "Name", Name: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN}
team = Client.Must(Client.CreateTeam(team)).Data.(*model.Team) team = Client.Must(Client.CreateTeam(team)).Data.(*model.Team)
user1 := &model.User{TeamId: team.Id, Email: model.NewId() + "corey@test.com", Nickname: "Corey Hulen", Password: "pwd"} user1 := &model.User{TeamId: team.Id, Email: model.NewId() + "corey@test.com", Nickname: "Corey Hulen", Password: "pwd"}
user1 = Client.Must(Client.CreateUser(user1, "")).Data.(*model.User) user1 = Client.Must(Client.CreateUser(user1, "")).Data.(*model.User)
store.Must(Srv.Store.User().VerifyEmail(user1.Id)) store.Must(Srv.Store.User().VerifyEmail(user1.Id))
Client.LoginByEmail(team.Domain, user1.Email, "pwd") Client.LoginByEmail(team.Name, user1.Email, "pwd")
channel1 := &model.Channel{DisplayName: "A Test API Name", Name: "a" + model.NewId() + "a", Type: model.CHANNEL_OPEN, TeamId: team.Id} channel1 := &model.Channel{DisplayName: "A Test API Name", Name: "a" + model.NewId() + "a", Type: model.CHANNEL_OPEN, TeamId: team.Id}
channel1 = Client.Must(Client.CreateChannel(channel1)).Data.(*model.Channel) channel1 = Client.Must(Client.CreateChannel(channel1)).Data.(*model.Channel)
@@ -591,13 +591,13 @@ func TestAddChannelMember(t *testing.T) {
channel2 := &model.Channel{DisplayName: "A Test API Name", Name: "a" + model.NewId() + "a", Type: model.CHANNEL_OPEN, TeamId: team.Id} channel2 := &model.Channel{DisplayName: "A Test API Name", Name: "a" + model.NewId() + "a", Type: model.CHANNEL_OPEN, TeamId: team.Id}
channel2 = Client.Must(Client.CreateChannel(channel2)).Data.(*model.Channel) channel2 = Client.Must(Client.CreateChannel(channel2)).Data.(*model.Channel)
Client.LoginByEmail(team.Domain, user2.Email, "pwd") Client.LoginByEmail(team.Name, user2.Email, "pwd")
if _, err := Client.AddChannelMember(channel2.Id, user2.Id); err == nil { if _, err := Client.AddChannelMember(channel2.Id, user2.Id); err == nil {
t.Fatal("Should have errored, user not in channel") t.Fatal("Should have errored, user not in channel")
} }
Client.LoginByEmail(team.Domain, user1.Email, "pwd") Client.LoginByEmail(team.Name, user1.Email, "pwd")
Client.Must(Client.DeleteChannel(channel2.Id)) Client.Must(Client.DeleteChannel(channel2.Id))
@@ -610,7 +610,7 @@ func TestAddChannelMember(t *testing.T) {
func TestRemoveChannelMember(t *testing.T) { func TestRemoveChannelMember(t *testing.T) {
Setup() Setup()
team := &model.Team{Name: "Name", Domain: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN} team := &model.Team{DisplayName: "Name", Name: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN}
team = Client.Must(Client.CreateTeam(team)).Data.(*model.Team) team = Client.Must(Client.CreateTeam(team)).Data.(*model.Team)
userTeamAdmin := &model.User{TeamId: team.Id, Email: team.Email, Nickname: "Corey Hulen", Password: "pwd"} userTeamAdmin := &model.User{TeamId: team.Id, Email: team.Email, Nickname: "Corey Hulen", Password: "pwd"}
@@ -621,14 +621,14 @@ func TestRemoveChannelMember(t *testing.T) {
userChannelAdmin = Client.Must(Client.CreateUser(userChannelAdmin, "")).Data.(*model.User) userChannelAdmin = Client.Must(Client.CreateUser(userChannelAdmin, "")).Data.(*model.User)
store.Must(Srv.Store.User().VerifyEmail(userChannelAdmin.Id)) store.Must(Srv.Store.User().VerifyEmail(userChannelAdmin.Id))
Client.LoginByEmail(team.Domain, userChannelAdmin.Email, "pwd") Client.LoginByEmail(team.Name, userChannelAdmin.Email, "pwd")
channelMadeByCA := &model.Channel{DisplayName: "A Test API Name", Name: "a" + model.NewId() + "a", Type: model.CHANNEL_OPEN, TeamId: team.Id} channelMadeByCA := &model.Channel{DisplayName: "A Test API Name", Name: "a" + model.NewId() + "a", Type: model.CHANNEL_OPEN, TeamId: team.Id}
channelMadeByCA = Client.Must(Client.CreateChannel(channelMadeByCA)).Data.(*model.Channel) channelMadeByCA = Client.Must(Client.CreateChannel(channelMadeByCA)).Data.(*model.Channel)
Client.Must(Client.AddChannelMember(channelMadeByCA.Id, userTeamAdmin.Id)) Client.Must(Client.AddChannelMember(channelMadeByCA.Id, userTeamAdmin.Id))
Client.LoginByEmail(team.Domain, userTeamAdmin.Email, "pwd") Client.LoginByEmail(team.Name, userTeamAdmin.Email, "pwd")
channel1 := &model.Channel{DisplayName: "A Test API Name", Name: "a" + model.NewId() + "a", Type: model.CHANNEL_OPEN, TeamId: team.Id} channel1 := &model.Channel{DisplayName: "A Test API Name", Name: "a" + model.NewId() + "a", Type: model.CHANNEL_OPEN, TeamId: team.Id}
channel1 = Client.Must(Client.CreateChannel(channel1)).Data.(*model.Channel) channel1 = Client.Must(Client.CreateChannel(channel1)).Data.(*model.Channel)
@@ -660,13 +660,13 @@ func TestRemoveChannelMember(t *testing.T) {
channel2 := &model.Channel{DisplayName: "A Test API Name", Name: "a" + model.NewId() + "a", Type: model.CHANNEL_OPEN, TeamId: team.Id} channel2 := &model.Channel{DisplayName: "A Test API Name", Name: "a" + model.NewId() + "a", Type: model.CHANNEL_OPEN, TeamId: team.Id}
channel2 = Client.Must(Client.CreateChannel(channel2)).Data.(*model.Channel) channel2 = Client.Must(Client.CreateChannel(channel2)).Data.(*model.Channel)
Client.LoginByEmail(team.Domain, userStd.Email, "pwd") Client.LoginByEmail(team.Name, userStd.Email, "pwd")
if _, err := Client.RemoveChannelMember(channel2.Id, userStd.Id); err == nil { if _, err := Client.RemoveChannelMember(channel2.Id, userStd.Id); err == nil {
t.Fatal("Should have errored, user not channel admin") t.Fatal("Should have errored, user not channel admin")
} }
Client.LoginByEmail(team.Domain, userTeamAdmin.Email, "pwd") Client.LoginByEmail(team.Name, userTeamAdmin.Email, "pwd")
Client.Must(Client.AddChannelMember(channel2.Id, userStd.Id)) Client.Must(Client.AddChannelMember(channel2.Id, userStd.Id))
Client.Must(Client.DeleteChannel(channel2.Id)) Client.Must(Client.DeleteChannel(channel2.Id))
@@ -680,14 +680,14 @@ func TestRemoveChannelMember(t *testing.T) {
func TestUpdateNotifyLevel(t *testing.T) { func TestUpdateNotifyLevel(t *testing.T) {
Setup() Setup()
team := &model.Team{Name: "Name", Domain: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN} team := &model.Team{DisplayName: "Name", Name: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN}
team = Client.Must(Client.CreateTeam(team)).Data.(*model.Team) team = Client.Must(Client.CreateTeam(team)).Data.(*model.Team)
user := &model.User{TeamId: team.Id, Email: model.NewId() + "corey@test.com", Nickname: "Corey Hulen", Password: "pwd"} user := &model.User{TeamId: team.Id, Email: model.NewId() + "corey@test.com", Nickname: "Corey Hulen", Password: "pwd"}
user = Client.Must(Client.CreateUser(user, "")).Data.(*model.User) user = Client.Must(Client.CreateUser(user, "")).Data.(*model.User)
store.Must(Srv.Store.User().VerifyEmail(user.Id)) store.Must(Srv.Store.User().VerifyEmail(user.Id))
Client.LoginByEmail(team.Domain, user.Email, "pwd") Client.LoginByEmail(team.Name, user.Email, "pwd")
channel1 := &model.Channel{DisplayName: "A Test API Name", Name: "a" + model.NewId() + "a", Type: model.CHANNEL_OPEN, TeamId: team.Id} channel1 := &model.Channel{DisplayName: "A Test API Name", Name: "a" + model.NewId() + "a", Type: model.CHANNEL_OPEN, TeamId: team.Id}
channel1 = Client.Must(Client.CreateChannel(channel1)).Data.(*model.Channel) channel1 = Client.Must(Client.CreateChannel(channel1)).Data.(*model.Channel)
@@ -749,7 +749,7 @@ func TestUpdateNotifyLevel(t *testing.T) {
user2 := &model.User{TeamId: team.Id, Email: model.NewId() + "corey@test.com", Nickname: "Corey Hulen", Password: "pwd"} user2 := &model.User{TeamId: team.Id, Email: model.NewId() + "corey@test.com", Nickname: "Corey Hulen", Password: "pwd"}
user2 = Client.Must(Client.CreateUser(user2, "")).Data.(*model.User) user2 = Client.Must(Client.CreateUser(user2, "")).Data.(*model.User)
Client.LoginByEmail(team.Domain, user2.Email, "pwd") Client.LoginByEmail(team.Name, user2.Email, "pwd")
data["channel_id"] = channel1.Id data["channel_id"] = channel1.Id
data["user_id"] = user2.Id data["user_id"] = user2.Id
@@ -762,14 +762,14 @@ func TestUpdateNotifyLevel(t *testing.T) {
func TestFuzzyChannel(t *testing.T) { func TestFuzzyChannel(t *testing.T) {
Setup() Setup()
team := &model.Team{Name: "Name", Domain: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN} team := &model.Team{DisplayName: "Name", Name: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN}
team = Client.Must(Client.CreateTeam(team)).Data.(*model.Team) team = Client.Must(Client.CreateTeam(team)).Data.(*model.Team)
user := &model.User{TeamId: team.Id, Email: model.NewId() + "corey@test.com", Nickname: "Corey Hulen", Password: "pwd"} user := &model.User{TeamId: team.Id, Email: model.NewId() + "corey@test.com", Nickname: "Corey Hulen", Password: "pwd"}
user = Client.Must(Client.CreateUser(user, "")).Data.(*model.User) user = Client.Must(Client.CreateUser(user, "")).Data.(*model.User)
store.Must(Srv.Store.User().VerifyEmail(user.Id)) store.Must(Srv.Store.User().VerifyEmail(user.Id))
Client.LoginByEmail(team.Domain, user.Email, "pwd") Client.LoginByEmail(team.Name, user.Email, "pwd")
// Strings that should pass as acceptable channel names // Strings that should pass as acceptable channel names
var fuzzyStringsPass = []string{ var fuzzyStringsPass = []string{

Просмотреть файл

@@ -321,14 +321,14 @@ func loadTestSetupCommand(c *Context, command *model.Command) bool {
numPosts, _ = strconv.Atoi(tokens[numArgs+2]) numPosts, _ = strconv.Atoi(tokens[numArgs+2])
} }
} }
client := model.NewClient(c.TeamUrl + "/api/v1") client := model.NewClient(c.GetSiteURL() + "/api/v1")
if doTeams { if doTeams {
if err := CreateBasicUser(client); err != nil { if err := CreateBasicUser(client); err != nil {
l4g.Error("Failed to create testing enviroment") l4g.Error("Failed to create testing enviroment")
return true return true
} }
client.LoginByEmail(BTEST_TEAM_DOMAIN_NAME, BTEST_USER_EMAIL, BTEST_USER_PASSWORD) client.LoginByEmail(BTEST_TEAM_NAME, BTEST_USER_EMAIL, BTEST_USER_PASSWORD)
enviroment, err := CreateTestEnviromentWithTeams( enviroment, err := CreateTestEnviromentWithTeams(
client, client,
utils.Range{numTeams, numTeams}, utils.Range{numTeams, numTeams},
@@ -342,7 +342,7 @@ func loadTestSetupCommand(c *Context, command *model.Command) bool {
} else { } else {
l4g.Info("Testing enviroment created") l4g.Info("Testing enviroment created")
for i := 0; i < len(enviroment.Teams); i++ { for i := 0; i < len(enviroment.Teams); i++ {
l4g.Info("Team Created: " + enviroment.Teams[i].Domain) l4g.Info("Team Created: " + enviroment.Teams[i].Name)
l4g.Info("\t User to login: " + enviroment.Enviroments[i].Users[0].Email + ", " + USER_PASSWORD) l4g.Info("\t User to login: " + enviroment.Enviroments[i].Users[0].Email + ", " + USER_PASSWORD)
} }
} }
@@ -381,7 +381,7 @@ func loadTestUsersCommand(c *Context, command *model.Command) bool {
if err == false { if err == false {
usersr = utils.Range{10, 15} usersr = utils.Range{10, 15}
} }
client := model.NewClient(c.TeamUrl + "/api/v1") client := model.NewClient(c.GetSiteURL() + "/api/v1")
userCreator := NewAutoUserCreator(client, c.Session.TeamId) userCreator := NewAutoUserCreator(client, c.Session.TeamId)
userCreator.Fuzzy = doFuzz userCreator.Fuzzy = doFuzz
userCreator.CreateTestUsers(usersr) userCreator.CreateTestUsers(usersr)
@@ -411,7 +411,7 @@ func loadTestChannelsCommand(c *Context, command *model.Command) bool {
if err == false { if err == false {
channelsr = utils.Range{20, 30} channelsr = utils.Range{20, 30}
} }
client := model.NewClient(c.TeamUrl + "/api/v1") client := model.NewClient(c.GetSiteURL() + "/api/v1")
client.MockSession(c.Session.Id) client.MockSession(c.Session.Id)
channelCreator := NewAutoChannelCreator(client, c.Session.TeamId) channelCreator := NewAutoChannelCreator(client, c.Session.TeamId)
channelCreator.Fuzzy = doFuzz channelCreator.Fuzzy = doFuzz
@@ -463,7 +463,7 @@ func loadTestPostsCommand(c *Context, command *model.Command) bool {
} }
} }
client := model.NewClient(c.TeamUrl + "/api/v1") client := model.NewClient(c.GetSiteURL() + "/api/v1")
client.MockSession(c.Session.Id) client.MockSession(c.Session.Id)
testPoster := NewAutoPostCreator(client, command.ChannelId) testPoster := NewAutoPostCreator(client, command.ChannelId)
testPoster.Fuzzy = doFuzz testPoster.Fuzzy = doFuzz

Просмотреть файл

@@ -12,14 +12,14 @@ import (
func TestSuggestRootCommands(t *testing.T) { func TestSuggestRootCommands(t *testing.T) {
Setup() Setup()
team := &model.Team{Name: "Name", Domain: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN} team := &model.Team{DisplayName: "Name", Name: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN}
team = Client.Must(Client.CreateTeam(team)).Data.(*model.Team) team = Client.Must(Client.CreateTeam(team)).Data.(*model.Team)
user1 := &model.User{TeamId: team.Id, Email: model.NewId() + "corey@test.com", Nickname: "Corey Hulen", Password: "pwd"} user1 := &model.User{TeamId: team.Id, Email: model.NewId() + "corey@test.com", Nickname: "Corey Hulen", Password: "pwd"}
user1 = Client.Must(Client.CreateUser(user1, "")).Data.(*model.User) user1 = Client.Must(Client.CreateUser(user1, "")).Data.(*model.User)
store.Must(Srv.Store.User().VerifyEmail(user1.Id)) store.Must(Srv.Store.User().VerifyEmail(user1.Id))
Client.LoginByEmail(team.Domain, user1.Email, "pwd") Client.LoginByEmail(team.Name, user1.Email, "pwd")
if _, err := Client.Command("", "", true); err == nil { if _, err := Client.Command("", "", true); err == nil {
t.Fatal("Should fail") t.Fatal("Should fail")
@@ -55,14 +55,14 @@ func TestSuggestRootCommands(t *testing.T) {
func TestLogoutCommands(t *testing.T) { func TestLogoutCommands(t *testing.T) {
Setup() Setup()
team := &model.Team{Name: "Name", Domain: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN} team := &model.Team{DisplayName: "Name", Name: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN}
team = Client.Must(Client.CreateTeam(team)).Data.(*model.Team) team = Client.Must(Client.CreateTeam(team)).Data.(*model.Team)
user1 := &model.User{TeamId: team.Id, Email: model.NewId() + "corey@test.com", Nickname: "Corey Hulen", Password: "pwd"} user1 := &model.User{TeamId: team.Id, Email: model.NewId() + "corey@test.com", Nickname: "Corey Hulen", Password: "pwd"}
user1 = Client.Must(Client.CreateUser(user1, "")).Data.(*model.User) user1 = Client.Must(Client.CreateUser(user1, "")).Data.(*model.User)
store.Must(Srv.Store.User().VerifyEmail(user1.Id)) store.Must(Srv.Store.User().VerifyEmail(user1.Id))
Client.LoginByEmail(team.Domain, user1.Email, "pwd") Client.LoginByEmail(team.Name, user1.Email, "pwd")
rs1 := Client.Must(Client.Command("", "/logout", false)).Data.(*model.Command) rs1 := Client.Must(Client.Command("", "/logout", false)).Data.(*model.Command)
if rs1.GotoLocation != "/logout" { if rs1.GotoLocation != "/logout" {
@@ -73,14 +73,14 @@ func TestLogoutCommands(t *testing.T) {
func TestJoinCommands(t *testing.T) { func TestJoinCommands(t *testing.T) {
Setup() Setup()
team := &model.Team{Name: "Name", Domain: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN} team := &model.Team{DisplayName: "Name", Name: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN}
team = Client.Must(Client.CreateTeam(team)).Data.(*model.Team) team = Client.Must(Client.CreateTeam(team)).Data.(*model.Team)
user1 := &model.User{TeamId: team.Id, Email: model.NewId() + "corey@test.com", Nickname: "Corey Hulen", Password: "pwd"} user1 := &model.User{TeamId: team.Id, Email: model.NewId() + "corey@test.com", Nickname: "Corey Hulen", Password: "pwd"}
user1 = Client.Must(Client.CreateUser(user1, "")).Data.(*model.User) user1 = Client.Must(Client.CreateUser(user1, "")).Data.(*model.User)
store.Must(Srv.Store.User().VerifyEmail(user1.Id)) store.Must(Srv.Store.User().VerifyEmail(user1.Id))
Client.LoginByEmail(team.Domain, user1.Email, "pwd") Client.LoginByEmail(team.Name, user1.Email, "pwd")
channel1 := &model.Channel{DisplayName: "AA", Name: "aa" + model.NewId() + "a", Type: model.CHANNEL_OPEN, TeamId: team.Id} channel1 := &model.Channel{DisplayName: "AA", Name: "aa" + model.NewId() + "a", Type: model.CHANNEL_OPEN, TeamId: team.Id}
channel1 = Client.Must(Client.CreateChannel(channel1)).Data.(*model.Channel) channel1 = Client.Must(Client.CreateChannel(channel1)).Data.(*model.Channel)

Просмотреть файл

@@ -17,12 +17,14 @@ import (
var sessionCache *utils.Cache = utils.NewLru(model.SESSION_CACHE_SIZE) var sessionCache *utils.Cache = utils.NewLru(model.SESSION_CACHE_SIZE)
type Context struct { type Context struct {
Session model.Session Session model.Session
RequestId string RequestId string
IpAddress string IpAddress string
TeamUrl string Path string
Path string Err *model.AppError
Err *model.AppError teamURLValid bool
teamURL string
siteURL string
} }
type Page struct { type Page struct {
@@ -30,32 +32,36 @@ type Page struct {
Title string Title string
SiteName string SiteName string
FeedbackEmail string FeedbackEmail string
TeamUrl string TeamURL string
Props map[string]string Props map[string]string
} }
func ApiAppHandler(h func(*Context, http.ResponseWriter, *http.Request)) http.Handler { func ApiAppHandler(h func(*Context, http.ResponseWriter, *http.Request)) http.Handler {
return &handler{h, false, false, true, false} return &handler{h, false, false, true, false, false}
} }
func AppHandler(h func(*Context, http.ResponseWriter, *http.Request)) http.Handler { func AppHandler(h func(*Context, http.ResponseWriter, *http.Request)) http.Handler {
return &handler{h, false, false, false, false} return &handler{h, false, false, false, false, false}
}
func AppHandlerIndependent(h func(*Context, http.ResponseWriter, *http.Request)) http.Handler {
return &handler{h, false, false, false, false, true}
} }
func ApiUserRequired(h func(*Context, http.ResponseWriter, *http.Request)) http.Handler { func ApiUserRequired(h func(*Context, http.ResponseWriter, *http.Request)) http.Handler {
return &handler{h, true, false, true, true} return &handler{h, true, false, true, true, false}
} }
func ApiUserRequiredActivity(h func(*Context, http.ResponseWriter, *http.Request), isUserActivity bool) http.Handler { func ApiUserRequiredActivity(h func(*Context, http.ResponseWriter, *http.Request), isUserActivity bool) http.Handler {
return &handler{h, true, false, true, isUserActivity} return &handler{h, true, false, true, isUserActivity, false}
} }
func UserRequired(h func(*Context, http.ResponseWriter, *http.Request)) http.Handler { func UserRequired(h func(*Context, http.ResponseWriter, *http.Request)) http.Handler {
return &handler{h, true, false, false, false} return &handler{h, true, false, false, false, false}
} }
func ApiAdminSystemRequired(h func(*Context, http.ResponseWriter, *http.Request)) http.Handler { func ApiAdminSystemRequired(h func(*Context, http.ResponseWriter, *http.Request)) http.Handler {
return &handler{h, true, true, true, false} return &handler{h, true, true, true, false, false}
} }
type handler struct { type handler struct {
@@ -64,6 +70,7 @@ type handler struct {
requireSystemAdmin bool requireSystemAdmin bool
isApi bool isApi bool
isUserActivity bool isUserActivity bool
isTeamIndependent bool
} }
func (h handler) ServeHTTP(w http.ResponseWriter, r *http.Request) { func (h handler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
@@ -73,7 +80,6 @@ func (h handler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
c := &Context{} c := &Context{}
c.RequestId = model.NewId() c.RequestId = model.NewId()
c.IpAddress = GetIpAddress(r) c.IpAddress = GetIpAddress(r)
c.Path = r.URL.Path
protocol := "http" protocol := "http"
@@ -90,7 +96,7 @@ func (h handler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
} }
} }
c.TeamUrl = protocol + "://" + r.Host c.setSiteURL(protocol + "://" + r.Host)
w.Header().Set(model.HEADER_REQUEST_ID, c.RequestId) w.Header().Set(model.HEADER_REQUEST_ID, c.RequestId)
w.Header().Set(model.HEADER_VERSION_ID, utils.Cfg.ServiceSettings.Version) w.Header().Set(model.HEADER_VERSION_ID, utils.Cfg.ServiceSettings.Version)
@@ -135,6 +141,15 @@ func (h handler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
} }
} }
if h.isApi || h.isTeamIndependent {
c.setTeamURL(c.GetSiteURL(), false)
c.Path = r.URL.Path
} else {
splitURL := strings.Split(r.URL.Path, "/")
c.setTeamURL(protocol+"://"+r.Host+"/"+splitURL[1], true)
c.Path = "/" + strings.Join(splitURL[2:], "/")
}
if c.Err == nil && h.requireUser { if c.Err == nil && h.requireUser {
c.UserRequired() c.UserRequired()
} }
@@ -165,7 +180,7 @@ func (h handler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
w.Write([]byte(c.Err.ToJson())) w.Write([]byte(c.Err.ToJson()))
} else { } else {
if c.Err.StatusCode == http.StatusUnauthorized { if c.Err.StatusCode == http.StatusUnauthorized {
http.Redirect(w, r, "/?redirect="+url.QueryEscape(r.URL.Path), http.StatusTemporaryRedirect) http.Redirect(w, r, c.GetTeamURL()+"/?redirect="+url.QueryEscape(r.URL.Path), http.StatusTemporaryRedirect)
} else { } else {
RenderWebError(c.Err, w, r) RenderWebError(c.Err, w, r)
} }
@@ -299,6 +314,39 @@ func (c *Context) SetUnknownError(where string, details string) {
c.Err = model.NewAppError(where, "An unknown error has occured. Please contact support.", details) c.Err = model.NewAppError(where, "An unknown error has occured. Please contact support.", details)
} }
func (c *Context) setTeamURL(url string, valid bool) {
c.teamURL = url
c.teamURLValid = valid
}
func (c *Context) setTeamURLFromSession() {
if result := <-Srv.Store.Team().Get(c.Session.TeamId); result.Err == nil {
c.setTeamURL(c.GetSiteURL()+"/"+result.Data.(*model.Team).Name, true)
}
}
func (c *Context) setSiteURL(url string) {
c.siteURL = url
}
func (c *Context) GetTeamURLFromTeam(team *model.Team) string {
return c.GetSiteURL() + "/" + team.Name
}
func (c *Context) GetTeamURL() string {
if !c.teamURLValid {
c.setTeamURLFromSession()
if !c.teamURLValid {
l4g.Debug("TeamURL accessed when not valid. Team URL should not be used in api functions or those that are team independent")
}
}
return c.teamURL
}
func (c *Context) GetSiteURL() string {
return c.siteURL
}
func GetIpAddress(r *http.Request) string { func GetIpAddress(r *http.Request) string {
address := r.Header.Get(model.HEADER_FORWARDED) address := r.Header.Get(model.HEADER_FORWARDED)
if len(address) == 0 { if len(address) == 0 {

Просмотреть файл

@@ -13,9 +13,9 @@ import (
"github.com/mattermost/platform/model" "github.com/mattermost/platform/model"
"github.com/mattermost/platform/utils" "github.com/mattermost/platform/utils"
"github.com/nfnt/resize" "github.com/nfnt/resize"
_ "golang.org/x/image/bmp"
"image" "image"
_ "image/gif" _ "image/gif"
_ "golang.org/x/image/bmp"
"image/jpeg" "image/jpeg"
"io" "io"
"net/http" "net/http"
@@ -115,7 +115,7 @@ func uploadFile(c *Context, w http.ResponseWriter, r *http.Request) {
return return
} }
fileUrl := c.TeamUrl + "/api/v1/files/get/" + channelId + "/" + c.Session.UserId + "/" + uid + "/" + url.QueryEscape(files[i].Filename) fileUrl := c.GetSiteURL() + "/api/v1/files/get/" + channelId + "/" + c.Session.UserId + "/" + uid + "/" + url.QueryEscape(files[i].Filename)
resStruct.Filenames = append(resStruct.Filenames, fileUrl) resStruct.Filenames = append(resStruct.Filenames, fileUrl)
} }
@@ -363,7 +363,7 @@ func getPublicLink(c *Context, w http.ResponseWriter, r *http.Request) {
data := model.MapToJson(newProps) data := model.MapToJson(newProps)
hash := model.HashPassword(fmt.Sprintf("%v:%v", data, utils.Cfg.ServiceSettings.PublicLinkSalt)) hash := model.HashPassword(fmt.Sprintf("%v:%v", data, utils.Cfg.ServiceSettings.PublicLinkSalt))
url := fmt.Sprintf("%s/api/v1/files/%s/%s/%s/%s?d=%s&h=%s&t=%s", c.TeamUrl, getType, channelId, userId, filename, url.QueryEscape(data), url.QueryEscape(hash), c.Session.TeamId) url := fmt.Sprintf("%s/api/v1/files/%s/%s/%s/%s?d=%s&h=%s&t=%s", c.GetSiteURL(), getType, channelId, userId, filename, url.QueryEscape(data), url.QueryEscape(hash), c.Session.TeamId)
if !c.HasPermissionsToChannel(cchan, "getPublicLink") { if !c.HasPermissionsToChannel(cchan, "getPublicLink") {
return return

Просмотреть файл

@@ -24,14 +24,14 @@ import (
func TestUploadFile(t *testing.T) { func TestUploadFile(t *testing.T) {
Setup() Setup()
team := &model.Team{Name: "Name", Domain: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN} team := &model.Team{DisplayName: "Name", Name: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN}
team = Client.Must(Client.CreateTeam(team)).Data.(*model.Team) team = Client.Must(Client.CreateTeam(team)).Data.(*model.Team)
user1 := &model.User{TeamId: team.Id, Email: model.NewId() + "corey@test.com", Nickname: "Corey Hulen", Password: "pwd"} user1 := &model.User{TeamId: team.Id, Email: model.NewId() + "corey@test.com", Nickname: "Corey Hulen", Password: "pwd"}
user1 = Client.Must(Client.CreateUser(user1, "")).Data.(*model.User) user1 = Client.Must(Client.CreateUser(user1, "")).Data.(*model.User)
store.Must(Srv.Store.User().VerifyEmail(user1.Id)) store.Must(Srv.Store.User().VerifyEmail(user1.Id))
Client.LoginByEmail(team.Domain, user1.Email, "pwd") Client.LoginByEmail(team.Name, user1.Email, "pwd")
channel1 := &model.Channel{DisplayName: "Test API Name", Name: "a" + model.NewId() + "a", Type: model.CHANNEL_OPEN, TeamId: team.Id} channel1 := &model.Channel{DisplayName: "Test API Name", Name: "a" + model.NewId() + "a", Type: model.CHANNEL_OPEN, TeamId: team.Id}
channel1 = Client.Must(Client.CreateChannel(channel1)).Data.(*model.Channel) channel1 = Client.Must(Client.CreateChannel(channel1)).Data.(*model.Channel)
@@ -111,14 +111,14 @@ func TestUploadFile(t *testing.T) {
func TestGetFile(t *testing.T) { func TestGetFile(t *testing.T) {
Setup() Setup()
team := &model.Team{Name: "Name", Domain: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN} team := &model.Team{DisplayName: "Name", Name: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN}
team = Client.Must(Client.CreateTeam(team)).Data.(*model.Team) team = Client.Must(Client.CreateTeam(team)).Data.(*model.Team)
user1 := &model.User{TeamId: team.Id, Email: model.NewId() + "corey@test.com", Nickname: "Corey Hulen", Password: "pwd"} user1 := &model.User{TeamId: team.Id, Email: model.NewId() + "corey@test.com", Nickname: "Corey Hulen", Password: "pwd"}
user1 = Client.Must(Client.CreateUser(user1, "")).Data.(*model.User) user1 = Client.Must(Client.CreateUser(user1, "")).Data.(*model.User)
store.Must(Srv.Store.User().VerifyEmail(user1.Id)) store.Must(Srv.Store.User().VerifyEmail(user1.Id))
Client.LoginByEmail(team.Domain, user1.Email, "pwd") Client.LoginByEmail(team.Name, user1.Email, "pwd")
channel1 := &model.Channel{DisplayName: "Test API Name", Name: "a" + model.NewId() + "a", Type: model.CHANNEL_OPEN, TeamId: team.Id} channel1 := &model.Channel{DisplayName: "Test API Name", Name: "a" + model.NewId() + "a", Type: model.CHANNEL_OPEN, TeamId: team.Id}
channel1 = Client.Must(Client.CreateChannel(channel1)).Data.(*model.Channel) channel1 = Client.Must(Client.CreateChannel(channel1)).Data.(*model.Channel)
@@ -173,7 +173,7 @@ func TestGetFile(t *testing.T) {
t.Fatal("file get failed") t.Fatal("file get failed")
} }
team2 := &model.Team{Name: "Name", Domain: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN} team2 := &model.Team{DisplayName: "Name", Name: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN}
team2 = Client.Must(Client.CreateTeam(team2)).Data.(*model.Team) team2 = Client.Must(Client.CreateTeam(team2)).Data.(*model.Team)
user2 := &model.User{TeamId: team2.Id, Email: model.NewId() + "corey@test.com", Nickname: "Corey Hulen", Password: "pwd"} user2 := &model.User{TeamId: team2.Id, Email: model.NewId() + "corey@test.com", Nickname: "Corey Hulen", Password: "pwd"}
@@ -187,7 +187,7 @@ func TestGetFile(t *testing.T) {
data := model.MapToJson(newProps) data := model.MapToJson(newProps)
hash := model.HashPassword(fmt.Sprintf("%v:%v", data, utils.Cfg.ServiceSettings.PublicLinkSalt)) hash := model.HashPassword(fmt.Sprintf("%v:%v", data, utils.Cfg.ServiceSettings.PublicLinkSalt))
Client.LoginByEmail(team2.Domain, user2.Email, "pwd") Client.LoginByEmail(team2.Name, user2.Email, "pwd")
if _, downErr := Client.GetFile(filenames[0]+"?d="+url.QueryEscape(data)+"&h="+url.QueryEscape(hash)+"&t="+team.Id, true); downErr != nil { if _, downErr := Client.GetFile(filenames[0]+"?d="+url.QueryEscape(data)+"&h="+url.QueryEscape(hash)+"&t="+team.Id, true); downErr != nil {
t.Fatal(downErr) t.Fatal(downErr)
@@ -258,7 +258,7 @@ func TestGetFile(t *testing.T) {
func TestGetPublicLink(t *testing.T) { func TestGetPublicLink(t *testing.T) {
Setup() Setup()
team := &model.Team{Name: "Name", Domain: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN} team := &model.Team{DisplayName: "Name", Name: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN}
team = Client.Must(Client.CreateTeam(team)).Data.(*model.Team) team = Client.Must(Client.CreateTeam(team)).Data.(*model.Team)
user1 := &model.User{TeamId: team.Id, Email: model.NewId() + "corey@test.com", Nickname: "Corey Hulen", Password: "pwd"} user1 := &model.User{TeamId: team.Id, Email: model.NewId() + "corey@test.com", Nickname: "Corey Hulen", Password: "pwd"}
@@ -269,7 +269,7 @@ func TestGetPublicLink(t *testing.T) {
user2 = Client.Must(Client.CreateUser(user2, "")).Data.(*model.User) user2 = Client.Must(Client.CreateUser(user2, "")).Data.(*model.User)
store.Must(Srv.Store.User().VerifyEmail(user2.Id)) store.Must(Srv.Store.User().VerifyEmail(user2.Id))
Client.LoginByEmail(team.Domain, user1.Email, "pwd") Client.LoginByEmail(team.Name, user1.Email, "pwd")
channel1 := &model.Channel{DisplayName: "Test API Name", Name: "a" + model.NewId() + "a", Type: model.CHANNEL_OPEN, TeamId: team.Id} channel1 := &model.Channel{DisplayName: "Test API Name", Name: "a" + model.NewId() + "a", Type: model.CHANNEL_OPEN, TeamId: team.Id}
channel1 = Client.Must(Client.CreateChannel(channel1)).Data.(*model.Channel) channel1 = Client.Must(Client.CreateChannel(channel1)).Data.(*model.Channel)
@@ -344,7 +344,7 @@ func TestGetPublicLink(t *testing.T) {
t.Fatal("Should have errored - bad file path") t.Fatal("Should have errored - bad file path")
} }
Client.LoginByEmail(team.Domain, user2.Email, "pwd") Client.LoginByEmail(team.Name, user2.Email, "pwd")
data["filename"] = filenames[0] data["filename"] = filenames[0]
if _, err := Client.GetPublicLink(data); err == nil { if _, err := Client.GetPublicLink(data); err == nil {
t.Fatal("should have errored, user not member of channel") t.Fatal("should have errored, user not member of channel")

Просмотреть файл

@@ -122,7 +122,7 @@ func CreateValetPost(c *Context, post *model.Post) (*model.Post, *model.AppError
rpost = result.Data.(*model.Post) rpost = result.Data.(*model.Post)
} }
fireAndForgetNotifications(rpost, c.Session.TeamId, c.TeamUrl) fireAndForgetNotifications(rpost, c.Session.TeamId, c.GetSiteURL())
return rpost, nil return rpost, nil
} }
@@ -201,14 +201,14 @@ func CreatePost(c *Context, post *model.Post, doUpdateLastViewed bool) (*model.P
} else { } else {
rpost = result.Data.(*model.Post) rpost = result.Data.(*model.Post)
fireAndForgetNotifications(rpost, c.Session.TeamId, c.TeamUrl) fireAndForgetNotifications(rpost, c.Session.TeamId, c.GetSiteURL())
} }
return rpost, nil return rpost, nil
} }
func fireAndForgetNotifications(post *model.Post, teamId, teamUrl string) { func fireAndForgetNotifications(post *model.Post, teamId, siteURL string) {
go func() { go func() {
// Get a list of user names (to be used as keywords) and ids for the given team // Get a list of user names (to be used as keywords) and ids for the given team
@@ -362,20 +362,22 @@ func fireAndForgetNotifications(post *model.Post, teamId, teamUrl string) {
mentionedUsers = append(mentionedUsers, k) mentionedUsers = append(mentionedUsers, k)
} }
var teamName string var teamDisplayName string
var teamURL string
if result := <-tchan; result.Err != nil { if result := <-tchan; result.Err != nil {
l4g.Error("Failed to retrieve team team_id=%v, err=%v", teamId, result.Err) l4g.Error("Failed to retrieve team team_id=%v, err=%v", teamId, result.Err)
return return
} else { } else {
teamName = result.Data.(*model.Team).Name teamDisplayName = result.Data.(*model.Team).DisplayName
teamURL = siteURL + "/" + result.Data.(*model.Team).Name
} }
// Build and send the emails // Build and send the emails
location, _ := time.LoadLocation("UTC") location, _ := time.LoadLocation("UTC")
tm := time.Unix(post.CreateAt/1000, 0).In(location) tm := time.Unix(post.CreateAt/1000, 0).In(location)
subjectPage := NewServerTemplatePage("post_subject", teamUrl) subjectPage := NewServerTemplatePage("post_subject", teamURL)
subjectPage.Props["TeamName"] = teamName subjectPage.Props["TeamDisplayName"] = teamDisplayName
subjectPage.Props["SubjectText"] = subjectText subjectPage.Props["SubjectText"] = subjectText
subjectPage.Props["Month"] = tm.Month().String()[:3] subjectPage.Props["Month"] = tm.Month().String()[:3]
subjectPage.Props["Day"] = fmt.Sprintf("%d", tm.Day()) subjectPage.Props["Day"] = fmt.Sprintf("%d", tm.Day())
@@ -392,9 +394,9 @@ func fireAndForgetNotifications(post *model.Post, teamId, teamUrl string) {
continue continue
} }
bodyPage := NewServerTemplatePage("post_body", teamUrl) bodyPage := NewServerTemplatePage("post_body", teamURL)
bodyPage.Props["Nickname"] = profileMap[id].FirstName bodyPage.Props["Nickname"] = profileMap[id].FirstName
bodyPage.Props["TeamName"] = teamName bodyPage.Props["TeamDisplayName"] = teamDisplayName
bodyPage.Props["ChannelName"] = channelName bodyPage.Props["ChannelName"] = channelName
bodyPage.Props["BodyText"] = bodyText bodyPage.Props["BodyText"] = bodyText
bodyPage.Props["SenderName"] = senderName bodyPage.Props["SenderName"] = senderName
@@ -403,7 +405,7 @@ func fireAndForgetNotifications(post *model.Post, teamId, teamUrl string) {
bodyPage.Props["Month"] = tm.Month().String()[:3] bodyPage.Props["Month"] = tm.Month().String()[:3]
bodyPage.Props["Day"] = fmt.Sprintf("%d", tm.Day()) bodyPage.Props["Day"] = fmt.Sprintf("%d", tm.Day())
bodyPage.Props["PostMessage"] = model.ClearMentionTags(post.Message) bodyPage.Props["PostMessage"] = model.ClearMentionTags(post.Message)
bodyPage.Props["TeamLink"] = teamUrl + "/channels/" + channel.Name bodyPage.Props["TeamLink"] = teamURL + "/channels/" + channel.Name
if err := utils.SendMail(profileMap[id].Email, subjectPage.Render(), bodyPage.Render()); err != nil { if err := utils.SendMail(profileMap[id].Email, subjectPage.Render(), bodyPage.Render()); err != nil {
l4g.Error("Failed to send mention email successfully email=%v err=%v", profileMap[id].Email, err) l4g.Error("Failed to send mention email successfully email=%v err=%v", profileMap[id].Email, err)
@@ -636,9 +638,9 @@ func deletePost(c *Context, w http.ResponseWriter, r *http.Request) {
post := result.Data.(*model.PostList).Posts[postId] post := result.Data.(*model.PostList).Posts[postId]
if !c.HasPermissionsToChannel(cchan, "deletePost") && !c.IsTeamAdmin(post.UserId){ if !c.HasPermissionsToChannel(cchan, "deletePost") && !c.IsTeamAdmin(post.UserId) {
return return
} }
if post == nil { if post == nil {
c.SetInvalidParam("deletePost", "postId") c.SetInvalidParam("deletePost", "postId")
@@ -651,7 +653,7 @@ func deletePost(c *Context, w http.ResponseWriter, r *http.Request) {
return return
} }
if post.UserId != c.Session.UserId && !strings.Contains(c.Session.Roles,model.ROLE_ADMIN) { if post.UserId != c.Session.UserId && !strings.Contains(c.Session.Roles, model.ROLE_ADMIN) {
c.Err = model.NewAppError("deletePost", "You do not have the appropriate permissions", "") c.Err = model.NewAppError("deletePost", "You do not have the appropriate permissions", "")
c.Err.StatusCode = http.StatusForbidden c.Err.StatusCode = http.StatusForbidden
return return

Просмотреть файл

@@ -15,10 +15,10 @@ import (
func TestCreatePost(t *testing.T) { func TestCreatePost(t *testing.T) {
Setup() Setup()
team := &model.Team{Name: "Name", Domain: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN} team := &model.Team{DisplayName: "Name", Name: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN}
team = Client.Must(Client.CreateTeam(team)).Data.(*model.Team) team = Client.Must(Client.CreateTeam(team)).Data.(*model.Team)
team2 := &model.Team{Name: "Name Team 2", Domain: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN} team2 := &model.Team{DisplayName: "Name Team 2", Name: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN}
team2 = Client.Must(Client.CreateTeam(team2)).Data.(*model.Team) team2 = Client.Must(Client.CreateTeam(team2)).Data.(*model.Team)
user1 := &model.User{TeamId: team.Id, Email: model.NewId() + "corey@test.com", Nickname: "Corey Hulen", Password: "pwd"} user1 := &model.User{TeamId: team.Id, Email: model.NewId() + "corey@test.com", Nickname: "Corey Hulen", Password: "pwd"}
@@ -29,7 +29,7 @@ func TestCreatePost(t *testing.T) {
user2 = Client.Must(Client.CreateUser(user2, "")).Data.(*model.User) user2 = Client.Must(Client.CreateUser(user2, "")).Data.(*model.User)
store.Must(Srv.Store.User().VerifyEmail(user2.Id)) store.Must(Srv.Store.User().VerifyEmail(user2.Id))
Client.LoginByEmail(team.Domain, user1.Email, "pwd") Client.LoginByEmail(team.Name, user1.Email, "pwd")
channel1 := &model.Channel{DisplayName: "Test API Name", Name: "a" + model.NewId() + "a", Type: model.CHANNEL_OPEN, TeamId: team.Id} channel1 := &model.Channel{DisplayName: "Test API Name", Name: "a" + model.NewId() + "a", Type: model.CHANNEL_OPEN, TeamId: team.Id}
channel1 = Client.Must(Client.CreateChannel(channel1)).Data.(*model.Channel) channel1 = Client.Must(Client.CreateChannel(channel1)).Data.(*model.Channel)
@@ -96,7 +96,7 @@ func TestCreatePost(t *testing.T) {
t.Fatal("Should have been forbidden") t.Fatal("Should have been forbidden")
} }
Client.LoginByEmail(team.Domain, user2.Email, "pwd") Client.LoginByEmail(team.Name, user2.Email, "pwd")
post7 := &model.Post{ChannelId: channel1.Id, Message: "a" + model.NewId() + "a"} post7 := &model.Post{ChannelId: channel1.Id, Message: "a" + model.NewId() + "a"}
_, err = Client.CreatePost(post7) _, err = Client.CreatePost(post7)
if err.StatusCode != http.StatusForbidden { if err.StatusCode != http.StatusForbidden {
@@ -107,7 +107,7 @@ func TestCreatePost(t *testing.T) {
user3 = Client.Must(Client.CreateUser(user3, "")).Data.(*model.User) user3 = Client.Must(Client.CreateUser(user3, "")).Data.(*model.User)
store.Must(Srv.Store.User().VerifyEmail(user3.Id)) store.Must(Srv.Store.User().VerifyEmail(user3.Id))
Client.LoginByEmail(team2.Domain, user3.Email, "pwd") Client.LoginByEmail(team2.Name, user3.Email, "pwd")
channel3 := &model.Channel{DisplayName: "Test API Name", Name: "a" + model.NewId() + "a", Type: model.CHANNEL_OPEN, TeamId: team2.Id} channel3 := &model.Channel{DisplayName: "Test API Name", Name: "a" + model.NewId() + "a", Type: model.CHANNEL_OPEN, TeamId: team2.Id}
channel3 = Client.Must(Client.CreateChannel(channel3)).Data.(*model.Channel) channel3 = Client.Must(Client.CreateChannel(channel3)).Data.(*model.Channel)
@@ -126,10 +126,10 @@ func TestCreatePost(t *testing.T) {
func TestCreateValetPost(t *testing.T) { func TestCreateValetPost(t *testing.T) {
Setup() Setup()
team := &model.Team{Name: "Name", Domain: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN} team := &model.Team{DisplayName: "Name", Name: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN}
team = Client.Must(Client.CreateTeam(team)).Data.(*model.Team) team = Client.Must(Client.CreateTeam(team)).Data.(*model.Team)
team2 := &model.Team{Name: "Name Team 2", Domain: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN} team2 := &model.Team{DisplayName: "Name Team 2", Name: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN}
team2 = Client.Must(Client.CreateTeam(team2)).Data.(*model.Team) team2 = Client.Must(Client.CreateTeam(team2)).Data.(*model.Team)
user1 := &model.User{TeamId: team.Id, Email: model.NewId() + "corey@test.com", Nickname: "Corey Hulen", Password: "pwd"} user1 := &model.User{TeamId: team.Id, Email: model.NewId() + "corey@test.com", Nickname: "Corey Hulen", Password: "pwd"}
@@ -140,7 +140,7 @@ func TestCreateValetPost(t *testing.T) {
user2 = Client.Must(Client.CreateUser(user2, "")).Data.(*model.User) user2 = Client.Must(Client.CreateUser(user2, "")).Data.(*model.User)
store.Must(Srv.Store.User().VerifyEmail(user2.Id)) store.Must(Srv.Store.User().VerifyEmail(user2.Id))
Client.LoginByEmail(team.Domain, user1.Email, "pwd") Client.LoginByEmail(team.Name, user1.Email, "pwd")
channel1 := &model.Channel{DisplayName: "Test API Name", Name: "a" + model.NewId() + "a", Type: model.CHANNEL_OPEN, TeamId: team.Id} channel1 := &model.Channel{DisplayName: "Test API Name", Name: "a" + model.NewId() + "a", Type: model.CHANNEL_OPEN, TeamId: team.Id}
channel1 = Client.Must(Client.CreateChannel(channel1)).Data.(*model.Channel) channel1 = Client.Must(Client.CreateChannel(channel1)).Data.(*model.Channel)
@@ -181,7 +181,7 @@ func TestCreateValetPost(t *testing.T) {
t.Fatal("Should have been forbidden") t.Fatal("Should have been forbidden")
} }
Client.LoginByEmail(team.Domain, user2.Email, "pwd") Client.LoginByEmail(team.Name, user2.Email, "pwd")
post5 := &model.Post{ChannelId: channel1.Id, Message: "a" + model.NewId() + "a"} post5 := &model.Post{ChannelId: channel1.Id, Message: "a" + model.NewId() + "a"}
_, err = Client.CreateValetPost(post5) _, err = Client.CreateValetPost(post5)
if err != nil { if err != nil {
@@ -192,7 +192,7 @@ func TestCreateValetPost(t *testing.T) {
user3 = Client.Must(Client.CreateUser(user3, "")).Data.(*model.User) user3 = Client.Must(Client.CreateUser(user3, "")).Data.(*model.User)
store.Must(Srv.Store.User().VerifyEmail(user3.Id)) store.Must(Srv.Store.User().VerifyEmail(user3.Id))
Client.LoginByEmail(team2.Domain, user3.Email, "pwd") Client.LoginByEmail(team2.Name, user3.Email, "pwd")
channel3 := &model.Channel{DisplayName: "Test API Name", Name: "a" + model.NewId() + "a", Type: model.CHANNEL_OPEN, TeamId: team2.Id} channel3 := &model.Channel{DisplayName: "Test API Name", Name: "a" + model.NewId() + "a", Type: model.CHANNEL_OPEN, TeamId: team2.Id}
channel3 = Client.Must(Client.CreateChannel(channel3)).Data.(*model.Channel) channel3 = Client.Must(Client.CreateChannel(channel3)).Data.(*model.Channel)
@@ -218,10 +218,10 @@ func TestCreateValetPost(t *testing.T) {
func TestUpdatePost(t *testing.T) { func TestUpdatePost(t *testing.T) {
Setup() Setup()
team := &model.Team{Name: "Name", Domain: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN} team := &model.Team{DisplayName: "Name", Name: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN}
team = Client.Must(Client.CreateTeam(team)).Data.(*model.Team) team = Client.Must(Client.CreateTeam(team)).Data.(*model.Team)
team2 := &model.Team{Name: "Name Team 2", Domain: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN} team2 := &model.Team{DisplayName: "Name Team 2", Name: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN}
team2 = Client.Must(Client.CreateTeam(team2)).Data.(*model.Team) team2 = Client.Must(Client.CreateTeam(team2)).Data.(*model.Team)
user1 := &model.User{TeamId: team.Id, Email: model.NewId() + "corey@test.com", Nickname: "Corey Hulen", Password: "pwd"} user1 := &model.User{TeamId: team.Id, Email: model.NewId() + "corey@test.com", Nickname: "Corey Hulen", Password: "pwd"}
@@ -232,7 +232,7 @@ func TestUpdatePost(t *testing.T) {
user2 = Client.Must(Client.CreateUser(user2, "")).Data.(*model.User) user2 = Client.Must(Client.CreateUser(user2, "")).Data.(*model.User)
store.Must(Srv.Store.User().VerifyEmail(user2.Id)) store.Must(Srv.Store.User().VerifyEmail(user2.Id))
Client.LoginByEmail(team.Domain, user1.Email, "pwd") Client.LoginByEmail(team.Name, user1.Email, "pwd")
channel1 := &model.Channel{DisplayName: "Test API Name", Name: "a" + model.NewId() + "a", Type: model.CHANNEL_OPEN, TeamId: team.Id} channel1 := &model.Channel{DisplayName: "Test API Name", Name: "a" + model.NewId() + "a", Type: model.CHANNEL_OPEN, TeamId: team.Id}
channel1 = Client.Must(Client.CreateChannel(channel1)).Data.(*model.Channel) channel1 = Client.Must(Client.CreateChannel(channel1)).Data.(*model.Channel)
@@ -289,14 +289,14 @@ func TestUpdatePost(t *testing.T) {
func TestGetPosts(t *testing.T) { func TestGetPosts(t *testing.T) {
Setup() Setup()
team := &model.Team{Name: "Name", Domain: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN} team := &model.Team{DisplayName: "Name", Name: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN}
team = Client.Must(Client.CreateTeam(team)).Data.(*model.Team) team = Client.Must(Client.CreateTeam(team)).Data.(*model.Team)
user1 := &model.User{TeamId: team.Id, Email: model.NewId() + "corey@test.com", Nickname: "Corey Hulen", Password: "pwd"} user1 := &model.User{TeamId: team.Id, Email: model.NewId() + "corey@test.com", Nickname: "Corey Hulen", Password: "pwd"}
user1 = Client.Must(Client.CreateUser(user1, "")).Data.(*model.User) user1 = Client.Must(Client.CreateUser(user1, "")).Data.(*model.User)
store.Must(Srv.Store.User().VerifyEmail(user1.Id)) store.Must(Srv.Store.User().VerifyEmail(user1.Id))
Client.LoginByEmail(team.Domain, user1.Email, "pwd") Client.LoginByEmail(team.Name, user1.Email, "pwd")
channel1 := &model.Channel{DisplayName: "TestGetPosts", Name: "a" + model.NewId() + "a", Type: model.CHANNEL_OPEN, TeamId: team.Id} channel1 := &model.Channel{DisplayName: "TestGetPosts", Name: "a" + model.NewId() + "a", Type: model.CHANNEL_OPEN, TeamId: team.Id}
channel1 = Client.Must(Client.CreateChannel(channel1)).Data.(*model.Channel) channel1 = Client.Must(Client.CreateChannel(channel1)).Data.(*model.Channel)
@@ -354,14 +354,14 @@ func TestGetPosts(t *testing.T) {
func TestSearchPosts(t *testing.T) { func TestSearchPosts(t *testing.T) {
Setup() Setup()
team := &model.Team{Name: "Name", Domain: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN} team := &model.Team{DisplayName: "Name", Name: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN}
team = Client.Must(Client.CreateTeam(team)).Data.(*model.Team) team = Client.Must(Client.CreateTeam(team)).Data.(*model.Team)
user1 := &model.User{TeamId: team.Id, Email: model.NewId() + "corey@test.com", Nickname: "Corey Hulen", Password: "pwd"} user1 := &model.User{TeamId: team.Id, Email: model.NewId() + "corey@test.com", Nickname: "Corey Hulen", Password: "pwd"}
user1 = Client.Must(Client.CreateUser(user1, "")).Data.(*model.User) user1 = Client.Must(Client.CreateUser(user1, "")).Data.(*model.User)
store.Must(Srv.Store.User().VerifyEmail(user1.Id)) store.Must(Srv.Store.User().VerifyEmail(user1.Id))
Client.LoginByEmail(team.Domain, user1.Email, "pwd") Client.LoginByEmail(team.Name, user1.Email, "pwd")
channel1 := &model.Channel{DisplayName: "TestGetPosts", Name: "a" + model.NewId() + "a", Type: model.CHANNEL_OPEN, TeamId: team.Id} channel1 := &model.Channel{DisplayName: "TestGetPosts", Name: "a" + model.NewId() + "a", Type: model.CHANNEL_OPEN, TeamId: team.Id}
channel1 = Client.Must(Client.CreateChannel(channel1)).Data.(*model.Channel) channel1 = Client.Must(Client.CreateChannel(channel1)).Data.(*model.Channel)
@@ -400,14 +400,14 @@ func TestSearchPosts(t *testing.T) {
func TestSearchHashtagPosts(t *testing.T) { func TestSearchHashtagPosts(t *testing.T) {
Setup() Setup()
team := &model.Team{Name: "Name", Domain: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN} team := &model.Team{DisplayName: "Name", Name: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN}
team = Client.Must(Client.CreateTeam(team)).Data.(*model.Team) team = Client.Must(Client.CreateTeam(team)).Data.(*model.Team)
user1 := &model.User{TeamId: team.Id, Email: model.NewId() + "corey@test.com", Nickname: "Corey Hulen", Password: "pwd"} user1 := &model.User{TeamId: team.Id, Email: model.NewId() + "corey@test.com", Nickname: "Corey Hulen", Password: "pwd"}
user1 = Client.Must(Client.CreateUser(user1, "")).Data.(*model.User) user1 = Client.Must(Client.CreateUser(user1, "")).Data.(*model.User)
store.Must(Srv.Store.User().VerifyEmail(user1.Id)) store.Must(Srv.Store.User().VerifyEmail(user1.Id))
Client.LoginByEmail(team.Domain, user1.Email, "pwd") Client.LoginByEmail(team.Name, user1.Email, "pwd")
channel1 := &model.Channel{DisplayName: "TestGetPosts", Name: "a" + model.NewId() + "a", Type: model.CHANNEL_OPEN, TeamId: team.Id} channel1 := &model.Channel{DisplayName: "TestGetPosts", Name: "a" + model.NewId() + "a", Type: model.CHANNEL_OPEN, TeamId: team.Id}
channel1 = Client.Must(Client.CreateChannel(channel1)).Data.(*model.Channel) channel1 = Client.Must(Client.CreateChannel(channel1)).Data.(*model.Channel)
@@ -431,14 +431,14 @@ func TestSearchHashtagPosts(t *testing.T) {
func TestGetPostsCache(t *testing.T) { func TestGetPostsCache(t *testing.T) {
Setup() Setup()
team := &model.Team{Name: "Name", Domain: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN} team := &model.Team{DisplayName: "Name", Name: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN}
team = Client.Must(Client.CreateTeam(team)).Data.(*model.Team) team = Client.Must(Client.CreateTeam(team)).Data.(*model.Team)
user1 := &model.User{TeamId: team.Id, Email: model.NewId() + "corey@test.com", Nickname: "Corey Hulen", Password: "pwd"} user1 := &model.User{TeamId: team.Id, Email: model.NewId() + "corey@test.com", Nickname: "Corey Hulen", Password: "pwd"}
user1 = Client.Must(Client.CreateUser(user1, "")).Data.(*model.User) user1 = Client.Must(Client.CreateUser(user1, "")).Data.(*model.User)
store.Must(Srv.Store.User().VerifyEmail(user1.Id)) store.Must(Srv.Store.User().VerifyEmail(user1.Id))
Client.LoginByEmail(team.Domain, user1.Email, "pwd") Client.LoginByEmail(team.Name, user1.Email, "pwd")
channel1 := &model.Channel{DisplayName: "TestGetPosts", Name: "a" + model.NewId() + "a", Type: model.CHANNEL_OPEN, TeamId: team.Id} channel1 := &model.Channel{DisplayName: "TestGetPosts", Name: "a" + model.NewId() + "a", Type: model.CHANNEL_OPEN, TeamId: team.Id}
channel1 = Client.Must(Client.CreateChannel(channel1)).Data.(*model.Channel) channel1 = Client.Must(Client.CreateChannel(channel1)).Data.(*model.Channel)
@@ -480,7 +480,7 @@ func TestGetPostsCache(t *testing.T) {
func TestDeletePosts(t *testing.T) { func TestDeletePosts(t *testing.T) {
Setup() Setup()
team := &model.Team{Name: "Name", Domain: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN} team := &model.Team{DisplayName: "Name", Name: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN}
team = Client.Must(Client.CreateTeam(team)).Data.(*model.Team) team = Client.Must(Client.CreateTeam(team)).Data.(*model.Team)
userAdmin := &model.User{TeamId: team.Id, Email: team.Email, Nickname: "Corey Hulen", Password: "pwd"} userAdmin := &model.User{TeamId: team.Id, Email: team.Email, Nickname: "Corey Hulen", Password: "pwd"}
@@ -491,7 +491,7 @@ func TestDeletePosts(t *testing.T) {
user1 = Client.Must(Client.CreateUser(user1, "")).Data.(*model.User) user1 = Client.Must(Client.CreateUser(user1, "")).Data.(*model.User)
store.Must(Srv.Store.User().VerifyEmail(user1.Id)) store.Must(Srv.Store.User().VerifyEmail(user1.Id))
Client.LoginByEmail(team.Domain, user1.Email, "pwd") Client.LoginByEmail(team.Name, user1.Email, "pwd")
channel1 := &model.Channel{DisplayName: "TestGetPosts", Name: "a" + model.NewId() + "a", Type: model.CHANNEL_OPEN, TeamId: team.Id} channel1 := &model.Channel{DisplayName: "TestGetPosts", Name: "a" + model.NewId() + "a", Type: model.CHANNEL_OPEN, TeamId: team.Id}
channel1 = Client.Must(Client.CreateChannel(channel1)).Data.(*model.Channel) channel1 = Client.Must(Client.CreateChannel(channel1)).Data.(*model.Channel)
@@ -532,7 +532,7 @@ func TestDeletePosts(t *testing.T) {
post4 := &model.Post{ChannelId: channel1.Id, Message: "a" + model.NewId() + "a"} post4 := &model.Post{ChannelId: channel1.Id, Message: "a" + model.NewId() + "a"}
post4 = Client.Must(Client.CreatePost(post4)).Data.(*model.Post) post4 = Client.Must(Client.CreatePost(post4)).Data.(*model.Post)
Client.LoginByEmail(team.Domain, userAdmin.Email, "pwd") Client.LoginByEmail(team.Name, userAdmin.Email, "pwd")
Client.Must(Client.DeletePost(channel1.Id, post4.Id)) Client.Must(Client.DeletePost(channel1.Id, post4.Id))
} }
@@ -540,14 +540,14 @@ func TestDeletePosts(t *testing.T) {
func TestEmailMention(t *testing.T) { func TestEmailMention(t *testing.T) {
Setup() Setup()
team := &model.Team{Name: "Name", Domain: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN} team := &model.Team{DisplayName: "Name", Name: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN}
team = Client.Must(Client.CreateTeam(team)).Data.(*model.Team) team = Client.Must(Client.CreateTeam(team)).Data.(*model.Team)
user1 := &model.User{TeamId: team.Id, Email: "corey@test.com", Nickname: "Bob Bobby", Password: "pwd"} user1 := &model.User{TeamId: team.Id, Email: "corey@test.com", Nickname: "Bob Bobby", Password: "pwd"}
user1 = Client.Must(Client.CreateUser(user1, "")).Data.(*model.User) user1 = Client.Must(Client.CreateUser(user1, "")).Data.(*model.User)
store.Must(Srv.Store.User().VerifyEmail(user1.Id)) store.Must(Srv.Store.User().VerifyEmail(user1.Id))
Client.LoginByEmail(team.Domain, user1.Email, "pwd") Client.LoginByEmail(team.Name, user1.Email, "pwd")
channel1 := &model.Channel{DisplayName: "TestGetPosts", Name: "a" + model.NewId() + "a", Type: model.CHANNEL_OPEN, TeamId: team.Id} channel1 := &model.Channel{DisplayName: "TestGetPosts", Name: "a" + model.NewId() + "a", Type: model.CHANNEL_OPEN, TeamId: team.Id}
channel1 = Client.Must(Client.CreateChannel(channel1)).Data.(*model.Channel) channel1 = Client.Must(Client.CreateChannel(channel1)).Data.(*model.Channel)
@@ -562,14 +562,14 @@ func TestEmailMention(t *testing.T) {
func TestFuzzyPosts(t *testing.T) { func TestFuzzyPosts(t *testing.T) {
Setup() Setup()
team := &model.Team{Name: "Name", Domain: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN} team := &model.Team{DisplayName: "Name", Name: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN}
team = Client.Must(Client.CreateTeam(team)).Data.(*model.Team) team = Client.Must(Client.CreateTeam(team)).Data.(*model.Team)
user := &model.User{TeamId: team.Id, Email: model.NewId() + "corey@test.com", Nickname: "Corey Hulen", Password: "pwd"} user := &model.User{TeamId: team.Id, Email: model.NewId() + "corey@test.com", Nickname: "Corey Hulen", Password: "pwd"}
user = Client.Must(Client.CreateUser(user, "")).Data.(*model.User) user = Client.Must(Client.CreateUser(user, "")).Data.(*model.User)
store.Must(Srv.Store.User().VerifyEmail(user.Id)) store.Must(Srv.Store.User().VerifyEmail(user.Id))
Client.LoginByEmail(team.Domain, user.Email, "pwd") Client.LoginByEmail(team.Name, user.Email, "pwd")
channel1 := &model.Channel{DisplayName: "Test API Name", Name: "a" + model.NewId() + "a", Type: model.CHANNEL_OPEN, TeamId: team.Id} channel1 := &model.Channel{DisplayName: "Test API Name", Name: "a" + model.NewId() + "a", Type: model.CHANNEL_OPEN, TeamId: team.Id}
channel1 = Client.Must(Client.CreateChannel(channel1)).Data.(*model.Channel) channel1 = Client.Must(Client.CreateChannel(channel1)).Data.(*model.Channel)

79
api/sharding.go Обычный файл
Просмотреть файл

@@ -0,0 +1,79 @@
// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved.
// See License.txt for license information.
package api
/*
func createSubDomain(subDomain string, target string) {
if utils.Cfg.AWSSettings.Route53AccessKeyId == "" {
return
}
creds := aws.Creds(utils.Cfg.AWSSettings.Route53AccessKeyId, utils.Cfg.AWSSettings.Route53SecretAccessKey, "")
r53 := route53.New(aws.DefaultConfig.Merge(&aws.Config{Credentials: creds, Region: utils.Cfg.AWSSettings.Route53Region}))
rr := route53.ResourceRecord{
Value: aws.String(target),
}
rrs := make([]*route53.ResourceRecord, 1)
rrs[0] = &rr
change := route53.Change{
Action: aws.String("CREATE"),
ResourceRecordSet: &route53.ResourceRecordSet{
Name: aws.String(fmt.Sprintf("%v.%v", subDomain, utils.Cfg.ServiceSettings.Domain)),
TTL: aws.Long(300),
Type: aws.String("CNAME"),
ResourceRecords: rrs,
},
}
changes := make([]*route53.Change, 1)
changes[0] = &change
r53req := &route53.ChangeResourceRecordSetsInput{
HostedZoneID: aws.String(utils.Cfg.AWSSettings.Route53ZoneId),
ChangeBatch: &route53.ChangeBatch{
Changes: changes,
},
}
if _, err := r53.ChangeResourceRecordSets(r53req); err != nil {
l4g.Error("erro in createSubDomain domain=%v err=%v", subDomain, err)
return
}
}
func doesSubDomainExist(subDomain string) bool {
// if it's configured for testing then skip this step
if utils.Cfg.AWSSettings.Route53AccessKeyId == "" {
return false
}
creds := aws.Creds(utils.Cfg.AWSSettings.Route53AccessKeyId, utils.Cfg.AWSSettings.Route53SecretAccessKey, "")
r53 := route53.New(aws.DefaultConfig.Merge(&aws.Config{Credentials: creds, Region: utils.Cfg.AWSSettings.Route53Region}))
r53req := &route53.ListResourceRecordSetsInput{
HostedZoneID: aws.String(utils.Cfg.AWSSettings.Route53ZoneId),
MaxItems: aws.String("1"),
StartRecordName: aws.String(fmt.Sprintf("%v.%v.", subDomain, utils.Cfg.ServiceSettings.Domain)),
}
if result, err := r53.ListResourceRecordSets(r53req); err != nil {
l4g.Error("error in doesSubDomainExist domain=%v err=%v", subDomain, err)
return true
} else {
for _, v := range result.ResourceRecordSets {
if v.Name != nil && *v.Name == fmt.Sprintf("%v.%v.", subDomain, utils.Cfg.ServiceSettings.Domain) {
return true
}
}
}
return false
}
*/

Просмотреть файл

@@ -6,8 +6,6 @@ package api
import ( import (
l4g "code.google.com/p/log4go" l4g "code.google.com/p/log4go"
"fmt" "fmt"
"github.com/awslabs/aws-sdk-go/aws"
"github.com/awslabs/aws-sdk-go/service/route53"
"github.com/gorilla/mux" "github.com/gorilla/mux"
"github.com/mattermost/platform/model" "github.com/mattermost/platform/model"
"github.com/mattermost/platform/utils" "github.com/mattermost/platform/utils"
@@ -24,11 +22,11 @@ func InitTeam(r *mux.Router) {
sr.Handle("/create", ApiAppHandler(createTeam)).Methods("POST") sr.Handle("/create", ApiAppHandler(createTeam)).Methods("POST")
sr.Handle("/create_from_signup", ApiAppHandler(createTeamFromSignup)).Methods("POST") sr.Handle("/create_from_signup", ApiAppHandler(createTeamFromSignup)).Methods("POST")
sr.Handle("/signup", ApiAppHandler(signupTeam)).Methods("POST") sr.Handle("/signup", ApiAppHandler(signupTeam)).Methods("POST")
sr.Handle("/find_team_by_domain", ApiAppHandler(findTeamByDomain)).Methods("POST") sr.Handle("/find_team_by_name", ApiAppHandler(findTeamByName)).Methods("POST")
sr.Handle("/find_teams", ApiAppHandler(findTeams)).Methods("POST") sr.Handle("/find_teams", ApiAppHandler(findTeams)).Methods("POST")
sr.Handle("/email_teams", ApiAppHandler(emailTeams)).Methods("POST") sr.Handle("/email_teams", ApiAppHandler(emailTeams)).Methods("POST")
sr.Handle("/invite_members", ApiUserRequired(inviteMembers)).Methods("POST") sr.Handle("/invite_members", ApiUserRequired(inviteMembers)).Methods("POST")
sr.Handle("/update_name", ApiUserRequired(updateTeamName)).Methods("POST") sr.Handle("/update_name", ApiUserRequired(updateTeamDisplayName)).Methods("POST")
sr.Handle("/update_valet_feature", ApiUserRequired(updateValetFeature)).Methods("POST") sr.Handle("/update_valet_feature", ApiUserRequired(updateValetFeature)).Methods("POST")
sr.Handle("/me", ApiUserRequired(getMyTeam)).Methods("GET") sr.Handle("/me", ApiUserRequired(getMyTeam)).Methods("GET")
} }
@@ -37,31 +35,31 @@ func signupTeam(c *Context, w http.ResponseWriter, r *http.Request) {
m := model.MapFromJson(r.Body) m := model.MapFromJson(r.Body)
email := strings.ToLower(strings.TrimSpace(m["email"])) email := strings.ToLower(strings.TrimSpace(m["email"]))
name := strings.TrimSpace(m["name"]) displayName := strings.TrimSpace(m["display_name"])
if len(email) == 0 { if len(email) == 0 {
c.SetInvalidParam("signupTeam", "email") c.SetInvalidParam("signupTeam", "email")
return return
} }
if len(name) == 0 { if len(displayName) == 0 {
c.SetInvalidParam("signupTeam", "name") c.SetInvalidParam("signupTeam", "display_name")
return return
} }
subjectPage := NewServerTemplatePage("signup_team_subject", c.TeamUrl) subjectPage := NewServerTemplatePage("signup_team_subject", c.GetSiteURL())
bodyPage := NewServerTemplatePage("signup_team_body", c.TeamUrl) bodyPage := NewServerTemplatePage("signup_team_body", c.GetSiteURL())
bodyPage.Props["TourUrl"] = utils.Cfg.TeamSettings.TourLink bodyPage.Props["TourUrl"] = utils.Cfg.TeamSettings.TourLink
props := make(map[string]string) props := make(map[string]string)
props["email"] = email props["email"] = email
props["name"] = name props["display_name"] = displayName
props["time"] = fmt.Sprintf("%v", model.GetMillis()) props["time"] = fmt.Sprintf("%v", model.GetMillis())
data := model.MapToJson(props) data := model.MapToJson(props)
hash := model.HashPassword(fmt.Sprintf("%v:%v", data, utils.Cfg.ServiceSettings.InviteSalt)) hash := model.HashPassword(fmt.Sprintf("%v:%v", data, utils.Cfg.ServiceSettings.InviteSalt))
bodyPage.Props["Link"] = fmt.Sprintf("%s/signup_team_complete/?d=%s&h=%s", c.TeamUrl, url.QueryEscape(data), url.QueryEscape(hash)) bodyPage.Props["Link"] = fmt.Sprintf("%s/signup_team_complete/?d=%s&h=%s", c.GetSiteURL(), url.QueryEscape(data), url.QueryEscape(hash))
if err := utils.SendMail(email, subjectPage.Render(), bodyPage.Render()); err != nil { if err := utils.SendMail(email, subjectPage.Render(), bodyPage.Render()); err != nil {
c.Err = err c.Err = err
@@ -119,25 +117,16 @@ func createTeamFromSignup(c *Context, w http.ResponseWriter, r *http.Request) {
return return
} }
found := FindTeamByDomain(c, teamSignup.Team.Domain, "true") found := FindTeamByName(c, teamSignup.Team.Name, "true")
if c.Err != nil { if c.Err != nil {
return return
} }
if found { if found {
c.Err = model.NewAppError("createTeamFromSignup", "This URL is unavailable. Please try another.", "d="+teamSignup.Team.Domain) c.Err = model.NewAppError("createTeamFromSignup", "This URL is unavailable. Please try another.", "d="+teamSignup.Team.Name)
return return
} }
if IsBetaDomain(r) {
for key, value := range utils.Cfg.ServiceSettings.Shards {
if strings.Index(r.Host, key) == 0 {
createSubDomain(teamSignup.Team.Domain, value)
break
}
}
}
teamSignup.Team.AllowValet = utils.Cfg.TeamSettings.AllowValetDefault teamSignup.Team.AllowValet = utils.Cfg.TeamSettings.AllowValetDefault
if result := <-Srv.Store.Team().Save(&teamSignup.Team); result.Err != nil { if result := <-Srv.Store.Team().Save(&teamSignup.Team); result.Err != nil {
@@ -166,7 +155,7 @@ func createTeamFromSignup(c *Context, w http.ResponseWriter, r *http.Request) {
} }
} }
InviteMembers(rteam, ruser, teamSignup.Invites) InviteMembers(c, rteam, ruser, teamSignup.Invites)
teamSignup.Team = *rteam teamSignup.Team = *rteam
teamSignup.User = *ruser teamSignup.User = *ruser
@@ -211,87 +200,14 @@ func createTeam(c *Context, w http.ResponseWriter, r *http.Request) {
} }
} }
func doesSubDomainExist(subDomain string) bool { func findTeamByName(c *Context, w http.ResponseWriter, r *http.Request) {
// if it's configured for testing then skip this step
if utils.Cfg.AWSSettings.Route53AccessKeyId == "" {
return false
}
creds := aws.Creds(utils.Cfg.AWSSettings.Route53AccessKeyId, utils.Cfg.AWSSettings.Route53SecretAccessKey, "")
r53 := route53.New(aws.DefaultConfig.Merge(&aws.Config{Credentials: creds, Region: utils.Cfg.AWSSettings.Route53Region}))
r53req := &route53.ListResourceRecordSetsInput{
HostedZoneID: aws.String(utils.Cfg.AWSSettings.Route53ZoneId),
MaxItems: aws.String("1"),
StartRecordName: aws.String(fmt.Sprintf("%v.%v.", subDomain, utils.Cfg.ServiceSettings.Domain)),
}
if result, err := r53.ListResourceRecordSets(r53req); err != nil {
l4g.Error("error in doesSubDomainExist domain=%v err=%v", subDomain, err)
return true
} else {
for _, v := range result.ResourceRecordSets {
if v.Name != nil && *v.Name == fmt.Sprintf("%v.%v.", subDomain, utils.Cfg.ServiceSettings.Domain) {
return true
}
}
}
return false
}
func createSubDomain(subDomain string, target string) {
if utils.Cfg.AWSSettings.Route53AccessKeyId == "" {
return
}
creds := aws.Creds(utils.Cfg.AWSSettings.Route53AccessKeyId, utils.Cfg.AWSSettings.Route53SecretAccessKey, "")
r53 := route53.New(aws.DefaultConfig.Merge(&aws.Config{Credentials: creds, Region: utils.Cfg.AWSSettings.Route53Region}))
rr := route53.ResourceRecord{
Value: aws.String(target),
}
rrs := make([]*route53.ResourceRecord, 1)
rrs[0] = &rr
change := route53.Change{
Action: aws.String("CREATE"),
ResourceRecordSet: &route53.ResourceRecordSet{
Name: aws.String(fmt.Sprintf("%v.%v", subDomain, utils.Cfg.ServiceSettings.Domain)),
TTL: aws.Long(300),
Type: aws.String("CNAME"),
ResourceRecords: rrs,
},
}
changes := make([]*route53.Change, 1)
changes[0] = &change
r53req := &route53.ChangeResourceRecordSetsInput{
HostedZoneID: aws.String(utils.Cfg.AWSSettings.Route53ZoneId),
ChangeBatch: &route53.ChangeBatch{
Changes: changes,
},
}
if _, err := r53.ChangeResourceRecordSets(r53req); err != nil {
l4g.Error("erro in createSubDomain domain=%v err=%v", subDomain, err)
return
}
}
func findTeamByDomain(c *Context, w http.ResponseWriter, r *http.Request) {
m := model.MapFromJson(r.Body) m := model.MapFromJson(r.Body)
domain := strings.ToLower(strings.TrimSpace(m["domain"])) name := strings.ToLower(strings.TrimSpace(m["name"]))
all := strings.ToLower(strings.TrimSpace(m["all"])) all := strings.ToLower(strings.TrimSpace(m["all"]))
found := FindTeamByDomain(c, domain, all) found := FindTeamByName(c, name, all)
if c.Err != nil { if c.Err != nil {
return return
@@ -304,56 +220,25 @@ func findTeamByDomain(c *Context, w http.ResponseWriter, r *http.Request) {
} }
} }
func FindTeamByDomain(c *Context, domain string, all string) bool { func FindTeamByName(c *Context, name string, all string) bool {
if domain == "" || len(domain) > 64 { if name == "" || len(name) > 64 {
c.SetInvalidParam("findTeamByDomain", "domain") c.SetInvalidParam("findTeamByName", "domain")
return false return false
} }
if model.IsReservedDomain(domain) { if model.IsReservedTeamName(name) {
c.Err = model.NewAppError("findTeamByDomain", "This URL is unavailable. Please try another.", "d="+domain) c.Err = model.NewAppError("findTeamByName", "This URL is unavailable. Please try another.", "name="+name)
return false return false
} }
if all == "false" { if result := <-Srv.Store.Team().GetByName(name); result.Err != nil {
if result := <-Srv.Store.Team().GetByDomain(domain); result.Err != nil { return false
return false
} else {
return true
}
} else { } else {
if doesSubDomainExist(domain) { return true
return true
}
protocol := "http"
if utils.Cfg.ServiceSettings.UseSSL {
protocol = "https"
}
for key, _ := range utils.Cfg.ServiceSettings.Shards {
url := fmt.Sprintf("%v://%v.%v/api/v1", protocol, key, utils.Cfg.ServiceSettings.Domain)
if strings.Index(utils.Cfg.ServiceSettings.Domain, "localhost") == 0 {
url = fmt.Sprintf("%v://%v/api/v1", protocol, utils.Cfg.ServiceSettings.Domain)
}
client := model.NewClient(url)
if result, err := client.FindTeamByDomain(domain, false); err != nil {
c.Err = err
return false
} else {
if result.Data.(bool) {
return true
}
}
}
return false
} }
return false
} }
func findTeams(c *Context, w http.ResponseWriter, r *http.Request) { func findTeams(c *Context, w http.ResponseWriter, r *http.Request) {
@@ -376,7 +261,7 @@ func findTeams(c *Context, w http.ResponseWriter, r *http.Request) {
s := make([]string, 0, len(teams)) s := make([]string, 0, len(teams))
for _, v := range teams { for _, v := range teams {
s = append(s, v.Domain) s = append(s, v.Name)
} }
w.Write([]byte(model.ArrayToJson(s))) w.Write([]byte(model.ArrayToJson(s)))
@@ -394,33 +279,8 @@ func emailTeams(c *Context, w http.ResponseWriter, r *http.Request) {
return return
} }
protocol := "http" subjectPage := NewServerTemplatePage("find_teams_subject", c.GetSiteURL())
bodyPage := NewServerTemplatePage("find_teams_body", c.GetSiteURL())
if utils.Cfg.ServiceSettings.UseSSL {
protocol = "https"
}
subjectPage := NewServerTemplatePage("find_teams_subject", c.TeamUrl)
bodyPage := NewServerTemplatePage("find_teams_body", c.TeamUrl)
for key, _ := range utils.Cfg.ServiceSettings.Shards {
url := fmt.Sprintf("%v://%v.%v/api/v1", protocol, key, utils.Cfg.ServiceSettings.Domain)
if strings.Index(utils.Cfg.ServiceSettings.Domain, "localhost") == 0 {
url = fmt.Sprintf("%v://%v/api/v1", protocol, utils.Cfg.ServiceSettings.Domain)
}
client := model.NewClient(url)
if result, err := client.FindTeams(email); err != nil {
l4g.Error("An error occured while finding teams at %v err=%v", key, err)
} else {
data := result.Data.([]string)
for _, domain := range data {
bodyPage.Props[fmt.Sprintf("%v://%v.%v", protocol, domain, utils.Cfg.ServiceSettings.Domain)] = ""
}
}
}
if err := utils.SendMail(email, subjectPage.Render(), bodyPage.Render()); err != nil { if err := utils.SendMail(email, subjectPage.Render(), bodyPage.Render()); err != nil {
l4g.Error("An error occured while sending an email in emailTeams err=%v", err) l4g.Error("An error occured while sending an email in emailTeams err=%v", err)
@@ -470,22 +330,16 @@ func inviteMembers(c *Context, w http.ResponseWriter, r *http.Request) {
ia = append(ia, invite["email"]) ia = append(ia, invite["email"])
} }
InviteMembers(team, user, ia) InviteMembers(c, team, user, ia)
w.Write([]byte(invites.ToJson())) w.Write([]byte(invites.ToJson()))
} }
func InviteMembers(team *model.Team, user *model.User, invites []string) { func InviteMembers(c *Context, team *model.Team, user *model.User, invites []string) {
for _, invite := range invites { for _, invite := range invites {
if len(invite) > 0 { if len(invite) > 0 {
teamUrl := "" teamURL := ""
if utils.Cfg.ServiceSettings.Mode == utils.MODE_DEV { teamURL = c.GetTeamURLFromTeam(team)
teamUrl = "http://localhost:8065"
} else if utils.Cfg.ServiceSettings.UseSSL {
teamUrl = fmt.Sprintf("https://%v.%v", team.Domain, utils.Cfg.ServiceSettings.Domain)
} else {
teamUrl = fmt.Sprintf("http://%v.%v", team.Domain, utils.Cfg.ServiceSettings.Domain)
}
sender := user.GetDisplayName() sender := user.GetDisplayName()
@@ -496,11 +350,11 @@ func InviteMembers(team *model.Team, user *model.User, invites []string) {
senderRole = "member" senderRole = "member"
} }
subjectPage := NewServerTemplatePage("invite_subject", teamUrl) subjectPage := NewServerTemplatePage("invite_subject", teamURL)
subjectPage.Props["SenderName"] = sender subjectPage.Props["SenderName"] = sender
subjectPage.Props["TeamName"] = team.Name subjectPage.Props["TeamDisplayName"] = team.DisplayName
bodyPage := NewServerTemplatePage("invite_body", teamUrl) bodyPage := NewServerTemplatePage("invite_body", teamURL)
bodyPage.Props["TeamName"] = team.Name bodyPage.Props["TeamDisplayName"] = team.DisplayName
bodyPage.Props["SenderName"] = sender bodyPage.Props["SenderName"] = sender
bodyPage.Props["SenderStatus"] = senderRole bodyPage.Props["SenderStatus"] = senderRole
@@ -509,12 +363,12 @@ func InviteMembers(team *model.Team, user *model.User, invites []string) {
props := make(map[string]string) props := make(map[string]string)
props["email"] = invite props["email"] = invite
props["id"] = team.Id props["id"] = team.Id
props["display_name"] = team.DisplayName
props["name"] = team.Name props["name"] = team.Name
props["domain"] = team.Domain
props["time"] = fmt.Sprintf("%v", model.GetMillis()) props["time"] = fmt.Sprintf("%v", model.GetMillis())
data := model.MapToJson(props) data := model.MapToJson(props)
hash := model.HashPassword(fmt.Sprintf("%v:%v", data, utils.Cfg.ServiceSettings.InviteSalt)) hash := model.HashPassword(fmt.Sprintf("%v:%v", data, utils.Cfg.ServiceSettings.InviteSalt))
bodyPage.Props["Link"] = fmt.Sprintf("%s/signup_user_complete/?d=%s&h=%s", teamUrl, url.QueryEscape(data), url.QueryEscape(hash)) bodyPage.Props["Link"] = fmt.Sprintf("%s/signup_user_complete/?d=%s&h=%s", c.GetSiteURL(), url.QueryEscape(data), url.QueryEscape(hash))
if utils.Cfg.ServiceSettings.Mode == utils.MODE_DEV { if utils.Cfg.ServiceSettings.Mode == utils.MODE_DEV {
l4g.Info("sending invitation to %v %v", invite, bodyPage.Props["Link"]) l4g.Info("sending invitation to %v %v", invite, bodyPage.Props["Link"])
@@ -527,35 +381,35 @@ func InviteMembers(team *model.Team, user *model.User, invites []string) {
} }
} }
func updateTeamName(c *Context, w http.ResponseWriter, r *http.Request) { func updateTeamDisplayName(c *Context, w http.ResponseWriter, r *http.Request) {
props := model.MapFromJson(r.Body) props := model.MapFromJson(r.Body)
new_name := props["new_name"] new_name := props["new_name"]
if len(new_name) == 0 { if len(new_name) == 0 {
c.SetInvalidParam("updateTeamName", "new_name") c.SetInvalidParam("updateTeamDisplayName", "new_name")
return return
} }
teamId := props["team_id"] teamId := props["team_id"]
if len(teamId) > 0 && len(teamId) != 26 { if len(teamId) > 0 && len(teamId) != 26 {
c.SetInvalidParam("updateTeamName", "team_id") c.SetInvalidParam("updateTeamDisplayName", "team_id")
return return
} else if len(teamId) == 0 { } else if len(teamId) == 0 {
teamId = c.Session.TeamId teamId = c.Session.TeamId
} }
if !c.HasPermissionsToTeam(teamId, "updateTeamName") { if !c.HasPermissionsToTeam(teamId, "updateTeamDisplayName") {
return return
} }
if !strings.Contains(c.Session.Roles, model.ROLE_ADMIN) { if !strings.Contains(c.Session.Roles, model.ROLE_ADMIN) {
c.Err = model.NewAppError("updateTeamName", "You do not have the appropriate permissions", "userId="+c.Session.UserId) c.Err = model.NewAppError("updateTeamDisplayName", "You do not have the appropriate permissions", "userId="+c.Session.UserId)
c.Err.StatusCode = http.StatusForbidden c.Err.StatusCode = http.StatusForbidden
return return
} }
if result := <-Srv.Store.Team().UpdateName(new_name, c.Session.TeamId); result.Err != nil { if result := <-Srv.Store.Team().UpdateDisplayName(new_name, c.Session.TeamId); result.Err != nil {
c.Err = result.Err c.Err = result.Err
return return
} }

Просмотреть файл

@@ -32,7 +32,7 @@ func TestCreateFromSignupTeam(t *testing.T) {
data := model.MapToJson(props) data := model.MapToJson(props)
hash := model.HashPassword(fmt.Sprintf("%v:%v", data, utils.Cfg.ServiceSettings.InviteSalt)) hash := model.HashPassword(fmt.Sprintf("%v:%v", data, utils.Cfg.ServiceSettings.InviteSalt))
team := model.Team{Name: "Name", Domain: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN} team := model.Team{DisplayName: "Name", Name: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN}
user := model.User{Email: props["email"], Nickname: "Corey Hulen", Password: "hello"} user := model.User{Email: props["email"], Nickname: "Corey Hulen", Password: "hello"}
ts := model.TeamSignup{Team: team, User: user, Invites: []string{"corey@test.com"}, Data: data, Hash: hash} ts := model.TeamSignup{Team: team, User: user, Invites: []string{"corey@test.com"}, Data: data, Hash: hash}
@@ -42,7 +42,7 @@ func TestCreateFromSignupTeam(t *testing.T) {
t.Fatal(err) t.Fatal(err)
} }
if rts.Data.(*model.TeamSignup).Team.Name != team.Name { if rts.Data.(*model.TeamSignup).Team.DisplayName != team.DisplayName {
t.Fatal("full name didn't match") t.Fatal("full name didn't match")
} }
@@ -71,7 +71,7 @@ func TestCreateFromSignupTeam(t *testing.T) {
func TestCreateTeam(t *testing.T) { func TestCreateTeam(t *testing.T) {
Setup() Setup()
team := model.Team{Name: "Name", Domain: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN} team := model.Team{DisplayName: "Name", Name: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN}
rteam, err := Client.CreateTeam(&team) rteam, err := Client.CreateTeam(&team)
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)
@@ -81,14 +81,14 @@ func TestCreateTeam(t *testing.T) {
user = Client.Must(Client.CreateUser(user, "")).Data.(*model.User) user = Client.Must(Client.CreateUser(user, "")).Data.(*model.User)
store.Must(Srv.Store.User().VerifyEmail(user.Id)) store.Must(Srv.Store.User().VerifyEmail(user.Id))
Client.LoginByEmail(team.Domain, user.Email, "pwd") Client.LoginByEmail(team.Name, user.Email, "pwd")
c1 := Client.Must(Client.GetChannels("")).Data.(*model.ChannelList) c1 := Client.Must(Client.GetChannels("")).Data.(*model.ChannelList)
if len(c1.Channels) != 2 { if len(c1.Channels) != 2 {
t.Fatal("default channels not created") t.Fatal("default channels not created")
} }
if rteam.Data.(*model.Team).Name != team.Name { if rteam.Data.(*model.Team).DisplayName != team.DisplayName {
t.Fatal("full name didn't match") t.Fatal("full name didn't match")
} }
@@ -111,7 +111,7 @@ func TestCreateTeam(t *testing.T) {
func TestFindTeamByEmail(t *testing.T) { func TestFindTeamByEmail(t *testing.T) {
Setup() Setup()
team := &model.Team{Name: "Name", Domain: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN} team := &model.Team{DisplayName: "Name", Name: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN}
team = Client.Must(Client.CreateTeam(team)).Data.(*model.Team) team = Client.Must(Client.CreateTeam(team)).Data.(*model.Team)
user := &model.User{TeamId: team.Id, Email: model.NewId() + "corey@test.com", Nickname: "Corey Hulen", Password: "pwd"} user := &model.User{TeamId: team.Id, Email: model.NewId() + "corey@test.com", Nickname: "Corey Hulen", Password: "pwd"}
@@ -122,7 +122,7 @@ func TestFindTeamByEmail(t *testing.T) {
t.Fatal(err) t.Fatal(err)
} else { } else {
domains := r1.Data.([]string) domains := r1.Data.([]string)
if domains[0] != team.Domain { if domains[0] != team.Name {
t.Fatal(domains) t.Fatal(domains)
} }
} }
@@ -139,14 +139,14 @@ XXXXXX investigate and fix failing test
func TestFindTeamByDomain(t *testing.T) { func TestFindTeamByDomain(t *testing.T) {
Setup() Setup()
team := &model.Team{Name: "Name", Domain: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN} team := &model.Team{DisplayName: "Name", Name: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN}
team = Client.Must(Client.CreateTeam(team)).Data.(*model.Team) team = Client.Must(Client.CreateTeam(team)).Data.(*model.Team)
user := &model.User{TeamId: team.Id, Email: model.NewId() + "corey@test.com", Nickname: "Corey Hulen", Password: "pwd"} user := &model.User{TeamId: team.Id, Email: model.NewId() + "corey@test.com", Nickname: "Corey Hulen", Password: "pwd"}
user = Client.Must(Client.CreateUser(user, "")).Data.(*model.User) user = Client.Must(Client.CreateUser(user, "")).Data.(*model.User)
store.Must(Srv.Store.User().VerifyEmail(user.Id)) store.Must(Srv.Store.User().VerifyEmail(user.Id))
if r1, err := Client.FindTeamByDomain(team.Domain, false); err != nil { if r1, err := Client.FindTeamByDomain(team.Name, false); err != nil {
t.Fatal(err) t.Fatal(err)
} else { } else {
val := r1.Data.(bool) val := r1.Data.(bool)
@@ -155,7 +155,7 @@ func TestFindTeamByDomain(t *testing.T) {
} }
} }
if r1, err := Client.FindTeamByDomain(team.Domain, true); err != nil { if r1, err := Client.FindTeamByDomain(team.Name, true); err != nil {
t.Fatal(err) t.Fatal(err)
} else { } else {
val := r1.Data.(bool) val := r1.Data.(bool)
@@ -179,7 +179,7 @@ func TestFindTeamByDomain(t *testing.T) {
func TestFindTeamByEmailSend(t *testing.T) { func TestFindTeamByEmailSend(t *testing.T) {
Setup() Setup()
team := &model.Team{Name: "Name", Domain: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN} team := &model.Team{DisplayName: "Name", Name: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN}
team = Client.Must(Client.CreateTeam(team)).Data.(*model.Team) team = Client.Must(Client.CreateTeam(team)).Data.(*model.Team)
user := &model.User{TeamId: team.Id, Email: model.NewId() + "corey@test.com", Nickname: "Corey Hulen", Password: "pwd"} user := &model.User{TeamId: team.Id, Email: model.NewId() + "corey@test.com", Nickname: "Corey Hulen", Password: "pwd"}
@@ -203,14 +203,14 @@ func TestFindTeamByEmailSend(t *testing.T) {
func TestInviteMembers(t *testing.T) { func TestInviteMembers(t *testing.T) {
Setup() Setup()
team := &model.Team{Name: "Name", Domain: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN} team := &model.Team{DisplayName: "Name", Name: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN}
team = Client.Must(Client.CreateTeam(team)).Data.(*model.Team) team = Client.Must(Client.CreateTeam(team)).Data.(*model.Team)
user := &model.User{TeamId: team.Id, Email: model.NewId() + "corey@test.com", Nickname: "Corey Hulen", Password: "pwd"} user := &model.User{TeamId: team.Id, Email: model.NewId() + "corey@test.com", Nickname: "Corey Hulen", Password: "pwd"}
user = Client.Must(Client.CreateUser(user, "")).Data.(*model.User) user = Client.Must(Client.CreateUser(user, "")).Data.(*model.User)
store.Must(Srv.Store.User().VerifyEmail(user.Id)) store.Must(Srv.Store.User().VerifyEmail(user.Id))
Client.LoginByEmail(team.Domain, user.Email, "pwd") Client.LoginByEmail(team.Name, user.Email, "pwd")
invite := make(map[string]string) invite := make(map[string]string)
invite["email"] = model.NewId() + "corey@test.com" invite["email"] = model.NewId() + "corey@test.com"
@@ -229,10 +229,10 @@ func TestInviteMembers(t *testing.T) {
} }
} }
func TestUpdateTeamName(t *testing.T) { func TestUpdateTeamDisplayName(t *testing.T) {
Setup() Setup()
team := &model.Team{Name: "Name", Domain: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN} team := &model.Team{DisplayName: "Name", Name: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN}
team = Client.Must(Client.CreateTeam(team)).Data.(*model.Team) team = Client.Must(Client.CreateTeam(team)).Data.(*model.Team)
user := &model.User{TeamId: team.Id, Email: "test@nowhere.com", Nickname: "Corey Hulen", Password: "pwd"} user := &model.User{TeamId: team.Id, Email: "test@nowhere.com", Nickname: "Corey Hulen", Password: "pwd"}
@@ -243,40 +243,40 @@ func TestUpdateTeamName(t *testing.T) {
user2 = Client.Must(Client.CreateUser(user2, "")).Data.(*model.User) user2 = Client.Must(Client.CreateUser(user2, "")).Data.(*model.User)
store.Must(Srv.Store.User().VerifyEmail(user2.Id)) store.Must(Srv.Store.User().VerifyEmail(user2.Id))
Client.LoginByEmail(team.Domain, user2.Email, "pwd") Client.LoginByEmail(team.Name, user2.Email, "pwd")
data := make(map[string]string) data := make(map[string]string)
data["new_name"] = "NewName" data["new_name"] = "NewName"
if _, err := Client.UpdateTeamName(data); err == nil { if _, err := Client.UpdateTeamDisplayName(data); err == nil {
t.Fatal("Should have errored, not admin") t.Fatal("Should have errored, not admin")
} }
Client.LoginByEmail(team.Domain, user.Email, "pwd") Client.LoginByEmail(team.Name, user.Email, "pwd")
data["new_name"] = "" data["new_name"] = ""
if _, err := Client.UpdateTeamName(data); err == nil { if _, err := Client.UpdateTeamDisplayName(data); err == nil {
t.Fatal("Should have errored, empty name") t.Fatal("Should have errored, empty name")
} }
data["new_name"] = "NewName" data["new_name"] = "NewName"
if _, err := Client.UpdateTeamName(data); err != nil { if _, err := Client.UpdateTeamDisplayName(data); err != nil {
t.Fatal(err) t.Fatal(err)
} }
// No GET team web service, so hard to confirm here that team name updated // No GET team web service, so hard to confirm here that team name updated
data["team_id"] = "junk" data["team_id"] = "junk"
if _, err := Client.UpdateTeamName(data); err == nil { if _, err := Client.UpdateTeamDisplayName(data); err == nil {
t.Fatal("Should have errored, junk team id") t.Fatal("Should have errored, junk team id")
} }
data["team_id"] = "12345678901234567890123456" data["team_id"] = "12345678901234567890123456"
if _, err := Client.UpdateTeamName(data); err == nil { if _, err := Client.UpdateTeamDisplayName(data); err == nil {
t.Fatal("Should have errored, bad team id") t.Fatal("Should have errored, bad team id")
} }
data["team_id"] = team.Id data["team_id"] = team.Id
data["new_name"] = "NewNameAgain" data["new_name"] = "NewNameAgain"
if _, err := Client.UpdateTeamName(data); err != nil { if _, err := Client.UpdateTeamDisplayName(data); err != nil {
t.Fatal(err) t.Fatal(err)
} }
// No GET team web service, so hard to confirm here that team name updated // No GET team web service, so hard to confirm here that team name updated
@@ -285,17 +285,17 @@ func TestUpdateTeamName(t *testing.T) {
func TestFuzzyTeamCreate(t *testing.T) { func TestFuzzyTeamCreate(t *testing.T) {
for i := 0; i < len(utils.FUZZY_STRINGS_NAMES) || i < len(utils.FUZZY_STRINGS_EMAILS); i++ { for i := 0; i < len(utils.FUZZY_STRINGS_NAMES) || i < len(utils.FUZZY_STRINGS_EMAILS); i++ {
testName := "Name" testDisplayName := "Name"
testEmail := "test@nowhere.com" testEmail := "test@nowhere.com"
if i < len(utils.FUZZY_STRINGS_NAMES) { if i < len(utils.FUZZY_STRINGS_NAMES) {
testName = utils.FUZZY_STRINGS_NAMES[i] testDisplayName = utils.FUZZY_STRINGS_NAMES[i]
} }
if i < len(utils.FUZZY_STRINGS_EMAILS) { if i < len(utils.FUZZY_STRINGS_EMAILS) {
testEmail = utils.FUZZY_STRINGS_EMAILS[i] testEmail = utils.FUZZY_STRINGS_EMAILS[i]
} }
team := model.Team{Name: testName, Domain: "z-z-" + model.NewId() + "a", Email: testEmail, Type: model.TEAM_OPEN} team := model.Team{DisplayName: testDisplayName, Name: "z-z-" + model.NewId() + "a", Email: testEmail, Type: model.TEAM_OPEN}
_, err := Client.CreateTeam(&team) _, err := Client.CreateTeam(&team)
if err != nil { if err != nil {
@@ -307,22 +307,22 @@ func TestFuzzyTeamCreate(t *testing.T) {
func TestGetMyTeam(t *testing.T) { func TestGetMyTeam(t *testing.T) {
Setup() Setup()
team := model.Team{Name: "Name", Domain: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN} team := model.Team{DisplayName: "Name", Name: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN}
rteam, _ := Client.CreateTeam(&team) rteam, _ := Client.CreateTeam(&team)
user := model.User{TeamId: rteam.Data.(*model.Team).Id, Email: strings.ToLower(model.NewId()) + "corey@test.com", Nickname: "Corey Hulen", Password: "pwd"} user := model.User{TeamId: rteam.Data.(*model.Team).Id, Email: strings.ToLower(model.NewId()) + "corey@test.com", Nickname: "Corey Hulen", Password: "pwd"}
ruser, _ := Client.CreateUser(&user, "") ruser, _ := Client.CreateUser(&user, "")
store.Must(Srv.Store.User().VerifyEmail(ruser.Data.(*model.User).Id)) store.Must(Srv.Store.User().VerifyEmail(ruser.Data.(*model.User).Id))
Client.LoginByEmail(team.Domain, user.Email, user.Password) Client.LoginByEmail(team.Name, user.Email, user.Password)
if result, err := Client.GetMyTeam(""); err != nil { if result, err := Client.GetMyTeam(""); err != nil {
t.Fatal("Failed to get user") t.Fatal("Failed to get user")
} else { } else {
if result.Data.(*model.Team).Name != team.Name { if result.Data.(*model.Team).DisplayName != team.DisplayName {
t.Fatal("team names did not match") t.Fatal("team names did not match")
} }
if result.Data.(*model.Team).Domain != team.Domain { if result.Data.(*model.Team).Name != team.Name {
t.Fatal("team domains did not match") t.Fatal("team domains did not match")
} }
if result.Data.(*model.Team).Type != team.Type { if result.Data.(*model.Team).Type != team.Type {
@@ -334,7 +334,7 @@ func TestGetMyTeam(t *testing.T) {
func TestUpdateValetFeature(t *testing.T) { func TestUpdateValetFeature(t *testing.T) {
Setup() Setup()
team := &model.Team{Name: "Name", Domain: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN} team := &model.Team{DisplayName: "Name", Name: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN}
team = Client.Must(Client.CreateTeam(team)).Data.(*model.Team) team = Client.Must(Client.CreateTeam(team)).Data.(*model.Team)
user := &model.User{TeamId: team.Id, Email: "test@nowhere.com", Nickname: "Corey Hulen", Password: "pwd"} user := &model.User{TeamId: team.Id, Email: "test@nowhere.com", Nickname: "Corey Hulen", Password: "pwd"}
@@ -345,14 +345,14 @@ func TestUpdateValetFeature(t *testing.T) {
user2 = Client.Must(Client.CreateUser(user2, "")).Data.(*model.User) user2 = Client.Must(Client.CreateUser(user2, "")).Data.(*model.User)
store.Must(Srv.Store.User().VerifyEmail(user2.Id)) store.Must(Srv.Store.User().VerifyEmail(user2.Id))
team2 := &model.Team{Name: "Name", Domain: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN} team2 := &model.Team{DisplayName: "Name", Name: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN}
team2 = Client.Must(Client.CreateTeam(team2)).Data.(*model.Team) team2 = Client.Must(Client.CreateTeam(team2)).Data.(*model.Team)
user3 := &model.User{TeamId: team2.Id, Email: model.NewId() + "corey@test.com", Nickname: "Corey Hulen", Password: "pwd"} user3 := &model.User{TeamId: team2.Id, Email: model.NewId() + "corey@test.com", Nickname: "Corey Hulen", Password: "pwd"}
user3 = Client.Must(Client.CreateUser(user3, "")).Data.(*model.User) user3 = Client.Must(Client.CreateUser(user3, "")).Data.(*model.User)
store.Must(Srv.Store.User().VerifyEmail(user3.Id)) store.Must(Srv.Store.User().VerifyEmail(user3.Id))
Client.LoginByEmail(team.Domain, user2.Email, "pwd") Client.LoginByEmail(team.Name, user2.Email, "pwd")
data := make(map[string]string) data := make(map[string]string)
data["allow_valet"] = "true" data["allow_valet"] = "true"
@@ -360,7 +360,7 @@ func TestUpdateValetFeature(t *testing.T) {
t.Fatal("Should have errored, not admin") t.Fatal("Should have errored, not admin")
} }
Client.LoginByEmail(team.Domain, user.Email, "pwd") Client.LoginByEmail(team.Name, user.Email, "pwd")
data["allow_valet"] = "" data["allow_valet"] = ""
if _, err := Client.UpdateValetFeature(data); err == nil { if _, err := Client.UpdateValetFeature(data); err == nil {
@@ -398,7 +398,7 @@ func TestUpdateValetFeature(t *testing.T) {
t.Fatal("Should have errored - allow valet property not updated") t.Fatal("Should have errored - allow valet property not updated")
} }
Client.LoginByEmail(team2.Domain, user3.Email, "pwd") Client.LoginByEmail(team2.Name, user3.Email, "pwd")
data["team_id"] = team.Id data["team_id"] = team.Id
data["allow_valet"] = "true" data["allow_valet"] = "true"

Просмотреть файл

@@ -9,7 +9,7 @@
<table align="center" border="0" cellpadding="0" cellspacing="0" width="100%" style="border-collapse: collapse;"> <table align="center" border="0" cellpadding="0" cellspacing="0" width="100%" style="border-collapse: collapse;">
<tr> <tr>
<td style="padding: 20px 30px 10px; text-align:left;"> <td style="padding: 20px 30px 10px; text-align:left;">
<img src="{{.TeamUrl}}/static/images/{{.SiteName}}-logodark.png" width="130px" style="opacity: 0.5" alt=""> <img src="{{.TeamURL}}/static/images/{{.SiteName}}-logodark.png" width="130px" style="opacity: 0.5" alt="">
</td> </td>
</tr> </tr>
<tr> <tr>
@@ -18,7 +18,7 @@
<tr> <tr>
<td style="border-bottom: 1px solid #ddd; padding: 0 0 20px;"> <td style="border-bottom: 1px solid #ddd; padding: 0 0 20px;">
<h2 style="font-weight: normal; margin-top: 10px;">You updated your email</h2> <h2 style="font-weight: normal; margin-top: 10px;">You updated your email</h2>
<p>You updated your email for {{.Props.TeamName}} on {{ .TeamUrl }}<br> If this change wasn't initiated by you, please reply to this email and let us know.</p> <p>You updated your email for {{.Props.TeamDisplayName}} on {{ .TeamURL }}<br> If this change wasn't initiated by you, please reply to this email and let us know.</p>
</td> </td>
</tr> </tr>
<tr> <tr>
@@ -34,7 +34,7 @@
<tr> <tr>
<td style="text-align: center;color: #AAA; font-size: 13px; padding-bottom: 10px;"> <td style="text-align: center;color: #AAA; font-size: 13px; padding-bottom: 10px;">
<p style="margin: 25px 0;"> <p style="margin: 25px 0;">
<img width="65" src="{{.TeamUrl}}/static/images/circles.png" alt=""> <img width="65" src="{{.TeamURL}}/static/images/circles.png" alt="">
</p> </p>
<p style="padding: 0 50px;"> <p style="padding: 0 50px;">
(c) 2015 SpinPunch, Inc. 855 El Camino Real, 13A-168, Palo Alto, CA, 94301.<br> (c) 2015 SpinPunch, Inc. 855 El Camino Real, 13A-168, Palo Alto, CA, 94301.<br>

Просмотреть файл

@@ -1 +1 @@
{{define "email_change_subject"}}You updated your email for {{.Props.TeamName}} on {{ .Props.Domain }}{{end}} {{define "email_change_subject"}}You updated your email for {{.Props.TeamDisplayName}} on {{ .Props.Domain }}{{end}}

Просмотреть файл

@@ -9,7 +9,7 @@
<table align="center" border="0" cellpadding="0" cellspacing="0" width="100%" style="border-collapse: collapse;"> <table align="center" border="0" cellpadding="0" cellspacing="0" width="100%" style="border-collapse: collapse;">
<tr> <tr>
<td style="padding: 20px 30px 10px; text-align:left;"> <td style="padding: 20px 30px 10px; text-align:left;">
<img src="{{.TeamUrl}}/static/images/{{.SiteName}}-logodark.png" width="130px" style="opacity: 0.5" alt=""> <img src="{{.TeamURL}}/static/images/{{.SiteName}}-logodark.png" width="130px" style="opacity: 0.5" alt="">
</td> </td>
</tr> </tr>
<tr> <tr>
@@ -42,7 +42,7 @@
<tr> <tr>
<td style="text-align: center;color: #AAA; font-size: 13px; padding-bottom: 10px;"> <td style="text-align: center;color: #AAA; font-size: 13px; padding-bottom: 10px;">
<p style="margin: 25px 0;"> <p style="margin: 25px 0;">
<img width="65" src="{{.TeamUrl}}/static/images/circles.png" alt=""> <img width="65" src="{{.TeamURL}}/static/images/circles.png" alt="">
</p> </p>
<p style="padding: 0 50px;"> <p style="padding: 0 50px;">
(c) 2015 SpinPunch, Inc. 855 El Camino Real, 13A-168, Palo Alto, CA, 94301.<br> (c) 2015 SpinPunch, Inc. 855 El Camino Real, 13A-168, Palo Alto, CA, 94301.<br>

Просмотреть файл

@@ -9,7 +9,7 @@
<table align="center" border="0" cellpadding="0" cellspacing="0" width="100%" style="border-collapse: collapse;"> <table align="center" border="0" cellpadding="0" cellspacing="0" width="100%" style="border-collapse: collapse;">
<tr> <tr>
<td style="padding: 20px 30px 10px; text-align:left;"> <td style="padding: 20px 30px 10px; text-align:left;">
<img src="{{.TeamUrl}}/static/images/{{.SiteName}}-logodark.png" width="130px" style="opacity: 0.5" alt=""> <img src="{{.TeamURL}}/static/images/{{.SiteName}}-logodark.png" width="130px" style="opacity: 0.5" alt="">
</td> </td>
</tr> </tr>
<tr> <tr>
@@ -18,7 +18,7 @@
<tr> <tr>
<td style="border-bottom: 1px solid #ddd; padding: 0 0 20px;"> <td style="border-bottom: 1px solid #ddd; padding: 0 0 20px;">
<h2 style="font-weight: normal; margin-top: 10px;">You've been invited</h2> <h2 style="font-weight: normal; margin-top: 10px;">You've been invited</h2>
<p>{{.Props.TeamName}} started using {{.SiteName}}.<br> The team {{.Props.SenderStatus}} <strong>{{.Props.SenderName}}</strong>, has invited you to join <strong>{{.Props.TeamName}}</strong>.</p> <p>{{.Props.TeamDisplayName}} started using {{.SiteName}}.<br> The team {{.Props.SenderStatus}} <strong>{{.Props.SenderName}}</strong>, has invited you to join <strong>{{.Props.TeamDisplayName}}</strong>.</p>
<p style="margin: 20px 0 15px"> <p style="margin: 20px 0 15px">
<a href="{{.Props.Link}}" style="background: #2389D7; border-radius: 3px; color: #fff; border: none; outline: none; min-width: 200px; padding: 15px 25px; font-size: 14px; font-family: inherit; cursor: pointer; -webkit-appearance: none;text-decoration: none;">Join Team</a> <a href="{{.Props.Link}}" style="background: #2389D7; border-radius: 3px; color: #fff; border: none; outline: none; min-width: 200px; padding: 15px 25px; font-size: 14px; font-family: inherit; cursor: pointer; -webkit-appearance: none;text-decoration: none;">Join Team</a>
</p> </p>
@@ -37,7 +37,7 @@
<tr> <tr>
<td style="text-align: center;color: #AAA; font-size: 13px; padding-bottom: 10px;"> <td style="text-align: center;color: #AAA; font-size: 13px; padding-bottom: 10px;">
<p style="margin: 25px 0;"> <p style="margin: 25px 0;">
<img width="65" src="{{.TeamUrl}}/static/images/circles.png" alt=""> <img width="65" src="{{.TeamURL}}/static/images/circles.png" alt="">
</p> </p>
<p style="padding: 0 50px;"> <p style="padding: 0 50px;">
(c) 2015 SpinPunch, Inc. 855 El Camino Real, 13A-168, Palo Alto, CA, 94301.<br> (c) 2015 SpinPunch, Inc. 855 El Camino Real, 13A-168, Palo Alto, CA, 94301.<br>

Просмотреть файл

@@ -1 +1 @@
{{define "invite_subject"}}{{ .Props.SenderName }} invited you to join {{ .Props.TeamName }} Team on {{.SiteName}}{{end}} {{define "invite_subject"}}{{ .Props.SenderName }} invited you to join {{ .Props.TeamDisplayName }} Team on {{.SiteName}}{{end}}

Просмотреть файл

@@ -9,7 +9,7 @@
<table align="center" border="0" cellpadding="0" cellspacing="0" width="100%" style="border-collapse: collapse;"> <table align="center" border="0" cellpadding="0" cellspacing="0" width="100%" style="border-collapse: collapse;">
<tr> <tr>
<td style="padding: 20px 30px 10px; text-align:left;"> <td style="padding: 20px 30px 10px; text-align:left;">
<img src="{{.TeamUrl}}/static/images/{{.SiteName}}-logodark.png" width="130px" style="opacity: 0.5" alt=""> <img src="{{.TeamURL}}/static/images/{{.SiteName}}-logodark.png" width="130px" style="opacity: 0.5" alt="">
</td> </td>
</tr> </tr>
<tr> <tr>
@@ -18,7 +18,7 @@
<tr> <tr>
<td style="border-bottom: 1px solid #ddd; padding: 0 0 20px;"> <td style="border-bottom: 1px solid #ddd; padding: 0 0 20px;">
<h2 style="font-weight: normal; margin-top: 10px;">You updated your password</h2> <h2 style="font-weight: normal; margin-top: 10px;">You updated your password</h2>
<p>You updated your password for {{.Props.TeamName}} on {{ .TeamUrl }} by {{.Props.Method}}.<br> If this change wasn't initiated by you, please reply to this email and let us know.</p> <p>You updated your password for {{.Props.TeamDisplayName}} on {{ .TeamURL }} by {{.Props.Method}}.<br> If this change wasn't initiated by you, please reply to this email and let us know.</p>
</td> </td>
</tr> </tr>
<tr> <tr>
@@ -34,7 +34,7 @@
<tr> <tr>
<td style="text-align: center;color: #AAA; font-size: 13px; padding-bottom: 10px;"> <td style="text-align: center;color: #AAA; font-size: 13px; padding-bottom: 10px;">
<p style="margin: 25px 0;"> <p style="margin: 25px 0;">
<img width="65" src="{{.TeamUrl}}/static/images/circles.png" alt=""> <img width="65" src="{{.TeamURL}}/static/images/circles.png" alt="">
</p> </p>
<p style="padding: 0 50px;"> <p style="padding: 0 50px;">
(c) 2015 SpinPunch, Inc. 855 El Camino Real, 13A-168, Palo Alto, CA, 94301.<br> (c) 2015 SpinPunch, Inc. 855 El Camino Real, 13A-168, Palo Alto, CA, 94301.<br>

Просмотреть файл

@@ -1 +1 @@
{{define "password_change_subject"}}You updated your password for {{.Props.TeamName}} on {{ .SiteName }}{{end}} {{define "password_change_subject"}}You updated your password for {{.Props.TeamDisplayName}} on {{ .SiteName }}{{end}}

Просмотреть файл

@@ -9,7 +9,7 @@
<table align="center" border="0" cellpadding="0" cellspacing="0" width="100%" style="border-collapse: collapse;"> <table align="center" border="0" cellpadding="0" cellspacing="0" width="100%" style="border-collapse: collapse;">
<tr> <tr>
<td style="padding: 20px 30px 10px; text-align:left;"> <td style="padding: 20px 30px 10px; text-align:left;">
<img src="{{.TeamUrl}}/static/images/{{.SiteName}}-logodark.png" width="130px" style="opacity: 0.5" alt=""> <img src="{{.TeamURL}}/static/images/{{.SiteName}}-logodark.png" width="130px" style="opacity: 0.5" alt="">
</td> </td>
</tr> </tr>
<tr> <tr>
@@ -37,7 +37,7 @@
<tr> <tr>
<td style="text-align: center;color: #AAA; font-size: 13px; padding-bottom: 10px;"> <td style="text-align: center;color: #AAA; font-size: 13px; padding-bottom: 10px;">
<p style="margin: 25px 0;"> <p style="margin: 25px 0;">
<img width="65" src="{{.TeamUrl}}/static/images/circles.png" alt=""> <img width="65" src="{{.TeamURL}}/static/images/circles.png" alt="">
</p> </p>
<p style="padding: 0 50px;"> <p style="padding: 0 50px;">
(c) 2015 SpinPunch, Inc. 855 El Camino Real, 13A-168, Palo Alto, CA, 94301.<br> (c) 2015 SpinPunch, Inc. 855 El Camino Real, 13A-168, Palo Alto, CA, 94301.<br>

Просмотреть файл

@@ -1 +1 @@
{{define "post_subject"}}[{{.Props.TeamName}} {{.SiteName}}] {{.Props.SubjectText}} for {{.Props.Month}} {{.Props.Day}}, {{.Props.Year}}{{end}} {{define "post_subject"}}[{{.Props.TeamDisplayName}} {{.SiteName}}] {{.Props.SubjectText}} for {{.Props.Month}} {{.Props.Day}}, {{.Props.Year}}{{end}}

Просмотреть файл

@@ -9,7 +9,7 @@
<table align="center" border="0" cellpadding="0" cellspacing="0" width="100%" style="border-collapse: collapse;"> <table align="center" border="0" cellpadding="0" cellspacing="0" width="100%" style="border-collapse: collapse;">
<tr> <tr>
<td style="padding: 20px 30px 10px; text-align:left;"> <td style="padding: 20px 30px 10px; text-align:left;">
<img src="{{.TeamUrl}}/static/images/{{.SiteName}}-logodark.png" width="130px" style="opacity: 0.5" alt=""> <img src="{{.TeamURL}}/static/images/{{.SiteName}}-logodark.png" width="130px" style="opacity: 0.5" alt="">
</td> </td>
</tr> </tr>
<tr> <tr>
@@ -37,7 +37,7 @@
<tr> <tr>
<td style="text-align: center;color: #AAA; font-size: 13px; padding-bottom: 10px;"> <td style="text-align: center;color: #AAA; font-size: 13px; padding-bottom: 10px;">
<p style="margin: 25px 0;"> <p style="margin: 25px 0;">
<img width="65" src="{{.TeamUrl}}/static/images/circles.png" alt=""> <img width="65" src="{{.TeamURL}}/static/images/circles.png" alt="">
</p> </p>
<p style="padding: 0 50px;"> <p style="padding: 0 50px;">
(c) 2015 SpinPunch, Inc. 855 El Camino Real, 13A-168, Palo Alto, CA, 94301.<br> (c) 2015 SpinPunch, Inc. 855 El Camino Real, 13A-168, Palo Alto, CA, 94301.<br>

Просмотреть файл

@@ -9,7 +9,7 @@
<table align="center" border="0" cellpadding="0" cellspacing="0" width="100%" style="border-collapse: collapse;"> <table align="center" border="0" cellpadding="0" cellspacing="0" width="100%" style="border-collapse: collapse;">
<tr> <tr>
<td style="padding: 20px 30px 10px; text-align:left;"> <td style="padding: 20px 30px 10px; text-align:left;">
<img src="{{.TeamUrl}}/static/images/{{.SiteName}}-logodark.png" width="130px" style="opacity: 0.5" alt=""> <img src="{{.TeamURL}}/static/images/{{.SiteName}}-logodark.png" width="130px" style="opacity: 0.5" alt="">
</td> </td>
</tr> </tr>
<tr> <tr>
@@ -40,7 +40,7 @@
<tr> <tr>
<td style="text-align: center;color: #AAA; font-size: 13px; padding-bottom: 10px;"> <td style="text-align: center;color: #AAA; font-size: 13px; padding-bottom: 10px;">
<p style="margin: 25px 0;"> <p style="margin: 25px 0;">
<img width="65" src="{{.TeamUrl}}/static/images/circles.png" alt=""> <img width="65" src="{{.TeamURL}}/static/images/circles.png" alt="">
</p> </p>
<p style="padding: 0 50px;"> <p style="padding: 0 50px;">
(c) 2015 SpinPunch, Inc. 855 El Camino Real, 13A-168, Palo Alto, CA, 94301.<br> (c) 2015 SpinPunch, Inc. 855 El Camino Real, 13A-168, Palo Alto, CA, 94301.<br>

Просмотреть файл

@@ -9,7 +9,7 @@
<table align="center" border="0" cellpadding="0" cellspacing="0" width="100%" style="border-collapse: collapse;"> <table align="center" border="0" cellpadding="0" cellspacing="0" width="100%" style="border-collapse: collapse;">
<tr> <tr>
<td style="padding: 20px 30px 10px; text-align:left;"> <td style="padding: 20px 30px 10px; text-align:left;">
<img src="{{.TeamUrl}}/static/images/{{.SiteName}}-logodark.png" width="130px" style="opacity: 0.5" alt=""> <img src="{{.TeamURL}}/static/images/{{.SiteName}}-logodark.png" width="130px" style="opacity: 0.5" alt="">
</td> </td>
</tr> </tr>
<tr> <tr>
@@ -37,7 +37,7 @@
<tr> <tr>
<td style="text-align: center;color: #AAA; font-size: 13px; padding-bottom: 10px;"> <td style="text-align: center;color: #AAA; font-size: 13px; padding-bottom: 10px;">
<p style="margin: 25px 0;"> <p style="margin: 25px 0;">
<img width="65" src="{{.TeamUrl}}/static/images/circles.png" alt=""> <img width="65" src="{{.TeamURL}}/static/images/circles.png" alt="">
</p> </p>
<p style="padding: 0 50px;"> <p style="padding: 0 50px;">
(c) 2015 SpinPunch, Inc. 855 El Camino Real, 13A-168, Palo Alto, CA, 94301.<br> (c) 2015 SpinPunch, Inc. 855 El Camino Real, 13A-168, Palo Alto, CA, 94301.<br>

Просмотреть файл

@@ -1 +1 @@
{{define "verify_subject"}}[{{ .Props.TeamName }} {{ .SiteName }}] Email Verification{{end}} {{define "verify_subject"}}[{{ .Props.TeamDisplayName }} {{ .SiteName }}] Email Verification{{end}}

Просмотреть файл

@@ -9,7 +9,7 @@
<table align="center" border="0" cellpadding="0" cellspacing="0" width="100%" style="border-collapse: collapse;"> <table align="center" border="0" cellpadding="0" cellspacing="0" width="100%" style="border-collapse: collapse;">
<tr> <tr>
<td style="padding: 20px 30px 10px; text-align:left;"> <td style="padding: 20px 30px 10px; text-align:left;">
<img src="{{.TeamUrl}}/static/images/{{.SiteName}}-logodark.png" width="130px" style="opacity: 0.5" alt=""> <img src="{{.TeamURL}}/static/images/{{.SiteName}}-logodark.png" width="130px" style="opacity: 0.5" alt="">
</td> </td>
</tr> </tr>
<tr> <tr>
@@ -17,8 +17,8 @@
<table border="0" cellpadding="0" cellspacing="0" style="padding: 20px 50px 0; text-align: center; margin: 0 auto"> <table border="0" cellpadding="0" cellspacing="0" style="padding: 20px 50px 0; text-align: center; margin: 0 auto">
<tr> <tr>
<td style="border-bottom: 1px solid #ddd; padding: 0 0 20px;"> <td style="border-bottom: 1px solid #ddd; padding: 0 0 20px;">
<h2 style="font-weight: normal; margin-top: 10px;">You joined the {{.Props.TeamName}} team at {{.SiteName}}!</h2> <h2 style="font-weight: normal; margin-top: 10px;">You joined the {{.Props.TeamDisplayName}} team at {{.SiteName}}!</h2>
<p>Please let me know if you have any questions.<br>Enjoy your stay at <a href="{{.TeamUrl}}">{{.SiteName}}</a>.</p> <p>Please let me know if you have any questions.<br>Enjoy your stay at <a href="{{.TeamURL}}">{{.SiteName}}</a>.</p>
</td> </td>
</tr> </tr>
<tr> <tr>
@@ -34,7 +34,7 @@
<tr> <tr>
<td style="text-align: center;color: #AAA; font-size: 13px; padding-bottom: 10px;"> <td style="text-align: center;color: #AAA; font-size: 13px; padding-bottom: 10px;">
<p style="margin: 25px 0;"> <p style="margin: 25px 0;">
<img width="65" src="{{.TeamUrl}}/static/images/circles.png" alt=""> <img width="65" src="{{.TeamURL}}/static/images/circles.png" alt="">
</p> </p>
<p style="padding: 0 50px;"> <p style="padding: 0 50px;">
(c) 2015 SpinPunch, Inc. 855 El Camino Real, 13A-168, Palo Alto, CA, 94301.<br> (c) 2015 SpinPunch, Inc. 855 El Camino Real, 13A-168, Palo Alto, CA, 94301.<br>

Просмотреть файл

@@ -181,14 +181,13 @@ func CreateUser(c *Context, team *model.Team, user *model.User) *model.User {
l4g.Error("Encountered an issue joining default channels user_id=%s, team_id=%s, err=%v", ruser.Id, ruser.TeamId, err) l4g.Error("Encountered an issue joining default channels user_id=%s, team_id=%s, err=%v", ruser.Id, ruser.TeamId, err)
} }
//fireAndForgetWelcomeEmail(ruser.FirstName, ruser.Email, team.Name, c.TeamUrl+"/channels/town-square") //fireAndForgetWelcomeEmail(ruser.FirstName, ruser.Email, team.Name, c.TeamURL+"/channels/town-square")
if user.EmailVerified { if user.EmailVerified {
if cresult := <-Srv.Store.User().VerifyEmail(ruser.Id); cresult.Err != nil { if cresult := <-Srv.Store.User().VerifyEmail(ruser.Id); cresult.Err != nil {
l4g.Error("Failed to set email verified err=%v", cresult.Err) l4g.Error("Failed to set email verified err=%v", cresult.Err)
} }
} else { } else {
FireAndForgetVerifyEmail(result.Data.(*model.User).Id, ruser.FirstName, ruser.Email, team.Name, c.TeamUrl) FireAndForgetVerifyEmail(result.Data.(*model.User).Id, ruser.FirstName, ruser.Email, team.DisplayName, c.GetTeamURLFromTeam(team))
} }
ruser.Sanitize(map[string]bool{}) ruser.Sanitize(map[string]bool{})
@@ -202,13 +201,13 @@ func CreateUser(c *Context, team *model.Team, user *model.User) *model.User {
} }
} }
func fireAndForgetWelcomeEmail(name, email, teamName, link string) { func fireAndForgetWelcomeEmail(name, email, teamDisplayName, link string) {
go func() { go func() {
subjectPage := NewServerTemplatePage("welcome_subject", link) subjectPage := NewServerTemplatePage("welcome_subject", link)
bodyPage := NewServerTemplatePage("welcome_body", link) bodyPage := NewServerTemplatePage("welcome_body", link)
bodyPage.Props["Nickname"] = name bodyPage.Props["Nickname"] = name
bodyPage.Props["TeamName"] = teamName bodyPage.Props["TeamDisplayName"] = teamDisplayName
bodyPage.Props["FeedbackName"] = utils.Cfg.EmailSettings.FeedbackName bodyPage.Props["FeedbackName"] = utils.Cfg.EmailSettings.FeedbackName
if err := utils.SendMail(email, subjectPage.Render(), bodyPage.Render()); err != nil { if err := utils.SendMail(email, subjectPage.Render(), bodyPage.Render()); err != nil {
@@ -218,16 +217,16 @@ func fireAndForgetWelcomeEmail(name, email, teamName, link string) {
}() }()
} }
func FireAndForgetVerifyEmail(userId, name, email, teamName, teamUrl string) { func FireAndForgetVerifyEmail(userId, name, email, teamDisplayName, teamURL string) {
go func() { go func() {
link := fmt.Sprintf("%s/verify?uid=%s&hid=%s", teamUrl, userId, model.HashPassword(userId)) link := fmt.Sprintf("%s/verify_email?uid=%s&hid=%s", teamURL, userId, model.HashPassword(userId))
subjectPage := NewServerTemplatePage("verify_subject", teamUrl) subjectPage := NewServerTemplatePage("verify_subject", teamURL)
subjectPage.Props["TeamName"] = teamName subjectPage.Props["TeamDisplayName"] = teamDisplayName
bodyPage := NewServerTemplatePage("verify_body", teamUrl) bodyPage := NewServerTemplatePage("verify_body", teamURL)
bodyPage.Props["Nickname"] = name bodyPage.Props["Nickname"] = name
bodyPage.Props["TeamName"] = teamName bodyPage.Props["TeamDisplayName"] = teamDisplayName
bodyPage.Props["VerifyUrl"] = link bodyPage.Props["VerifyUrl"] = link
if err := utils.SendMail(email, subjectPage.Render(), bodyPage.Render()); err != nil { if err := utils.SendMail(email, subjectPage.Render(), bodyPage.Render()); err != nil {
@@ -251,10 +250,10 @@ func login(c *Context, w http.ResponseWriter, r *http.Request) {
} }
var team *model.Team var team *model.Team
if result.Data == nil && len(props["email"]) != 0 && len(props["domain"]) != 0 { if result.Data == nil && len(props["email"]) != 0 && len(props["name"]) != 0 {
extraInfo = props["email"] + " in " + props["domain"] extraInfo = props["email"] + " in " + props["name"]
if nr := <-Srv.Store.Team().GetByDomain(props["domain"]); nr.Err != nil { if nr := <-Srv.Store.Team().GetByName(props["name"]); nr.Err != nil {
c.Err = nr.Err c.Err = nr.Err
return return
} else { } else {
@@ -517,7 +516,6 @@ func getProfiles(c *Context, w http.ResponseWriter, r *http.Request) {
} }
w.Header().Set(model.HEADER_ETAG_SERVER, etag) w.Header().Set(model.HEADER_ETAG_SERVER, etag)
w.Header().Set("Cache-Control", "max-age=120, public") // 2 mins
w.Write([]byte(model.UserMapToJson(profiles))) w.Write([]byte(model.UserMapToJson(profiles)))
return return
} }
@@ -758,7 +756,8 @@ func updateUser(c *Context, w http.ResponseWriter, r *http.Request) {
if tresult := <-Srv.Store.Team().Get(rusers[1].TeamId); tresult.Err != nil { if tresult := <-Srv.Store.Team().Get(rusers[1].TeamId); tresult.Err != nil {
l4g.Error(tresult.Err.Message) l4g.Error(tresult.Err.Message)
} else { } else {
fireAndForgetEmailChangeEmail(rusers[1].Email, tresult.Data.(*model.Team).Name, c.TeamUrl) team := tresult.Data.(*model.Team)
fireAndForgetEmailChangeEmail(rusers[1].Email, team.DisplayName, c.GetTeamURLFromTeam(team))
} }
} }
@@ -829,7 +828,8 @@ func updatePassword(c *Context, w http.ResponseWriter, r *http.Request) {
if tresult := <-tchan; tresult.Err != nil { if tresult := <-tchan; tresult.Err != nil {
l4g.Error(tresult.Err.Message) l4g.Error(tresult.Err.Message)
} else { } else {
fireAndForgetPasswordChangeEmail(user.Email, tresult.Data.(*model.Team).Name, c.TeamUrl, "using the settings menu") team := tresult.Data.(*model.Team)
fireAndForgetPasswordChangeEmail(user.Email, team.DisplayName, c.GetTeamURLFromTeam(team), "using the settings menu")
} }
data := make(map[string]string) data := make(map[string]string)
@@ -988,14 +988,14 @@ func sendPasswordReset(c *Context, w http.ResponseWriter, r *http.Request) {
return return
} }
domain := props["domain"] name := props["name"]
if len(domain) == 0 { if len(name) == 0 {
c.SetInvalidParam("sendPasswordReset", "domain") c.SetInvalidParam("sendPasswordReset", "name")
return return
} }
var team *model.Team var team *model.Team
if result := <-Srv.Store.Team().GetByDomain(domain); result.Err != nil { if result := <-Srv.Store.Team().GetByName(name); result.Err != nil {
c.Err = result.Err c.Err = result.Err
return return
} else { } else {
@@ -1017,10 +1017,10 @@ func sendPasswordReset(c *Context, w http.ResponseWriter, r *http.Request) {
data := model.MapToJson(newProps) data := model.MapToJson(newProps)
hash := model.HashPassword(fmt.Sprintf("%v:%v", data, utils.Cfg.ServiceSettings.ResetSalt)) hash := model.HashPassword(fmt.Sprintf("%v:%v", data, utils.Cfg.ServiceSettings.ResetSalt))
link := fmt.Sprintf("%s/reset_password?d=%s&h=%s", c.TeamUrl, url.QueryEscape(data), url.QueryEscape(hash)) link := fmt.Sprintf("%s/reset_password?d=%s&h=%s", c.GetTeamURLFromTeam(team), url.QueryEscape(data), url.QueryEscape(hash))
subjectPage := NewServerTemplatePage("reset_subject", c.TeamUrl) subjectPage := NewServerTemplatePage("reset_subject", c.GetTeamURLFromTeam(team))
bodyPage := NewServerTemplatePage("reset_body", c.TeamUrl) bodyPage := NewServerTemplatePage("reset_body", c.GetTeamURLFromTeam(team))
bodyPage.Props["ResetUrl"] = link bodyPage.Props["ResetUrl"] = link
if err := utils.SendMail(email, subjectPage.Render(), bodyPage.Render()); err != nil { if err := utils.SendMail(email, subjectPage.Render(), bodyPage.Render()); err != nil {
@@ -1062,16 +1062,16 @@ func resetPassword(c *Context, w http.ResponseWriter, r *http.Request) {
return return
} }
domain := props["domain"] name := props["name"]
if len(domain) == 0 { if len(name) == 0 {
c.SetInvalidParam("resetPassword", "domain") c.SetInvalidParam("resetPassword", "name")
return return
} }
c.LogAuditWithUserId(userId, "attempt") c.LogAuditWithUserId(userId, "attempt")
var team *model.Team var team *model.Team
if result := <-Srv.Store.Team().GetByDomain(domain); result.Err != nil { if result := <-Srv.Store.Team().GetByName(name); result.Err != nil {
c.Err = result.Err c.Err = result.Err
return return
} else { } else {
@@ -1110,19 +1110,19 @@ func resetPassword(c *Context, w http.ResponseWriter, r *http.Request) {
c.LogAuditWithUserId(userId, "success") c.LogAuditWithUserId(userId, "success")
} }
fireAndForgetPasswordChangeEmail(user.Email, team.Name, c.TeamUrl, "using a reset password link") fireAndForgetPasswordChangeEmail(user.Email, team.DisplayName, c.GetTeamURLFromTeam(team), "using a reset password link")
props["new_password"] = "" props["new_password"] = ""
w.Write([]byte(model.MapToJson(props))) w.Write([]byte(model.MapToJson(props)))
} }
func fireAndForgetPasswordChangeEmail(email, teamName, teamUrl, method string) { func fireAndForgetPasswordChangeEmail(email, teamDisplayName, teamURL, method string) {
go func() { go func() {
subjectPage := NewServerTemplatePage("password_change_subject", teamUrl) subjectPage := NewServerTemplatePage("password_change_subject", teamURL)
subjectPage.Props["TeamName"] = teamName subjectPage.Props["TeamDisplayName"] = teamDisplayName
bodyPage := NewServerTemplatePage("password_change_body", teamUrl) bodyPage := NewServerTemplatePage("password_change_body", teamURL)
bodyPage.Props["TeamName"] = teamName bodyPage.Props["TeamDisplayName"] = teamDisplayName
bodyPage.Props["Method"] = method bodyPage.Props["Method"] = method
if err := utils.SendMail(email, subjectPage.Render(), bodyPage.Render()); err != nil { if err := utils.SendMail(email, subjectPage.Render(), bodyPage.Render()); err != nil {
@@ -1132,13 +1132,13 @@ func fireAndForgetPasswordChangeEmail(email, teamName, teamUrl, method string) {
}() }()
} }
func fireAndForgetEmailChangeEmail(email, teamName, teamUrl string) { func fireAndForgetEmailChangeEmail(email, teamDisplayName, teamURL string) {
go func() { go func() {
subjectPage := NewServerTemplatePage("email_change_subject", teamUrl) subjectPage := NewServerTemplatePage("email_change_subject", teamURL)
subjectPage.Props["TeamName"] = teamName subjectPage.Props["TeamDisplayName"] = teamDisplayName
bodyPage := NewServerTemplatePage("email_change_body", teamUrl) bodyPage := NewServerTemplatePage("email_change_body", teamURL)
bodyPage.Props["TeamName"] = teamName bodyPage.Props["TeamDisplayName"] = teamDisplayName
if err := utils.SendMail(email, subjectPage.Render(), bodyPage.Render()); err != nil { if err := utils.SendMail(email, subjectPage.Render(), bodyPage.Render()); err != nil {
l4g.Error("Failed to send update password email successfully err=%v", err) l4g.Error("Failed to send update password email successfully err=%v", err)

Просмотреть файл

@@ -25,7 +25,7 @@ import (
func TestCreateUser(t *testing.T) { func TestCreateUser(t *testing.T) {
Setup() Setup()
team := model.Team{Name: "Name", Domain: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN} team := model.Team{DisplayName: "Name", Name: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN}
rteam, _ := Client.CreateTeam(&team) rteam, _ := Client.CreateTeam(&team)
user := model.User{TeamId: rteam.Data.(*model.Team).Id, Email: strings.ToLower(model.NewId()) + "corey@test.com", Nickname: "Corey Hulen", Password: "hello"} user := model.User{TeamId: rteam.Data.(*model.Team).Id, Email: strings.ToLower(model.NewId()) + "corey@test.com", Nickname: "Corey Hulen", Password: "hello"}
@@ -75,7 +75,7 @@ func TestCreateUser(t *testing.T) {
func TestCreateUserAllowedDomains(t *testing.T) { func TestCreateUserAllowedDomains(t *testing.T) {
Setup() Setup()
team := model.Team{Name: "Name", Domain: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_INVITE, AllowedDomains: "spinpunch.com, @nowh.com,@hello.com"} team := model.Team{DisplayName: "Name", Name: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_INVITE, AllowedDomains: "spinpunch.com, @nowh.com,@hello.com"}
rteam, _ := Client.CreateTeam(&team) rteam, _ := Client.CreateTeam(&team)
user := model.User{TeamId: rteam.Data.(*model.Team).Id, Email: strings.ToLower(model.NewId()) + "corey@test.com", Nickname: "Corey Hulen", Password: "hello"} user := model.User{TeamId: rteam.Data.(*model.Team).Id, Email: strings.ToLower(model.NewId()) + "corey@test.com", Nickname: "Corey Hulen", Password: "hello"}
@@ -95,7 +95,7 @@ func TestCreateUserAllowedDomains(t *testing.T) {
func TestLogin(t *testing.T) { func TestLogin(t *testing.T) {
Setup() Setup()
team := model.Team{Name: "Name", Domain: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN} team := model.Team{DisplayName: "Name", Name: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN}
rteam, _ := Client.CreateTeam(&team) rteam, _ := Client.CreateTeam(&team)
user := model.User{TeamId: rteam.Data.(*model.Team).Id, Email: strings.ToLower(model.NewId()) + "corey@test.com", Nickname: "Corey Hulen", Password: "pwd"} user := model.User{TeamId: rteam.Data.(*model.Team).Id, Email: strings.ToLower(model.NewId()) + "corey@test.com", Nickname: "Corey Hulen", Password: "pwd"}
@@ -110,7 +110,7 @@ func TestLogin(t *testing.T) {
} }
} }
if result, err := Client.LoginByEmail(team.Domain, user.Email, user.Password); err != nil { if result, err := Client.LoginByEmail(team.Name, user.Email, user.Password); err != nil {
t.Fatal(err) t.Fatal(err)
} else { } else {
if result.Data.(*model.User).Email != user.Email { if result.Data.(*model.User).Email != user.Email {
@@ -118,11 +118,11 @@ func TestLogin(t *testing.T) {
} }
} }
if _, err := Client.LoginByEmail(team.Domain, user.Email, user.Password+"invalid"); err == nil { if _, err := Client.LoginByEmail(team.Name, user.Email, user.Password+"invalid"); err == nil {
t.Fatal("Invalid Password") t.Fatal("Invalid Password")
} }
if _, err := Client.LoginByEmail(team.Domain, "", user.Password); err == nil { if _, err := Client.LoginByEmail(team.Name, "", user.Password); err == nil {
t.Fatal("should have failed") t.Fatal("should have failed")
} }
@@ -135,7 +135,7 @@ func TestLogin(t *testing.T) {
Client.AuthToken = "" Client.AuthToken = ""
team2 := model.Team{Name: "Name", Domain: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_INVITE} team2 := model.Team{DisplayName: "Name", Name: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_INVITE}
rteam2 := Client.Must(Client.CreateTeam(&team2)) rteam2 := Client.Must(Client.CreateTeam(&team2))
user2 := model.User{TeamId: rteam2.Data.(*model.Team).Id, Email: strings.ToLower(model.NewId()) + "corey@test.com", Nickname: "Corey Hulen", Password: "pwd"} user2 := model.User{TeamId: rteam2.Data.(*model.Team).Id, Email: strings.ToLower(model.NewId()) + "corey@test.com", Nickname: "Corey Hulen", Password: "pwd"}
@@ -147,14 +147,14 @@ func TestLogin(t *testing.T) {
props := make(map[string]string) props := make(map[string]string)
props["email"] = user2.Email props["email"] = user2.Email
props["id"] = rteam2.Data.(*model.Team).Id props["id"] = rteam2.Data.(*model.Team).Id
props["name"] = rteam2.Data.(*model.Team).Name props["display_name"] = rteam2.Data.(*model.Team).DisplayName
props["time"] = fmt.Sprintf("%v", model.GetMillis()) props["time"] = fmt.Sprintf("%v", model.GetMillis())
data := model.MapToJson(props) data := model.MapToJson(props)
hash := model.HashPassword(fmt.Sprintf("%v:%v", data, utils.Cfg.ServiceSettings.InviteSalt)) hash := model.HashPassword(fmt.Sprintf("%v:%v", data, utils.Cfg.ServiceSettings.InviteSalt))
ruser2, _ := Client.CreateUserFromSignup(&user2, data, hash) ruser2, _ := Client.CreateUserFromSignup(&user2, data, hash)
if _, err := Client.LoginByEmail(team2.Domain, ruser2.Data.(*model.User).Email, user2.Password); err != nil { if _, err := Client.LoginByEmail(team2.Name, ruser2.Data.(*model.User).Email, user2.Password); err != nil {
t.Fatal("From verfied hash") t.Fatal("From verfied hash")
} }
@@ -164,7 +164,7 @@ func TestLogin(t *testing.T) {
func TestSessions(t *testing.T) { func TestSessions(t *testing.T) {
Setup() Setup()
team := model.Team{Name: "Name", Domain: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN} team := model.Team{DisplayName: "Name", Name: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN}
rteam, _ := Client.CreateTeam(&team) rteam, _ := Client.CreateTeam(&team)
user := model.User{TeamId: rteam.Data.(*model.Team).Id, Email: strings.ToLower(model.NewId()) + "corey@test.com", Nickname: "Corey Hulen", Password: "pwd"} user := model.User{TeamId: rteam.Data.(*model.Team).Id, Email: strings.ToLower(model.NewId()) + "corey@test.com", Nickname: "Corey Hulen", Password: "pwd"}
@@ -172,8 +172,8 @@ func TestSessions(t *testing.T) {
store.Must(Srv.Store.User().VerifyEmail(ruser.Id)) store.Must(Srv.Store.User().VerifyEmail(ruser.Id))
deviceId := model.NewId() deviceId := model.NewId()
Client.LoginByEmailWithDevice(team.Domain, user.Email, user.Password, deviceId) Client.LoginByEmailWithDevice(team.Name, user.Email, user.Password, deviceId)
Client.LoginByEmail(team.Domain, user.Email, user.Password) Client.LoginByEmail(team.Name, user.Email, user.Password)
r1, err := Client.GetSessions(ruser.Id) r1, err := Client.GetSessions(ruser.Id)
if err != nil { if err != nil {
@@ -221,7 +221,7 @@ func TestSessions(t *testing.T) {
func TestGetUser(t *testing.T) { func TestGetUser(t *testing.T) {
Setup() Setup()
team := model.Team{Name: "Name", Domain: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN} team := model.Team{DisplayName: "Name", Name: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN}
rteam, _ := Client.CreateTeam(&team) rteam, _ := Client.CreateTeam(&team)
user := model.User{TeamId: rteam.Data.(*model.Team).Id, Email: strings.ToLower(model.NewId()) + "corey@test.com", Nickname: "Corey Hulen", Password: "pwd"} user := model.User{TeamId: rteam.Data.(*model.Team).Id, Email: strings.ToLower(model.NewId()) + "corey@test.com", Nickname: "Corey Hulen", Password: "pwd"}
@@ -232,7 +232,7 @@ func TestGetUser(t *testing.T) {
ruser2, _ := Client.CreateUser(&user2, "") ruser2, _ := Client.CreateUser(&user2, "")
store.Must(Srv.Store.User().VerifyEmail(ruser2.Data.(*model.User).Id)) store.Must(Srv.Store.User().VerifyEmail(ruser2.Data.(*model.User).Id))
Client.LoginByEmail(team.Domain, user.Email, user.Password) Client.LoginByEmail(team.Name, user.Email, user.Password)
rId := ruser.Data.(*model.User).Id rId := ruser.Data.(*model.User).Id
if result, err := Client.GetUser(rId, ""); err != nil { if result, err := Client.GetUser(rId, ""); err != nil {
@@ -292,7 +292,7 @@ func TestGetUser(t *testing.T) {
func TestGetAudits(t *testing.T) { func TestGetAudits(t *testing.T) {
Setup() Setup()
team := model.Team{Name: "Name", Domain: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN} team := model.Team{DisplayName: "Name", Name: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN}
rteam, _ := Client.CreateTeam(&team) rteam, _ := Client.CreateTeam(&team)
user := model.User{TeamId: rteam.Data.(*model.Team).Id, Email: strings.ToLower(model.NewId()) + "corey@test.com", Nickname: "Corey Hulen", Password: "pwd"} user := model.User{TeamId: rteam.Data.(*model.Team).Id, Email: strings.ToLower(model.NewId()) + "corey@test.com", Nickname: "Corey Hulen", Password: "pwd"}
@@ -301,7 +301,7 @@ func TestGetAudits(t *testing.T) {
time.Sleep(100 * time.Millisecond) time.Sleep(100 * time.Millisecond)
Client.LoginByEmail(team.Domain, user.Email, user.Password) Client.LoginByEmail(team.Name, user.Email, user.Password)
time.Sleep(100 * time.Millisecond) time.Sleep(100 * time.Millisecond)
@@ -345,14 +345,14 @@ func TestUserCreateImage(t *testing.T) {
t.Fatal("Failed to create correct color") t.Fatal("Failed to create correct color")
} }
team := &model.Team{Name: "Name", Domain: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN} team := &model.Team{DisplayName: "Name", Name: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN}
team = Client.Must(Client.CreateTeam(team)).Data.(*model.Team) team = Client.Must(Client.CreateTeam(team)).Data.(*model.Team)
user := &model.User{TeamId: team.Id, Email: strings.ToLower(model.NewId()) + "corey@test.com", Nickname: "Corey Hulen", Password: "pwd"} user := &model.User{TeamId: team.Id, Email: strings.ToLower(model.NewId()) + "corey@test.com", Nickname: "Corey Hulen", Password: "pwd"}
user = Client.Must(Client.CreateUser(user, "")).Data.(*model.User) user = Client.Must(Client.CreateUser(user, "")).Data.(*model.User)
store.Must(Srv.Store.User().VerifyEmail(user.Id)) store.Must(Srv.Store.User().VerifyEmail(user.Id))
Client.LoginByEmail(team.Domain, user.Email, "pwd") Client.LoginByEmail(team.Name, user.Email, "pwd")
Client.DoGet("/users/"+user.Id+"/image", "", "") Client.DoGet("/users/"+user.Id+"/image", "", "")
@@ -361,7 +361,7 @@ func TestUserCreateImage(t *testing.T) {
func TestUserUploadProfileImage(t *testing.T) { func TestUserUploadProfileImage(t *testing.T) {
Setup() Setup()
team := &model.Team{Name: "Name", Domain: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN} team := &model.Team{DisplayName: "Name", Name: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN}
team = Client.Must(Client.CreateTeam(team)).Data.(*model.Team) team = Client.Must(Client.CreateTeam(team)).Data.(*model.Team)
user := &model.User{TeamId: team.Id, Email: strings.ToLower(model.NewId()) + "corey@test.com", Nickname: "Corey Hulen", Password: "pwd"} user := &model.User{TeamId: team.Id, Email: strings.ToLower(model.NewId()) + "corey@test.com", Nickname: "Corey Hulen", Password: "pwd"}
@@ -377,7 +377,7 @@ func TestUserUploadProfileImage(t *testing.T) {
t.Fatal("Should have errored") t.Fatal("Should have errored")
} }
Client.LoginByEmail(team.Domain, user.Email, "pwd") Client.LoginByEmail(team.Name, user.Email, "pwd")
if _, upErr := Client.UploadFile("/users/newimage", body.Bytes(), writer.FormDataContentType()); upErr == nil { if _, upErr := Client.UploadFile("/users/newimage", body.Bytes(), writer.FormDataContentType()); upErr == nil {
t.Fatal("Should have errored") t.Fatal("Should have errored")
@@ -458,7 +458,7 @@ func TestUserUploadProfileImage(t *testing.T) {
func TestUserUpdate(t *testing.T) { func TestUserUpdate(t *testing.T) {
Setup() Setup()
team := &model.Team{Name: "Name", Domain: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN} team := &model.Team{DisplayName: "Name", Name: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN}
team = Client.Must(Client.CreateTeam(team)).Data.(*model.Team) team = Client.Must(Client.CreateTeam(team)).Data.(*model.Team)
time1 := model.GetMillis() time1 := model.GetMillis()
@@ -471,7 +471,7 @@ func TestUserUpdate(t *testing.T) {
t.Fatal("Should have errored") t.Fatal("Should have errored")
} }
Client.LoginByEmail(team.Domain, user.Email, "pwd") Client.LoginByEmail(team.Name, user.Email, "pwd")
time.Sleep(100 * time.Millisecond) time.Sleep(100 * time.Millisecond)
@@ -523,7 +523,7 @@ func TestUserUpdate(t *testing.T) {
user2 = Client.Must(Client.CreateUser(user2, "")).Data.(*model.User) user2 = Client.Must(Client.CreateUser(user2, "")).Data.(*model.User)
store.Must(Srv.Store.User().VerifyEmail(user2.Id)) store.Must(Srv.Store.User().VerifyEmail(user2.Id))
Client.LoginByEmail(team.Domain, user2.Email, "pwd") Client.LoginByEmail(team.Name, user2.Email, "pwd")
user.Nickname = "Tim Timmy" user.Nickname = "Tim Timmy"
@@ -535,7 +535,7 @@ func TestUserUpdate(t *testing.T) {
func TestUserUpdatePassword(t *testing.T) { func TestUserUpdatePassword(t *testing.T) {
Setup() Setup()
team := &model.Team{Name: "Name", Domain: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN} team := &model.Team{DisplayName: "Name", Name: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN}
team = Client.Must(Client.CreateTeam(team)).Data.(*model.Team) team = Client.Must(Client.CreateTeam(team)).Data.(*model.Team)
user := &model.User{TeamId: team.Id, Email: strings.ToLower(model.NewId()) + "corey@test.com", Nickname: "Corey Hulen", Password: "pwd"} user := &model.User{TeamId: team.Id, Email: strings.ToLower(model.NewId()) + "corey@test.com", Nickname: "Corey Hulen", Password: "pwd"}
@@ -546,7 +546,7 @@ func TestUserUpdatePassword(t *testing.T) {
t.Fatal("Should have errored") t.Fatal("Should have errored")
} }
Client.LoginByEmail(team.Domain, user.Email, "pwd") Client.LoginByEmail(team.Name, user.Email, "pwd")
if _, err := Client.UpdateUserPassword("123", "pwd", "newpwd"); err == nil { if _, err := Client.UpdateUserPassword("123", "pwd", "newpwd"); err == nil {
t.Fatal("Should have errored") t.Fatal("Should have errored")
@@ -577,14 +577,14 @@ func TestUserUpdatePassword(t *testing.T) {
t.Fatal("LastPasswordUpdate should have changed") t.Fatal("LastPasswordUpdate should have changed")
} }
if _, err := Client.LoginByEmail(team.Domain, user.Email, "newpwd"); err != nil { if _, err := Client.LoginByEmail(team.Name, user.Email, "newpwd"); err != nil {
t.Fatal(err) t.Fatal(err)
} }
user2 := &model.User{TeamId: team.Id, Email: strings.ToLower(model.NewId()) + "corey@test.com", Nickname: "Corey Hulen", Password: "pwd"} user2 := &model.User{TeamId: team.Id, Email: strings.ToLower(model.NewId()) + "corey@test.com", Nickname: "Corey Hulen", Password: "pwd"}
user2 = Client.Must(Client.CreateUser(user2, "")).Data.(*model.User) user2 = Client.Must(Client.CreateUser(user2, "")).Data.(*model.User)
Client.LoginByEmail(team.Domain, user2.Email, "pwd") Client.LoginByEmail(team.Name, user2.Email, "pwd")
if _, err := Client.UpdateUserPassword(user.Id, "pwd", "newpwd"); err == nil { if _, err := Client.UpdateUserPassword(user.Id, "pwd", "newpwd"); err == nil {
t.Fatal("Should have errored") t.Fatal("Should have errored")
@@ -594,7 +594,7 @@ func TestUserUpdatePassword(t *testing.T) {
func TestUserUpdateRoles(t *testing.T) { func TestUserUpdateRoles(t *testing.T) {
Setup() Setup()
team := &model.Team{Name: "Name", Domain: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN} team := &model.Team{DisplayName: "Name", Name: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN}
team = Client.Must(Client.CreateTeam(team)).Data.(*model.Team) team = Client.Must(Client.CreateTeam(team)).Data.(*model.Team)
user := &model.User{TeamId: team.Id, Email: "test@nowhere.com", Nickname: "Corey Hulen", Password: "pwd"} user := &model.User{TeamId: team.Id, Email: "test@nowhere.com", Nickname: "Corey Hulen", Password: "pwd"}
@@ -613,20 +613,20 @@ func TestUserUpdateRoles(t *testing.T) {
t.Fatal("Should have errored, not logged in") t.Fatal("Should have errored, not logged in")
} }
Client.LoginByEmail(team.Domain, user2.Email, "pwd") Client.LoginByEmail(team.Name, user2.Email, "pwd")
if _, err := Client.UpdateUserRoles(data); err == nil { if _, err := Client.UpdateUserRoles(data); err == nil {
t.Fatal("Should have errored, not admin") t.Fatal("Should have errored, not admin")
} }
team2 := &model.Team{Name: "Name", Domain: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN} team2 := &model.Team{DisplayName: "Name", Name: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN}
team2 = Client.Must(Client.CreateTeam(team2)).Data.(*model.Team) team2 = Client.Must(Client.CreateTeam(team2)).Data.(*model.Team)
user3 := &model.User{TeamId: team2.Id, Email: "test@nowhere.com", Nickname: "Corey Hulen", Password: "pwd"} user3 := &model.User{TeamId: team2.Id, Email: "test@nowhere.com", Nickname: "Corey Hulen", Password: "pwd"}
user3 = Client.Must(Client.CreateUser(user3, "")).Data.(*model.User) user3 = Client.Must(Client.CreateUser(user3, "")).Data.(*model.User)
store.Must(Srv.Store.User().VerifyEmail(user3.Id)) store.Must(Srv.Store.User().VerifyEmail(user3.Id))
Client.LoginByEmail(team2.Domain, user3.Email, "pwd") Client.LoginByEmail(team2.Name, user3.Email, "pwd")
data["user_id"] = user2.Id data["user_id"] = user2.Id
@@ -634,7 +634,7 @@ func TestUserUpdateRoles(t *testing.T) {
t.Fatal("Should have errored, wrong team") t.Fatal("Should have errored, wrong team")
} }
Client.LoginByEmail(team.Domain, user.Email, "pwd") Client.LoginByEmail(team.Name, user.Email, "pwd")
data["user_id"] = "junk" data["user_id"] = "junk"
data["new_roles"] = "admin" data["new_roles"] = "admin"
@@ -663,7 +663,7 @@ func TestUserUpdateRoles(t *testing.T) {
func TestUserUpdateActive(t *testing.T) { func TestUserUpdateActive(t *testing.T) {
Setup() Setup()
team := &model.Team{Name: "Name", Domain: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN} team := &model.Team{DisplayName: "Name", Name: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN}
team = Client.Must(Client.CreateTeam(team)).Data.(*model.Team) team = Client.Must(Client.CreateTeam(team)).Data.(*model.Team)
user := &model.User{TeamId: team.Id, Email: "test@nowhere.com", Nickname: "Corey Hulen", Password: "pwd"} user := &model.User{TeamId: team.Id, Email: "test@nowhere.com", Nickname: "Corey Hulen", Password: "pwd"}
@@ -678,26 +678,26 @@ func TestUserUpdateActive(t *testing.T) {
t.Fatal("Should have errored, not logged in") t.Fatal("Should have errored, not logged in")
} }
Client.LoginByEmail(team.Domain, user2.Email, "pwd") Client.LoginByEmail(team.Name, user2.Email, "pwd")
if _, err := Client.UpdateActive(user.Id, false); err == nil { if _, err := Client.UpdateActive(user.Id, false); err == nil {
t.Fatal("Should have errored, not admin") t.Fatal("Should have errored, not admin")
} }
team2 := &model.Team{Name: "Name", Domain: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN} team2 := &model.Team{DisplayName: "Name", Name: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN}
team2 = Client.Must(Client.CreateTeam(team2)).Data.(*model.Team) team2 = Client.Must(Client.CreateTeam(team2)).Data.(*model.Team)
user3 := &model.User{TeamId: team2.Id, Email: "test@nowhere.com", Nickname: "Corey Hulen", Password: "pwd"} user3 := &model.User{TeamId: team2.Id, Email: "test@nowhere.com", Nickname: "Corey Hulen", Password: "pwd"}
user3 = Client.Must(Client.CreateUser(user3, "")).Data.(*model.User) user3 = Client.Must(Client.CreateUser(user3, "")).Data.(*model.User)
store.Must(Srv.Store.User().VerifyEmail(user3.Id)) store.Must(Srv.Store.User().VerifyEmail(user3.Id))
Client.LoginByEmail(team2.Domain, user3.Email, "pwd") Client.LoginByEmail(team2.Name, user3.Email, "pwd")
if _, err := Client.UpdateActive(user.Id, false); err == nil { if _, err := Client.UpdateActive(user.Id, false); err == nil {
t.Fatal("Should have errored, wrong team") t.Fatal("Should have errored, wrong team")
} }
Client.LoginByEmail(team.Domain, user.Email, "pwd") Client.LoginByEmail(team.Name, user.Email, "pwd")
if _, err := Client.UpdateActive("junk", false); err == nil { if _, err := Client.UpdateActive("junk", false); err == nil {
t.Fatal("Should have errored, bad id") t.Fatal("Should have errored, bad id")
@@ -727,7 +727,7 @@ func TestUserUpdateActive(t *testing.T) {
func TestSendPasswordReset(t *testing.T) { func TestSendPasswordReset(t *testing.T) {
Setup() Setup()
team := &model.Team{Name: "Name", Domain: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN} team := &model.Team{DisplayName: "Name", Name: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN}
team = Client.Must(Client.CreateTeam(team)).Data.(*model.Team) team = Client.Must(Client.CreateTeam(team)).Data.(*model.Team)
user := &model.User{TeamId: team.Id, Email: strings.ToLower(model.NewId()) + "corey@test.com", Nickname: "Corey Hulen", Password: "pwd"} user := &model.User{TeamId: team.Id, Email: strings.ToLower(model.NewId()) + "corey@test.com", Nickname: "Corey Hulen", Password: "pwd"}
@@ -736,7 +736,7 @@ func TestSendPasswordReset(t *testing.T) {
data := make(map[string]string) data := make(map[string]string)
data["email"] = user.Email data["email"] = user.Email
data["domain"] = team.Domain data["name"] = team.Name
if _, err := Client.SendPasswordReset(data); err != nil { if _, err := Client.SendPasswordReset(data); err != nil {
t.Fatal(err) t.Fatal(err)
@@ -753,21 +753,21 @@ func TestSendPasswordReset(t *testing.T) {
} }
data["email"] = user.Email data["email"] = user.Email
data["domain"] = "" data["name"] = ""
if _, err := Client.SendPasswordReset(data); err == nil { if _, err := Client.SendPasswordReset(data); err == nil {
t.Fatal("Should have errored - no domain") t.Fatal("Should have errored - no name")
} }
data["domain"] = "junk" data["name"] = "junk"
if _, err := Client.SendPasswordReset(data); err == nil { if _, err := Client.SendPasswordReset(data); err == nil {
t.Fatal("Should have errored - bad domain") t.Fatal("Should have errored - bad name")
} }
} }
func TestResetPassword(t *testing.T) { func TestResetPassword(t *testing.T) {
Setup() Setup()
team := &model.Team{Name: "Name", Domain: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN} team := &model.Team{DisplayName: "Name", Name: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN}
team = Client.Must(Client.CreateTeam(team)).Data.(*model.Team) team = Client.Must(Client.CreateTeam(team)).Data.(*model.Team)
user := &model.User{TeamId: team.Id, Email: strings.ToLower(model.NewId()) + "corey@test.com", Nickname: "Corey Hulen", Password: "pwd"} user := &model.User{TeamId: team.Id, Email: strings.ToLower(model.NewId()) + "corey@test.com", Nickname: "Corey Hulen", Password: "pwd"}
@@ -781,7 +781,7 @@ func TestResetPassword(t *testing.T) {
props["time"] = fmt.Sprintf("%v", model.GetMillis()) props["time"] = fmt.Sprintf("%v", model.GetMillis())
data["data"] = model.MapToJson(props) data["data"] = model.MapToJson(props)
data["hash"] = model.HashPassword(fmt.Sprintf("%v:%v", data["data"], utils.Cfg.ServiceSettings.ResetSalt)) data["hash"] = model.HashPassword(fmt.Sprintf("%v:%v", data["data"], utils.Cfg.ServiceSettings.ResetSalt))
data["domain"] = team.Domain data["name"] = team.Name
if _, err := Client.ResetPassword(data); err != nil { if _, err := Client.ResetPassword(data); err != nil {
t.Fatal(err) t.Fatal(err)
@@ -839,10 +839,10 @@ func TestResetPassword(t *testing.T) {
t.Fatal("Should have errored - bad domain") t.Fatal("Should have errored - bad domain")
} }
team2 := &model.Team{Name: "Name", Domain: "z-z-" + model.NewId() + "a", Email: "test2@nowhere.com", Type: model.TEAM_OPEN} team2 := &model.Team{DisplayName: "Name", Name: "z-z-" + model.NewId() + "a", Email: "test2@nowhere.com", Type: model.TEAM_OPEN}
team2 = Client.Must(Client.CreateTeam(team2)).Data.(*model.Team) team2 = Client.Must(Client.CreateTeam(team2)).Data.(*model.Team)
data["domain"] = team2.Domain data["domain"] = team2.Name
if _, err := Client.ResetPassword(data); err == nil { if _, err := Client.ResetPassword(data); err == nil {
t.Fatal("Should have errored - domain team doesn't match user team") t.Fatal("Should have errored - domain team doesn't match user team")
} }
@@ -851,7 +851,7 @@ func TestResetPassword(t *testing.T) {
func TestUserUpdateNotify(t *testing.T) { func TestUserUpdateNotify(t *testing.T) {
Setup() Setup()
team := &model.Team{Name: "Name", Domain: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN} team := &model.Team{DisplayName: "Name", Name: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN}
team = Client.Must(Client.CreateTeam(team)).Data.(*model.Team) team = Client.Must(Client.CreateTeam(team)).Data.(*model.Team)
user := &model.User{TeamId: team.Id, Email: strings.ToLower(model.NewId()) + "corey@test.com", Nickname: "Corey Hulen", Password: "pwd", Roles: ""} user := &model.User{TeamId: team.Id, Email: strings.ToLower(model.NewId()) + "corey@test.com", Nickname: "Corey Hulen", Password: "pwd", Roles: ""}
@@ -868,7 +868,7 @@ func TestUserUpdateNotify(t *testing.T) {
t.Fatal("Should have errored - not logged in") t.Fatal("Should have errored - not logged in")
} }
Client.LoginByEmail(team.Domain, user.Email, "pwd") Client.LoginByEmail(team.Name, user.Email, "pwd")
if result, err := Client.UpdateUserNotify(data); err != nil { if result, err := Client.UpdateUserNotify(data); err != nil {
t.Fatal(err) t.Fatal(err)
@@ -919,7 +919,7 @@ func TestUserUpdateNotify(t *testing.T) {
func TestFuzzyUserCreate(t *testing.T) { func TestFuzzyUserCreate(t *testing.T) {
team := model.Team{Name: "Name", Domain: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN} team := model.Team{DisplayName: "Name", Name: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN}
rteam, _ := Client.CreateTeam(&team) rteam, _ := Client.CreateTeam(&team)
for i := 0; i < len(utils.FUZZY_STRINGS_NAMES) || i < len(utils.FUZZY_STRINGS_EMAILS); i++ { for i := 0; i < len(utils.FUZZY_STRINGS_NAMES) || i < len(utils.FUZZY_STRINGS_EMAILS); i++ {
@@ -945,14 +945,14 @@ func TestFuzzyUserCreate(t *testing.T) {
func TestStatuses(t *testing.T) { func TestStatuses(t *testing.T) {
Setup() Setup()
team := model.Team{Name: "Name", Domain: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN} team := model.Team{DisplayName: "Name", Name: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN}
rteam, _ := Client.CreateTeam(&team) rteam, _ := Client.CreateTeam(&team)
user := model.User{TeamId: rteam.Data.(*model.Team).Id, Email: strings.ToLower(model.NewId()) + "corey@test.com", Nickname: "Corey Hulen", Password: "pwd"} user := model.User{TeamId: rteam.Data.(*model.Team).Id, Email: strings.ToLower(model.NewId()) + "corey@test.com", Nickname: "Corey Hulen", Password: "pwd"}
ruser := Client.Must(Client.CreateUser(&user, "")).Data.(*model.User) ruser := Client.Must(Client.CreateUser(&user, "")).Data.(*model.User)
store.Must(Srv.Store.User().VerifyEmail(ruser.Id)) store.Must(Srv.Store.User().VerifyEmail(ruser.Id))
Client.LoginByEmail(team.Domain, user.Email, user.Password) Client.LoginByEmail(team.Name, user.Email, user.Password)
r1, err := Client.GetStatuses() r1, err := Client.GetStatuses()
if err != nil { if err != nil {

Просмотреть файл

@@ -17,13 +17,13 @@ func TestSocket(t *testing.T) {
Setup() Setup()
url := "ws://localhost:" + utils.Cfg.ServiceSettings.Port + "/api/v1/websocket" url := "ws://localhost:" + utils.Cfg.ServiceSettings.Port + "/api/v1/websocket"
team := &model.Team{Name: "Name", Domain: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN} team := &model.Team{DisplayName: "Name", Name: "z-z-" + model.NewId() + "a", Email: "test@nowhere.com", Type: model.TEAM_OPEN}
team = Client.Must(Client.CreateTeam(team)).Data.(*model.Team) team = Client.Must(Client.CreateTeam(team)).Data.(*model.Team)
user1 := &model.User{TeamId: team.Id, Email: model.NewId() + "corey@test.com", Nickname: "Corey Hulen", Password: "pwd"} user1 := &model.User{TeamId: team.Id, Email: model.NewId() + "corey@test.com", Nickname: "Corey Hulen", Password: "pwd"}
user1 = Client.Must(Client.CreateUser(user1, "")).Data.(*model.User) user1 = Client.Must(Client.CreateUser(user1, "")).Data.(*model.User)
store.Must(Srv.Store.User().VerifyEmail(user1.Id)) store.Must(Srv.Store.User().VerifyEmail(user1.Id))
Client.LoginByEmail(team.Domain, user1.Email, "pwd") Client.LoginByEmail(team.Name, user1.Email, "pwd")
channel1 := &model.Channel{DisplayName: "Test Web Scoket 1", Name: "a" + model.NewId() + "a", Type: model.CHANNEL_OPEN, TeamId: team.Id} channel1 := &model.Channel{DisplayName: "Test Web Scoket 1", Name: "a" + model.NewId() + "a", Type: model.CHANNEL_OPEN, TeamId: team.Id}
channel1 = Client.Must(Client.CreateChannel(channel1)).Data.(*model.Channel) channel1 = Client.Must(Client.CreateChannel(channel1)).Data.(*model.Channel)
@@ -42,7 +42,7 @@ func TestSocket(t *testing.T) {
user2 := &model.User{TeamId: team.Id, Email: model.NewId() + "corey@test.com", Nickname: "Corey Hulen", Password: "pwd"} user2 := &model.User{TeamId: team.Id, Email: model.NewId() + "corey@test.com", Nickname: "Corey Hulen", Password: "pwd"}
user2 = Client.Must(Client.CreateUser(user2, "")).Data.(*model.User) user2 = Client.Must(Client.CreateUser(user2, "")).Data.(*model.User)
store.Must(Srv.Store.User().VerifyEmail(user2.Id)) store.Must(Srv.Store.User().VerifyEmail(user2.Id))
Client.LoginByEmail(team.Domain, user2.Email, "pwd") Client.LoginByEmail(team.Name, user2.Email, "pwd")
header2 := http.Header{} header2 := http.Header{}
header2.Set(model.HEADER_AUTH, "BEARER "+Client.AuthToken) header2.Set(model.HEADER_AUTH, "BEARER "+Client.AuthToken)

Просмотреть файл

@@ -9,7 +9,6 @@
}, },
"ServiceSettings": { "ServiceSettings": {
"SiteName": "Mattermost", "SiteName": "Mattermost",
"Domain": "xxxxxxmustbefilledin.com",
"Mode" : "dev", "Mode" : "dev",
"AllowTesting" : false, "AllowTesting" : false,
"UseSSL": false, "UseSSL": false,
@@ -35,11 +34,7 @@
"S3AccessKeyId": "", "S3AccessKeyId": "",
"S3SecretAccessKey": "", "S3SecretAccessKey": "",
"S3Bucket": "", "S3Bucket": "",
"S3Region": "", "S3Region": ""
"Route53AccessKeyId": "",
"Route53SecretAccessKey": "",
"Route53ZoneId": "",
"Route53Region": ""
}, },
"ImageSettings": { "ImageSettings": {
"ThumbnailWidth": 200, "ThumbnailWidth": 200,

Просмотреть файл

@@ -9,7 +9,6 @@
}, },
"ServiceSettings": { "ServiceSettings": {
"SiteName": "Mattermost", "SiteName": "Mattermost",
"Domain": "",
"Mode" : "dev", "Mode" : "dev",
"AllowTesting" : false, "AllowTesting" : false,
"UseSSL": false, "UseSSL": false,
@@ -35,11 +34,7 @@
"S3AccessKeyId": "", "S3AccessKeyId": "",
"S3SecretAccessKey": "", "S3SecretAccessKey": "",
"S3Bucket": "", "S3Bucket": "",
"S3Region": "", "S3Region": ""
"Route53AccessKeyId": "",
"Route53SecretAccessKey": "",
"Route53ZoneId": "",
"Route53Region": ""
}, },
"ImageSettings": { "ImageSettings": {
"ThumbnailWidth": 200, "ThumbnailWidth": 200,

Просмотреть файл

@@ -57,17 +57,17 @@ func manualTest(c *api.Context, w http.ResponseWriter, r *http.Request) {
// Check for username parameter and create a user if present // Check for username parameter and create a user if present
username, ok1 := params["username"] username, ok1 := params["username"]
teamname, ok2 := params["teamname"] teamDisplayName, ok2 := params["teamname"]
var teamID string var teamID string
var userID string var userID string
if ok1 && ok2 { if ok1 && ok2 {
l4g.Info("Creating user and team") l4g.Info("Creating user and team")
// Create team for testing // Create team for testing
team := &model.Team{ team := &model.Team{
Name: teamname[0], DisplayName: teamDisplayName[0],
Domain: utils.RandomName(utils.Range{20, 20}, utils.LOWERCASE), Name: utils.RandomName(utils.Range{20, 20}, utils.LOWERCASE),
Email: utils.RandomEmail(utils.Range{20, 20}, utils.LOWERCASE), Email: utils.RandomEmail(utils.Range{20, 20}, utils.LOWERCASE),
Type: model.TEAM_OPEN, Type: model.TEAM_OPEN,
} }
if result := <-api.Srv.Store.Team().Save(team); result.Err != nil { if result := <-api.Srv.Store.Team().Save(team); result.Err != nil {

Просмотреть файл

@@ -98,10 +98,10 @@ func (c *Client) Must(result *Result, err *AppError) *Result {
return result return result
} }
func (c *Client) SignupTeam(email string, name string) (*Result, *AppError) { func (c *Client) SignupTeam(email string, displayName string) (*Result, *AppError) {
m := make(map[string]string) m := make(map[string]string)
m["email"] = email m["email"] = email
m["name"] = name m["display_name"] = displayName
if r, err := c.DoPost("/teams/signup", MapToJson(m)); err != nil { if r, err := c.DoPost("/teams/signup", MapToJson(m)); err != nil {
return nil, err return nil, err
} else { } else {
@@ -128,11 +128,11 @@ func (c *Client) CreateTeam(team *Team) (*Result, *AppError) {
} }
} }
func (c *Client) FindTeamByDomain(domain string, allServers bool) (*Result, *AppError) { func (c *Client) FindTeamByName(name string, allServers bool) (*Result, *AppError) {
m := make(map[string]string) m := make(map[string]string)
m["domain"] = domain m["name"] = name
m["all"] = fmt.Sprintf("%v", allServers) m["all"] = fmt.Sprintf("%v", allServers)
if r, err := c.DoPost("/teams/find_team_by_domain", MapToJson(m)); err != nil { if r, err := c.DoPost("/teams/find_team_by_name", MapToJson(m)); err != nil {
return nil, err return nil, err
} else { } else {
val := false val := false
@@ -177,7 +177,7 @@ func (c *Client) InviteMembers(invites *Invites) (*Result, *AppError) {
} }
} }
func (c *Client) UpdateTeamName(data map[string]string) (*Result, *AppError) { func (c *Client) UpdateTeamDisplayName(data map[string]string) (*Result, *AppError) {
if r, err := c.DoPost("/teams/update_name", MapToJson(data)); err != nil { if r, err := c.DoPost("/teams/update_name", MapToJson(data)); err != nil {
return nil, err return nil, err
} else { } else {
@@ -247,17 +247,17 @@ func (c *Client) LoginById(id string, password string) (*Result, *AppError) {
return c.login(m) return c.login(m)
} }
func (c *Client) LoginByEmail(domain string, email string, password string) (*Result, *AppError) { func (c *Client) LoginByEmail(name string, email string, password string) (*Result, *AppError) {
m := make(map[string]string) m := make(map[string]string)
m["domain"] = domain m["name"] = name
m["email"] = email m["email"] = email
m["password"] = password m["password"] = password
return c.login(m) return c.login(m)
} }
func (c *Client) LoginByEmailWithDevice(domain string, email string, password string, deviceId string) (*Result, *AppError) { func (c *Client) LoginByEmailWithDevice(name string, email string, password string, deviceId string) (*Result, *AppError) {
m := make(map[string]string) m := make(map[string]string)
m["domain"] = domain m["name"] = name
m["email"] = email m["email"] = email
m["password"] = password m["password"] = password
m["device_id"] = deviceId m["device_id"] = deviceId

Просмотреть файл

@@ -18,8 +18,8 @@ type Team struct {
CreateAt int64 `json:"create_at"` CreateAt int64 `json:"create_at"`
UpdateAt int64 `json:"update_at"` UpdateAt int64 `json:"update_at"`
DeleteAt int64 `json:"delete_at"` DeleteAt int64 `json:"delete_at"`
DisplayName string `json:"display_name"`
Name string `json:"name"` Name string `json:"name"`
Domain string `json:"domain"`
Email string `json:"email"` Email string `json:"email"`
Type string `json:"type"` Type string `json:"type"`
CompanyName string `json:"company_name"` CompanyName string `json:"company_name"`
@@ -97,20 +97,20 @@ func (o *Team) IsValid() *AppError {
return NewAppError("Team.IsValid", "Invalid email", "id="+o.Id) return NewAppError("Team.IsValid", "Invalid email", "id="+o.Id)
} }
if len(o.Name) > 64 { if len(o.DisplayName) > 64 {
return NewAppError("Team.IsValid", "Invalid name", "id="+o.Id) return NewAppError("Team.IsValid", "Invalid name", "id="+o.Id)
} }
if len(o.Domain) > 64 { if len(o.Name) > 64 {
return NewAppError("Team.IsValid", "Invalid domain", "id="+o.Id) return NewAppError("Team.IsValid", "Invalid URL Identifier", "id="+o.Id)
} }
if IsReservedDomain(o.Domain) { if IsReservedTeamName(o.Name) {
return NewAppError("Team.IsValid", "This URL is unavailable. Please try another.", "id="+o.Id) return NewAppError("Team.IsValid", "This URL is unavailable. Please try another.", "id="+o.Id)
} }
if !IsValidDomain(o.Domain) { if !IsValidTeamName(o.Name) {
return NewAppError("Team.IsValid", "Domain must be 4 or more lowercase alphanumeric characters", "id="+o.Id) return NewAppError("Team.IsValid", "Name must be 4 or more lowercase alphanumeric characters", "id="+o.Id)
} }
if !(o.Type == TEAM_OPEN || o.Type == TEAM_INVITE) { if !(o.Type == TEAM_OPEN || o.Type == TEAM_INVITE) {

Просмотреть файл

@@ -9,7 +9,7 @@ import (
) )
func TestTeamSignupJson(t *testing.T) { func TestTeamSignupJson(t *testing.T) {
team := Team{Id: NewId(), Name: NewId()} team := Team{Id: NewId(), DisplayName: NewId()}
o := TeamSignup{Team: team, Data: "data"} o := TeamSignup{Team: team, Data: "data"}
json := o.ToJson() json := o.ToJson()
ro := TeamSignupFromJson(strings.NewReader(json)) ro := TeamSignupFromJson(strings.NewReader(json))

Просмотреть файл

@@ -9,7 +9,7 @@ import (
) )
func TestTeamJson(t *testing.T) { func TestTeamJson(t *testing.T) {
o := Team{Id: NewId(), Name: NewId()} o := Team{Id: NewId(), DisplayName: NewId()}
json := o.ToJson() json := o.ToJson()
ro := TeamFromJson(strings.NewReader(json)) ro := TeamFromJson(strings.NewReader(json))
@@ -46,18 +46,18 @@ func TestTeamIsValid(t *testing.T) {
} }
o.Email = "corey@hulen.com" o.Email = "corey@hulen.com"
o.Name = strings.Repeat("01234567890", 20) o.DisplayName = strings.Repeat("01234567890", 20)
if err := o.IsValid(); err == nil { if err := o.IsValid(); err == nil {
t.Fatal("should be invalid") t.Fatal("should be invalid")
} }
o.Name = "1234" o.DisplayName = "1234"
o.Domain = "ZZZZZZZ" o.Name = "ZZZZZZZ"
if err := o.IsValid(); err == nil { if err := o.IsValid(); err == nil {
t.Fatal("should be invalid") t.Fatal("should be invalid")
} }
o.Domain = "zzzzz" o.Name = "zzzzz"
o.Type = TEAM_OPEN o.Type = TEAM_OPEN
if err := o.IsValid(); err != nil { if err := o.IsValid(); err != nil {
t.Fatal(err) t.Fatal(err)
@@ -65,12 +65,12 @@ func TestTeamIsValid(t *testing.T) {
} }
func TestTeamPreSave(t *testing.T) { func TestTeamPreSave(t *testing.T) {
o := Team{Name: "test"} o := Team{DisplayName: "test"}
o.PreSave() o.PreSave()
o.Etag() o.Etag()
} }
func TestTeamPreUpdate(t *testing.T) { func TestTeamPreUpdate(t *testing.T) {
o := Team{Name: "test"} o := Team{DisplayName: "test"}
o.PreUpdate() o.PreUpdate()
} }

Просмотреть файл

@@ -148,7 +148,7 @@ func IsValidEmail(email string) bool {
return false return false
} }
var reservedDomains = []string{ var reservedName = []string{
"www", "www",
"web", "web",
"admin", "admin",
@@ -168,10 +168,10 @@ var reservedDomains = []string{
"api", "api",
} }
func IsReservedDomain(s string) bool { func IsReservedTeamName(s string) bool {
s = strings.ToLower(s) s = strings.ToLower(s)
for _, value := range reservedDomains { for _, value := range reservedName {
if strings.Index(s, value) == 0 { if strings.Index(s, value) == 0 {
return true return true
} }
@@ -180,7 +180,7 @@ func IsReservedDomain(s string) bool {
return false return false
} }
func IsValidDomain(s string) bool { func IsValidTeamName(s string) bool {
if !IsValidAlphaNum(s) { if !IsValidAlphaNum(s) {
return false return false

Просмотреть файл

@@ -83,9 +83,9 @@ var domains = []struct {
{"test", true}, {"test", true},
} }
func TestValidDomain(t *testing.T) { func TestValidTeamName(t *testing.T) {
for _, v := range domains { for _, v := range domains {
if IsValidDomain(v.value) != v.expected { if IsValidTeamName(v.value) != v.expected {
t.Errorf("expect %v as %v", v.value, v.expected) t.Errorf("expect %v as %v", v.value, v.expected)
} }
} }
@@ -102,9 +102,9 @@ var tReservedDomains = []struct {
{"spin-punch-admin", false}, {"spin-punch-admin", false},
} }
func TestReservedDomain(t *testing.T) { func TestReservedTeamName(t *testing.T) {
for _, v := range tReservedDomains { for _, v := range tReservedDomains {
if IsReservedDomain(v.value) != v.expected { if IsReservedTeamName(v.value) != v.expected {
t.Errorf("expect %v as %v", v.value, v.expected) t.Errorf("expect %v as %v", v.value, v.expected)
} }
} }

Просмотреть файл

@@ -19,8 +19,8 @@ func NewSqlTeamStore(sqlStore *SqlStore) TeamStore {
for _, db := range sqlStore.GetAllConns() { for _, db := range sqlStore.GetAllConns() {
table := db.AddTableWithName(model.Team{}, "Teams").SetKeys(false, "Id") table := db.AddTableWithName(model.Team{}, "Teams").SetKeys(false, "Id")
table.ColMap("Id").SetMaxSize(26) table.ColMap("Id").SetMaxSize(26)
table.ColMap("Name").SetMaxSize(64) table.ColMap("DisplayName").SetMaxSize(64)
table.ColMap("Domain").SetMaxSize(64).SetUnique(true) table.ColMap("Name").SetMaxSize(64).SetUnique(true)
table.ColMap("Email").SetMaxSize(128) table.ColMap("Email").SetMaxSize(128)
table.ColMap("CompanyName").SetMaxSize(64) table.ColMap("CompanyName").SetMaxSize(64)
table.ColMap("AllowedDomains").SetMaxSize(500) table.ColMap("AllowedDomains").SetMaxSize(500)
@@ -35,6 +35,10 @@ func (s SqlTeamStore) UpgradeSchemaIfNeeded() {
defaultValue = "1" defaultValue = "1"
} }
s.CreateColumnIfNotExists("Teams", "AllowValet", "AllowedDomains", "tinyint(1)", defaultValue) s.CreateColumnIfNotExists("Teams", "AllowValet", "AllowedDomains", "tinyint(1)", defaultValue)
if !s.DoesColumnExist("Teams", "DisplayName") {
s.RenameColumnIfExists("Teams", "Name", "DisplayName", "varchar(64)")
s.RenameColumnIfExists("Teams", "Domain", "Name", "varchar(64)")
}
} }
func (s SqlTeamStore) CreateIndexesIfNotExists() { func (s SqlTeamStore) CreateIndexesIfNotExists() {
@@ -62,7 +66,7 @@ func (s SqlTeamStore) Save(team *model.Team) StoreChannel {
} }
if err := s.GetMaster().Insert(team); err != nil { if err := s.GetMaster().Insert(team); err != nil {
if strings.Contains(err.Error(), "Duplicate entry") && strings.Contains(err.Error(), "for key 'Domain'") { if strings.Contains(err.Error(), "Duplicate entry") && strings.Contains(err.Error(), "for key 'Name'") {
result.Err = model.NewAppError("SqlTeamStore.Save", "A team with that domain already exists", "id="+team.Id+", "+err.Error()) result.Err = model.NewAppError("SqlTeamStore.Save", "A team with that domain already exists", "id="+team.Id+", "+err.Error())
} else { } else {
result.Err = model.NewAppError("SqlTeamStore.Save", "We couldn't save the team", "id="+team.Id+", "+err.Error()) result.Err = model.NewAppError("SqlTeamStore.Save", "We couldn't save the team", "id="+team.Id+", "+err.Error())
@@ -100,7 +104,7 @@ func (s SqlTeamStore) Update(team *model.Team) StoreChannel {
} else { } else {
oldTeam := oldResult.(*model.Team) oldTeam := oldResult.(*model.Team)
team.CreateAt = oldTeam.CreateAt team.CreateAt = oldTeam.CreateAt
team.Domain = oldTeam.Domain team.Name = oldTeam.Name
if count, err := s.GetMaster().Update(team); err != nil { if count, err := s.GetMaster().Update(team); err != nil {
result.Err = model.NewAppError("SqlTeamStore.Update", "We encounted an error updating the team", "id="+team.Id+", "+err.Error()) result.Err = model.NewAppError("SqlTeamStore.Update", "We encounted an error updating the team", "id="+team.Id+", "+err.Error())
@@ -118,15 +122,15 @@ func (s SqlTeamStore) Update(team *model.Team) StoreChannel {
return storeChannel return storeChannel
} }
func (s SqlTeamStore) UpdateName(name string, teamId string) StoreChannel { func (s SqlTeamStore) UpdateDisplayName(name string, teamId string) StoreChannel {
storeChannel := make(StoreChannel) storeChannel := make(StoreChannel)
go func() { go func() {
result := StoreResult{} result := StoreResult{}
if _, err := s.GetMaster().Exec("UPDATE Teams SET Name = ? WHERE Id = ?", name, teamId); err != nil { if _, err := s.GetMaster().Exec("UPDATE Teams SET DisplayName = ? WHERE Id = ?", name, teamId); err != nil {
result.Err = model.NewAppError("SqlTeamStore.UpdateName", "We couldn't update the team name", "team_id="+teamId) result.Err = model.NewAppError("SqlTeamStore.UpdateDisplayName", "We couldn't update the team name", "team_id="+teamId)
} else { } else {
result.Data = teamId result.Data = teamId
} }
@@ -159,7 +163,7 @@ func (s SqlTeamStore) Get(id string) StoreChannel {
return storeChannel return storeChannel
} }
func (s SqlTeamStore) GetByDomain(domain string) StoreChannel { func (s SqlTeamStore) GetByName(name string) StoreChannel {
storeChannel := make(StoreChannel) storeChannel := make(StoreChannel)
go func() { go func() {
@@ -167,8 +171,8 @@ func (s SqlTeamStore) GetByDomain(domain string) StoreChannel {
team := model.Team{} team := model.Team{}
if err := s.GetReplica().SelectOne(&team, "SELECT * FROM Teams WHERE Domain=?", domain); err != nil { if err := s.GetReplica().SelectOne(&team, "SELECT * FROM Teams WHERE Name=?", name); err != nil {
result.Err = model.NewAppError("SqlTeamStore.GetByDomain", "We couldn't find the existing team", "domain="+domain+", "+err.Error()) result.Err = model.NewAppError("SqlTeamStore.GetByName", "We couldn't find the existing team", "name="+name+", "+err.Error())
} }
result.Data = &team result.Data = &team

Просмотреть файл

@@ -13,8 +13,8 @@ func TestTeamStoreSave(t *testing.T) {
Setup() Setup()
o1 := model.Team{} o1 := model.Team{}
o1.Name = "Name" o1.DisplayName = "DisplayName"
o1.Domain = "a" + model.NewId() + "b" o1.Name = "a" + model.NewId() + "b"
o1.Email = model.NewId() + "@nowhere.com" o1.Email = model.NewId() + "@nowhere.com"
o1.Type = model.TEAM_OPEN o1.Type = model.TEAM_OPEN
@@ -36,8 +36,8 @@ func TestTeamStoreUpdate(t *testing.T) {
Setup() Setup()
o1 := model.Team{} o1 := model.Team{}
o1.Name = "Name" o1.DisplayName = "DisplayName"
o1.Domain = "a" + model.NewId() + "b" o1.Name = "a" + model.NewId() + "b"
o1.Email = model.NewId() + "@nowhere.com" o1.Email = model.NewId() + "@nowhere.com"
o1.Type = model.TEAM_OPEN o1.Type = model.TEAM_OPEN
if err := (<-store.Team().Save(&o1)).Err; err != nil { if err := (<-store.Team().Save(&o1)).Err; err != nil {
@@ -61,25 +61,25 @@ func TestTeamStoreUpdate(t *testing.T) {
} }
} }
func TestTeamStoreUpdateName(t *testing.T) { func TestTeamStoreUpdateDisplayName(t *testing.T) {
Setup() Setup()
o1 := &model.Team{} o1 := &model.Team{}
o1.Name = "Name" o1.DisplayName = "Display Name"
o1.Domain = "a" + model.NewId() + "b" o1.Name = "a" + model.NewId() + "b"
o1.Email = model.NewId() + "@nowhere.com" o1.Email = model.NewId() + "@nowhere.com"
o1.Type = model.TEAM_OPEN o1.Type = model.TEAM_OPEN
o1 = (<-store.Team().Save(o1)).Data.(*model.Team) o1 = (<-store.Team().Save(o1)).Data.(*model.Team)
newName := "NewName" newDisplayName := "NewDisplayName"
if err := (<-store.Team().UpdateName(newName, o1.Id)).Err; err != nil { if err := (<-store.Team().UpdateDisplayName(newDisplayName, o1.Id)).Err; err != nil {
t.Fatal(err) t.Fatal(err)
} }
ro1 := (<-store.Team().Get(o1.Id)).Data.(*model.Team) ro1 := (<-store.Team().Get(o1.Id)).Data.(*model.Team)
if ro1.Name != newName { if ro1.DisplayName != newDisplayName {
t.Fatal("Name not updated") t.Fatal("DisplayName not updated")
} }
} }
@@ -87,8 +87,8 @@ func TestTeamStoreGet(t *testing.T) {
Setup() Setup()
o1 := model.Team{} o1 := model.Team{}
o1.Name = "Name" o1.DisplayName = "DisplayName"
o1.Domain = "a" + model.NewId() + "b" o1.Name = "a" + model.NewId() + "b"
o1.Email = model.NewId() + "@nowhere.com" o1.Email = model.NewId() + "@nowhere.com"
o1.Type = model.TEAM_OPEN o1.Type = model.TEAM_OPEN
Must(store.Team().Save(&o1)) Must(store.Team().Save(&o1))
@@ -106,12 +106,12 @@ func TestTeamStoreGet(t *testing.T) {
} }
} }
func TestTeamStoreGetByDomain(t *testing.T) { func TestTeamStoreGetByName(t *testing.T) {
Setup() Setup()
o1 := model.Team{} o1 := model.Team{}
o1.Name = "Name" o1.DisplayName = "DisplayName"
o1.Domain = "a" + model.NewId() + "b" o1.Name = "a" + model.NewId() + "b"
o1.Email = model.NewId() + "@nowhere.com" o1.Email = model.NewId() + "@nowhere.com"
o1.Type = model.TEAM_OPEN o1.Type = model.TEAM_OPEN
@@ -119,7 +119,7 @@ func TestTeamStoreGetByDomain(t *testing.T) {
t.Fatal(err) t.Fatal(err)
} }
if r1 := <-store.Team().GetByDomain(o1.Domain); r1.Err != nil { if r1 := <-store.Team().GetByName(o1.Name); r1.Err != nil {
t.Fatal(r1.Err) t.Fatal(r1.Err)
} else { } else {
if r1.Data.(*model.Team).ToJson() != o1.ToJson() { if r1.Data.(*model.Team).ToJson() != o1.ToJson() {
@@ -127,7 +127,7 @@ func TestTeamStoreGetByDomain(t *testing.T) {
} }
} }
if err := (<-store.Team().GetByDomain("")).Err; err == nil { if err := (<-store.Team().GetByName("")).Err; err == nil {
t.Fatal("Missing id should have failed") t.Fatal("Missing id should have failed")
} }
} }
@@ -136,8 +136,8 @@ func TestTeamStoreGetForEmail(t *testing.T) {
Setup() Setup()
o1 := model.Team{} o1 := model.Team{}
o1.Name = "Name" o1.DisplayName = "DisplayName"
o1.Domain = "a" + model.NewId() + "b" o1.Name = "a" + model.NewId() + "b"
o1.Email = model.NewId() + "@nowhere.com" o1.Email = model.NewId() + "@nowhere.com"
o1.Type = model.TEAM_OPEN o1.Type = model.TEAM_OPEN
Must(store.Team().Save(&o1)) Must(store.Team().Save(&o1))

Просмотреть файл

@@ -36,9 +36,9 @@ type Store interface {
type TeamStore interface { type TeamStore interface {
Save(team *model.Team) StoreChannel Save(team *model.Team) StoreChannel
Update(team *model.Team) StoreChannel Update(team *model.Team) StoreChannel
UpdateName(name string, teamId string) StoreChannel UpdateDisplayName(name string, teamId string) StoreChannel
Get(id string) StoreChannel Get(id string) StoreChannel
GetByDomain(domain string) StoreChannel GetByName(name string) StoreChannel
GetTeamsForEmail(domain string) StoreChannel GetTeamsForEmail(domain string) StoreChannel
} }

Просмотреть файл

@@ -19,13 +19,11 @@ const (
type ServiceSettings struct { type ServiceSettings struct {
SiteName string SiteName string
Domain string
Mode string Mode string
AllowTesting bool AllowTesting bool
UseSSL bool UseSSL bool
Port string Port string
Version string Version string
Shards map[string]string
InviteSalt string InviteSalt string
PublicLinkSalt string PublicLinkSalt string
ResetSalt string ResetSalt string
@@ -52,14 +50,10 @@ type LogSettings struct {
} }
type AWSSettings struct { type AWSSettings struct {
S3AccessKeyId string S3AccessKeyId string
S3SecretAccessKey string S3SecretAccessKey string
S3Bucket string S3Bucket string
S3Region string S3Region string
Route53AccessKeyId string
Route53SecretAccessKey string
Route53ZoneId string
Route53Region string
} }
type ImageSettings struct { type ImageSettings struct {
@@ -213,18 +207,10 @@ func LoadConfig(fileName string) {
panic("Error decoding configuration " + err.Error()) panic("Error decoding configuration " + err.Error())
} }
// Grabs the domain from enviroment variable if not in configuration
if config.ServiceSettings.Domain == "" {
config.ServiceSettings.Domain = os.Getenv("MATTERMOST_DOMAIN")
// If the enviroment variable is not set, use a default
if config.ServiceSettings.Domain == "" {
config.ServiceSettings.Domain = "localhost"
}
}
// Check for a valid email for feedback, if not then do feedback@domain // Check for a valid email for feedback, if not then do feedback@domain
if _, err := mail.ParseAddress(config.EmailSettings.FeedbackEmail); err != nil { if _, err := mail.ParseAddress(config.EmailSettings.FeedbackEmail); err != nil {
config.EmailSettings.FeedbackEmail = "feedback@" + config.ServiceSettings.Domain config.EmailSettings.FeedbackEmail = "feedback@localhost"
l4g.Error("Misconfigured feedback email setting: %s", config.EmailSettings.FeedbackEmail)
} }
configureLog(config.LogSettings) configureLog(config.LogSettings)

Просмотреть файл

@@ -4,24 +4,9 @@
package utils package utils
import ( import (
"os"
"testing" "testing"
) )
func TestConfig(t *testing.T) { func TestConfig(t *testing.T) {
LoadConfig("config.json") LoadConfig("config.json")
} }
func TestEnvOverride(t *testing.T) {
os.Setenv("MATTERMOST_DOMAIN", "testdomain.com")
LoadConfig("config_docker.json")
if Cfg.ServiceSettings.Domain != "testdomain.com" {
t.Fail()
}
LoadConfig("config.json")
if Cfg.ServiceSettings.Domain == "testdomain.com" {
t.Fail()
}
}

Просмотреть файл

@@ -12,7 +12,7 @@ module.exports = React.createClass({
Client.deleteChannel(this.state.channel_id, Client.deleteChannel(this.state.channel_id,
function(data) { function(data) {
AsyncClient.getChannels(true); AsyncClient.getChannels(true);
window.location.href = '/channels/town-square'; window.location.href = '/';
}.bind(this), }.bind(this),
function(err) { function(err) {
AsyncClient.dispatchError(err, "handleDelete"); AsyncClient.dispatchError(err, "handleDelete");

Просмотреть файл

@@ -1,102 +1,21 @@
// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. // Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved.
// See License.txt for license information. // See License.txt for license information.
var utils = require('../utils/utils.jsx'); var utils = require('../utils/utils.jsx');
var client = require('../utils/client.jsx'); var client = require('../utils/client.jsx');
var UserStore = require('../stores/user_store.jsx'); var UserStore = require('../stores/user_store.jsx');
var TeamStore = require('../stores/team_store.jsx');
var BrowserStore = require('../stores/browser_store.jsx'); var BrowserStore = require('../stores/browser_store.jsx');
var Constants = require('../utils/constants.jsx');
var FindTeamDomain = React.createClass({
handleSubmit: function(e) {
e.preventDefault();
var state = { }
var domain = this.refs.domain.getDOMNode().value.trim();
if (!domain) {
state.server_error = "A domain is required"
this.setState(state);
return;
}
if (!BrowserStore.isLocalStorageSupported()) {
state.server_error = "This service requires local storage to be enabled. Please enable it or exit private browsing.";
this.setState(state);
return;
}
state.server_error = "";
this.setState(state);
client.findTeamByDomain(domain,
function(data) {
console.log(data);
if (data) {
window.location.href = window.location.protocol + "//" + domain + "." + utils.getDomainWithOutSub();
}
else {
this.state.server_error = "We couldn't find your " + strings.Team + ".";
this.setState(this.state);
}
}.bind(this),
function(err) {
this.state.server_error = err.message;
this.setState(this.state);
}.bind(this)
);
},
getInitialState: function() {
return { };
},
render: function() {
var server_error = this.state.server_error ? <label className="control-label">{this.state.server_error}</label> : null;
return (
<div className="signup-team__container">
<div>
<span className="signup-team__name">{ config.SiteName }</span>
<br/>
<span className="signup-team__subdomain">Enter your {strings.Team}'s domain.</span>
<br/>
<br/>
</div>
<form onSubmit={this.handleSubmit}>
<div className={server_error ? 'form-group has-error' : 'form-group'}>
{ server_error }
<input type="text" className="form-control" name="domain" ref="domain" placeholder="team domain" />
</div>
<div className="form-group">
<button type="submit" className="btn btn-primary">Continue</button>
</div>
<div>
<span>Don't remember your {strings.Team}'s domain? <a href="/find_team">Find it here</a></span>
</div>
<br/>
<br/>
<br/>
<br/>
<br/>
<br/>
<div>
<span>{"Want to create your own " + strings.Team + "?"} <a href={utils.getHomeLink()} className="signup-team-login">Sign up now</a></span>
</div>
</form>
</div>
);
}
});
module.exports = React.createClass({ module.exports = React.createClass({
handleSubmit: function(e) { handleSubmit: function(e) {
e.preventDefault(); e.preventDefault();
var state = { } var state = { }
var domain = this.refs.domain.getDOMNode().value.trim(); var name = this.props.teamName
if (!domain) { if (!name) {
state.server_error = "A domain is required" state.server_error = "Bad team name"
this.setState(state); this.setState(state);
return; return;
} }
@@ -124,23 +43,22 @@ module.exports = React.createClass({
state.server_error = ""; state.server_error = "";
this.setState(state); this.setState(state);
client.loginByEmail(domain, email, password, client.loginByEmail(name, email, password,
function(data) { function(data) {
UserStore.setLastDomain(domain);
UserStore.setLastEmail(email);
UserStore.setCurrentUser(data); UserStore.setCurrentUser(data);
UserStore.setLastEmail(email);
var redirect = utils.getUrlParameter("redirect"); var redirect = utils.getUrlParameter("redirect");
if (redirect) { if (redirect) {
window.location.href = decodeURI(redirect); window.location.pathname = decodeURI(redirect);
} else { } else {
window.location.href = '/channels/town-square'; window.location.pathname = '/' + name + '/channels/town-square';
} }
}.bind(this), }.bind(this),
function(err) { function(err) {
if (err.message == "Login failed because email address has not been verified") { if (err.message == "Login failed because email address has not been verified") {
window.location.href = '/verify?domain=' + encodeURIComponent(domain) + '&email=' + encodeURIComponent(email); window.location.href = '/verify_email?name=' + encodeURIComponent(name) + '&email=' + encodeURIComponent(email);
return; return;
} }
state.server_error = err.message; state.server_error = err.message;
@@ -161,35 +79,35 @@ module.exports = React.createClass({
priorEmail = decodeURIComponent(emailParam); priorEmail = decodeURIComponent(emailParam);
} }
var subDomainClass = "form-control hidden"; var teamDisplayName = this.props.teamDisplayName;
var subDomain = utils.getSubDomain(); var teamName = this.props.teamName;
if (utils.isTestDomain()) { var focusEmail = false;
subDomainClass = "form-control"; var focusPassword = false;
subDomain = UserStore.getLastDomain(); if (priorEmail != "") {
} else if (subDomain == "") { focusPassword = true;
return (<FindTeamDomain />); } else {
focusEmail = true;
} }
return ( return (
<div className="signup-team__container"> <div className="signup-team__container">
<div> <div>
<span className="signup-team__name">{ subDomain }</span> <span className="signup-team__name">{ teamDisplayName }</span>
<br/> <br/>
<span className="signup-team__subdomain">{ utils.getDomainWithOutSub() }</span> <span className="signup-team__subdomain">/{ teamName }/</span>
<br/> <br/>
<br/> <br/>
</div> </div>
<form onSubmit={this.handleSubmit}> <form onSubmit={this.handleSubmit}>
<div className={server_error ? 'form-group has-error' : 'form-group'}> <div className={server_error ? 'form-group has-error' : 'form-group'}>
{ server_error } { server_error }
<input type="text" className={subDomainClass} name="domain" defaultValue={subDomain} ref="domain" placeholder="Domain" />
</div> </div>
<div className={server_error ? 'form-group has-error' : 'form-group'}> <div className={server_error ? 'form-group has-error' : 'form-group'}>
<input type="email" className="form-control" name="email" defaultValue={priorEmail} ref="email" placeholder="Email" /> <input autoFocus={focusEmail} type="email" className="form-control" name="email" defaultValue={priorEmail} ref="email" placeholder="Email" />
</div> </div>
<div className={server_error ? 'form-group has-error' : 'form-group'}> <div className={server_error ? 'form-group has-error' : 'form-group'}>
<input type="password" className="form-control" name="password" ref="password" placeholder="Password" /> <input autoFocus={focusPassword} type="password" className="form-control" name="password" ref="password" placeholder="Password" />
</div> </div>
<div className="form-group"> <div className="form-group">
<button type="submit" className="btn btn-primary">Sign in</button> <button type="submit" className="btn btn-primary">Sign in</button>
@@ -198,10 +116,10 @@ module.exports = React.createClass({
<span><a href="/find_team">{"Find other " + strings.TeamPlural}</a></span> <span><a href="/find_team">{"Find other " + strings.TeamPlural}</a></span>
</div> </div>
<div className="form-group"> <div className="form-group">
<a href="/reset_password">I forgot my password</a> <a href={"/" + teamName + "/reset_password"}>I forgot my password</a>
</div> </div>
<div className="external-link"> <div className="external-link">
<span>{"Want to create your own " + strings.Team + "?"} <a href={utils.getHomeLink()} className="signup-team-login">Sign up now</a></span> <span>{"Want to create your own " + strings.Team + "?"} <a href="/" className="signup-team-login">Sign up now</a></span>
</div> </div>
</form> </form>
</div> </div>

Просмотреть файл

@@ -51,7 +51,7 @@ module.exports = React.createClass({
}, },
render: function() { render: function() {
return ( return (
<span className="msg-typing">{ this.state.text }</span> <span className="msg-typing">{ this.state.text }</span>
); );
} }
}); });

Просмотреть файл

@@ -7,6 +7,7 @@ var client = require('../utils/client.jsx');
var AsyncClient = require('../utils/async_client.jsx'); var AsyncClient = require('../utils/async_client.jsx');
var UserStore = require('../stores/user_store.jsx'); var UserStore = require('../stores/user_store.jsx');
var ChannelStore = require('../stores/channel_store.jsx'); var ChannelStore = require('../stores/channel_store.jsx');
var TeamStore = require('../stores/team_store.jsx');
var UserProfile = require('./user_profile.jsx'); var UserProfile = require('./user_profile.jsx');
var MessageWrapper = require('./message_wrapper.jsx'); var MessageWrapper = require('./message_wrapper.jsx');
@@ -61,93 +62,6 @@ var NotifyCounts = React.createClass({
} }
}); });
var NavbarLoginForm = React.createClass({
handleSubmit: function(e) {
e.preventDefault();
var state = { };
var domain = this.refs.domain.getDOMNode().value.trim();
if (!domain) {
state.server_error = "A domain is required";
this.setState(state);
return;
}
var email = this.refs.email.getDOMNode().value.trim();
if (!email) {
state.server_error = "An email is required";
this.setState(state);
return;
}
var password = this.refs.password.getDOMNode().value.trim();
if (!password) {
state.server_error = "A password is required";
this.setState(state);
return;
}
state.server_error = "";
this.setState(state);
client.loginByEmail(domain, email, password,
function(data) {
UserStore.setLastDomain(domain);
UserStore.setLastEmail(email);
UserStore.setCurrentUser(data);
var redirect = utils.getUrlParameter("redirect");
if (redirect) {
window.location.href = decodeURI(redirect);
} else {
window.location.href = '/channels/town-square';
}
},
function(err) {
if (err.message == "Login failed because email address has not been verified") {
window.location.href = '/verify?domain=' + encodeURIComponent(domain) + '&email=' + encodeURIComponent(email);
return;
}
state.server_error = err.message;
this.valid = false;
this.setState(state);
}.bind(this)
);
},
getInitialState: function() {
return { };
},
render: function() {
var server_error = this.state.server_error ? <label className="control-label">{this.state.server_error}</label> : null;
var subDomain = utils.getSubDomain();
var subDomainClass = "form-control hidden";
if (subDomain == "") {
subDomain = UserStore.getLastDomain();
subDomainClass = "form-control";
}
return (
<form className="navbar-form navbar-right" onSubmit={this.handleSubmit}>
<a href="/find_team">Find your team</a>
<div className={server_error ? 'form-group has-error' : 'form-group'}>
{ server_error }
<input type="text" className={subDomainClass} name="domain" defaultValue={subDomain} ref="domain" placeholder="Domain" />
</div>
<div className={server_error ? 'form-group has-error' : 'form-group'}>
<input type="text" className="form-control" name="email" defaultValue={UserStore.getLastEmail()} ref="email" placeholder="Email" />
</div>
<div className={server_error ? 'form-group has-error' : 'form-group'}>
<input type="password" className="form-control" name="password" ref="password" placeholder="Password" />
</div>
<button type="submit" className="btn btn-default">Login</button>
</form>
);
}
});
function getStateFromStores() { function getStateFromStores() {
return { return {
channel: ChannelStore.getCurrent(), channel: ChannelStore.getCurrent(),
@@ -180,10 +94,10 @@ module.exports = React.createClass({
}, },
handleLeave: function(e) { handleLeave: function(e) {
client.leaveChannel(this.state.channel.id, client.leaveChannel(this.state.channel.id,
function() { function(data, text, req) {
AsyncClient.getChannels(true); AsyncClient.getChannels(true);
window.location.href = '/channels/town-square'; window.location.href = TeamStore.getCurrentTeamUrl() + '/channels/town-square';
}, }.bind(this),
function(err) { function(err) {
AsyncClient.dispatchError(err, "handleLeave"); AsyncClient.dispatchError(err, "handleLeave");
} }
@@ -229,7 +143,7 @@ module.exports = React.createClass({
var currentId = UserStore.getCurrentId(); var currentId = UserStore.getCurrentId();
var popoverContent = ""; var popoverContent = "";
var channelTitle = this.props.teamName; var channelTitle = this.props.teamDisplayName;
var isAdmin = false; var isAdmin = false;
var isDirect = false; var isDirect = false;
var description = "" var description = ""
@@ -333,14 +247,8 @@ module.exports = React.createClass({
<div className="navbar-brand"> <div className="navbar-brand">
<a href="/" className="heading">{ channelTitle }</a> <a href="/" className="heading">{ channelTitle }</a>
</div> </div>
: null } : "" }
</div> </div>
{ !currentId ?
<div className="collapse navbar-collapse" id="navbar-collapse-1">
<NavbarLoginForm />
</div>
: null
}
</div> </div>
</nav> </nav>
); );

Просмотреть файл

@@ -6,6 +6,8 @@ var utils = require('../utils/utils.jsx');
var client = require('../utils/client.jsx'); var client = require('../utils/client.jsx');
var asyncClient = require('../utils/async_client.jsx'); var asyncClient = require('../utils/async_client.jsx');
var UserStore = require('../stores/user_store.jsx'); var UserStore = require('../stores/user_store.jsx');
var TeamStore = require('../stores/team_store.jsx');
var Constants = require('../utils/constants.jsx');
module.exports = React.createClass({ module.exports = React.createClass({
handleSubmit: function(e) { handleSubmit: function(e) {
@@ -60,13 +62,13 @@ module.exports = React.createClass({
var self = this; var self = this;
client.createChannel(channel, client.createChannel(channel,
function(data) { function() {
this.refs.display_name.getDOMNode().value = ""; this.refs.display_name.getDOMNode().value = "";
this.refs.channel_name.getDOMNode().value = ""; this.refs.channel_name.getDOMNode().value = "";
this.refs.channel_desc.getDOMNode().value = ""; this.refs.channel_desc.getDOMNode().value = "";
$(self.refs.modal.getDOMNode()).modal('hide'); $(self.refs.modal.getDOMNode()).modal('hide');
window.location.href = "/channels/" + channel.name; window.location = TeamStore.getCurrentTeamUrl() + "/channels/" + channel.name;
asyncClient.getChannels(true); asyncClient.getChannels(true);
}.bind(this), }.bind(this),
function(err) { function(err) {

Просмотреть файл

@@ -10,13 +10,6 @@ SendResetPasswordLink = React.createClass({
e.preventDefault(); e.preventDefault();
var state = {}; var state = {};
var domain = this.refs.domain.getDOMNode().value.trim();
if (!domain) {
state.error = "A domain is required"
this.setState(state);
return;
}
var email = this.refs.email.getDOMNode().value.trim(); var email = this.refs.email.getDOMNode().value.trim();
if (!email) { if (!email) {
state.error = "Please enter a valid email address." state.error = "Please enter a valid email address."
@@ -29,17 +22,17 @@ SendResetPasswordLink = React.createClass({
data = {}; data = {};
data['email'] = email; data['email'] = email;
data['domain'] = domain; data['name'] = this.props.teamName;
client.sendPasswordReset(data, client.sendPasswordReset(data,
function(data) { function(data) {
this.setState({ error: null, update_text: <p>A password reset link has been sent to <b>{email}</b> for your <b>{this.props.teamName}</b> team on {config.SiteName}.com.</p>, more_update_text: "Please check your inbox." }); this.setState({ error: null, update_text: <p>A password reset link has been sent to <b>{email}</b> for your <b>{this.props.teamDisplayName}</b> team on {window.location.hostname}.</p>, more_update_text: "Please check your inbox." });
$(this.refs.reset_form.getDOMNode()).hide(); $(this.refs.reset_form.getDOMNode()).hide();
}.bind(this), }.bind(this),
function(err) { function(err) {
this.setState({ error: err.message, update_text: null, more_update_text: null }); this.setState({ error: err.message, update_text: null, more_update_text: null });
}.bind(this) }.bind(this)
); );
}, },
getInitialState: function() { getInitialState: function() {
return {}; return {};
@@ -48,24 +41,13 @@ SendResetPasswordLink = React.createClass({
var update_text = this.state.update_text ? <div className="reset-form alert alert-success">{this.state.update_text}{this.state.more_update_text}</div> : null; var update_text = this.state.update_text ? <div className="reset-form alert alert-success">{this.state.update_text}{this.state.more_update_text}</div> : null;
var error = this.state.error ? <div className="form-group has-error"><label className="control-label">{this.state.error}</label></div> : null; var error = this.state.error ? <div className="form-group has-error"><label className="control-label">{this.state.error}</label></div> : null;
var subDomain = utils.getSubDomain();
var subDomainClass = "form-control hidden";
if (subDomain == "") {
subDomain = UserStore.getLastDomain();
subDomainClass = "form-control";
}
return ( return (
<div className="col-sm-12"> <div className="col-sm-12">
<div className="signup-team__container"> <div className="signup-team__container">
<h3>Password Reset</h3> <h3>Password Reset</h3>
{ update_text } { update_text }
<form onSubmit={this.handleSendLink} ref="reset_form"> <form onSubmit={this.handleSendLink} ref="reset_form">
<p>{"To reset your password, enter the email address you used to sign up for " + this.props.teamName + "."}</p> <p>{"To reset your password, enter the email address you used to sign up for " + this.props.teamDisplayName + "."}</p>
<div className="form-group">
<input type="text" className={subDomainClass} name="domain" defaultValue={subDomain} ref="domain" placeholder="Domain" />
</div>
<div className={error ? 'form-group has-error' : 'form-group'}> <div className={error ? 'form-group has-error' : 'form-group'}>
<input type="text" className="form-control" name="email" ref="email" placeholder="Email" /> <input type="text" className="form-control" name="email" ref="email" placeholder="Email" />
</div> </div>
@@ -83,13 +65,6 @@ ResetPassword = React.createClass({
e.preventDefault(); e.preventDefault();
var state = {}; var state = {};
var domain = this.refs.domain.getDOMNode().value.trim();
if (!domain) {
state.error = "A domain is required"
this.setState(state);
return;
}
var password = this.refs.password.getDOMNode().value.trim(); var password = this.refs.password.getDOMNode().value.trim();
if (!password || password.length < 5) { if (!password || password.length < 5) {
state.error = "Please enter at least 5 characters." state.error = "Please enter at least 5 characters."
@@ -104,41 +79,30 @@ ResetPassword = React.createClass({
data['new_password'] = password; data['new_password'] = password;
data['hash'] = this.props.hash; data['hash'] = this.props.hash;
data['data'] = this.props.data; data['data'] = this.props.data;
data['domain'] = domain; data['name'] = this.props.teamName;
client.resetPassword(data, client.resetPassword(data,
function(data) { function(data) {
this.setState({ error: null, update_text: "Your password has been updated successfully." }); this.setState({ error: null, update_text: "Your password has been updated successfully." });
}.bind(this), }.bind(this),
function(err) { function(err) {
this.setState({ error: err.message, update_text: null }); this.setState({ error: err.message, update_text: null });
}.bind(this) }.bind(this)
); );
}, },
getInitialState: function() { getInitialState: function() {
return {}; return {};
}, },
render: function() { render: function() {
var update_text = this.state.update_text ? <div className="form-group"><br/><label className="control-label reset-form">{this.state.update_text} Click <a href="/login">here</a> to log in.</label></div> : null; var update_text = this.state.update_text ? <div className="form-group"><br/><label className="control-label reset-form">{this.state.update_text} Click <a href={"/" + this.props.teamName + "/login"}>here</a> to log in.</label></div> : null;
var error = this.state.error ? <div className="form-group has-error"><label className="control-label">{this.state.error}</label></div> : null; var error = this.state.error ? <div className="form-group has-error"><label className="control-label">{this.state.error}</label></div> : null;
var subDomain = this.props.domain != "" ? this.props.domain : utils.getSubDomain();
var subDomainClass = "form-control hidden";
if (subDomain == "") {
subDomain = UserStore.getLastDomain();
subDomainClass = "form-control";
}
return ( return (
<div className="col-sm-12"> <div className="col-sm-12">
<div className="signup-team__container"> <div className="signup-team__container">
<h3>Password Reset</h3> <h3>Password Reset</h3>
<form onSubmit={this.handlePasswordReset}> <form onSubmit={this.handlePasswordReset}>
<p>{"Enter a new password for your " + this.props.teamName + " " + config.SiteName + " account."}</p> <p>{"Enter a new password for your " + this.props.teamDisplayName + " " + config.SiteName + " account."}</p>
<div className="form-group">
<input type="text" className={subDomainClass} name="domain" defaultValue={subDomain} ref="domain" placeholder="Domain" />
</div>
<div className={error ? 'form-group has-error' : 'form-group'}> <div className={error ? 'form-group has-error' : 'form-group'}>
<input type="password" className="form-control" name="password" ref="password" placeholder="Password" /> <input type="password" className="form-control" name="password" ref="password" placeholder="Password" />
</div> </div>
@@ -161,14 +125,15 @@ module.exports = React.createClass({
if (this.props.isReset === "false") { if (this.props.isReset === "false") {
return ( return (
<SendResetPasswordLink <SendResetPasswordLink
teamDisplayName={this.props.teamDisplayName}
teamName={this.props.teamName} teamName={this.props.teamName}
/> />
); );
} else { } else {
return ( return (
<ResetPassword <ResetPassword
teamDisplayName={this.props.teamDisplayName}
teamName={this.props.teamName} teamName={this.props.teamName}
domain={this.props.domain}
hash={this.props.hash} hash={this.props.hash}
data={this.props.data} data={this.props.data}
/> />

Просмотреть файл

@@ -6,6 +6,8 @@ var utils = require('../utils/utils.jsx');
var Client = require('../utils/client.jsx'); var Client = require('../utils/client.jsx');
var AsyncClient = require('../utils/async_client.jsx'); var AsyncClient = require('../utils/async_client.jsx');
var ChannelStore = require('../stores/channel_store.jsx'); var ChannelStore = require('../stores/channel_store.jsx');
var TeamStore = require('../stores/team_store.jsx');
var Constants = require('../utils/constants.jsx');
module.exports = React.createClass({ module.exports = React.createClass({
handleSubmit: function(e) { handleSubmit: function(e) {
@@ -60,12 +62,12 @@ module.exports = React.createClass({
return; return;
Client.updateChannel(channel, Client.updateChannel(channel,
function(data) { function(data, text, req) {
this.refs.display_name.getDOMNode().value = ""; this.refs.display_name.getDOMNode().value = "";
this.refs.channel_name.getDOMNode().value = ""; this.refs.channel_name.getDOMNode().value = "";
$('#' + this.props.modalId).modal('hide'); $('#' + this.props.modalId).modal('hide');
window.location.href = '/channels/' + this.state.channel_name; window.location.href = TeamStore.getCurrentTeamUrl() + '/channels/' + this.state.channel_name;
AsyncClient.getChannels(true); AsyncClient.getChannels(true);
}.bind(this), }.bind(this),
function(err) { function(err) {

Просмотреть файл

@@ -24,13 +24,13 @@ module.exports = React.createClass({
if (!valid) if (!valid)
return; return;
if (this.props.teamName === name) if (this.props.teamDisplayName === name)
return; return;
var data = {}; var data = {};
data["new_name"] = name; data["new_name"] = name;
Client.updateTeamName(data, Client.updateTeamDisplayName(data,
function(data) { function(data) {
$('#rename_team_link').modal('hide'); $('#rename_team_link').modal('hide');
window.location.reload(); window.location.reload();
@@ -47,11 +47,11 @@ module.exports = React.createClass({
componentDidMount: function() { componentDidMount: function() {
var self = this; var self = this;
$(this.refs.modal.getDOMNode()).on('hidden.bs.modal', function(e) { $(this.refs.modal.getDOMNode()).on('hidden.bs.modal', function(e) {
self.setState({ name: self.props.teamName }); self.setState({ name: self.props.teamDisplayName });
}); });
}, },
getInitialState: function() { getInitialState: function() {
return { name: this.props.teamName }; return { name: this.props.teamDisplayName };
}, },
render: function() { render: function() {

Просмотреть файл

@@ -6,6 +6,7 @@ var ChannelStore = require('../stores/channel_store.jsx');
var AsyncClient = require('../utils/async_client.jsx'); var AsyncClient = require('../utils/async_client.jsx');
var SocketStore = require('../stores/socket_store.jsx'); var SocketStore = require('../stores/socket_store.jsx');
var UserStore = require('../stores/user_store.jsx'); var UserStore = require('../stores/user_store.jsx');
var TeamStore = require('../stores/team_store.jsx');
var utils = require('../utils/utils.jsx'); var utils = require('../utils/utils.jsx');
var SidebarHeader = require('./sidebar_header.jsx'); var SidebarHeader = require('./sidebar_header.jsx');
var SearchBox = require('./search_bar.jsx'); var SearchBox = require('./search_bar.jsx');
@@ -13,93 +14,6 @@ var SearchBox = require('./search_bar.jsx');
var Constants = require('../utils/constants.jsx'); var Constants = require('../utils/constants.jsx');
var ActionTypes = Constants.ActionTypes; var ActionTypes = Constants.ActionTypes;
var SidebarLoginForm = React.createClass({
handleSubmit: function(e) {
e.preventDefault();
var state = { }
var domain = this.refs.domain.getDOMNode().value.trim();
if (!domain) {
state.server_error = "A domain is required"
this.setState(state);
return;
}
var email = this.refs.email.getDOMNode().value.trim();
if (!email) {
state.server_error = "An email is required"
this.setState(state);
return;
}
var password = this.refs.password.getDOMNode().value.trim();
if (!password) {
state.server_error = "A password is required"
this.setState(state);
return;
}
state.server_error = "";
this.setState(state);
client.loginByEmail(domain, email, password,
function(data) {
UserStore.setLastDomain(domain);
UserStore.setLastEmail(email);
UserStore.setCurrentUser(data);
var redirect = utils.getUrlParameter("redirect");
if (redirect) {
window.location.href = decodeURI(redirect);
} else {
window.location.href = '/channels/town-square';
}
}.bind(this),
function(err) {
if (err.message == "Login failed because email address has not been verified") {
window.location.href = '/verify?domain=' + encodeURIComponent(domain) + '&email=' + encodeURIComponent(email);
return;
}
state.server_error = err.message;
this.valid = false;
this.setState(state);
}.bind(this)
);
},
getInitialState: function() {
return { };
},
render: function() {
var server_error = this.state.server_error ? <label className="control-label">{this.state.server_error}</label> : null;
var subDomain = utils.getSubDomain();
var subDomainClass = "form-control hidden";
if (subDomain == "") {
subDomain = UserStore.getLastDomain();
subDomainClass = "form-control";
}
return (
<form className="" onSubmit={this.handleSubmit}>
<a href="/find_team">{"Find your " + strings.Team}</a>
<div className={server_error ? 'form-group has-error' : 'form-group'}>
{ server_error }
<input type="text" className={subDomainClass} name="domain" defaultValue={subDomain} ref="domain" placeholder="Domain" />
</div>
<div className={server_error ? 'form-group has-error' : 'form-group'}>
<input type="text" className="form-control" name="email" defaultValue={UserStore.getLastEmail()} ref="email" placeholder="Email" />
</div>
<div className={server_error ? 'form-group has-error' : 'form-group'}>
<input type="password" className="form-control" name="password" ref="password" placeholder="Password" />
</div>
<button type="submit" className="btn btn-default">Login</button>
</form>
);
}
});
function getStateFromStores() { function getStateFromStores() {
var members = ChannelStore.getAllMembers(); var members = ChannelStore.getAllMembers();
var team_member_map = UserStore.getActiveOnlyProfiles(); var team_member_map = UserStore.getActiveOnlyProfiles();
@@ -192,7 +106,7 @@ function getStateFromStores() {
}; };
} }
var SidebarLoggedIn = React.createClass({ module.exports = React.createClass({
componentDidMount: function() { componentDidMount: function() {
ChannelStore.addChangeListener(this._onChange); ChannelStore.addChangeListener(this._onChange);
UserStore.addChangeListener(this._onChange); UserStore.addChangeListener(this._onChange);
@@ -383,7 +297,7 @@ var SidebarLoggedIn = React.createClass({
); );
} else { } else {
return ( return (
<li key={channel.name} className={active}><a className={"sidebar-channel " + titleClass} href={"/channels/"+channel.name}><span className="status" dangerouslySetInnerHTML={{__html: statusIcon}} /> {badge}{channel.display_name}</a></li> <li key={channel.name} className={active}><a className={"sidebar-channel " + titleClass} href={TeamStore.getCurrentTeamUrl() + "/channels/"+channel.name}><span className="status" dangerouslySetInnerHTML={{__html: statusIcon}} /> {badge}{channel.display_name}</a></li>
); );
} }
@@ -414,7 +328,7 @@ var SidebarLoggedIn = React.createClass({
} }
return ( return (
<div> <div>
<SidebarHeader teamName={this.props.teamName} teamType={this.props.teamType} /> <SidebarHeader teamDisplayName={this.props.teamDisplayName} teamType={this.props.teamType} />
<SearchBox /> <SearchBox />
<div className="nav-pills__container"> <div className="nav-pills__container">
@@ -440,25 +354,3 @@ var SidebarLoggedIn = React.createClass({
); );
} }
}); });
var SidebarLoggedOut = React.createClass({
render: function() {
return (
<div>
<SidebarHeader teamName={this.props.teamName} />
<SidebarLoginForm />
</div>
);
}
});
module.exports = React.createClass({
render: function() {
var currentId = UserStore.getCurrentId();
if (currentId != null) {
return <SidebarLoggedIn teamName={this.props.teamName} teamType={this.props.teamType} />;
} else {
return <SidebarLoggedOut teamName={this.props.teamName} />;
}
}
});

Просмотреть файл

@@ -61,19 +61,15 @@ var NavbarDropdown = React.createClass({
var teams = []; var teams = [];
teams.push(<li className="divider" key="div"></li>);
if (this.state.teams.length > 1) { if (this.state.teams.length > 1) {
for (var i = 0; i < this.state.teams.length; i++) { for (var i = 0; i < this.state.teams.length; i++) {
var domain = this.state.teams[i]; var teamName = this.state.teams[i];
if (domain == utils.getSubDomain()) teams.push(<li key={ teamName }><a href={window.location.origin + "/" + teamName }>Switch to { teamName }</a></li>);
continue;
if (teams.length == 0)
teams.push(<li className="divider" key="div"></li>);
teams.push(<li key={ domain }><a href={window.location.protocol + "//" + domain + "." + utils.getDomainWithOutSub() }>Switch to { domain }</a></li>);
} }
} }
teams.push(<li><a href={window.location.origin + "/signup_team" }>Create a New Team</a></li>);
return ( return (
<ul className="nav navbar-nav navbar-right"> <ul className="nav navbar-nav navbar-right">
@@ -110,19 +106,21 @@ module.exports = React.createClass({
}, },
render: function() { render: function() {
var me = UserStore.getCurrentUser(); var teamDisplayName = this.props.teamDisplayName ? this.props.teamDisplayName : config.SiteName;
var me = UserStore.getCurrentUser()
if (!me) { if (!me) {
return null; return null;
} }
return ( return (
<div className="team__header theme"> <div className="team__header theme">
<img className="user__picture" src={"/api/v1/users/" + me.id + "/image?time=" + me.update_at} /> <a className="settings_link" href="#" data-toggle="modal" data-target="#user_settings1">
<div className="header__info"> <img className="user__picture" src={"/api/v1/users/" + me.id + "/image?time=" + me.update_at} />
<div className="user__name">{'@' + me.username}</div> <div className="header__info">
<a className="team__name" href="/channels/town-square">{this.props.teamName}</a> <div className="user__name">{ '@' + me.username}</div>
</div> <div className="team__name">{ teamDisplayName }</div>
</div>
</a>
<NavbarDropdown teamType={this.props.teamType} /> <NavbarDropdown teamType={this.props.teamType} />
</div> </div>
); );

Просмотреть файл

@@ -49,12 +49,12 @@ module.exports = React.createClass({
} }
var siteName = config.SiteName != null ? config.SiteName : ""; var siteName = config.SiteName != null ? config.SiteName : "";
var teamName = this.props.teamName ? this.props.teamName : siteName; var teamDisplayName = this.props.teamDisplayName ? this.props.teamDisplayName : siteName;
return ( return (
<div> <div>
<div className="team__header theme"> <div className="team__header theme">
<a className="team__name" href="/channels/town-square">{ teamName }</a> <a className="team__name" href="/channels/town-square">{ teamDisplayName }</a>
</div> </div>
<div className="nav-pills__container"> <div className="nav-pills__container">

Просмотреть файл

@@ -20,8 +20,8 @@ module.exports = React.createClass({
state.email_error = ""; state.email_error = "";
} }
team.name = this.refs.name.getDOMNode().value.trim(); team.display_name = this.refs.name.getDOMNode().value.trim();
if (!team.name) { if (!team.display_name) {
state.name_error = "This field is required"; state.name_error = "This field is required";
state.inValid = true; state.inValid = true;
} }
@@ -34,7 +34,7 @@ module.exports = React.createClass({
return; return;
} }
client.signupTeam(team.email, team.name, client.signupTeam(team.email, team.display_name,
function(data) { function(data) {
if (data["follow_link"]) { if (data["follow_link"]) {
window.location.href = data["follow_link"]; window.location.href = data["follow_link"];
@@ -61,7 +61,7 @@ module.exports = React.createClass({
return ( return (
<form role="form" onSubmit={this.handleSubmit}> <form role="form" onSubmit={this.handleSubmit}>
<div className={ email_error ? "form-group has-error" : "form-group" }> <div className={ email_error ? "form-group has-error" : "form-group" }>
<input type="email" ref="email" className="form-control" placeholder="Email Address" maxLength="128" /> <input autoFocus={true} type="email" ref="email" className="form-control" placeholder="Email Address" maxLength="128" />
{ email_error } { email_error }
</div> </div>
<div className={ name_error ? "form-group has-error" : "form-group" }> <div className={ name_error ? "form-group has-error" : "form-group" }>
@@ -70,6 +70,9 @@ module.exports = React.createClass({
</div> </div>
{ server_error } { server_error }
<button className="btn btn-md btn-primary" type="submit">Sign up for Free</button> <button className="btn btn-md btn-primary" type="submit">Sign up for Free</button>
<div className="form-group form-group--small">
<span><a href="/find_team">{"Find my " + strings.Team}</a></span>
</div>
</form> </form>
); );
} }

Просмотреть файл

@@ -15,7 +15,7 @@ WelcomePage = React.createClass({
return; return;
} }
e.preventDefault(); e.preventDefault();
this.props.state.wizard = "team_name"; this.props.state.wizard = "team_display_name";
this.props.updateParent(this.props.state); this.props.updateParent(this.props.state);
}, },
handleDiffEmail: function (e) { handleDiffEmail: function (e) {
@@ -57,6 +57,17 @@ WelcomePage = React.createClass({
getInitialState: function() { getInitialState: function() {
return { use_diff: false }; return { use_diff: false };
}, },
handleKeyPress: function(event) {
if (event.keyCode == 13) {
this.submitNext(event);
}
},
componentWillMount: function() {
document.addEventListener("keyup", this.handleKeyPress, false);
},
componentWillUnmount: function() {
document.removeEventListener("keyup", this.handleKeyPress, false);
},
render: function() { render: function() {
client.track('signup', 'signup_team_01_welcome'); client.track('signup', 'signup_team_01_welcome');
@@ -77,7 +88,7 @@ WelcomePage = React.createClass({
<span className="black">{ this.props.state.team.email }</span><br /> <span className="black">{ this.props.state.team.email }</span><br />
</p> </p>
<div className="form-group"> <div className="form-group">
<button className="btn-primary btn form-group" onClick={this.submitNext}><i className="glyphicon glyphicon-ok"></i>Yes, this address is correct</button> <button className="btn-primary btn form-group" type="submit" onClick={this.submitNext}><i className="glyphicon glyphicon-ok"></i>Yes, this address is correct</button>
{ storage_error } { storage_error }
</div> </div>
<hr /> <hr />
@@ -92,15 +103,15 @@ WelcomePage = React.createClass({
{ email_error } { email_error }
</div> </div>
{ server_error } { server_error }
<button className="btn btn-md btn-primary" onClick={this.handleDiffSubmit} type="submit">Use this instead</button> <button className="btn btn-md btn-primary" type="button" onClick={this.handleDiffSubmit} type="submit">Use this instead</button>
</div> </div>
<button onClick={this.handleDiffEmail} className={ this.state.use_diff ? "btn-default btn hidden" : "btn-default btn" }>Use a different address</button> <button type="button" onClick={this.handleDiffEmail} className={ this.state.use_diff ? "btn-default btn hidden" : "btn-default btn" }>Use a different address</button>
</div> </div>
); );
} }
}); });
TeamNamePage = React.createClass({ TeamDisplayNamePage = React.createClass({
submitBack: function (e) { submitBack: function (e) {
e.preventDefault(); e.preventDefault();
this.props.state.wizard = "welcome"; this.props.state.wizard = "welcome";
@@ -109,19 +120,24 @@ TeamNamePage = React.createClass({
submitNext: function (e) { submitNext: function (e) {
e.preventDefault(); e.preventDefault();
var name = this.refs.name.getDOMNode().value.trim(); var display_name = this.refs.name.getDOMNode().value.trim();
if (!name) { if (!display_name) {
this.setState({name_error: "This field is required"}); this.setState({name_error: "This field is required"});
return; return;
} }
this.props.state.wizard = "team_url"; this.props.state.wizard = "team_url";
this.props.state.team.name = name; this.props.state.team.display_name = display_name;
this.props.updateParent(this.props.state); this.props.updateParent(this.props.state);
}, },
getInitialState: function() { getInitialState: function() {
return { }; return { };
}, },
handleFocus: function(e) {
e.preventDefault();
e.currentTarget.select();
},
render: function() { render: function() {
client.track('signup', 'signup_team_02_name'); client.track('signup', 'signup_team_02_name');
@@ -130,29 +146,31 @@ TeamNamePage = React.createClass({
return ( return (
<div> <div>
<form>
<img className="signup-team-logo" src="/static/images/logo.png" /> <img className="signup-team-logo" src="/static/images/logo.png" />
<h2>{utils.toTitleCase(strings.Team) + " Name"}</h2> <h2>{utils.toTitleCase(strings.Team) + " Name"}</h2>
<div className={ name_error ? "form-group has-error" : "form-group" }> <div className={ name_error ? "form-group has-error" : "form-group" }>
<div className="row"> <div className="row">
<div className="col-sm-9"> <div className="col-sm-9">
<input type="text" ref="name" className="form-control" placeholder="" maxLength="128" defaultValue={this.props.state.team.name} /> <input type="text" ref="name" className="form-control" placeholder="" maxLength="128" defaultValue={this.props.state.team.display_name} autoFocus={true} onFocus={this.handleFocus} />
</div> </div>
</div> </div>
{ name_error } { name_error }
</div> </div>
<p>{"Your " + strings.Team + " name shows in menus and headings. It may include the name of your " + strings.Company + ", but it's not required."}</p> <p>{"Your " + strings.Team + " name shows in menus and headings. It may include the name of your " + strings.Company + ", but it's not required."}</p>
<button className="btn btn-default" onClick={this.submitBack}><i className="glyphicon glyphicon-chevron-left"></i> Back</button>&nbsp; <button type="button" className="btn btn-default" onClick={this.submitBack}><i className="glyphicon glyphicon-chevron-left"></i> Back</button>&nbsp;
<button className="btn-primary btn" onClick={this.submitNext}>Next<i className="glyphicon glyphicon-chevron-right"></i></button> <button type="submit" className="btn-primary btn" onClick={this.submitNext}>Next<i className="glyphicon glyphicon-chevron-right"></i></button>
</form>
</div> </div>
); );
} }
}); });
TeamUrlPage = React.createClass({ TeamURLPage = React.createClass({
submitBack: function (e) { submitBack: function (e) {
e.preventDefault(); e.preventDefault();
this.props.state.wizard = "team_name"; this.props.state.wizard = "team_display_name";
this.props.updateParent(this.props.state); this.props.updateParent(this.props.state);
}, },
submitNext: function (e) { submitNext: function (e) {
@@ -172,18 +190,18 @@ TeamUrlPage = React.createClass({
return; return;
} }
else if (cleaned_name.length <= 3 || cleaned_name.length > 15) { else if (cleaned_name.length <= 3 || cleaned_name.length > 15) {
this.setState({name_error: "Domain must be 4 or more characters up to a maximum of 15"}) this.setState({name_error: "Name must be 4 or more characters up to a maximum of 15"})
return; return;
} }
for (var index = 0; index < constants.RESERVED_DOMAINS.length; index++) { for (var index = 0; index < constants.RESERVED_TEAM_NAMES.length; index++) {
if (cleaned_name.indexOf(constants.RESERVED_DOMAINS[index]) == 0) { if (cleaned_name.indexOf(constants.RESERVED_TEAM_NAMES[index]) == 0) {
this.setState({name_error: "This Team URL name is unavailable"}) this.setState({name_error: "This team name is unavailable"})
return; return;
} }
} }
client.findTeamByDomain(name, client.findTeamByName(name,
function(data) { function(data) {
if (!data) { if (!data) {
if (config.AllowSignupDomainsWizard) { if (config.AllowSignupDomainsWizard) {
@@ -193,7 +211,7 @@ TeamUrlPage = React.createClass({
this.props.state.team.type = 'O'; this.props.state.team.type = 'O';
} }
this.props.state.team.domain = name; this.props.state.team.name = name;
this.props.updateParent(this.props.state); this.props.updateParent(this.props.state);
} }
else { else {
@@ -210,6 +228,11 @@ TeamUrlPage = React.createClass({
getInitialState: function() { getInitialState: function() {
return { }; return { };
}, },
handleFocus: function(e) {
e.preventDefault();
e.currentTarget.select();
},
render: function() { render: function() {
client.track('signup', 'signup_team_03_url'); client.track('signup', 'signup_team_03_url');
@@ -218,14 +241,15 @@ TeamUrlPage = React.createClass({
return ( return (
<div> <div>
<form>
<img className="signup-team-logo" src="/static/images/logo.png" /> <img className="signup-team-logo" src="/static/images/logo.png" />
<h2>{utils.toTitleCase(strings.Team) + " URL"}</h2> <h2>{utils.toTitleCase(strings.Team) + " URL"}</h2>
<div className={ name_error ? "form-group has-error" : "form-group" }> <div className={ name_error ? "form-group has-error" : "form-group" }>
<div className="row"> <div className="row">
<div className="col-sm-9"> <div className="col-sm-9">
<div className="input-group"> <div className="input-group">
<input type="text" ref="name" className="form-control text-right" placeholder="" maxLength="128" defaultValue={this.props.state.team.domain} /> <span className="input-group-addon">{ window.location.origin + "/" }</span>
<span className="input-group-addon">.{ utils.getDomainWithOutSub() }</span> <input type="text" ref="name" className="form-control" placeholder="" maxLength="128" defaultValue={this.props.state.team.name} autoFocus={true} onFocus={this.handleFocus}/>
</div> </div>
</div> </div>
</div> </div>
@@ -233,8 +257,9 @@ TeamUrlPage = React.createClass({
</div> </div>
<p className="black">{"Pick something short and memorable for your " + strings.Team + "'s web address."}</p> <p className="black">{"Pick something short and memorable for your " + strings.Team + "'s web address."}</p>
<p>{"Your " + strings.Team + " URL can only contain lowercase letters, numbers and dashes. Also, it needs to start with a letter and cannot end in a dash."}</p> <p>{"Your " + strings.Team + " URL can only contain lowercase letters, numbers and dashes. Also, it needs to start with a letter and cannot end in a dash."}</p>
<button className="btn btn-default" onClick={this.submitBack}><i className="glyphicon glyphicon-chevron-left"></i> Back</button>&nbsp; <button type="button" className="btn btn-default" onClick={this.submitBack}><i className="glyphicon glyphicon-chevron-left"></i> Back</button>&nbsp;
<button className="btn-primary btn" onClick={this.submitNext}>Next<i className="glyphicon glyphicon-chevron-right"></i></button> <button type="submit" className="btn-primary btn" onClick={this.submitNext}>Next<i className="glyphicon glyphicon-chevron-right"></i></button>
</form>
</div> </div>
); );
} }
@@ -291,6 +316,7 @@ AllowedDomainsPage = React.createClass({
return ( return (
<div> <div>
<form>
<img className="signup-team-logo" src="/static/images/logo.png" /> <img className="signup-team-logo" src="/static/images/logo.png" />
<h2>Email Domain</h2> <h2>Email Domain</h2>
<p> <p>
@@ -303,7 +329,7 @@ AllowedDomainsPage = React.createClass({
<div className="col-sm-9"> <div className="col-sm-9">
<div className="input-group"> <div className="input-group">
<span className="input-group-addon">@</span> <span className="input-group-addon">@</span>
<input type="text" ref="name" className="form-control" placeholder="" maxLength="128" defaultValue={this.props.state.team.allowed_domains} /> <input type="text" ref="name" className="form-control" placeholder="" maxLength="128" defaultValue={this.props.state.team.allowed_domains} autoFocus={true} onFocus={this.handleFocus}/>
</div> </div>
</div> </div>
</div> </div>
@@ -313,8 +339,9 @@ AllowedDomainsPage = React.createClass({
<p> <p>
<div className="checkbox"><label><input type="checkbox" ref="open_network" defaultChecked={this.props.state.team.type == 'O'} /> Allow anyone to signup to this domain without an invitation.</label></div> <div className="checkbox"><label><input type="checkbox" ref="open_network" defaultChecked={this.props.state.team.type == 'O'} /> Allow anyone to signup to this domain without an invitation.</label></div>
</p> </p>
<button className="btn btn-default" onClick={this.submitBack}><i className="glyphicon glyphicon-chevron-left"></i> Back</button>&nbsp; <button type="button" className="btn btn-default" onClick={this.submitBack}><i className="glyphicon glyphicon-chevron-left"></i> Back</button>&nbsp;
<button className="btn-primary btn" onClick={this.submitNext}>Next<i className="glyphicon glyphicon-chevron-right"></i></button> <button type="submit" className="btn-primary btn" onClick={this.submitNext}>Next<i className="glyphicon glyphicon-chevron-right"></i></button>
</form>
</div> </div>
); );
} }
@@ -356,7 +383,7 @@ EmailItem = React.createClass({
return ( return (
<div className={ email_error ? "form-group has-error" : "form-group" }> <div className={ email_error ? "form-group has-error" : "form-group" }>
<input type="email" ref="email" className="form-control" placeholder="Email Address" defaultValue={this.props.email} maxLength="128" /> <input autoFocus={this.props.focus} type="email" ref="email" className="form-control" placeholder="Email Address" defaultValue={this.props.email} maxLength="128" />
{ email_error } { email_error }
</div> </div>
); );
@@ -424,16 +451,22 @@ SendInivtesPage = React.createClass({
var emails = []; var emails = [];
for (var i = 0; i < this.props.state.invites.length; i++) { for (var i = 0; i < this.props.state.invites.length; i++) {
emails.push(<EmailItem key={i} ref={'email_' + i} email={this.props.state.invites[i]} />); if (i == 0) {
emails.push(<EmailItem focus={true} key={i} ref={'email_' + i} email={this.props.state.invites[i]} />);
} else {
emails.push(<EmailItem focus={false} key={i} ref={'email_' + i} email={this.props.state.invites[i]} />);
}
} }
return ( return (
<div> <div>
<form>
<img className="signup-team-logo" src="/static/images/logo.png" /> <img className="signup-team-logo" src="/static/images/logo.png" />
<h2>Send Invitations</h2> <h2>Send Invitations</h2>
{ emails } { emails }
<div className="form-group"><button className="btn-default btn" onClick={this.submitAddInvite}>Add Invitation</button></div> <div className="form-group"><button type="button" className="btn-default btn" onClick={this.submitAddInvite}>Add Invitation</button></div>
<div className="form btn-default-group"><button className="btn btn-default" onClick={this.submitBack}><i className="glyphicon glyphicon-chevron-left"></i> Back</button>&nbsp;<button className="btn-primary btn" onClick={this.submitNext}>Next<i className="glyphicon glyphicon-chevron-right"></i></button></div> <div className="form btn-default-group"><button type="button" className="btn btn-default" onClick={this.submitBack}><i className="glyphicon glyphicon-chevron-left"></i> Back</button>&nbsp;<button type="submit" className="btn-primary btn" onClick={this.submitNext}>Next<i className="glyphicon glyphicon-chevron-right"></i></button></div>
</form>
<p>{"If you'd prefer, you can send invitations after you finish setting up the "+ strings.Team + "."}</p> <p>{"If you'd prefer, you can send invitations after you finish setting up the "+ strings.Team + "."}</p>
<div><a href="#" onClick={this.submitSkip}>Skip this step</a></div> <div><a href="#" onClick={this.submitSkip}>Skip this step</a></div>
</div> </div>
@@ -477,20 +510,22 @@ UsernamePage = React.createClass({
return ( return (
<div> <div>
<form>
<img className="signup-team-logo" src="/static/images/logo.png" /> <img className="signup-team-logo" src="/static/images/logo.png" />
<h2>Choose a username</h2> <h2>Choose a username</h2>
<div className={ name_error ? "form-group has-error" : "form-group" }> <div className={ name_error ? "form-group has-error" : "form-group" }>
<div className="row"> <div className="row">
<div className="col-sm-9"> <div className="col-sm-9">
<input type="text" ref="name" className="form-control" placeholder="" defaultValue={this.props.state.user.username} maxLength="128" /> <input autoFocus={true} type="text" ref="name" className="form-control" placeholder="" defaultValue={this.props.state.user.username} maxLength="128" />
</div> </div>
</div> </div>
{ name_error } { name_error }
</div> </div>
<p>{"Pick something " + strings.Team + "mates will recognize. Your username is how you will appear to others."}</p> <p>{"Pick something " + strings.Team + "mates will recognize. Your username is how you will appear to others."}</p>
<p>It can be made of lowercase letters and numbers.</p> <p>It can be made of lowercase letters and numbers.</p>
<button className="btn btn-default" onClick={this.submitBack}><i className="glyphicon glyphicon-chevron-left"></i> Back</button>&nbsp; <button type="button" className="btn btn-default" onClick={this.submitBack}><i className="glyphicon glyphicon-chevron-left"></i> Back</button>&nbsp;
<button className="btn-primary btn" onClick={this.submitNext}>Next<i className="glyphicon glyphicon-chevron-right"></i></button> <button type="submit" className="btn-primary btn" onClick={this.submitNext}>Next<i className="glyphicon glyphicon-chevron-right"></i></button>
</form>
</div> </div>
); );
} }
@@ -531,18 +566,11 @@ PasswordPage = React.createClass({
props.state.wizard = "finished"; props.state.wizard = "finished";
props.updateParent(props.state, true); props.updateParent(props.state, true);
if (utils.isTestDomain()) { window.location.href = window.location.origin + '/' + props.state.team.name + '/login?email=' + encodeURIComponent(teamSignup.team.email);
UserStore.setLastDomain(teamSignup.team.domain);
UserStore.setLastEmail(teamSignup.team.email);
window.location.href = window.location.protocol + '//' + utils.getDomainWithOutSub() + '/login?email=' + encodeURIComponent(teamSignup.team.email);
}
else {
window.location.href = window.location.protocol + '//' + teamSignup.team.domain + '.' + utils.getDomainWithOutSub() + '/login?email=' + encodeURIComponent(teamSignup.team.email);
}
// client.loginByEmail(teamSignup.team.domain, teamSignup.team.email, teamSignup.user.password, // client.loginByEmail(teamSignup.team.domain, teamSignup.team.email, teamSignup.user.password,
// function(data) { // function(data) {
// UserStore.setLastDomain(teamSignup.team.domain); // TeamStore.setLastName(teamSignup.team.domain);
// UserStore.setLastEmail(teamSignup.team.email); // UserStore.setLastEmail(teamSignup.team.email);
// UserStore.setCurrentUser(data); // UserStore.setCurrentUser(data);
// window.location.href = '/channels/town-square'; // window.location.href = '/channels/town-square';
@@ -570,13 +598,14 @@ PasswordPage = React.createClass({
return ( return (
<div> <div>
<form>
<img className="signup-team-logo" src="/static/images/logo.png" /> <img className="signup-team-logo" src="/static/images/logo.png" />
<h2>Choose a password</h2> <h2>Choose a password</h2>
<p>You'll use your email address ({this.props.state.team.email}) and password to log into {config.SiteName}.</p> <p>You'll use your email address ({this.props.state.team.email}) and password to log into {config.SiteName}.</p>
<div className={ name_error ? "form-group has-error" : "form-group" }> <div className={ name_error ? "form-group has-error" : "form-group" }>
<div className="row"> <div className="row">
<div className="col-sm-9"> <div className="col-sm-9">
<input type="password" ref="password" className="form-control" placeholder="" maxLength="128" /> <input autoFocus={true} type="password" ref="password" className="form-control" placeholder="" maxLength="128" />
</div> </div>
</div> </div>
{ name_error } { name_error }
@@ -585,10 +614,11 @@ PasswordPage = React.createClass({
<label><input type="checkbox" ref="email_service" /> It's ok to send me occassional email with updates about the {config.SiteName} service.</label> <label><input type="checkbox" ref="email_service" /> It's ok to send me occassional email with updates about the {config.SiteName} service.</label>
</div> </div>
<div className="form-group"> <div className="form-group">
<button className="btn btn-default" onClick={this.submitBack}><i className="glyphicon glyphicon-chevron-left"></i> Back</button>&nbsp; <button type="button" className="btn btn-default" onClick={this.submitBack}><i className="glyphicon glyphicon-chevron-left"></i> Back</button>&nbsp;
<button className="btn-primary btn" id="finish-button" data-loading-text={"<span class='glyphicon glyphicon-refresh glyphicon-refresh-animate'></span> Creating "+strings.Team+"..."} onClick={this.submitNext}>Finish</button> <button type="submit" className="btn-primary btn" id="finish-button" data-loading-text={"<span class='glyphicon glyphicon-refresh glyphicon-refresh-animate'></span> Creating "+strings.Team+"..."} onClick={this.submitNext}>Finish</button>
</div> </div>
<p>By proceeding to create your account and use { config.SiteName }, you agree to our <a href={ config.TermsLink }>Terms of Service</a> and <a href={ config.PrivacyLink }>Privacy Policy</a>. If you do not agree, you cannot use {config.SiteName}.</p> <p>By proceeding to create your account and use { config.SiteName }, you agree to our <a href={ config.TermsLink }>Terms of Service</a> and <a href={ config.PrivacyLink }>Privacy Policy</a>. If you do not agree, you cannot use {config.SiteName}.</p>
</form>
</div> </div>
); );
} }
@@ -610,9 +640,9 @@ module.exports = React.createClass({
props.wizard = "welcome"; props.wizard = "welcome";
props.team = {}; props.team = {};
props.team.email = this.props.email; props.team.email = this.props.email;
props.team.name = this.props.name; props.team.display_name = this.props.name;
props.team.company_name = this.props.name; props.team.company_name = this.props.name;
props.team.domain = utils.cleanUpUrlable(this.props.name); props.team.name = utils.cleanUpUrlable(this.props.name);
props.team.allowed_domains = ""; props.team.allowed_domains = "";
props.invites = []; props.invites = [];
props.invites.push(""); props.invites.push("");
@@ -630,12 +660,12 @@ module.exports = React.createClass({
return <WelcomePage state={this.state} updateParent={this.updateParent} /> return <WelcomePage state={this.state} updateParent={this.updateParent} />
} }
if (this.state.wizard == "team_name") { if (this.state.wizard == "team_display_name") {
return <TeamNamePage state={this.state} updateParent={this.updateParent} /> return <TeamDisplayNamePage state={this.state} updateParent={this.updateParent} />
} }
if (this.state.wizard == "team_url") { if (this.state.wizard == "team_url") {
return <TeamUrlPage state={this.state} updateParent={this.updateParent} /> return <TeamURLPage state={this.state} updateParent={this.updateParent} />
} }
if (this.state.wizard == "allowed_domains") { if (this.state.wizard == "allowed_domains") {

Просмотреть файл

@@ -48,16 +48,17 @@ module.exports = React.createClass({
client.loginByEmail(this.props.domain, this.state.user.email, this.state.user.password, client.loginByEmail(this.props.domain, this.state.user.email, this.state.user.password,
function(data) { function(data) {
UserStore.setLastDomain(this.props.domain);
UserStore.setLastEmail(this.state.user.email); UserStore.setLastEmail(this.state.user.email);
UserStore.setCurrentUser(data); UserStore.setCurrentUser(data);
if (this.props.hash > 0) if (this.props.hash > 0)
{
BrowserStore.setGlobalItem(this.props.hash, JSON.stringify({wizard: "finished"})); BrowserStore.setGlobalItem(this.props.hash, JSON.stringify({wizard: "finished"}));
window.location.href = '/channels/town-square'; }
window.location.href = '/';
}.bind(this), }.bind(this),
function(err) { function(err) {
if (err.message == "Login failed because email address has not been verified") { if (err.message == "Login failed because email address has not been verified") {
window.location.href = "/verify?email="+ encodeURIComponent(this.state.user.email) + "&domain=" + encodeURIComponent(this.props.domain); window.location.href = "/verify_email?email="+ encodeURIComponent(this.state.user.email) + "&domain=" + encodeURIComponent(this.props.domain);
} else { } else {
this.state.server_error = err.message; this.state.server_error = err.message;
this.setState(this.state); this.setState(this.state);

Просмотреть файл

@@ -57,7 +57,7 @@ module.exports = React.createClass({
<div className="modal-content"> <div className="modal-content">
<div className="modal-header"> <div className="modal-header">
<button type="button" className="close" data-dismiss="modal" aria-label="Close" data-reactid=".5.0.0.0.0"><span aria-hidden="true" data-reactid=".5.0.0.0.0.0">×</span></button> <button type="button" className="close" data-dismiss="modal" aria-label="Close" data-reactid=".5.0.0.0.0"><span aria-hidden="true" data-reactid=".5.0.0.0.0.0">×</span></button>
<h4 className="modal-title" id="myModalLabel">{this.props.teamName + " Members"}</h4> <h4 className="modal-title" id="myModalLabel">{this.props.teamDisplayName + " Members"}</h4>
</div> </div>
<div ref="modalBody" className="modal-body"> <div ref="modalBody" className="modal-body">
<div className="channel-settings"> <div className="channel-settings">

Просмотреть файл

@@ -61,17 +61,17 @@ global.window.setup_channel_page = function(team_name, team_type, team_id, chann
); );
React.render( React.render(
<Navbar teamName={team_name} />, <Navbar teamDisplayName={team_name} />,
document.getElementById('navbar') document.getElementById('navbar')
); );
React.render( React.render(
<Sidebar teamName={team_name} teamType={team_type} />, <Sidebar teamDisplayName={team_name} teamType={team_type} />,
document.getElementById('sidebar-left') document.getElementById('sidebar-left')
); );
React.render( React.render(
<RenameTeamModal teamName={team_name} />, <RenameTeamModal teamDisplayName={team_name} />,
document.getElementById('rename_team_modal') document.getElementById('rename_team_modal')
); );
@@ -91,7 +91,7 @@ global.window.setup_channel_page = function(team_name, team_type, team_id, chann
); );
React.render( React.render(
<TeamMembersModal teamName={team_name} />, <TeamMembersModal teamDisplayName={team_name} />,
document.getElementById('team_members_modal') document.getElementById('team_members_modal')
); );
@@ -186,7 +186,7 @@ global.window.setup_channel_page = function(team_name, team_type, team_id, chann
); );
React.render( React.render(
<SidebarRightMenu teamName={team_name} teamType={team_type} />, <SidebarRightMenu teamDisplayName={team_name} teamType={team_type} />,
document.getElementById('sidebar-menu') document.getElementById('sidebar-menu')
); );

Просмотреть файл

@@ -2,13 +2,14 @@
// See License.txt for license information. // See License.txt for license information.
var ChannelStore = require('../stores/channel_store.jsx'); var ChannelStore = require('../stores/channel_store.jsx');
var TeamStore = require('../stores/team_store.jsx');
var Constants = require('../utils/constants.jsx'); var Constants = require('../utils/constants.jsx');
global.window.setup_home_page = function() { global.window.setup_home_page = function(teamURL) {
var last = ChannelStore.getLastVisitedName(); var last = ChannelStore.getLastVisitedName();
if (last == null || last.length === 0) { if (last == null || last.length === 0) {
window.location.replace("/channels/" + Constants.DEFAULT_CHANNEL); window.location = teamURL + "/channels/" + Constants.DEFAULT_CHANNEL;
} else { } else {
window.location.replace("/channels/" + last); window.location = teamURL + "/channels/" + last;
} }
} }

Просмотреть файл

@@ -3,9 +3,9 @@
var Login = require('../components/login.jsx'); var Login = require('../components/login.jsx');
global.window.setup_login_page = function() { global.window.setup_login_page = function(teamDisplayName, teamName) {
React.render( React.render(
<Login />, <Login teamDisplayName={teamDisplayName} teamName={teamName}/>,
document.getElementById('login') document.getElementById('login')
); );
}; };

Просмотреть файл

@@ -3,13 +3,13 @@
var PasswordReset = require('../components/password_reset.jsx'); var PasswordReset = require('../components/password_reset.jsx');
global.window.setup_password_reset_page = function(is_reset, team_name, domain, hash, data) { global.window.setup_password_reset_page = function(is_reset, team_display_name, team_name, hash, data) {
React.render( React.render(
<PasswordReset <PasswordReset
isReset={is_reset} isReset={is_reset}
teamDisplayName={team_display_name}
teamName={team_name} teamName={team_name}
domain={domain}
hash={hash} hash={hash}
data={data} data={data}
/>, />,

Просмотреть файл

@@ -5,7 +5,7 @@ var SignupTeamComplete =require('../components/signup_team_complete.jsx');
global.window.setup_signup_team_complete_page = function(email, name, data, hash) { global.window.setup_signup_team_complete_page = function(email, name, data, hash) {
React.render( React.render(
<SignupTeamComplete name={name} email={email} hash={hash} data={data} />, <SignupTeamComplete name={name} email={email} hash={hash} data={data}/>,
document.getElementById('signup-team-complete') document.getElementById('signup-team-complete')
); );
}; };

Просмотреть файл

@@ -8,7 +8,7 @@ function getPrefix() {
} }
// Also change model/utils.go ETAG_ROOT_VERSION // Also change model/utils.go ETAG_ROOT_VERSION
var BROWSER_STORE_VERSION = '.3'; var BROWSER_STORE_VERSION = '.4';
module.exports = { module.exports = {
_initialized: false, _initialized: false,

Просмотреть файл

@@ -151,12 +151,12 @@ var PostStore = assign({}, EventEmitter.prototype, {
return BrowserStore.getItem("draft_" + channel_id + "_" + user_id); return BrowserStore.getItem("draft_" + channel_id + "_" + user_id);
}, },
clearDraftUploads: function() { clearDraftUploads: function() {
BrowserStore.actionOnItemsWithPrefix("draft_", function (key, value) { BrowserStore.actionOnItemsWithPrefix("draft_", function (key, value) {
if (value) { if (value) {
value.uploadsInProgress = 0; value.uploadsInProgress = 0;
BrowserStore.setItem(key, value); BrowserStore.setItem(key, value);
} }
}); });
} }
}); });

Просмотреть файл

@@ -57,10 +57,13 @@ var TeamStore = assign({}, EventEmitter.prototype, {
else else
return null; return null;
}, },
getCurrentTeamUrl: function() {
return window.location.origin + "/" + this.getCurrent().name;
},
storeTeam: function(team) { storeTeam: function(team) {
var teams = this._getTeams(); var teams = this._getTeams();
teams[team.id] = team; teams[team.id] = team;
this._storeTeams(teams); this._storeTeams(teams);
}, },
_storeTeams: function(teams) { _storeTeams: function(teams) {
BrowserStore.setItem("user_teams", teams); BrowserStore.setItem("user_teams", teams);

Просмотреть файл

@@ -67,9 +67,18 @@ var UserStore = assign({}, EventEmitter.prototype, {
}, },
setCurrentId: function(id) { setCurrentId: function(id) {
this._current_id = id; this._current_id = id;
if (id == null) {
BrowserStore.removeGlobalItem("current_user_id");
} else {
BrowserStore.setGlobalItem("current_user_id", id);
}
}, },
getCurrentId: function(skipFetch) { getCurrentId: function(skipFetch) {
var current_id = this._current_id; var current_id = this._current_id;
if (current_id == null) {
current_id = BrowserStore.getGlobalItem("current_user_id");
}
// this is a speical case to force fetch the // this is a speical case to force fetch the
// current user if it's missing // current user if it's missing
@@ -92,17 +101,11 @@ var UserStore = assign({}, EventEmitter.prototype, {
return this._getProfiles()[this.getCurrentId()]; return this._getProfiles()[this.getCurrentId()];
}, },
setCurrentUser: function(user) { setCurrentUser: function(user) {
this.saveProfile(user);
this.setCurrentId(user.id); this.setCurrentId(user.id);
}, this.saveProfile(user);
getLastDomain: function() {
return BrowserStore.getItem("last_domain", '');
},
setLastDomain: function(domain) {
BrowserStore.setItem("last_domain", domain);
}, },
getLastEmail: function() { getLastEmail: function() {
return BrowserStore.getItem("last_email", ''); return BrowserStore.getItem("last_email", '');
}, },
setLastEmail: function(email) { setLastEmail: function(email) {
BrowserStore.setItem("last_email", email); BrowserStore.setItem("last_email", email);
@@ -144,18 +147,18 @@ var UserStore = assign({}, EventEmitter.prototype, {
this._storeProfiles(ps); this._storeProfiles(ps);
}, },
_storeProfiles: function(profiles) { _storeProfiles: function(profiles) {
BrowserStore.setGlobalItem("profiles", profiles); BrowserStore.setItem("profiles", profiles);
var profileUsernameMap = {}; var profileUsernameMap = {};
for (var id in profiles) { for (var id in profiles) {
profileUsernameMap[profiles[id].username] = profiles[id]; profileUsernameMap[profiles[id].username] = profiles[id];
} }
BrowserStore.setGlobalItem("profileUsernameMap", profileUsernameMap); BrowserStore.setItem("profileUsernameMap", profileUsernameMap);
}, },
_getProfiles: function() { _getProfiles: function() {
return BrowserStore.getGlobalItem("profiles", {}); return BrowserStore.getItem("profiles", {});
}, },
_getProfilesUsernameMap: function() { _getProfilesUsernameMap: function() {
return BrowserStore.getGlobalItem("profileUsernameMap", {}); return BrowserStore.getItem("profileUsernameMap", {});
}, },
setSessions: function(sessions) { setSessions: function(sessions) {
BrowserStore.setItem("sessions", sessions); BrowserStore.setItem("sessions", sessions);

Просмотреть файл

@@ -2,6 +2,7 @@
// See License.txt for license information. // See License.txt for license information.
var BrowserStore = require('../stores/browser_store.jsx'); var BrowserStore = require('../stores/browser_store.jsx');
var TeamStore = require('../stores/team_store.jsx');
module.exports.track = function(category, action, label, prop, val) { module.exports.track = function(category, action, label, prop, val) {
global.window.snowplow('trackStructEvent', category, action, label, prop, val); global.window.snowplow('trackStructEvent', category, action, label, prop, val);
@@ -44,7 +45,12 @@ function handleError(method_name, xhr, status, err) {
module.exports.track('api', 'api_weberror', method_name, 'message', msg); module.exports.track('api', 'api_weberror', method_name, 'message', msg);
if (xhr.status == 401) { if (xhr.status == 401) {
window.location.href = '/login?redirect=' + encodeURIComponent(window.location.pathname+window.location.search); if (window.location.href.indexOf("/channels") === 0) {
window.location.pathname = '/login?redirect=' + encodeURIComponent(window.location.pathname+window.location.search);
} else {
var teamURL = window.location.href.split('/channels')[0];
window.location.href = teamURL + '/login?redirect=' + encodeURIComponent(window.location.pathname+window.location.search);
}
} }
return e; return e;
@@ -205,17 +211,18 @@ module.exports.resetPassword = function(data, success, error) {
module.exports.logout = function() { module.exports.logout = function() {
module.exports.track('api', 'api_users_logout'); module.exports.track('api', 'api_users_logout');
BrowserStore.clear(); var currentTeamUrl = TeamStore.getCurrentTeamUrl();
window.location.href = "/logout"; BrowserStore.clear();
window.location.href = currentTeamUrl + "/logout";
}; };
module.exports.loginByEmail = function(domain, email, password, success, error) { module.exports.loginByEmail = function(name, email, password, success, error) {
$.ajax({ $.ajax({
url: "/api/v1/users/login", url: "/api/v1/users/login",
dataType: 'json', dataType: 'json',
contentType: 'application/json', contentType: 'application/json',
type: 'POST', type: 'POST',
data: JSON.stringify({domain: domain, email: email, password: password}), data: JSON.stringify({name: name, email: email, password: password}),
success: function(data, textStatus, xhr) { success: function(data, textStatus, xhr) {
module.exports.track('api', 'api_users_login_success', data.team_id, 'email', data.email); module.exports.track('api', 'api_users_login_success', data.team_id, 'email', data.email);
success(data, textStatus, xhr); success(data, textStatus, xhr);
@@ -317,7 +324,7 @@ module.exports.inviteMembers = function(data, success, error) {
module.exports.track('api', 'api_teams_invite_members'); module.exports.track('api', 'api_teams_invite_members');
}; };
module.exports.updateTeamName = function(data, success, error) { module.exports.updateTeamDisplayName = function(data, success, error) {
$.ajax({ $.ajax({
url: "/api/v1/teams/update_name", url: "/api/v1/teams/update_name",
dataType: 'json', dataType: 'json',
@@ -326,7 +333,7 @@ module.exports.updateTeamName = function(data, success, error) {
data: JSON.stringify(data), data: JSON.stringify(data),
success: success, success: success,
error: function(xhr, status, err) { error: function(xhr, status, err) {
e = handleError("updateTeamName", xhr, status, err); e = handleError("updateTeamDisplayName", xhr, status, err);
error(e); error(e);
} }
}); });
@@ -334,13 +341,13 @@ module.exports.updateTeamName = function(data, success, error) {
module.exports.track('api', 'api_teams_update_name'); module.exports.track('api', 'api_teams_update_name');
}; };
module.exports.signupTeam = function(email, name, success, error) { module.exports.signupTeam = function(email, display_name, success, error) {
$.ajax({ $.ajax({
url: "/api/v1/teams/signup", url: "/api/v1/teams/signup",
dataType: 'json', dataType: 'json',
contentType: 'application/json', contentType: 'application/json',
type: 'POST', type: 'POST',
data: JSON.stringify({email: email, name: name}), data: JSON.stringify({email: email, display_name: display_name}),
success: success, success: success,
error: function(xhr, status, err) { error: function(xhr, status, err) {
e = handleError("singupTeam", xhr, status, err); e = handleError("singupTeam", xhr, status, err);
@@ -366,16 +373,16 @@ module.exports.createTeam = function(team, success, error) {
}); });
}; };
module.exports.findTeamByDomain = function(domain, success, error) { module.exports.findTeamByName = function(teamName, success, error) {
$.ajax({ $.ajax({
url: "/api/v1/teams/find_team_by_domain", url: "/api/v1/teams/find_team_by_name",
dataType: 'json', dataType: 'json',
contentType: 'application/json', contentType: 'application/json',
type: 'POST', type: 'POST',
data: JSON.stringify({domain: domain}), data: JSON.stringify({name: teamName}),
success: success, success: success,
error: function(xhr, status, err) { error: function(xhr, status, err) {
e = handleError("findTeamByDomain", xhr, status, err); e = handleError("findTeamByName", xhr, status, err);
error(e); error(e);
} }
}); });

Просмотреть файл

@@ -54,7 +54,7 @@ module.exports = {
DEFAULT_CHANNEL: 'town-square', DEFAULT_CHANNEL: 'town-square',
OFFTOPIC_CHANNEL: 'off-topic', OFFTOPIC_CHANNEL: 'off-topic',
POST_CHUNK_SIZE: 60, POST_CHUNK_SIZE: 60,
RESERVED_DOMAINS: [ RESERVED_TEAM_NAMES: [
"www", "www",
"web", "web",
"admin", "admin",

Просмотреть файл

@@ -16,10 +16,10 @@ module.exports.isEmail = function(email) {
}; };
module.exports.cleanUpUrlable = function(input) { module.exports.cleanUpUrlable = function(input) {
var cleaned = input.trim().replace(/-/g, ' ').replace(/[^\w\s]/gi, '').toLowerCase().replace(/\s/g, '-'); var cleaned = input.trim().replace(/-/g, ' ').replace(/[^\w\s]/gi, '').toLowerCase().replace(/\s/g, '-');
cleaned = cleaned.replace(/^\-+/, ''); cleaned = cleaned.replace(/^\-+/, '');
cleaned = cleaned.replace(/\-+$/, ''); cleaned = cleaned.replace(/\-+$/, '');
return cleaned; return cleaned;
}; };
@@ -114,7 +114,7 @@ module.exports.notifyMe = function(title, body, channel) {
if (channel) { if (channel) {
module.exports.switchChannel(channel); module.exports.switchChannel(channel);
} else { } else {
window.location.href = "/channels/town-square"; window.location.href = "/";
} }
}; };
setTimeout(function(){ setTimeout(function(){
@@ -708,8 +708,8 @@ module.exports.switchChannel = function(channel, teammate_name) {
id: channel.id id: channel.id
}); });
var domain = window.location.href.split('/channels')[0]; var teamURL = window.location.href.split('/channels')[0];
history.replaceState('data', '', domain + '/channels/' + channel.name); history.replaceState('data', '', teamURL + '/channels/' + channel.name);
if (channel.type === 'D' && teammate_name) { if (channel.type === 'D' && teammate_name) {
document.title = teammate_name + " " + document.title.substring(document.title.lastIndexOf("-")); document.title = teammate_name + " " + document.title.substring(document.title.lastIndexOf("-"));
@@ -784,18 +784,6 @@ Image.prototype.load = function(url, progressCallback) {
Image.prototype.completedPercentage = 0; Image.prototype.completedPercentage = 0;
module.exports.getHomeLink = function() {
if (config.HomeLink != "") {
return config.HomeLink;
}
var parts = window.location.host.split(".");
if (parts.length <= 1) {
return window.location.protocol + "//" + window.location.host;
}
parts[0] = "www";
return window.location.protocol + "//" + parts.join(".");
}
module.exports.changeColor =function(col, amt) { module.exports.changeColor =function(col, amt) {
var usePound = false; var usePound = false;

Просмотреть файл

@@ -98,6 +98,9 @@
fill: #fff; fill: #fff;
} }
} }
.settings__link a:hover, a:visited, a:link, a:active {
text-decoration: none;
}
.user__picture { .user__picture {
width: 36px; width: 36px;
height: 36px; height: 36px;
@@ -248,4 +251,4 @@
margin-top: 8px; margin-top: 8px;
fill: #AAA; fill: #AAA;
} }
} }

Просмотреть файл

@@ -6,7 +6,7 @@
} }
.signup-team__container { .signup-team__container {
padding: 100px 0px 50px 0px; padding: 100px 0px 50px 0px;
max-width: 340px; max-width: 600px;
margin: 0 auto; margin: 0 auto;
font-size: 1.1em; font-size: 1.1em;
position: relative; position: relative;
@@ -118,4 +118,4 @@
.signup-team-login { .signup-team-login {
padding-bottom: 10px; padding-bottom: 10px;
font-weight: 700; font-weight: 700;
} }

Просмотреть файл

@@ -46,7 +46,7 @@
<div id="direct_channel_modal"></div> <div id="direct_channel_modal"></div>
<div id="channel_info_modal"></div> <div id="channel_info_modal"></div>
<script> <script>
window.setup_channel_page('{{ .Props.TeamName }}', '{{ .Props.TeamType }}', '{{ .Props.TeamId }}', '{{ .Props.ChannelName }}', '{{ .Props.ChannelId }}'); window.setup_channel_page('{{ .Props.TeamDisplayName }}', '{{ .Props.TeamType }}', '{{ .Props.TeamId }}', '{{ .Props.ChannelName }}', '{{ .Props.ChannelId }}');
</script> </script>
</body> </body>
</html> </html>

Просмотреть файл

@@ -17,7 +17,7 @@
</div> </div>
</div> </div>
<script> <script>
window.setup_home_page(); window.setup_home_page({{.Props.TeamURL}});
</script> </script>
</body> </body>
</html> </html>

Просмотреть файл

@@ -7,7 +7,7 @@
<div class="inner__wrap"> <div class="inner__wrap">
<div class="row content"> <div class="row content">
<div class="signup-header"> <div class="signup-header">
{{.Props.TeamName}} {{.Props.TeamDisplayName}}
</div> </div>
<div class="col-sm-12"> <div class="col-sm-12">
<div id="login"></div> <div id="login"></div>
@@ -20,7 +20,7 @@
</div> </div>
</div> </div>
<script> <script>
window.setup_login_page(); window.setup_login_page({{.Props.TeamDisplayName}}, {{.Props.TeamName}});
</script> </script>
</body> </body>
</html> </html>

Просмотреть файл

@@ -9,7 +9,7 @@
</div> </div>
</div> </div>
<script> <script>
window.setup_password_reset_page('{{ .Props.IsReset }}', '{{ .Props.TeamName }}', '{{ .Props.Domain }}', '{{ .Props.Hash }}', '{{ .Props.Data }}'); window.setup_password_reset_page('{{ .Props.IsReset }}', '{{ .Props.TeamDisplayName }}', '{{ .Props.TeamName }}', '{{ .Props.Hash }}', '{{ .Props.Data }}');
</script> </script>
</body> </body>
</html> </html>

Просмотреть файл

@@ -12,7 +12,6 @@
<h2>All team communication in one place, searchable and accessible anywhere</h2> <h2>All team communication in one place, searchable and accessible anywhere</h2>
<h4 class="text--light">{{ .SiteName }} is free for an unlimited time, for unlimited users </h4 class="text--light"> <h4 class="text--light">{{ .SiteName }} is free for an unlimited time, for unlimited users </h4 class="text--light">
<div id="signup-team"></div> <div id="signup-team"></div>
<a class="signup-team-login" href="/login">or Sign In</a>
</div> </div>
</div> </div>
<div class="footer-push"></div> <div class="footer-push"></div>
@@ -23,7 +22,7 @@
</div> </div>
</div> </div>
<script> <script>
window.setup_signup_team_page(); window.setup_signup_team_page();
</script> </script>
</body> </body>
</html> </html>

Просмотреть файл

@@ -19,7 +19,7 @@
</div> </div>
</div> </div>
<script> <script>
window.setup_signup_team_complete_page('{{.Props.Email}}', '{{.Props.Name}}', '{{.Props.Data}}', '{{.Props.Hash}}'); window.setup_signup_team_complete_page('{{.Props.Email}}', '{{.Props.DisplayName}}', '{{.Props.Data}}', '{{.Props.Hash}}');
</script> </script>
</body> </body>
</html> </html>

Просмотреть файл

@@ -8,7 +8,6 @@
<div class="row content"> <div class="row content">
<div class="col-sm-12"> <div class="col-sm-12">
<div class="signup-team__container"> <div class="signup-team__container">
<p>Did you mean to sign-in rather than sign up? Sign in <a href="/login">here</a>. </p>
<h3>Sign up Complete</h3> <h3>Sign up Complete</h3>
<p>Please check your email: {{ .Props.Email }}<br> <p>Please check your email: {{ .Props.Email }}<br>
You email contains a link to set up your team</p> You email contains a link to set up your team</p>

Просмотреть файл

@@ -19,7 +19,7 @@
</div> </div>
</div> </div>
<script> <script>
window.setup_signup_user_complete_page('{{.Props.Email}}', '{{.Props.TeamDomain}}', '{{.Props.TeamName}}', '{{.Props.TeamId}}', '{{.Props.Data}}', '{{.Props.Hash}}'); window.setup_signup_user_complete_page('{{.Props.Email}}', '{{.Props.TeamName}}', '{{.Props.TeamDisplayName}}', '{{.Props.TeamId}}', '{{.Props.Data}}', '{{.Props.Hash}}');
</script> </script>
</body> </body>
</html> </html>

Просмотреть файл

@@ -42,25 +42,28 @@ func (me *HtmlTemplatePage) Render(c *api.Context, w http.ResponseWriter) {
func InitWeb() { func InitWeb() {
l4g.Debug("Initializing web routes") l4g.Debug("Initializing web routes")
mainrouter := api.Srv.Router
staticDir := utils.FindDir("web/static") staticDir := utils.FindDir("web/static")
l4g.Debug("Using static directory at %v", staticDir) l4g.Debug("Using static directory at %v", staticDir)
api.Srv.Router.PathPrefix("/static/").Handler(http.StripPrefix("/static/", mainrouter.PathPrefix("/static/").Handler(http.StripPrefix("/static/", http.FileServer(http.Dir(staticDir))))
http.FileServer(http.Dir(staticDir))))
api.Srv.Router.Handle("/", api.AppHandler(root)).Methods("GET") mainrouter.Handle("/", api.AppHandlerIndependent(root)).Methods("GET")
api.Srv.Router.Handle("/login", api.AppHandler(login)).Methods("GET") mainrouter.Handle("/{team:[A-Za-z0-9-]+(__)?[A-Za-z0-9-]+}", api.AppHandler(login)).Methods("GET")
api.Srv.Router.Handle("/signup_team_confirm/", api.AppHandler(signupTeamConfirm)).Methods("GET") mainrouter.Handle("/{team:[A-Za-z0-9-]+(__)?[A-Za-z0-9-]+}/", api.AppHandler(login)).Methods("GET")
api.Srv.Router.Handle("/signup_team_complete/", api.AppHandler(signupTeamComplete)).Methods("GET") mainrouter.Handle("/{team:[A-Za-z0-9-]+(__)?[A-Za-z0-9-]+}/login", api.AppHandler(login)).Methods("GET")
api.Srv.Router.Handle("/signup_user_complete/", api.AppHandler(signupUserComplete)).Methods("GET") mainrouter.Handle("/{team:[A-Za-z0-9-]+(__)?[A-Za-z0-9-]+}/logout", api.AppHandler(logout)).Methods("GET")
mainrouter.Handle("/{team:[A-Za-z0-9-]+(__)?[A-Za-z0-9-]+}/reset_password", api.AppHandler(resetPassword)).Methods("GET")
// Bug in gorilla.mux pervents us from using regex here.
mainrouter.Handle("/{team}/channels/{channelname}", api.UserRequired(getChannel)).Methods("GET")
api.Srv.Router.Handle("/logout", api.AppHandler(logout)).Methods("GET") // Anything added here must have an _ in it so it does not conflict with team names
mainrouter.Handle("/signup_team_complete/", api.AppHandlerIndependent(signupTeamComplete)).Methods("GET")
api.Srv.Router.Handle("/verify", api.AppHandler(verifyEmail)).Methods("GET") mainrouter.Handle("/signup_user_complete/", api.AppHandlerIndependent(signupUserComplete)).Methods("GET")
api.Srv.Router.Handle("/find_team", api.AppHandler(findTeam)).Methods("GET") mainrouter.Handle("/signup_team_confirm/", api.AppHandlerIndependent(signupTeamConfirm)).Methods("GET")
api.Srv.Router.Handle("/reset_password", api.AppHandler(resetPassword)).Methods("GET") mainrouter.Handle("/verify_email", api.AppHandlerIndependent(verifyEmail)).Methods("GET")
mainrouter.Handle("/find_team", api.AppHandlerIndependent(findTeam)).Methods("GET")
csr := api.Srv.Router.PathPrefix("/channels").Subrouter() mainrouter.Handle("/signup_team", api.AppHandlerIndependent(signup)).Methods("GET")
csr.Handle("/{name:[A-Za-z0-9-]+(__)?[A-Za-z0-9-]+}", api.UserRequired(getChannel)).Methods("GET")
watchAndParseTemplates() watchAndParseTemplates()
} }
@@ -128,46 +131,53 @@ func root(c *api.Context, w http.ResponseWriter, r *http.Request) {
} }
if len(c.Session.UserId) == 0 { if len(c.Session.UserId) == 0 {
if api.IsTestDomain(r) || strings.Index(r.Host, "www") == 0 || strings.Index(r.Host, "beta") == 0 || strings.Index(r.Host, "ci") == 0 { page := NewHtmlTemplatePage("signup_team", "Signup")
page := NewHtmlTemplatePage("signup_team", "Signup") page.Render(c, w)
page.Render(c, w)
} else {
login(c, w, r)
}
} else { } else {
page := NewHtmlTemplatePage("home", "Home") page := NewHtmlTemplatePage("home", "Home")
page.Props["TeamURL"] = c.GetTeamURL()
page.Render(c, w) page.Render(c, w)
} }
} }
func signup(c *api.Context, w http.ResponseWriter, r *http.Request) {
if !CheckBrowserCompatability(c, r) {
return
}
page := NewHtmlTemplatePage("signup_team", "Signup")
page.Render(c, w)
}
func login(c *api.Context, w http.ResponseWriter, r *http.Request) { func login(c *api.Context, w http.ResponseWriter, r *http.Request) {
if !CheckBrowserCompatability(c, r) { if !CheckBrowserCompatability(c, r) {
return return
} }
params := mux.Vars(r)
teamName := params["team"]
teamName := "Beta" var team *model.Team
teamDomain := "" if tResult := <-api.Srv.Store.Team().GetByName(teamName); tResult.Err != nil {
siteDomain := "." + utils.Cfg.ServiceSettings.Domain l4g.Error("Couldn't find team name=%v, teamURL=%v, err=%v", teamName, c.GetTeamURL(), tResult.Err.Message)
// This should probably do somthing nicer
if utils.Cfg.ServiceSettings.Mode == utils.MODE_DEV { http.Redirect(w, r, "http://"+r.Host, http.StatusTemporaryRedirect)
teamDomain = "developer" return
} else if utils.Cfg.ServiceSettings.Mode == utils.MODE_BETA {
teamDomain = "beta"
} else { } else {
teamDomain, siteDomain = model.GetSubDomain(c.TeamUrl) team = tResult.Data.(*model.Team)
siteDomain = "." + siteDomain + ".com" }
if tResult := <-api.Srv.Store.Team().GetByDomain(teamDomain); tResult.Err != nil { // If we are already logged into this team then go to home
l4g.Error("Couldn't find team teamDomain=%v, siteDomain=%v, teamUrl=%v, err=%v", teamDomain, siteDomain, c.TeamUrl, tResult.Err.Message) if len(c.Session.UserId) != 0 && c.Session.TeamId == team.Id {
} else { page := NewHtmlTemplatePage("home", "Home")
teamName = tResult.Data.(*model.Team).Name page.Props["TeamURL"] = c.GetTeamURL()
} page.Render(c, w)
return
} }
page := NewHtmlTemplatePage("login", "Login") page := NewHtmlTemplatePage("login", "Login")
page.Props["TeamDisplayName"] = team.DisplayName
page.Props["TeamName"] = teamName page.Props["TeamName"] = teamName
page.Props["TeamDomain"] = teamDomain
page.Props["SiteDomain"] = siteDomain
page.Render(c, w) page.Render(c, w)
} }
@@ -198,7 +208,7 @@ func signupTeamComplete(c *api.Context, w http.ResponseWriter, r *http.Request)
page := NewHtmlTemplatePage("signup_team_complete", "Complete Team Sign Up") page := NewHtmlTemplatePage("signup_team_complete", "Complete Team Sign Up")
page.Props["Email"] = props["email"] page.Props["Email"] = props["email"]
page.Props["Name"] = props["name"] page.Props["DisplayName"] = props["display_name"]
page.Props["Data"] = data page.Props["Data"] = data
page.Props["Hash"] = hash page.Props["Hash"] = hash
page.Render(c, w) page.Render(c, w)
@@ -225,8 +235,8 @@ func signupUserComplete(c *api.Context, w http.ResponseWriter, r *http.Request)
} }
props["email"] = "" props["email"] = ""
props["display_name"] = team.DisplayName
props["name"] = team.Name props["name"] = team.Name
props["domain"] = team.Domain
props["id"] = team.Id props["id"] = team.Id
data = model.MapToJson(props) data = model.MapToJson(props)
hash = "" hash = ""
@@ -249,8 +259,8 @@ func signupUserComplete(c *api.Context, w http.ResponseWriter, r *http.Request)
page := NewHtmlTemplatePage("signup_user_complete", "Complete User Sign Up") page := NewHtmlTemplatePage("signup_user_complete", "Complete User Sign Up")
page.Props["Email"] = props["email"] page.Props["Email"] = props["email"]
page.Props["TeamDisplayName"] = props["display_name"]
page.Props["TeamName"] = props["name"] page.Props["TeamName"] = props["name"]
page.Props["TeamDomain"] = props["domain"]
page.Props["TeamId"] = props["id"] page.Props["TeamId"] = props["id"]
page.Props["Data"] = data page.Props["Data"] = data
page.Props["Hash"] = hash page.Props["Hash"] = hash
@@ -259,12 +269,12 @@ func signupUserComplete(c *api.Context, w http.ResponseWriter, r *http.Request)
func logout(c *api.Context, w http.ResponseWriter, r *http.Request) { func logout(c *api.Context, w http.ResponseWriter, r *http.Request) {
api.Logout(c, w, r) api.Logout(c, w, r)
http.Redirect(w, r, "/", http.StatusFound) http.Redirect(w, r, c.GetTeamURL(), http.StatusFound)
} }
func getChannel(c *api.Context, w http.ResponseWriter, r *http.Request) { func getChannel(c *api.Context, w http.ResponseWriter, r *http.Request) {
params := mux.Vars(r) params := mux.Vars(r)
name := params["name"] name := params["channelname"]
var channelId string var channelId string
if result := <-api.Srv.Store.Channel().CheckPermissionsToByName(c.Session.TeamId, name, c.Session.UserId); result.Err != nil { if result := <-api.Srv.Store.Channel().CheckPermissionsToByName(c.Session.TeamId, name, c.Session.UserId); result.Err != nil {
@@ -304,7 +314,7 @@ func getChannel(c *api.Context, w http.ResponseWriter, r *http.Request) {
//api.Handle404(w, r) //api.Handle404(w, r)
//Bad channel urls just redirect to the town-square for now //Bad channel urls just redirect to the town-square for now
http.Redirect(w, r, "/channels/town-square", http.StatusFound) http.Redirect(w, r, c.GetTeamURL()+"/channels/town-square", http.StatusFound)
return return
} }
} }
@@ -319,8 +329,8 @@ func getChannel(c *api.Context, w http.ResponseWriter, r *http.Request) {
} }
page := NewHtmlTemplatePage("channel", "") page := NewHtmlTemplatePage("channel", "")
page.Title = name + " - " + team.Name + " " + page.SiteName page.Title = name + " - " + team.DisplayName + " " + page.SiteName
page.Props["TeamName"] = team.Name page.Props["TeamDisplayName"] = team.DisplayName
page.Props["TeamType"] = team.Type page.Props["TeamType"] = team.Type
page.Props["TeamId"] = team.Id page.Props["TeamId"] = team.Id
page.Props["ChannelName"] = name page.Props["ChannelName"] = name
@@ -331,7 +341,7 @@ func getChannel(c *api.Context, w http.ResponseWriter, r *http.Request) {
func verifyEmail(c *api.Context, w http.ResponseWriter, r *http.Request) { func verifyEmail(c *api.Context, w http.ResponseWriter, r *http.Request) {
resend := r.URL.Query().Get("resend") resend := r.URL.Query().Get("resend")
domain := r.URL.Query().Get("domain") name := r.URL.Query().Get("name")
email := r.URL.Query().Get("email") email := r.URL.Query().Get("email")
hashedId := r.URL.Query().Get("hid") hashedId := r.URL.Query().Get("hid")
userId := r.URL.Query().Get("uid") userId := r.URL.Query().Get("uid")
@@ -339,7 +349,7 @@ func verifyEmail(c *api.Context, w http.ResponseWriter, r *http.Request) {
if resend == "true" { if resend == "true" {
teamId := "" teamId := ""
if result := <-api.Srv.Store.Team().GetByDomain(domain); result.Err != nil { if result := <-api.Srv.Store.Team().GetByName(name); result.Err != nil {
c.Err = result.Err c.Err = result.Err
return return
} else { } else {
@@ -351,7 +361,7 @@ func verifyEmail(c *api.Context, w http.ResponseWriter, r *http.Request) {
return return
} else { } else {
user := result.Data.(*model.User) user := result.Data.(*model.User)
api.FireAndForgetVerifyEmail(user.Id, user.FirstName, user.Email, domain, c.TeamUrl) api.FireAndForgetVerifyEmail(user.Id, strings.Split(user.Nickname, " ")[0], user.Email, name, c.GetTeamURL())
http.Redirect(w, r, "/", http.StatusFound) http.Redirect(w, r, "/", http.StatusFound)
return return
} }
@@ -387,6 +397,8 @@ func resetPassword(c *api.Context, w http.ResponseWriter, r *http.Request) {
isResetLink := true isResetLink := true
hash := r.URL.Query().Get("h") hash := r.URL.Query().Get("h")
data := r.URL.Query().Get("d") data := r.URL.Query().Get("d")
params := mux.Vars(r)
teamName := params["team"]
if len(hash) == 0 || len(data) == 0 { if len(hash) == 0 || len(data) == 0 {
isResetLink = false isResetLink = false
@@ -405,30 +417,25 @@ func resetPassword(c *api.Context, w http.ResponseWriter, r *http.Request) {
} }
} }
teamName := "Developer/Beta" teamDisplayName := "Developer/Beta"
domain := "" var team *model.Team
if utils.Cfg.ServiceSettings.Mode != utils.MODE_DEV { if tResult := <-api.Srv.Store.Team().GetByName(teamName); tResult.Err != nil {
domain, _ = model.GetSubDomain(c.TeamUrl) c.Err = tResult.Err
return
} else {
team = tResult.Data.(*model.Team)
}
var team *model.Team if team != nil {
if tResult := <-api.Srv.Store.Team().GetByDomain(domain); tResult.Err != nil { teamDisplayName = team.DisplayName
c.Err = tResult.Err
return
} else {
team = tResult.Data.(*model.Team)
}
if team != nil {
teamName = team.Name
}
} }
page := NewHtmlTemplatePage("password_reset", "") page := NewHtmlTemplatePage("password_reset", "")
page.Title = "Reset Password - " + page.SiteName page.Title = "Reset Password - " + page.SiteName
page.Props["TeamName"] = teamName page.Props["TeamDisplayName"] = teamDisplayName
page.Props["Hash"] = hash page.Props["Hash"] = hash
page.Props["Data"] = data page.Props["Data"] = data
page.Props["Domain"] = domain page.Props["TeamName"] = teamName
page.Props["IsReset"] = strconv.FormatBool(isResetLink) page.Props["IsReset"] = strconv.FormatBool(isResetLink)
page.Render(c, w) page.Render(c, w)
} }