diff --git a/Dockerfile b/Dockerfile index dec9ceb..cfd8ef5 100644 --- a/Dockerfile +++ b/Dockerfile @@ -18,6 +18,7 @@ RUN apk add --no-cache go-bindata WORKDIR /go/src/git.happydns.org/happydns COPY --from=nodebuild /go/src/git.happydns.org/happydns/ ./ +COPY actions ./actions COPY admin ./admin COPY api ./api COPY config ./config diff --git a/actions/users.go b/actions/users.go new file mode 100644 index 0000000..255d8dc --- /dev/null +++ b/actions/users.go @@ -0,0 +1,102 @@ +// Copyright or © or Copr. happyDNS (2021) +// +// contact@happydns.org +// +// This software is a computer program whose purpose is to provide a modern +// interface to interact with DNS systems. +// +// This software is governed by the CeCILL license under French law and abiding +// by the rules of distribution of free software. You can use, modify and/or +// redistribute the software under the terms of the CeCILL license as +// circulated by CEA, CNRS and INRIA at the following URL +// "http://www.cecill.info". +// +// As a counterpart to the access to the source code and rights to copy, modify +// and redistribute granted by the license, users are provided only with a +// limited warranty and the software's author, the holder of the economic +// rights, and the successive licensors have only limited liability. +// +// In this respect, the user's attention is drawn to the risks associated with +// loading, using, modifying and/or developing or reproducing the software by +// the user in light of its specific status of free software, that may mean +// that it is complicated to manipulate, and that also therefore means that it +// is reserved for developers and experienced professionals having in-depth +// computer knowledge. Users are therefore encouraged to load and test the +// software's suitability as regards their requirements in conditions enabling +// the security of their systems and/or data to be ensured and, more generally, +// to use and operate it in the same conditions as regards security. +// +// The fact that you are presently reading this means that you have had +// knowledge of the CeCILL license and that you accept its terms. + +package actions + +import ( + "net/mail" + "strings" + "unicode" + + "git.happydns.org/happydns/config" + "git.happydns.org/happydns/model" + "git.happydns.org/happydns/utils" +) + +func genUsername(user *happydns.User) (toName string) { + if n := strings.Index(user.Email, "+"); n > 0 { + toName = user.Email[0:n] + } else { + toName = user.Email[0:strings.Index(user.Email, "@")] + } + if len(toName) > 1 { + toNameCopy := strings.Replace(toName, ".", " ", -1) + toName = "" + lastRuneIsSpace := true + for _, runeValue := range toNameCopy { + if lastRuneIsSpace { + lastRuneIsSpace = false + toName += string(unicode.ToTitle(runeValue)) + } else { + toName += string(runeValue) + } + + if unicode.IsSpace(runeValue) || unicode.IsPunct(runeValue) || unicode.IsSymbol(runeValue) { + lastRuneIsSpace = true + } + } + } + return +} + +func SendValidationLink(opts *config.Options, user *happydns.User) error { + toName := genUsername(user) + return utils.SendMail( + &mail.Address{Name: toName, Address: user.Email}, + "Your new account on happyDNS", + `Welcome to happyDNS! +-------------------- + +Hi `+toName+`, + +We are pleased that you created an account on our great domain name +management platform! + +In order to validate your account, please follow this link now: + +[Validate my account](`+opts.GetRegistrationURL(user)+`)`, + ) +} + +func SendRecoveryLink(opts *config.Options, user *happydns.User) error { + toName := genUsername(user) + return utils.SendMail( + &mail.Address{Name: toName, Address: user.Email}, + "Recover you happyDNS account", + `Hi `+toName+`, + +You've just ask on our platform to recover your account. + +In order to define a new password, please follow this link now: + +[Recover my account](`+opts.GetAccountRecoveryURL(user)+`)`, + ) +} diff --git a/admin/db-user.go b/admin/db-user.go index b3e22c9..2b1e227 100644 --- a/admin/db-user.go +++ b/admin/db-user.go @@ -41,6 +41,7 @@ import ( "github.com/julienschmidt/httprouter" + "git.happydns.org/happydns/actions" "git.happydns.org/happydns/api" "git.happydns.org/happydns/config" "git.happydns.org/happydns/model" @@ -161,11 +162,11 @@ func resetUserPasswd(_ *config.Options, user *happydns.User, _ httprouter.Params } func sendRecoverUserAcct(opts *config.Options, user *happydns.User, _ httprouter.Params, body io.Reader) api.Response { - return api.NewAPIResponse(true, api.SendRecoveryLink(opts, user)) + return api.NewAPIResponse(true, actions.SendRecoveryLink(opts, user)) } func sendValidateUserEmail(opts *config.Options, user *happydns.User, _ httprouter.Params, body io.Reader) api.Response { - return api.NewAPIResponse(true, api.SendValidationLink(opts, user)) + return api.NewAPIResponse(true, actions.SendValidationLink(opts, user)) } func validateEmail(_ *config.Options, user *happydns.User, _ httprouter.Params, body io.Reader) api.Response { diff --git a/api/users.go b/api/users.go index 322c5d5..9bdc08b 100644 --- a/api/users.go +++ b/api/users.go @@ -38,18 +38,16 @@ import ( "io" "log" "net/http" - "net/mail" "strconv" "strings" "time" - "unicode" "github.com/julienschmidt/httprouter" + "git.happydns.org/happydns/actions" "git.happydns.org/happydns/config" "git.happydns.org/happydns/model" "git.happydns.org/happydns/storage" - "git.happydns.org/happydns/utils" ) func init() { @@ -74,66 +72,6 @@ type UploadedUser struct { Newsletter bool `json:"wantReceiveUpdate,omitempty"` } -func genUsername(user *happydns.User) (toName string) { - if n := strings.Index(user.Email, "+"); n > 0 { - toName = user.Email[0:n] - } else { - toName = user.Email[0:strings.Index(user.Email, "@")] - } - if len(toName) > 1 { - toNameCopy := strings.Replace(toName, ".", " ", -1) - toName = "" - lastRuneIsSpace := true - for _, runeValue := range toNameCopy { - if lastRuneIsSpace { - lastRuneIsSpace = false - toName += string(unicode.ToTitle(runeValue)) - } else { - toName += string(runeValue) - } - - if unicode.IsSpace(runeValue) || unicode.IsPunct(runeValue) || unicode.IsSymbol(runeValue) { - lastRuneIsSpace = true - } - } - } - return -} - -func SendValidationLink(opts *config.Options, user *happydns.User) error { - toName := genUsername(user) - return utils.SendMail( - &mail.Address{Name: toName, Address: user.Email}, - "Your new account on happyDNS", - `Welcome to happyDNS! --------------------- - -Hi `+toName+`, - -We are pleased that you created an account on our great domain name -management platform! - -In order to validate your account, please follow this link now: - -[Validate my account](`+opts.GetRegistrationURL(user)+`)`, - ) -} - -func SendRecoveryLink(opts *config.Options, user *happydns.User) error { - toName := genUsername(user) - return utils.SendMail( - &mail.Address{Name: toName, Address: user.Email}, - "Recover you happyDNS account", - `Hi `+toName+`, - -You've just ask on our platform to recover your account. - -In order to define a new password, please follow this link now: - -[Recover my account](`+opts.GetAccountRecoveryURL(user)+`)`, - ) -} - func registerUser(opts *config.Options, p httprouter.Params, body io.Reader) Response { var uu UploadedUser err := json.NewDecoder(body).Decode(&uu) @@ -174,7 +112,7 @@ func registerUser(opts *config.Options, p httprouter.Params, body io.Reader) Res return APIErrorResponse{ err: err, } - } else if SendValidationLink(opts, user); err != nil { + } else if actions.SendValidationLink(opts, user); err != nil { return APIErrorResponse{ err: err, } @@ -207,14 +145,14 @@ func specialUserOperations(opts *config.Options, p httprouter.Params, body io.Re } else { if uu.Kind == "recovery" { if user.EmailValidated == nil { - if err = SendValidationLink(opts, user); err != nil { + if err = actions.SendValidationLink(opts, user); err != nil { return APIErrorResponse{ err: err, } } log.Printf("Sent validation link to: %s", user.Email) } else { - if err = SendRecoveryLink(opts, user); err != nil { + if err = actions.SendRecoveryLink(opts, user); err != nil { return APIErrorResponse{ err: err, } @@ -228,7 +166,7 @@ func specialUserOperations(opts *config.Options, p httprouter.Params, body io.Re } else if uu.Kind == "validation" { if user.EmailValidated != nil { return res - } else if err = SendValidationLink(opts, user); err != nil { + } else if err = actions.SendValidationLink(opts, user); err != nil { return APIErrorResponse{ err: err, }