diff options
| -rw-r--r-- | domain.go | 22 | ||||
| -rw-r--r-- | email.go | 6 | ||||
| -rwxr-xr-x | env.sh | 2 | ||||
| -rw-r--r-- | handler.go | 22 | ||||
| -rw-r--r-- | main.go | 4 | ||||
| -rw-r--r-- | server.go | 4 | ||||
| -rw-r--r-- | user.go | 2 | ||||
| -rw-r--r-- | utilities.go | 18 | ||||
| -rw-r--r-- | utilities_test.go | 38 |
9 files changed, 87 insertions, 31 deletions
@@ -10,7 +10,7 @@ import ( func (vD VirtualDomain) DomainExists() bool { query := Db.Where("name = ?", vD.Name).Find(&vD) if query.Error != nil { - log.Println(query.Error) + log.Println("Info: Query error.", query.Error) return false } if vD.Name == "" { @@ -21,25 +21,25 @@ func (vD VirtualDomain) DomainExists() bool { func (vD VirtualDomain) CreateDomain() bool { if !Db.NewRecord(vD) { - log.Println("Creating new record failed.", vD.Name) + log.Println("Info: Creating new record failed.", vD.Name) return false } query := Db.Create(&vD) if query.Error != nil { - log.Println(query.Error) + log.Println("Info: Query error.", query.Error) return false } return true } func (vD VirtualDomain) ValidateDomain(ref string) bool { - log.Println("Validating " + vD.Name) + log.Println("Info: Validating " + vD.Name) if vD.Name == "" { return false } addr, err := net.LookupIP(vD.Name) if err != nil { - log.Println(vD.Name + " " + err.Error()) + log.Println("Info: ", vD.Name+" "+err.Error()) return false } if len(addr) == 0 { @@ -47,33 +47,33 @@ func (vD VirtualDomain) ValidateDomain(ref string) bool { } serverIP, err := net.LookupIP(ref) if err != nil { - log.Println(ref + " " + err.Error()) + log.Println("Info: ", ref+" "+err.Error()) return false } return reflect.DeepEqual(serverIP, addr) } func (vD VirtualDomain) ValidateDomainMX(ref string) bool { - log.Println("Validating MX " + vD.Name) + log.Println("Info: Validating MX " + vD.Name) if vD.Name == "" { - log.Println("Empty domain.") + log.Println("Info: Empty domain.") return false } mx, err := net.LookupMX(vD.Name) if err != nil { - log.Println("Lookup error " + vD.Name + " " + err.Error()) + log.Println("Info: Lookup error " + vD.Name + " " + err.Error()) return false } match := false serverIP, err := net.LookupIP(ref) if err != nil { - log.Println("Lookup error for server " + ref + " " + err.Error()) + log.Println("Info: Lookup error for server " + ref + " " + err.Error()) return false } for _, v := range mx { mxIP, err := net.LookupIP(v.Host) if err != nil { - log.Println(err) + log.Println("Info: ", err) } if reflect.DeepEqual(serverIP, mxIP) { match = true @@ -8,7 +8,7 @@ import ( func (vU VirtualUser) EmailExists() bool { query := Db.Where("email = ?", vU.Email).Find(&vU) if query.Error != nil { - log.Println(query.Error) + log.Println("Info: ", query.Error) return false } if vU.Email == "" { @@ -19,12 +19,12 @@ func (vU VirtualUser) EmailExists() bool { func (vU VirtualUser) CreateEmail() bool { if !Db.NewRecord(vU) { - log.Println("Creating new record failed.", vU) + log.Println("Info: Creating new record failed.", vU) return false } query := Db.Create(&vU) if query.Error != nil { - log.Println(query.Error) + log.Println("Info: ", query.Error) return false } return true @@ -5,7 +5,7 @@ export FREEMAIL_DB_DRIVER=sqlite3 export FREEMAIL_DB_CREDENTIALS=./db/freemail.db export FREEMAIL_DB_IMPORT_DRIVER=github.com/mattn/go-sqlite3 -export FREEMAIL_DB_LOG=true +export FREEMAIL_DB_LOG=false export FREEMAIL_SECRET=verylongsecret # Redis @@ -8,7 +8,7 @@ import ( func IndexHandler(w http.ResponseWriter, r *http.Request) { session, err := store.Get(r, "_SID") if err != nil { - log.Println(err) + log.Println("Info: ", err) } flash := Flash{} @@ -28,7 +28,7 @@ func IndexHandler(w http.ResponseWriter, r *http.Request) { func RegisterHandler(w http.ResponseWriter, r *http.Request) { session, err := store.Get(r, "_SID") if err != nil { - log.Println(err) + log.Println("Info: ", err) } flash := Flash{} @@ -61,7 +61,7 @@ func CreateNewEntryHandler(w http.ResponseWriter, r *http.Request) { session, err := store.Get(r, "_SID") if err != nil { - log.Println(err) + log.Println("Info: ", err) } if !CompareStrings(req.Email, req.ConfirmEmail) { @@ -88,6 +88,7 @@ func CreateNewEntryHandler(w http.ResponseWriter, r *http.Request) { return } + log.Println("Info: New sign up " + req.Email + " from " + GetIP(r)) session.AddFlash("Success! You can login now with your new mail account.", "success") session.Save(r, w) http.Redirect(w, r, "/user", 302) @@ -96,7 +97,7 @@ func CreateNewEntryHandler(w http.ResponseWriter, r *http.Request) { func AboutHandler(w http.ResponseWriter, r *http.Request) { session, err := store.Get(r, "_SID") if err != nil { - log.Println(err) + log.Println("Info: ", err) } flash := Flash{} @@ -116,7 +117,7 @@ func AboutHandler(w http.ResponseWriter, r *http.Request) { func ServerHandler(w http.ResponseWriter, r *http.Request) { session, err := store.Get(r, "_SID") if err != nil { - log.Println(err) + log.Println("Info: ", err) } flash := Flash{} @@ -136,7 +137,7 @@ func ServerHandler(w http.ResponseWriter, r *http.Request) { func HowtoHandler(w http.ResponseWriter, r *http.Request) { session, err := store.Get(r, "_SID") if err != nil { - log.Println(err) + log.Println("Info: ", err) } flash := Flash{} @@ -156,7 +157,7 @@ func HowtoHandler(w http.ResponseWriter, r *http.Request) { func UserHandler(w http.ResponseWriter, r *http.Request) { session, err := store.Get(r, "_SID") if err != nil { - log.Println(err) + log.Println("Info: ", err) } flash := Flash{} @@ -176,7 +177,7 @@ func UserHandler(w http.ResponseWriter, r *http.Request) { func PasswordHandler(w http.ResponseWriter, r *http.Request) { session, err := store.Get(r, "_SID") if err != nil { - log.Println(err) + log.Println("Info: ", err) } flash := Flash{} @@ -212,7 +213,7 @@ func ChangePasswordHandler(w http.ResponseWriter, r *http.Request) { session, err := store.Get(r, "_SID") if err != nil { - log.Println(err) + log.Println("Info: ", err) } if !CompareStrings(req.NewPassword, req.ConfirmPassword) { session.AddFlash("Passwords don't match.", "error") @@ -224,13 +225,14 @@ func ChangePasswordHandler(w http.ResponseWriter, r *http.Request) { req.NewPassword = Md5Hash(req.NewPassword) if err := ChangePassword(req.Email, req.Password, req.NewPassword); err != nil { - log.Println(err) + log.Println("Info: ", err) session.AddFlash(err.Error(), "error") session.Save(r, w) http.Redirect(w, r, "/password", 302) return } + log.Println("Info: Changed password for " + req.Email + " from " + GetIP(r)) session.AddFlash("Changed your password.", "success") session.Save(r, w) http.Redirect(w, r, "/user", 302) @@ -51,7 +51,7 @@ func main() { err := http.ListenAndServe(ip+":"+port, nil) if err != nil { - log.Panic(err) + log.Panic("Info: ", err) } - log.Println("Server is up and listens on " + ip + ":" + port) + log.Println("Info: Server is up and listens on " + ip + ":" + port) } @@ -54,7 +54,7 @@ func ExecTemplate(template string, w http.ResponseWriter, r *http.Request, flash err := index.ExecuteTemplate(w, template, flash) if err != nil { - log.Println(err) + log.Println("Info: ", err) return err } return nil @@ -62,7 +62,7 @@ func ExecTemplate(template string, w http.ResponseWriter, r *http.Request, flash func ChangePassword(email, oldPassword, newPassword string) error { if !ValidateEmail(email) { - log.Println("No E-Mail: ", email) + log.Println("Info: No E-Mail: ", email) return errors.New("This doesn't look like a mail adress.") } @@ -29,7 +29,7 @@ func (vU VirtualUser) UpdatePassword(password string) bool { } query := Db.Model(&vU).Where("Email = ?", vU.Email).Update("password", password) if query.Error != nil { - log.Println(query.Error) + log.Println("Info: ", query.Error) return false } return true diff --git a/utilities.go b/utilities.go index 4bf0b92..3ce3e1d 100644 --- a/utilities.go +++ b/utilities.go @@ -5,6 +5,7 @@ import ( "fmt" "io" "log" + "net" "net/http" "strings" ) @@ -33,7 +34,7 @@ func CompareStrings(strs ...string) bool { func GetLanguage(r *http.Request) string { c, err := r.Cookie("lang") if err != nil { - log.Println("Cookie: lang", err) + log.Println("Info: Cookie: lang", err) } else { if c.Value != "" { if c.Value == "de" { @@ -53,3 +54,18 @@ func GetLanguage(r *http.Request) string { } return "" } + +func GetIP(r *http.Request) string { + if len(r.Header["X-Forwarded-For"]) > 0 { + return r.Header["X-Forwarded-For"][0] + } + if len(r.Header["X-Real-Ip"]) > 0 { + return r.Header["X-Real-Ip"][0] + } + if r.RemoteAddr != "" { + ip, _, _ := net.SplitHostPort(r.RemoteAddr) + return ip + } + log.Println("Info: No remote IP detectable.") + return "0.0.0.0" +} diff --git a/utilities_test.go b/utilities_test.go index 5f095dc..4431241 100644 --- a/utilities_test.go +++ b/utilities_test.go @@ -74,3 +74,41 @@ func TestGetLanguage(t *testing.T) { t.Fatal("Expected empty string as lang.") } } + +func TestGetIP(t *testing.T) { + // Test with X-Forwarded-For + request, err := http.NewRequest("GET", "/", nil) + if err != nil { + t.Fatal("Error creating new http request. (/)", err) + } + request.Header.Add("X-Forwarded-For", "10.0.0.1") + + ip := GetIP(request) + if ip != "10.0.0.1" { + t.Fatal("Expected IP '10.0.0.1', got " + ip) + } + + // Test with X-Real-Ip + request, err = http.NewRequest("GET", "/", nil) + if err != nil { + t.Fatal("Error creating new http request. (/)", err) + } + request.Header.Add("X-Real-Ip", "10.0.0.1") + + ip = GetIP(request) + if ip != "10.0.0.1" { + t.Fatal("Expected IP '10.0.0.1', got " + ip) + } + + // Test with RemoteAddr + // Since Golang itself doesn't set RemoteAddr '0.0.0.0' is expected + request, err = http.NewRequest("GET", "/", nil) + if err != nil { + t.Fatal("Error creating new http request. (/)", err) + } + + ip = GetIP(request) + if ip != "0.0.0.0" { + t.Fatal("Expected IP '0.0.0.0', got " + ip) + } +} |
