2014-03-06 11:21:44 +04:00
// Copyright 2014 The Gogs Authors. All rights reserved.
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file.
package auth
import (
"net/http"
"reflect"
2014-03-06 11:59:44 +04:00
"strings"
2014-03-06 11:21:44 +04:00
2014-03-30 20:11:28 +04:00
"github.com/go-martini/martini"
2014-03-06 11:21:44 +04:00
"github.com/gogits/gogs/modules/base"
2014-03-08 02:22:15 +04:00
"github.com/gogits/gogs/modules/log"
2014-05-05 10:42:52 +04:00
"github.com/gogits/gogs/modules/middleware/binding"
2014-03-06 11:21:44 +04:00
)
2014-03-09 06:25:38 +04:00
// Web form interface.
2014-03-06 20:10:35 +04:00
type Form interface {
Name ( field string ) string
}
2014-03-06 11:21:44 +04:00
type RegisterForm struct {
2014-05-01 15:35:21 +04:00
UserName string ` form:"username" binding:"Required;AlphaDashDot;MaxSize(30)" `
2014-03-06 20:10:35 +04:00
Email string ` form:"email" binding:"Required;Email;MaxSize(50)" `
Password string ` form:"passwd" binding:"Required;MinSize(6);MaxSize(30)" `
RetypePasswd string ` form:"retypepasswd" `
2014-05-05 12:40:25 +04:00
LoginType string ` form:"logintype" `
2014-05-11 10:12:45 +04:00
LoginName string ` form:"loginname" `
2014-03-06 20:10:35 +04:00
}
2014-03-06 20:42:14 +04:00
func ( f * RegisterForm ) Name ( field string ) string {
2014-03-06 20:10:35 +04:00
names := map [ string ] string {
"UserName" : "Username" ,
"Email" : "E-mail address" ,
"Password" : "Password" ,
"RetypePasswd" : "Re-type password" ,
}
return names [ field ]
2014-03-06 11:21:44 +04:00
}
2014-05-09 06:12:05 +04:00
func ( f * RegisterForm ) Validate ( errs * binding . Errors , req * http . Request , ctx martini . Context ) {
2014-05-06 00:21:43 +04:00
data := ctx . Get ( reflect . TypeOf ( base . TmplData { } ) ) . Interface ( ) . ( base . TmplData )
validate ( errs , data , f )
2014-03-06 20:42:14 +04:00
}
type LogInForm struct {
2014-04-27 11:54:08 +04:00
UserName string ` form:"username" binding:"Required;MaxSize(35)" `
2014-03-06 20:42:14 +04:00
Password string ` form:"passwd" binding:"Required;MinSize(6);MaxSize(30)" `
2014-05-06 00:21:43 +04:00
Remember bool ` form:"remember" `
2014-03-06 20:42:14 +04:00
}
func ( f * LogInForm ) Name ( field string ) string {
names := map [ string ] string {
"UserName" : "Username" ,
"Password" : "Password" ,
}
return names [ field ]
}
2014-05-09 06:12:05 +04:00
func ( f * LogInForm ) Validate ( errs * binding . Errors , req * http . Request , ctx martini . Context ) {
2014-05-06 00:21:43 +04:00
data := ctx . Get ( reflect . TypeOf ( base . TmplData { } ) ) . Interface ( ) . ( base . TmplData )
validate ( errs , data , f )
2014-03-06 20:42:14 +04:00
}
2014-05-05 21:08:01 +04:00
func GetMinMaxSize ( field reflect . StructField ) string {
2014-03-06 11:59:44 +04:00
for _ , rule := range strings . Split ( field . Tag . Get ( "binding" ) , ";" ) {
if strings . HasPrefix ( rule , "MinSize(" ) || strings . HasPrefix ( rule , "MaxSize(" ) {
return rule [ 8 : len ( rule ) - 1 ]
}
}
return ""
}
2014-05-09 06:12:05 +04:00
func validate ( errs * binding . Errors , data base . TmplData , f Form ) {
2014-05-06 00:21:43 +04:00
if errs . Count ( ) == 0 {
return
} else if len ( errs . Overall ) > 0 {
for _ , err := range errs . Overall {
log . Error ( "%s: %v" , reflect . TypeOf ( f ) , err )
}
return
}
data [ "HasError" ] = true
AssignForm ( f , data )
typ := reflect . TypeOf ( f )
val := reflect . ValueOf ( f )
2014-03-06 11:59:44 +04:00
if typ . Kind ( ) == reflect . Ptr {
typ = typ . Elem ( )
val = val . Elem ( )
}
for i := 0 ; i < typ . NumField ( ) ; i ++ {
field := typ . Field ( i )
fieldName := field . Tag . Get ( "form" )
// Allow ignored fields in the struct
if fieldName == "-" {
continue
}
2014-05-06 00:21:43 +04:00
if err , ok := errs . Fields [ field . Name ] ; ok {
2014-03-06 11:59:44 +04:00
data [ "Err_" + field . Name ] = true
switch err {
2014-05-05 10:42:52 +04:00
case binding . BindingRequireError :
2014-05-06 00:21:43 +04:00
data [ "ErrorMsg" ] = f . Name ( field . Name ) + " cannot be empty"
2014-05-05 10:42:52 +04:00
case binding . BindingAlphaDashError :
2014-05-06 00:21:43 +04:00
data [ "ErrorMsg" ] = f . Name ( field . Name ) + " must be valid alpha or numeric or dash(-_) characters"
2014-05-05 10:42:52 +04:00
case binding . BindingAlphaDashDotError :
2014-05-06 00:21:43 +04:00
data [ "ErrorMsg" ] = f . Name ( field . Name ) + " must be valid alpha or numeric or dash(-_) or dot characters"
2014-05-05 10:42:52 +04:00
case binding . BindingMinSizeError :
2014-05-06 00:21:43 +04:00
data [ "ErrorMsg" ] = f . Name ( field . Name ) + " must contain at least " + GetMinMaxSize ( field ) + " characters"
2014-05-05 10:42:52 +04:00
case binding . BindingMaxSizeError :
2014-05-06 00:21:43 +04:00
data [ "ErrorMsg" ] = f . Name ( field . Name ) + " must contain at most " + GetMinMaxSize ( field ) + " characters"
2014-05-05 10:42:52 +04:00
case binding . BindingEmailError :
2014-05-06 00:21:43 +04:00
data [ "ErrorMsg" ] = f . Name ( field . Name ) + " is not a valid e-mail address"
2014-05-05 10:42:52 +04:00
case binding . BindingUrlError :
2014-05-06 00:21:43 +04:00
data [ "ErrorMsg" ] = f . Name ( field . Name ) + " is not a valid URL"
2014-03-06 11:59:44 +04:00
default :
data [ "ErrorMsg" ] = "Unknown error: " + err
}
return
}
}
}
2014-03-06 11:21:44 +04:00
// AssignForm assign form values back to the template data.
func AssignForm ( form interface { } , data base . TmplData ) {
typ := reflect . TypeOf ( form )
val := reflect . ValueOf ( form )
if typ . Kind ( ) == reflect . Ptr {
typ = typ . Elem ( )
val = val . Elem ( )
}
for i := 0 ; i < typ . NumField ( ) ; i ++ {
field := typ . Field ( i )
fieldName := field . Tag . Get ( "form" )
// Allow ignored fields in the struct
if fieldName == "-" {
continue
}
data [ fieldName ] = val . Field ( i ) . Interface ( )
}
}
2014-03-29 02:40:31 +04:00
type InstallForm struct {
Database string ` form:"database" binding:"Required" `
Host string ` form:"host" `
User string ` form:"user" `
Passwd string ` form:"passwd" `
DatabaseName string ` form:"database_name" `
SslMode string ` form:"ssl_mode" `
DatabasePath string ` form:"database_path" `
RepoRootPath string ` form:"repo_path" `
RunUser string ` form:"run_user" `
2014-03-30 01:50:51 +04:00
Domain string ` form:"domain" `
2014-03-29 02:40:31 +04:00
AppUrl string ` form:"app_url" `
2014-05-01 15:59:09 +04:00
AdminName string ` form:"admin_name" binding:"Required;AlphaDashDot;MaxSize(30)" `
2014-03-29 02:40:31 +04:00
AdminPasswd string ` form:"admin_pwd" binding:"Required;MinSize(6);MaxSize(30)" `
AdminEmail string ` form:"admin_email" binding:"Required;Email;MaxSize(50)" `
SmtpHost string ` form:"smtp_host" `
SmtpEmail string ` form:"mailer_user" `
SmtpPasswd string ` form:"mailer_pwd" `
RegisterConfirm string ` form:"register_confirm" `
MailNotify string ` form:"mail_notify" `
}
func ( f * InstallForm ) Name ( field string ) string {
names := map [ string ] string {
"Database" : "Database name" ,
"AdminName" : "Admin user name" ,
"AdminPasswd" : "Admin password" ,
"AdminEmail" : "Admin e-maill address" ,
}
return names [ field ]
}
2014-05-09 06:12:05 +04:00
func ( f * InstallForm ) Validate ( errors * binding . Errors , req * http . Request , context martini . Context ) {
2014-03-29 02:40:31 +04:00
data := context . Get ( reflect . TypeOf ( base . TmplData { } ) ) . Interface ( ) . ( base . TmplData )
validate ( errors , data , f )
}