1
0
mirror of https://github.com/directorz/mailfull-go.git synced 2025-12-17 17:47:04 +00:00

Implement create/update/remove a AliasUser

This commit is contained in:
teru
2016-08-10 19:45:03 +09:00
parent 5593025c55
commit a7602a3180
2 changed files with 107 additions and 0 deletions

View File

@@ -3,8 +3,10 @@ package mailfull
import (
"bufio"
"errors"
"fmt"
"os"
"path/filepath"
"sort"
"strings"
)
@@ -137,3 +139,107 @@ func (r *Repository) AliasUser(domainName, aliasUserName string) (*AliasUser, er
return nil, nil
}
// AliasUserCreate creates the input AliasUser.
func (r *Repository) AliasUserCreate(domainName string, aliasUser *AliasUser) error {
aliasUsers, err := r.AliasUsers(domainName)
if err != nil {
return err
}
for _, au := range aliasUsers {
if au.Name() == aliasUser.Name() {
return ErrAliasUserAlreadyExist
}
}
existUser, err := r.User(domainName, aliasUser.Name())
if err != nil {
return err
}
if existUser != nil {
return ErrUserAlreadyExist
}
aliasUsers = append(aliasUsers, aliasUser)
if err := r.writeAliasUsersFile(domainName, aliasUsers); err != nil {
return err
}
return nil
}
// AliasUserUpdate updates the input AliasUser.
func (r *Repository) AliasUserUpdate(domainName string, aliasUser *AliasUser) error {
aliasUsers, err := r.AliasUsers(domainName)
if err != nil {
return err
}
idx := -1
for i, au := range aliasUsers {
if au.Name() == aliasUser.Name() {
idx = i
}
}
if idx < 0 {
return ErrAliasUserNotExist
}
aliasUsers[idx] = aliasUser
if err := r.writeAliasUsersFile(domainName, aliasUsers); err != nil {
return err
}
return nil
}
// AliasUserRemove removes a AliasUser of the input name.
func (r *Repository) AliasUserRemove(domainName string, aliasUserName string) error {
aliasUsers, err := r.AliasUsers(domainName)
if err != nil {
return err
}
idx := -1
for i, aliasUser := range aliasUsers {
if aliasUser.Name() == aliasUserName {
idx = i
}
}
if idx < 0 {
return ErrAliasUserNotExist
}
aliasUsers = append(aliasUsers[:idx], aliasUsers[idx+1:]...)
if err := r.writeAliasUsersFile(domainName, aliasUsers); err != nil {
return err
}
return nil
}
// writeAliasUsersFile writes a AliasUser slice to the file.
func (r *Repository) writeAliasUsersFile(domainName string, aliasUsers []*AliasUser) error {
if !validDomainName(domainName) {
return ErrInvalidDomainName
}
file, err := os.OpenFile(filepath.Join(r.DirMailDataPath, domainName, FileNameAliasUsers), os.O_RDWR|os.O_TRUNC, 0666)
if err != nil {
return err
}
defer file.Close()
sort.Sort(AliasUserSlice(aliasUsers))
for _, aliasUser := range aliasUsers {
if _, err := fmt.Fprintf(file, "%s:%s\n", aliasUser.Name(), strings.Join(aliasUser.Targets(), ",")); err != nil {
return err
}
}
return nil
}

View File

@@ -29,6 +29,7 @@ var (
ErrUserAlreadyExist = errors.New("User: already exist")
ErrUserIsCatchAllUser = errors.New("User: is set as catchall")
ErrAliasUserNotExist = errors.New("AliasUser: not exist")
ErrAliasUserAlreadyExist = errors.New("AliasUser: already exist")
ErrInvalidFormatUsersPassword = errors.New("User: password file invalid format")