Adding perm delete to cmd line

This commit is contained in:
=Corey Hulen
2015-11-16 17:12:49 -08:00
parent 03c6dcbd86
commit 6b2eabf610
25 changed files with 461 additions and 35 deletions

View File

@@ -582,6 +582,32 @@ func updateTeam(c *Context, w http.ResponseWriter, r *http.Request) {
w.Write([]byte(oldTeam.ToJson())) w.Write([]byte(oldTeam.ToJson()))
} }
func PermanentDeleteTeam(c *Context, team *model.Team) *model.AppError {
l4g.Warn("Attempting to permanently delete team %v id=%v", team.Name, team.Id)
team.DeleteAt = model.GetMillis()
if result := <-Srv.Store.Team().Update(team); result.Err != nil {
return result.Err
}
if result := <-Srv.Store.User().GetForExport(team.Id); result.Err != nil {
return result.Err
} else {
users := result.Data.([]*model.User)
for _, user := range users {
PermanentDeleteUser(c, user)
}
}
if result := <-Srv.Store.Team().PermanentDelete(team.Id); result.Err != nil {
return result.Err
}
l4g.Warn("Permanently deleted team %v id=%v", team.Name, team.Id)
return nil
}
func getMyTeam(c *Context, w http.ResponseWriter, r *http.Request) { func getMyTeam(c *Context, w http.ResponseWriter, r *http.Request) {
if len(c.Session.TeamId) == 0 { if len(c.Session.TeamId) == 0 {

View File

@@ -168,6 +168,43 @@ func TestGetAllTeams(t *testing.T) {
} }
} }
func TestTeamPermDelete(t *testing.T) {
Setup()
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)
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)
store.Must(Srv.Store.User().VerifyEmail(user1.Id))
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 = Client.Must(Client.CreateChannel(channel1)).Data.(*model.Channel)
post1 := &model.Post{ChannelId: channel1.Id, Message: "search for post1"}
post1 = Client.Must(Client.CreatePost(post1)).Data.(*model.Post)
post2 := &model.Post{ChannelId: channel1.Id, Message: "search for post2"}
post2 = Client.Must(Client.CreatePost(post2)).Data.(*model.Post)
post3 := &model.Post{ChannelId: channel1.Id, Message: "#hashtag search for post3"}
post3 = Client.Must(Client.CreatePost(post3)).Data.(*model.Post)
post4 := &model.Post{ChannelId: channel1.Id, Message: "hashtag for post4"}
post4 = Client.Must(Client.CreatePost(post4)).Data.(*model.Post)
c := &Context{}
c.RequestId = model.NewId()
c.IpAddress = "test"
err := PermanentDeleteTeam(c, team)
if err != nil {
t.Fatal(err)
}
}
/* /*
XXXXXX investigate and fix failing test XXXXXX investigate and fix failing test

View File

@@ -1196,6 +1196,14 @@ func updateActive(c *Context, w http.ResponseWriter, r *http.Request) {
} }
} }
ruser := UpdateActive(c, user, active)
if c.Err == nil {
w.Write([]byte(ruser.ToJson()))
}
}
func UpdateActive(c *Context, user *model.User, active bool) *model.User {
if active { if active {
user.DeleteAt = 0 user.DeleteAt = 0
} else { } else {
@@ -1204,7 +1212,7 @@ func updateActive(c *Context, w http.ResponseWriter, r *http.Request) {
if result := <-Srv.Store.User().Update(user, true); result.Err != nil { if result := <-Srv.Store.User().Update(user, true); result.Err != nil {
c.Err = result.Err c.Err = result.Err
return return nil
} else { } else {
c.LogAuditWithUserId(user.Id, fmt.Sprintf("active=%v", active)) c.LogAuditWithUserId(user.Id, fmt.Sprintf("active=%v", active))
@@ -1216,10 +1224,61 @@ func updateActive(c *Context, w http.ResponseWriter, r *http.Request) {
options := utils.SanitizeOptions options := utils.SanitizeOptions
options["passwordupdate"] = false options["passwordupdate"] = false
ruser.Sanitize(options) ruser.Sanitize(options)
w.Write([]byte(ruser.ToJson())) return ruser
} }
} }
func PermanentDeleteUser(c *Context, user *model.User) *model.AppError {
l4g.Warn("Attempting to permanently delete account %v id=%v", user.Email, user.Id)
c.Path = "/user/permanent_delete"
c.LogAuditWithUserId(user.Id, fmt.Sprintf("attempt"))
if user.IsInRole(model.ROLE_SYSTEM_ADMIN) {
l4g.Warn("You are deleting %v that is a system administrator. You may need to set another account as the system administrator using the command line tools.", user.Email)
}
UpdateActive(c, user, false)
if result := <-Srv.Store.Session().PermanentDeleteSessionsByUser(user.Id); result.Err != nil {
return result.Err
}
if result := <-Srv.Store.OAuth().PermanentDeleteAuthDataByUser(user.Id); result.Err != nil {
return result.Err
}
if result := <-Srv.Store.Webhook().PermanentDeleteIncomingByUser(user.Id); result.Err != nil {
return result.Err
}
if result := <-Srv.Store.Webhook().PermanentDeleteOutgoingByUser(user.Id); result.Err != nil {
return result.Err
}
if result := <-Srv.Store.Preference().PermanentDeleteByUser(user.Id); result.Err != nil {
return result.Err
}
if result := <-Srv.Store.Channel().PermanentDeleteMembersByUser(user.Id); result.Err != nil {
return result.Err
}
if result := <-Srv.Store.Post().PermanentDeleteByUser(user.Id); result.Err != nil {
return result.Err
}
if result := <-Srv.Store.User().PermanentDelete(user.Id); result.Err != nil {
return result.Err
}
if result := <-Srv.Store.Audit().PermanentDeleteByUser(user.Id); result.Err != nil {
return result.Err
}
l4g.Warn("Permanently deleted account %v id=%v", user.Email, user.Id)
return nil
}
func sendPasswordReset(c *Context, w http.ResponseWriter, r *http.Request) { func sendPasswordReset(c *Context, w http.ResponseWriter, r *http.Request) {
props := model.MapFromJson(r.Body) props := model.MapFromJson(r.Body)

View File

@@ -767,6 +767,43 @@ func TestUserUpdateActive(t *testing.T) {
} }
} }
func TestUserPermDelete(t *testing.T) {
Setup()
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)
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)
store.Must(Srv.Store.User().VerifyEmail(user1.Id))
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 = Client.Must(Client.CreateChannel(channel1)).Data.(*model.Channel)
post1 := &model.Post{ChannelId: channel1.Id, Message: "search for post1"}
post1 = Client.Must(Client.CreatePost(post1)).Data.(*model.Post)
post2 := &model.Post{ChannelId: channel1.Id, Message: "search for post2"}
post2 = Client.Must(Client.CreatePost(post2)).Data.(*model.Post)
post3 := &model.Post{ChannelId: channel1.Id, Message: "#hashtag search for post3"}
post3 = Client.Must(Client.CreatePost(post3)).Data.(*model.Post)
post4 := &model.Post{ChannelId: channel1.Id, Message: "hashtag for post4"}
post4 = Client.Must(Client.CreatePost(post4)).Data.(*model.Post)
c := &Context{}
c.RequestId = model.NewId()
c.IpAddress = "test"
err := PermanentDeleteUser(c, user1)
if err != nil {
t.Fatal(err)
}
}
func TestSendPasswordReset(t *testing.T) { func TestSendPasswordReset(t *testing.T) {
Setup() Setup()

View File

@@ -30,6 +30,8 @@ var flagCmdCreateUser bool
var flagCmdAssignRole bool var flagCmdAssignRole bool
var flagCmdVersion bool var flagCmdVersion bool
var flagCmdResetPassword bool var flagCmdResetPassword bool
var flagCmdResetPermanentDeleteUser bool
var flagCmdResetPermanentDeleteTeam bool
var flagConfigFile string var flagConfigFile string
var flagEmail string var flagEmail string
var flagPassword string var flagPassword string
@@ -191,10 +193,12 @@ func parseCmds() {
flag.BoolVar(&flagCmdAssignRole, "assign_role", false, "") flag.BoolVar(&flagCmdAssignRole, "assign_role", false, "")
flag.BoolVar(&flagCmdVersion, "version", false, "") flag.BoolVar(&flagCmdVersion, "version", false, "")
flag.BoolVar(&flagCmdResetPassword, "reset_password", false, "") flag.BoolVar(&flagCmdResetPassword, "reset_password", false, "")
flag.BoolVar(&flagCmdResetPermanentDeleteUser, "permanent_delete_user", false, "")
flag.BoolVar(&flagCmdResetPermanentDeleteTeam, "permanent_delete_team", false, "")
flag.Parse() flag.Parse()
flagRunCmds = flagCmdCreateTeam || flagCmdCreateUser || flagCmdAssignRole || flagCmdResetPassword || flagCmdVersion flagRunCmds = flagCmdCreateTeam || flagCmdCreateUser || flagCmdAssignRole || flagCmdResetPassword || flagCmdVersion || flagCmdResetPermanentDeleteUser || flagCmdResetPermanentDeleteTeam
} }
func runCmds() { func runCmds() {
@@ -203,6 +207,8 @@ func runCmds() {
cmdCreateUser() cmdCreateUser()
cmdAssignRole() cmdAssignRole()
cmdResetPassword() cmdResetPassword()
cmdPermDeleteUser()
cmdPermDeleteTeam()
} }
func cmdCreateTeam() { func cmdCreateTeam() {
@@ -406,6 +412,106 @@ func cmdResetPassword() {
} }
} }
func cmdPermDeleteUser() {
if flagCmdResetPermanentDeleteUser {
if len(flagTeamName) == 0 {
fmt.Fprintln(os.Stderr, "flag needs an argument: -team_name")
flag.Usage()
os.Exit(1)
}
if len(flagEmail) == 0 {
fmt.Fprintln(os.Stderr, "flag needs an argument: -email")
flag.Usage()
os.Exit(1)
}
c := &api.Context{}
c.RequestId = model.NewId()
c.IpAddress = "cmd_line"
var team *model.Team
if result := <-api.Srv.Store.Team().GetByName(flagTeamName); result.Err != nil {
l4g.Error("%v", result.Err)
flushLogAndExit(1)
} else {
team = result.Data.(*model.Team)
}
var user *model.User
if result := <-api.Srv.Store.User().GetByEmail(team.Id, flagEmail); result.Err != nil {
l4g.Error("%v", result.Err)
flushLogAndExit(1)
} else {
user = result.Data.(*model.User)
}
var confirmBackup string
fmt.Print("Have you performed a database backup? (YES/NO): ")
fmt.Scanln(&confirmBackup)
if confirmBackup != "YES" {
flushLogAndExit(1)
}
var confirm string
fmt.Printf("Are you sure you want to delete the user %v? All data will be permanently deleted? (YES/NO): ", user.Email)
fmt.Scanln(&confirm)
if confirm != "YES" {
flushLogAndExit(1)
}
if err := api.PermanentDeleteUser(c, user); err != nil {
l4g.Error("%v", err)
flushLogAndExit(1)
} else {
flushLogAndExit(0)
}
}
}
func cmdPermDeleteTeam() {
if flagCmdResetPermanentDeleteTeam {
if len(flagTeamName) == 0 {
fmt.Fprintln(os.Stderr, "flag needs an argument: -team_name")
flag.Usage()
os.Exit(1)
}
c := &api.Context{}
c.RequestId = model.NewId()
c.IpAddress = "cmd_line"
var team *model.Team
if result := <-api.Srv.Store.Team().GetByName(flagTeamName); result.Err != nil {
l4g.Error("%v", result.Err)
flushLogAndExit(1)
} else {
team = result.Data.(*model.Team)
}
var confirmBackup string
fmt.Print("Have you performed a database backup? (YES/NO): ")
fmt.Scanln(&confirmBackup)
if confirmBackup != "YES" {
flushLogAndExit(1)
}
var confirm string
fmt.Printf("Are you sure you want to delete the team %v? All data will be permanently deleted? (YES/NO): ", team.Name)
fmt.Scanln(&confirm)
if confirm != "YES" {
flushLogAndExit(1)
}
if err := api.PermanentDeleteTeam(c, team); err != nil {
l4g.Error("%v", err)
flushLogAndExit(1)
} else {
flushLogAndExit(0)
}
}
}
func flushLogAndExit(code int) { func flushLogAndExit(code int) {
l4g.Close() l4g.Close()
time.Sleep(time.Second) time.Sleep(time.Second)
@@ -461,5 +567,17 @@ Usage:
Example: Example:
platform -reset_password -team_name="name" -email="user@example.com" -password="newpassword" platform -reset_password -team_name="name" -email="user@example.com" -password="newpassword"
-permanent_delete_user Permanently deletes a user and all related information
include posts from the database. It requires the
-team_name, and -email flag.
Example:
platform -permanent_delete_user -team_name="name" -email="user@example.com"
-permanent_delete_team Permanently deletes a team and all users along with
all related information including posts from the database.
It requires the -team_name flag.
Example:
platform -permanent_delete_team -team_name="name"
` `

View File

@@ -87,7 +87,7 @@ func (s SqlAuditStore) Get(user_id string, limit int) StoreChannel {
return storeChannel return storeChannel
} }
func (s SqlAuditStore) Delete(userId string) StoreChannel { func (s SqlAuditStore) PermanentDeleteByUser(userId string) StoreChannel {
storeChannel := make(StoreChannel) storeChannel := make(StoreChannel)

View File

@@ -45,7 +45,7 @@ func TestSqlAuditStore(t *testing.T) {
t.Fatal("Should have returned empty because user_id is missing") t.Fatal("Should have returned empty because user_id is missing")
} }
if r2 := <-store.Audit().Delete(audit.UserId); r2.Err != nil { if r2 := <-store.Audit().PermanentDeleteByUser(audit.UserId); r2.Err != nil {
t.Fatal(r2.Err) t.Fatal(r2.Err)
} }
} }

View File

@@ -616,7 +616,7 @@ func (s SqlChannelStore) RemoveMember(channelId string, userId string) StoreChan
return storeChannel return storeChannel
} }
func (s SqlChannelStore) DeleteMember(userId string) StoreChannel { func (s SqlChannelStore) PermanentDeleteMembersByUser(userId string) StoreChannel {
storeChannel := make(StoreChannel) storeChannel := make(StoreChannel)
go func() { go func() {

View File

@@ -428,7 +428,7 @@ func TestChannelDeleteMemberStore(t *testing.T) {
t.Fatal("should have saved 2 members") t.Fatal("should have saved 2 members")
} }
Must(store.Channel().DeleteMember(o2.UserId)) Must(store.Channel().PermanentDeleteMembersByUser(o2.UserId))
count = (<-store.Channel().GetMemberCount(o1.ChannelId)).Data.(int64) count = (<-store.Channel().GetMemberCount(o1.ChannelId)).Data.(int64)
if count != 1 { if count != 1 {

View File

@@ -333,7 +333,7 @@ func (as SqlOAuthStore) RemoveAuthData(code string) StoreChannel {
return storeChannel return storeChannel
} }
func (as SqlOAuthStore) RemoveAuthDataByUserId(userId string) StoreChannel { func (as SqlOAuthStore) PermanentDeleteAuthDataByUser(userId string) StoreChannel {
storeChannel := make(StoreChannel) storeChannel := make(StoreChannel)
go func() { go func() {

View File

@@ -181,7 +181,7 @@ func TestOAuthStoreRemoveAuthData(t *testing.T) {
} }
} }
func TestOAuthStoreRemoveAuthDataByUserId(t *testing.T) { func TestOAuthStoreRemoveAuthDataByUser(t *testing.T) {
Setup() Setup()
a1 := model.AuthData{} a1 := model.AuthData{}
@@ -190,7 +190,7 @@ func TestOAuthStoreRemoveAuthDataByUserId(t *testing.T) {
a1.Code = model.NewId() a1.Code = model.NewId()
Must(store.OAuth().SaveAuthData(&a1)) Must(store.OAuth().SaveAuthData(&a1))
if err := (<-store.OAuth().RemoveAuthDataByUserId(a1.UserId)).Err; err != nil { if err := (<-store.OAuth().PermanentDeleteAuthDataByUser(a1.UserId)).Err; err != nil {
t.Fatal(err) t.Fatal(err)
} }
} }

View File

@@ -228,13 +228,13 @@ func (s SqlPostStore) Delete(postId string, time int64) StoreChannel {
return storeChannel return storeChannel
} }
func (s SqlPostStore) PermanentDelete(userId string) StoreChannel { func (s SqlPostStore) permanentDelete(postId string) StoreChannel {
storeChannel := make(StoreChannel) storeChannel := make(StoreChannel)
go func() { go func() {
result := StoreResult{} result := StoreResult{}
_, err := s.GetMaster().Exec("Update Posts SET DeleteAt = :DeleteAt, UpdateAt = :UpdateAt WHERE Id = :Id OR ParentId = :ParentId OR RootId = :RootId", map[string]interface{}{"DeleteAt": time, "UpdateAt": time, "Id": postId, "ParentId": postId, "RootId": postId}) _, err := s.GetMaster().Exec("DELETE FROM Posts WHERE Id = :Id OR ParentId = :ParentId OR RootId = :RootId", map[string]interface{}{"Id": postId, "ParentId": postId, "RootId": postId})
if err != nil { if err != nil {
result.Err = model.NewAppError("SqlPostStore.Delete", "We couldn't delete the post", "id="+postId+", err="+err.Error()) result.Err = model.NewAppError("SqlPostStore.Delete", "We couldn't delete the post", "id="+postId+", err="+err.Error())
} }
@@ -246,6 +246,81 @@ func (s SqlPostStore) PermanentDelete(userId string) StoreChannel {
return storeChannel return storeChannel
} }
func (s SqlPostStore) permanentDeleteAllCommentByUser(userId string) StoreChannel {
storeChannel := make(StoreChannel)
go func() {
result := StoreResult{}
_, err := s.GetMaster().Exec("DELETE FROM Posts WHERE UserId = :UserId AND RootId != ''", map[string]interface{}{"UserId": userId})
if err != nil {
result.Err = model.NewAppError("SqlPostStore.permanentDeleteAllCommentByUser", "We couldn't delete the comments for user", "userId="+userId+", err="+err.Error())
}
storeChannel <- result
close(storeChannel)
}()
return storeChannel
}
func (s SqlPostStore) PermanentDeleteByUser(userId string) StoreChannel {
storeChannel := make(StoreChannel)
go func() {
result := StoreResult{}
// First attempt to delete all the comments for a user
if r := <-s.permanentDeleteAllCommentByUser(userId); r.Err != nil {
result.Err = r.Err
storeChannel <- result
close(storeChannel)
return
}
// Now attempt to delete all the root posts for a user. This will also
// delete all the comments for each post.
found := true
count := 0
for found {
var ids []string
_, err := s.GetMaster().Select(&ids, "SELECT Id FROM Posts WHERE UserId = :UserId LIMIT 1000", map[string]interface{}{"UserId": userId})
if err != nil {
result.Err = model.NewAppError("SqlPostStore.PermanentDeleteByUser.select", "We couldn't select the posts to delete for the user", "userId="+userId+", err="+err.Error())
storeChannel <- result
close(storeChannel)
return
} else {
found = false
for _, id := range ids {
found = true
if r := <-s.permanentDelete(id); r.Err != nil {
result.Err = r.Err
storeChannel <- result
close(storeChannel)
return
}
}
}
// This is a fail safe, give up if more than 10K messages
count = count + 1
if count >= 10 {
result.Err = model.NewAppError("SqlPostStore.PermanentDeleteByUser.toolarge", "We couldn't select the posts to delete for the user (too many), please re-run", "userId="+userId)
storeChannel <- result
close(storeChannel)
return
}
}
storeChannel <- result
close(storeChannel)
}()
return storeChannel
}
func (s SqlPostStore) GetPosts(channelId string, offset int, limit int) StoreChannel { func (s SqlPostStore) GetPosts(channelId string, offset int, limit int) StoreChannel {
storeChannel := make(StoreChannel) storeChannel := make(StoreChannel)

View File

@@ -247,6 +247,76 @@ func TestPostStoreDelete2Level(t *testing.T) {
} }
} }
func TestPostStorePermDelete1Level(t *testing.T) {
Setup()
o1 := &model.Post{}
o1.ChannelId = model.NewId()
o1.UserId = model.NewId()
o1.Message = "a" + model.NewId() + "b"
o1 = (<-store.Post().Save(o1)).Data.(*model.Post)
o2 := &model.Post{}
o2.ChannelId = o1.ChannelId
o2.UserId = model.NewId()
o2.Message = "a" + model.NewId() + "b"
o2.ParentId = o1.Id
o2.RootId = o1.Id
o2 = (<-store.Post().Save(o2)).Data.(*model.Post)
if r2 := <-store.Post().PermanentDeleteByUser(o2.UserId); r2.Err != nil {
t.Fatal(r2.Err)
}
if r3 := (<-store.Post().Get(o1.Id)); r3.Err != nil {
t.Fatal("Deleted id shouldn't have failed")
}
if r4 := (<-store.Post().Get(o2.Id)); r4.Err == nil {
t.Fatal("Deleted id should have failed")
}
}
func TestPostStorePermDelete1Level2(t *testing.T) {
Setup()
o1 := &model.Post{}
o1.ChannelId = model.NewId()
o1.UserId = model.NewId()
o1.Message = "a" + model.NewId() + "b"
o1 = (<-store.Post().Save(o1)).Data.(*model.Post)
o2 := &model.Post{}
o2.ChannelId = o1.ChannelId
o2.UserId = model.NewId()
o2.Message = "a" + model.NewId() + "b"
o2.ParentId = o1.Id
o2.RootId = o1.Id
o2 = (<-store.Post().Save(o2)).Data.(*model.Post)
o3 := &model.Post{}
o3.ChannelId = model.NewId()
o3.UserId = model.NewId()
o3.Message = "a" + model.NewId() + "b"
o3 = (<-store.Post().Save(o3)).Data.(*model.Post)
if r2 := <-store.Post().PermanentDeleteByUser(o1.UserId); r2.Err != nil {
t.Fatal(r2.Err)
}
if r3 := (<-store.Post().Get(o1.Id)); r3.Err == nil {
t.Fatal("Deleted id should have failed")
}
if r4 := (<-store.Post().Get(o2.Id)); r4.Err == nil {
t.Fatal("Deleted id should have failed")
}
if r5 := (<-store.Post().Get(o3.Id)); r5.Err != nil {
t.Fatal("Deleted id shouldn't have failed")
}
}
func TestPostStoreGetWithChildren(t *testing.T) { func TestPostStoreGetWithChildren(t *testing.T) {
Setup() Setup()

View File

@@ -240,7 +240,7 @@ func (s SqlPreferenceStore) GetAll(userId string) StoreChannel {
return storeChannel return storeChannel
} }
func (s SqlPreferenceStore) Delete(userId string) StoreChannel { func (s SqlPreferenceStore) PermanentDeleteByUser(userId string) StoreChannel {
storeChannel := make(StoreChannel) storeChannel := make(StoreChannel)
go func() { go func() {

View File

@@ -228,7 +228,7 @@ func TestPreferenceDelete(t *testing.T) {
Must(store.Preference().Save(&preferences)) Must(store.Preference().Save(&preferences))
if result := <-store.Preference().Delete(userId); result.Err != nil { if result := <-store.Preference().PermanentDeleteByUser(userId); result.Err != nil {
t.Fatal(result.Err) t.Fatal(result.Err)
} }
} }

View File

@@ -158,7 +158,7 @@ func (me SqlSessionStore) RemoveAllSessionsForTeam(teamId string) StoreChannel {
return storeChannel return storeChannel
} }
func (me SqlSessionStore) RemoveAllSessionsForUser(userId string) StoreChannel { func (me SqlSessionStore) PermanentDeleteSessionsByUser(userId string) StoreChannel {
storeChannel := make(StoreChannel) storeChannel := make(StoreChannel)
go func() { go func() {

View File

@@ -119,7 +119,7 @@ func TestSessionRemoveByUser(t *testing.T) {
} }
} }
Must(store.Session().RemoveAllSessionsForUser(s1.UserId)) Must(store.Session().PermanentDeleteSessionsByUser(s1.UserId))
if rs2 := (<-store.Session().Get(s1.Id)); rs2.Err == nil { if rs2 := (<-store.Session().Get(s1.Id)); rs2.Err == nil {
t.Fatal("should have been removed") t.Fatal("should have been removed")

View File

@@ -301,7 +301,7 @@ func (s SqlTeamStore) GetAllTeamListing() StoreChannel {
return storeChannel return storeChannel
} }
func (s SqlTeamStore) Delete(teamId string) StoreChannel { func (s SqlTeamStore) PermanentDelete(teamId string) StoreChannel {
storeChannel := make(StoreChannel) storeChannel := make(StoreChannel)
go func() { go func() {

View File

@@ -257,7 +257,7 @@ func TestDelete(t *testing.T) {
o2.Type = model.TEAM_OPEN o2.Type = model.TEAM_OPEN
Must(store.Team().Save(&o2)) Must(store.Team().Save(&o2))
if r1 := <-store.Team().Delete(o1.Id); r1.Err != nil { if r1 := <-store.Team().PermanentDelete(o1.Id); r1.Err != nil {
t.Fatal(r1.Err) t.Fatal(r1.Err)
} }
} }

View File

@@ -555,7 +555,7 @@ func (us SqlUserStore) GetTotalActiveUsersCount() StoreChannel {
return storeChannel return storeChannel
} }
func (us SqlUserStore) Delete(userId string) StoreChannel { func (us SqlUserStore) PermanentDelete(userId string) StoreChannel {
storeChannel := make(StoreChannel) storeChannel := make(StoreChannel)

View File

@@ -386,7 +386,7 @@ func TestUserStoreDelete(t *testing.T) {
u1.Email = model.NewId() u1.Email = model.NewId()
Must(store.User().Save(&u1)) Must(store.User().Save(&u1))
if err := (<-store.User().Delete(u1.Id)).Err; err != nil { if err := (<-store.User().PermanentDelete(u1.Id)).Err; err != nil {
t.Fatal(err) t.Fatal(err)
} }
} }

View File

@@ -116,7 +116,7 @@ func (s SqlWebhookStore) DeleteIncoming(webhookId string, time int64) StoreChann
return storeChannel return storeChannel
} }
func (s SqlWebhookStore) DeleteIncomingByUser(userId string) StoreChannel { func (s SqlWebhookStore) PermanentDeleteIncomingByUser(userId string) StoreChannel {
storeChannel := make(StoreChannel) storeChannel := make(StoreChannel)
go func() { go func() {
@@ -312,7 +312,7 @@ func (s SqlWebhookStore) DeleteOutgoing(webhookId string, time int64) StoreChann
return storeChannel return storeChannel
} }
func (s SqlWebhookStore) DeleteOutgoingByUser(userId string) StoreChannel { func (s SqlWebhookStore) PermanentDeleteOutgoingByUser(userId string) StoreChannel {
storeChannel := make(StoreChannel) storeChannel := make(StoreChannel)
go func() { go func() {

View File

@@ -121,7 +121,7 @@ func TestWebhookStoreDeleteIncomingByUser(t *testing.T) {
} }
} }
if r2 := <-store.Webhook().DeleteIncomingByUser(o1.UserId); r2.Err != nil { if r2 := <-store.Webhook().PermanentDeleteIncomingByUser(o1.UserId); r2.Err != nil {
t.Fatal(r2.Err) t.Fatal(r2.Err)
} }
@@ -305,7 +305,7 @@ func TestWebhookStoreDeleteOutgoingByUser(t *testing.T) {
} }
} }
if r2 := <-store.Webhook().DeleteOutgoingByUser(o1.CreatorId); r2.Err != nil { if r2 := <-store.Webhook().PermanentDeleteOutgoingByUser(o1.CreatorId); r2.Err != nil {
t.Fatal(r2.Err) t.Fatal(r2.Err)
} }

View File

@@ -52,7 +52,7 @@ type TeamStore interface {
GetAll() StoreChannel GetAll() StoreChannel
GetAllTeamListing() StoreChannel GetAllTeamListing() StoreChannel
GetByInviteId(inviteId string) StoreChannel GetByInviteId(inviteId string) StoreChannel
Delete(teamId string) StoreChannel PermanentDelete(teamId string) StoreChannel
} }
type ChannelStore interface { type ChannelStore interface {
@@ -73,7 +73,7 @@ type ChannelStore interface {
GetMember(channelId string, userId string) StoreChannel GetMember(channelId string, userId string) StoreChannel
GetMemberCount(channelId string) StoreChannel GetMemberCount(channelId string) StoreChannel
RemoveMember(channelId string, userId string) StoreChannel RemoveMember(channelId string, userId string) StoreChannel
DeleteMember(userId string) StoreChannel PermanentDeleteMembersByUser(userId string) StoreChannel
GetExtraMembers(channelId string, limit int) StoreChannel GetExtraMembers(channelId string, limit int) StoreChannel
CheckPermissionsTo(teamId string, channelId string, userId string) StoreChannel CheckPermissionsTo(teamId string, channelId string, userId string) StoreChannel
CheckOpenChannelPermissions(teamId string, channelId string) StoreChannel CheckOpenChannelPermissions(teamId string, channelId string) StoreChannel
@@ -88,6 +88,7 @@ type PostStore interface {
Update(post *model.Post, newMessage string, newHashtags string) StoreChannel Update(post *model.Post, newMessage string, newHashtags string) StoreChannel
Get(id string) StoreChannel Get(id string) StoreChannel
Delete(postId string, time int64) StoreChannel Delete(postId string, time int64) StoreChannel
PermanentDeleteByUser(userId string) StoreChannel
GetPosts(channelId string, offset int, limit int) StoreChannel GetPosts(channelId string, offset int, limit int) StoreChannel
GetPostsBefore(channelId string, postId string, numPosts int, offset int) StoreChannel GetPostsBefore(channelId string, postId string, numPosts int, offset int) StoreChannel
GetPostsAfter(channelId string, postId string, numPosts int, offset int) StoreChannel GetPostsAfter(channelId string, postId string, numPosts int, offset int) StoreChannel
@@ -120,7 +121,7 @@ type UserStore interface {
GetTotalUsersCount() StoreChannel GetTotalUsersCount() StoreChannel
GetTotalActiveUsersCount() StoreChannel GetTotalActiveUsersCount() StoreChannel
GetSystemAdminProfiles() StoreChannel GetSystemAdminProfiles() StoreChannel
Delete(userId string) StoreChannel PermanentDelete(userId string) StoreChannel
} }
type SessionStore interface { type SessionStore interface {
@@ -129,7 +130,7 @@ type SessionStore interface {
GetSessions(userId string) StoreChannel GetSessions(userId string) StoreChannel
Remove(sessionIdOrToken string) StoreChannel Remove(sessionIdOrToken string) StoreChannel
RemoveAllSessionsForTeam(teamId string) StoreChannel RemoveAllSessionsForTeam(teamId string) StoreChannel
RemoveAllSessionsForUser(teamId string) StoreChannel PermanentDeleteSessionsByUser(teamId string) StoreChannel
UpdateLastActivityAt(sessionId string, time int64) StoreChannel UpdateLastActivityAt(sessionId string, time int64) StoreChannel
UpdateRoles(userId string, roles string) StoreChannel UpdateRoles(userId string, roles string) StoreChannel
} }
@@ -137,7 +138,7 @@ type SessionStore interface {
type AuditStore interface { type AuditStore interface {
Save(audit *model.Audit) StoreChannel Save(audit *model.Audit) StoreChannel
Get(user_id string, limit int) StoreChannel Get(user_id string, limit int) StoreChannel
Delete(userId string) StoreChannel PermanentDeleteByUser(userId string) StoreChannel
} }
type OAuthStore interface { type OAuthStore interface {
@@ -148,7 +149,7 @@ type OAuthStore interface {
SaveAuthData(authData *model.AuthData) StoreChannel SaveAuthData(authData *model.AuthData) StoreChannel
GetAuthData(code string) StoreChannel GetAuthData(code string) StoreChannel
RemoveAuthData(code string) StoreChannel RemoveAuthData(code string) StoreChannel
RemoveAuthDataByUserId(userId string) StoreChannel PermanentDeleteAuthDataByUser(userId string) StoreChannel
SaveAccessData(accessData *model.AccessData) StoreChannel SaveAccessData(accessData *model.AccessData) StoreChannel
GetAccessData(token string) StoreChannel GetAccessData(token string) StoreChannel
GetAccessDataByAuthCode(authCode string) StoreChannel GetAccessDataByAuthCode(authCode string) StoreChannel
@@ -167,14 +168,14 @@ type WebhookStore interface {
GetIncomingByUser(userId string) StoreChannel GetIncomingByUser(userId string) StoreChannel
GetIncomingByChannel(channelId string) StoreChannel GetIncomingByChannel(channelId string) StoreChannel
DeleteIncoming(webhookId string, time int64) StoreChannel DeleteIncoming(webhookId string, time int64) StoreChannel
DeleteIncomingByUser(userId string) StoreChannel PermanentDeleteIncomingByUser(userId string) StoreChannel
SaveOutgoing(webhook *model.OutgoingWebhook) StoreChannel SaveOutgoing(webhook *model.OutgoingWebhook) StoreChannel
GetOutgoing(id string) StoreChannel GetOutgoing(id string) StoreChannel
GetOutgoingByCreator(userId string) StoreChannel GetOutgoingByCreator(userId string) StoreChannel
GetOutgoingByChannel(channelId string) StoreChannel GetOutgoingByChannel(channelId string) StoreChannel
GetOutgoingByTeam(teamId string) StoreChannel GetOutgoingByTeam(teamId string) StoreChannel
DeleteOutgoing(webhookId string, time int64) StoreChannel DeleteOutgoing(webhookId string, time int64) StoreChannel
DeleteOutgoingByUser(userId string) StoreChannel PermanentDeleteOutgoingByUser(userId string) StoreChannel
UpdateOutgoing(hook *model.OutgoingWebhook) StoreChannel UpdateOutgoing(hook *model.OutgoingWebhook) StoreChannel
} }
@@ -183,5 +184,5 @@ type PreferenceStore interface {
Get(userId string, category string, name string) StoreChannel Get(userId string, category string, name string) StoreChannel
GetCategory(userId string, category string) StoreChannel GetCategory(userId string, category string) StoreChannel
GetAll(userId string) StoreChannel GetAll(userId string) StoreChannel
Delete(userId string) StoreChannel PermanentDeleteByUser(userId string) StoreChannel
} }

View File

@@ -59,8 +59,7 @@ func FindDir(dir string) string {
func ConfigureCmdLineLog() { func ConfigureCmdLineLog() {
ls := model.LogSettings{} ls := model.LogSettings{}
ls.EnableConsole = true ls.EnableConsole = true
ls.ConsoleLevel = "ERROR" ls.ConsoleLevel = "WARN"
ls.EnableFile = false
configureLog(&ls) configureLog(&ls)
} }
@@ -72,6 +71,8 @@ func configureLog(s *model.LogSettings) {
level := l4g.DEBUG level := l4g.DEBUG
if s.ConsoleLevel == "INFO" { if s.ConsoleLevel == "INFO" {
level = l4g.INFO level = l4g.INFO
} else if s.ConsoleLevel == "WARN" {
level = l4g.WARNING
} else if s.ConsoleLevel == "ERROR" { } else if s.ConsoleLevel == "ERROR" {
level = l4g.ERROR level = l4g.ERROR
} }
@@ -90,6 +91,8 @@ func configureLog(s *model.LogSettings) {
level := l4g.DEBUG level := l4g.DEBUG
if s.FileLevel == "INFO" { if s.FileLevel == "INFO" {
level = l4g.INFO level = l4g.INFO
} else if s.FileLevel == "WARN" {
level = l4g.WARNING
} else if s.FileLevel == "ERROR" { } else if s.FileLevel == "ERROR" {
level = l4g.ERROR level = l4g.ERROR
} }