1
0
Fork 0
mirror of https://codeberg.org/forgejo/forgejo.git synced 2024-11-25 08:59:31 -05:00

basic authentications

This commit is contained in:
Lunny Xiao 2014-05-05 16:40:25 +08:00
parent 79ea34e70e
commit 1652dd5068
13 changed files with 334 additions and 49 deletions

View file

@ -2,17 +2,31 @@ package models
import ( import (
"encoding/json" "encoding/json"
"errors"
"time" "time"
"github.com/go-xorm/core" "github.com/go-xorm/core"
"github.com/go-xorm/xorm"
"github.com/gogits/gogs/modules/auth/ldap" "github.com/gogits/gogs/modules/auth/ldap"
) )
/*const ( // Login types.
const (
LT_PLAIN = iota + 1 LT_PLAIN = iota + 1
LT_LDAP LT_LDAP
LT_SMTP LT_SMTP
)*/ )
var (
ErrAuthenticationAlreadyExist = errors.New("Authentication already exist")
ErrAuthenticationNotExist = errors.New("Authentication is not exist")
ErrAuthenticationUserUsed = errors.New("Authentication has been used by some users")
)
var LoginTypes = map[int]string{
LT_LDAP: "LDAP",
LT_SMTP: "SMTP",
}
var _ core.Conversion = &LDAPConfig{} var _ core.Conversion = &LDAPConfig{}
@ -32,19 +46,50 @@ func (cfg *LDAPConfig) ToDB() ([]byte, error) {
type LoginSource struct { type LoginSource struct {
Id int64 Id int64
Type int Type int
Name string Name string `xorm:"unique"`
IsActived bool IsActived bool `xorm:"not null default false"`
Cfg core.Conversion `xorm:"TEXT"` Cfg core.Conversion `xorm:"TEXT"`
Created time.Time `xorm:"created"` Created time.Time `xorm:"created"`
Updated time.Time `xorm:"updated"` Updated time.Time `xorm:"updated"`
} }
func (source *LoginSource) TypeString() string {
return LoginTypes[source.Type]
}
func (source *LoginSource) LDAP() *LDAPConfig {
return source.Cfg.(*LDAPConfig)
}
// for xorm callback
func (source *LoginSource) BeforeSet(colName string, val xorm.Cell) {
if colName == "type" {
ty := (*val).(int64)
switch ty {
case LT_LDAP:
source.Cfg = new(LDAPConfig)
}
}
}
func GetAuths() ([]*LoginSource, error) { func GetAuths() ([]*LoginSource, error) {
var auths = make([]*LoginSource, 0) var auths = make([]*LoginSource, 0)
err := orm.Find(&auths) err := orm.Find(&auths)
return auths, err return auths, err
} }
func GetLoginSourceById(id int64) (*LoginSource, error) {
source := new(LoginSource)
has, err := orm.Id(id).Get(source)
if err != nil {
return nil, err
}
if !has {
return nil, ErrAuthenticationNotExist
}
return source, nil
}
func AddLDAPSource(name string, cfg *LDAPConfig) error { func AddLDAPSource(name string, cfg *LDAPConfig) error {
_, err := orm.Insert(&LoginSource{Type: LT_LDAP, _, err := orm.Insert(&LoginSource{Type: LT_LDAP,
Name: name, Name: name,
@ -54,17 +99,19 @@ func AddLDAPSource(name string, cfg *LDAPConfig) error {
return err return err
} }
func UpdateLDAPSource(id int64, name string, cfg *LDAPConfig) error { func UpdateLDAPSource(source *LoginSource) error {
_, err := orm.AllCols().Id(id).Update(&LoginSource{ _, err := orm.AllCols().Id(source.Id).Update(source)
Id: id,
Type: LT_LDAP,
Name: name,
Cfg: cfg,
})
return err return err
} }
func DelLoginSource(id int64) error { func DelLoginSource(source *LoginSource) error {
_, err := orm.Id(id).Delete(&LoginSource{}) cnt, err := orm.Count(&User{LoginSource: source.Id})
if err != nil {
return err
}
if cnt > 0 {
return ErrAuthenticationUserUsed
}
_, err = orm.Id(source.Id).Delete(&LoginSource{})
return err return err
} }

View file

@ -26,12 +26,6 @@ const (
UT_ORGANIZATION UT_ORGANIZATION
) )
// Login types.
const (
LT_PLAIN = iota + 1
LT_LDAP
)
var ( var (
ErrUserOwnRepos = errors.New("User still have ownership of repositories") ErrUserOwnRepos = errors.New("User still have ownership of repositories")
ErrUserAlreadyExist = errors.New("User already exist") ErrUserAlreadyExist = errors.New("User already exist")
@ -49,6 +43,7 @@ type User struct {
Email string `xorm:"unique not null"` Email string `xorm:"unique not null"`
Passwd string `xorm:"not null"` Passwd string `xorm:"not null"`
LoginType int LoginType int
LoginSource int64 `xorm:"not null default 0"`
Type int Type int
NumFollowers int NumFollowers int
NumFollowings int NumFollowings int

View file

@ -15,12 +15,13 @@ import (
) )
type AdminEditUserForm struct { type AdminEditUserForm struct {
Email string `form:"email" binding:"Required;Email;MaxSize(50)"` Email string `form:"email" binding:"Required;Email;MaxSize(50)"`
Website string `form:"website" binding:"MaxSize(50)"` Website string `form:"website" binding:"MaxSize(50)"`
Location string `form:"location" binding:"MaxSize(50)"` Location string `form:"location" binding:"MaxSize(50)"`
Avatar string `form:"avatar" binding:"Required;Email;MaxSize(50)"` Avatar string `form:"avatar" binding:"Required;Email;MaxSize(50)"`
Active string `form:"active"` Active string `form:"active"`
Admin string `form:"admin"` Admin string `form:"admin"`
LoginType int `form:"login_type"`
} }
func (f *AdminEditUserForm) Name(field string) string { func (f *AdminEditUserForm) Name(field string) string {

View file

@ -25,6 +25,7 @@ type RegisterForm struct {
Email string `form:"email" binding:"Required;Email;MaxSize(50)"` Email string `form:"email" binding:"Required;Email;MaxSize(50)"`
Password string `form:"passwd" binding:"Required;MinSize(6);MaxSize(30)"` Password string `form:"passwd" binding:"Required;MinSize(6);MaxSize(30)"`
RetypePasswd string `form:"retypepasswd"` RetypePasswd string `form:"retypepasswd"`
LoginType string `form:"logintype"`
} }
func (f *RegisterForm) Name(field string) string { func (f *RegisterForm) Name(field string) string {

View file

@ -1,6 +1,7 @@
package auth package auth
type AuthenticationForm struct { type AuthenticationForm struct {
Id int64 `form:"id"`
Type int `form:"type"` Type int `form:"type"`
Name string `form:"name" binding:"MaxSize(50)"` Name string `form:"name" binding:"MaxSize(50)"`
Domain string `form:"domain"` Domain string `form:"domain"`
@ -10,4 +11,5 @@ type AuthenticationForm struct {
Attributes string `form:"attributes"` Attributes string `form:"attributes"`
Filter string `form:"filter"` Filter string `form:"filter"`
MsAdSA string `form:"ms_ad_sa"` MsAdSA string `form:"ms_ad_sa"`
IsActived bool `form:"is_actived"`
} }

View file

@ -3,9 +3,11 @@ package admin
import ( import (
"strings" "strings"
"github.com/go-martini/martini"
"github.com/gogits/gogs/models" "github.com/gogits/gogs/models"
"github.com/gogits/gogs/modules/auth" "github.com/gogits/gogs/modules/auth"
"github.com/gogits/gogs/modules/auth/ldap" "github.com/gogits/gogs/modules/auth/ldap"
"github.com/gogits/gogs/modules/base"
"github.com/gogits/gogs/modules/middleware" "github.com/gogits/gogs/modules/middleware"
"github.com/gpmgo/gopm/log" "github.com/gpmgo/gopm/log"
) )
@ -13,6 +15,7 @@ import (
func NewAuthSource(ctx *middleware.Context) { func NewAuthSource(ctx *middleware.Context) {
ctx.Data["Title"] = "New Authentication" ctx.Data["Title"] = "New Authentication"
ctx.Data["PageIsAuths"] = true ctx.Data["PageIsAuths"] = true
ctx.Data["LoginTypes"] = models.LoginTypes
ctx.HTML(200, "admin/auths/new") ctx.HTML(200, "admin/auths/new")
} }
@ -52,11 +55,93 @@ func NewAuthSourcePost(ctx *middleware.Context, form auth.AuthenticationForm) {
ctx.Redirect("/admin/auths") ctx.Redirect("/admin/auths")
} }
func EditAuthSource(ctx *middleware.Context) { func EditAuthSource(ctx *middleware.Context, params martini.Params) {
ctx.Data["Title"] = "Edit Authentication"
ctx.Data["PageIsAuths"] = true
id, err := base.StrTo(params["authid"]).Int64()
if err != nil {
ctx.Handle(404, "admin.auths.EditAuthSource", err)
return
}
u, err := models.GetLoginSourceById(id)
if err != nil {
ctx.Handle(500, "admin.user.EditUser", err)
return
}
ctx.Data["Source"] = u
ctx.Data["LoginTypes"] = models.LoginTypes
ctx.HTML(200, "admin/auths/edit")
} }
func EditAuthSourcePost(ctx *middleware.Context) { func EditAuthSourcePost(ctx *middleware.Context, form auth.AuthenticationForm) {
ctx.Data["Title"] = "Edit Authentication"
ctx.Data["PageIsAuths"] = true
if ctx.HasError() {
ctx.HTML(200, "admin/auths/edit")
return
}
u := models.LoginSource{
Name: form.Name,
IsActived: form.IsActived,
Type: models.LT_LDAP,
Cfg: &models.LDAPConfig{
Ldapsource: ldap.Ldapsource{
Host: form.Host,
Port: form.Port,
BaseDN: form.BaseDN,
Attributes: form.Attributes,
Filter: form.Filter,
MsAdSAFormat: form.MsAdSA,
Enabled: true,
Name: form.Name,
},
},
}
if err := models.UpdateLDAPSource(&u); err != nil {
switch err {
default:
ctx.Handle(500, "admin.auths.EditAuth", err)
}
return
}
log.Trace("%s Authentication changed by admin(%s): %s", ctx.Req.RequestURI,
ctx.User.LowerName, strings.ToLower(form.Name))
ctx.Redirect("/admin/auths")
} }
func DeleteAuthSource(ctx *middleware.Context) { func DeleteAuthSource(ctx *middleware.Context, params martini.Params) {
ctx.Data["Title"] = "Delete Authentication"
ctx.Data["PageIsAuths"] = true
id, err := base.StrTo(params["authid"]).Int64()
if err != nil {
ctx.Handle(404, "admin.auths.DeleteAuth", err)
return
}
a, err := models.GetLoginSourceById(id)
if err != nil {
ctx.Handle(500, "admin.auths.DeleteAuth", err)
return
}
if err = models.DelLoginSource(a); err != nil {
switch err {
case models.ErrAuthenticationUserUsed:
ctx.Flash.Error("This authentication still has used by some users, you should move them and then delete again.")
ctx.Redirect("/admin/auths/" + params["authid"])
default:
ctx.Handle(500, "admin.auths.DeleteAuth", err)
}
return
}
log.Trace("%s Authentication deleted by admin(%s): %s", ctx.Req.RequestURI,
ctx.User.LowerName, ctx.User.LowerName)
ctx.Redirect("/admin/auths")
} }

View file

@ -5,6 +5,8 @@
package admin package admin
import ( import (
"fmt"
"strconv"
"strings" "strings"
"github.com/go-martini/martini" "github.com/go-martini/martini"
@ -19,6 +21,12 @@ import (
func NewUser(ctx *middleware.Context) { func NewUser(ctx *middleware.Context) {
ctx.Data["Title"] = "New Account" ctx.Data["Title"] = "New Account"
ctx.Data["PageIsUsers"] = true ctx.Data["PageIsUsers"] = true
auths, err := models.GetAuths()
if err != nil {
ctx.Handle(500, "admin.user.NewUser", err)
return
}
ctx.Data["LoginSources"] = auths
ctx.HTML(200, "admin/users/new") ctx.HTML(200, "admin/users/new")
} }
@ -40,10 +48,18 @@ func NewUserPost(ctx *middleware.Context, form auth.RegisterForm) {
} }
u := &models.User{ u := &models.User{
Name: form.UserName, Name: form.UserName,
Email: form.Email, Email: form.Email,
Passwd: form.Password, Passwd: form.Password,
IsActive: true, IsActive: true,
LoginType: models.LT_PLAIN,
}
if len(form.LoginType) > 0 {
fields := strings.Split(form.LoginType, "-")
u.LoginType, _ = strconv.Atoi(fields[0])
u.LoginSource, _ = strconv.ParseInt(fields[1], 10, 64)
fmt.Println(u.LoginSource)
} }
var err error var err error
@ -84,6 +100,12 @@ func EditUser(ctx *middleware.Context, params martini.Params) {
} }
ctx.Data["User"] = u ctx.Data["User"] = u
auths, err := models.GetAuths()
if err != nil {
ctx.Handle(500, "admin.user.NewUser", err)
return
}
ctx.Data["LoginSources"] = auths
ctx.HTML(200, "admin/users/edit") ctx.HTML(200, "admin/users/edit")
} }
@ -110,6 +132,7 @@ func EditUserPost(ctx *middleware.Context, params martini.Params, form auth.Admi
u.AvatarEmail = form.Avatar u.AvatarEmail = form.Avatar
u.IsActive = form.Active == "on" u.IsActive = form.Active == "on"
u.IsAdmin = form.Admin == "on" u.IsAdmin = form.Admin == "on"
u.LoginType = form.LoginType
if err := models.UpdateUser(u); err != nil { if err := models.UpdateUser(u); err != nil {
ctx.Handle(500, "admin.user.EditUser", err) ctx.Handle(500, "admin.user.EditUser", err)
return return
@ -126,7 +149,7 @@ func DeleteUser(ctx *middleware.Context, params martini.Params) {
ctx.Data["Title"] = "Delete Account" ctx.Data["Title"] = "Delete Account"
ctx.Data["PageIsUsers"] = true ctx.Data["PageIsUsers"] = true
log.Info("delete") //log.Info("delete")
uid, err := base.StrTo(params["userid"]).Int() uid, err := base.StrTo(params["userid"]).Int()
if err != nil { if err != nil {
ctx.Handle(404, "admin.user.EditUser", err) ctx.Handle(404, "admin.user.EditUser", err)

View file

@ -27,11 +27,11 @@
<tr> <tr>
<td>{{.Id}}</td> <td>{{.Id}}</td>
<td><a href="/admin/auths/{{.Id}}">{{.Name}}</a></td> <td><a href="/admin/auths/{{.Id}}">{{.Name}}</a></td>
<td>{{.Type}}</td> <td>{{.TypeString}}</td>
<td>{{.Actived}}</td> <td><i class="fa fa{{if .IsActived}}-check{{end}}-square-o"></i></td>
<td>{{DateFormat .Updated "M d, Y"}}</td> <td>{{DateFormat .Updated "M d, Y"}}</td>
<td>{{DateFormat .Created "M d, Y"}}</td> <td>{{DateFormat .Created "M d, Y"}}</td>
<td><a href="/admin/users/{{.Id}}"><i class="fa fa-pencil-square-o"></i></a></td> <td><a href="/admin/auths/{{.Id}}"><i class="fa fa-pencil-square-o"></i></a></td>
</tr> </tr>
{{end}} {{end}}
</tbody> </tbody>

View file

@ -0,0 +1,107 @@
{{template "base/head" .}}
{{template "base/navbar" .}}
<div id="body" class="container" data-page="admin">
{{template "admin/nav" .}}
<div id="admin-container" class="col-md-9">
<div class="panel panel-default">
<div class="panel-heading">
Edit Authentication
</div>
<div class="panel-body">
<br/>
<form action="/admin/auths/{{.Source.Id}}" method="post" class="form-horizontal">
{{.CsrfTokenHtml}}
{{template "base/alert" .}}
<input type="hidden" value="{{.Source.Id}}" name="id"/>
<div class="form-group">
<label class="col-md-3 control-label">Auth Type: </label>
<div class="col-md-7">
<select class="form-control">
{{$type := .Source.Type}}
{{range $key, $val := .LoginTypes}}
<option value="{{$key}}" {{if eq $key $type}}selected{{end}}>{{$val}}</option>
{{end}}
</select>
</div>
</div>
<div class="form-group {{if .Err_UserName}}has-error has-feedback{{end}}">
<label class="col-md-3 control-label">Name: </label>
<div class="col-md-7">
<input name="name" class="form-control" placeholder="Type account's username" value="{{.Source.Name}}" required="required">
</div>
</div>
<div class="form-group {{if .Err_Email}}has-error has-feedback{{end}}">
<label class="col-md-3 control-label">Domain: </label>
<div class="col-md-7">
<input name="domain" class="form-control" placeholder="Type account's e-mail address" value="{{.Source.LDAP.Name}}" required="required" title="Email is not valid">
</div>
</div>
<div class="form-group {{if .Err_Email}}has-error has-feedback{{end}}">
<label class="col-md-3 control-label">Host: </label>
<div class="col-md-7">
<input name="host" class="form-control" placeholder="Type account's e-mail address" value="{{.Source.LDAP.Host}}" required="required" title="Email is not valid">
</div>
</div>
<div class="form-group {{if .Err_Email}}has-error has-feedback{{end}}">
<label class="col-md-3 control-label">Port: </label>
<div class="col-md-7">
<input name="port" class="form-control" placeholder="Type account's e-mail address" value="{{.Source.LDAP.Port}}" required="required" title="Email is not valid">
</div>
</div>
<div class="form-group {{if .Err_Email}}has-error has-feedback{{end}}">
<label class="col-md-3 control-label">Base DN: </label>
<div class="col-md-7">
<input name="base_dn" class="form-control" placeholder="Type account's e-mail address" value="{{.Source.LDAP.BaseDN}}" required="required" title="Email is not valid">
</div>
</div>
<div class="form-group {{if .Err_Email}}has-error has-feedback{{end}}">
<label class="col-md-3 control-label">Search Attributes: </label>
<div class="col-md-7">
<input name="attributes" class="form-control" placeholder="Type account's e-mail address" value="{{.Source.LDAP.Attributes}}" required="required" title="Email is not valid">
</div>
</div>
<div class="form-group {{if .Err_Email}}has-error has-feedback{{end}}">
<label class="col-md-3 control-label">Search Filter: </label>
<div class="col-md-7">
<input name="filter" class="form-control" placeholder="Type account's e-mail address" value="{{.Source.LDAP.Filter}}" required="required" title="Email is not valid">
</div>
</div>
<div class="form-group {{if .Err_Email}}has-error has-feedback{{end}}">
<label class="col-md-3 control-label">Ms Ad SA: </label>
<div class="col-md-7">
<input name="ms_ad_sa" class="form-control" placeholder="Type account's e-mail address" value="{{.Source.LDAP.MsAdSAFormat}}" required="required" title="Email is not valid">
</div>
</div>
<div class="form-group">
<div class="col-md-7 col-md-offset-3">
<div class="checkbox">
<label>
<input type="checkbox" name="is_actived" {{if .Source.IsActived}}checked{{end}}>
<strong>This authentication has activated.</strong>
</label>
</div>
</div>
</div>
<hr/>
<div class="form-group">
<div class="col-md-offset-3 col-md-6">
<button type="submit" class="btn btn-lg btn-primary btn-block">Update authentication config</button>
<a type="button" href="/admin/auths/{{.Source.Id}}/delete" class="btn btn-lg btn-danger btn-block">Delete this authentication</a>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
{{template "base/footer" .}}

View file

@ -17,64 +17,65 @@
<label class="col-md-3 control-label">Auth Type: </label> <label class="col-md-3 control-label">Auth Type: </label>
<div class="col-md-7"> <div class="col-md-7">
<select class="form-control"> <select class="form-control">
<option value=2>LDAP</option> {{range $key, $val := .LoginTypes}}
<option value=3>SMTP</option> <option value="{{$key}}">{{$val}}</option>
</select> {{end}}
</select>
</div> </div>
</div> </div>
<div class="form-group {{if .Err_UserName}}has-error has-feedback{{end}}"> <div class="form-group {{if .Err_UserName}}has-error has-feedback{{end}}">
<label class="col-md-3 control-label">Name: </label> <label class="col-md-3 control-label">Name: </label>
<div class="col-md-7"> <div class="col-md-7">
<input name="name" class="form-control" placeholder="Type account's username" value="{{.username}}" required="required"> <input name="name" class="form-control" placeholder="Authentication's name" required="required">
</div> </div>
</div> </div>
<div class="form-group {{if .Err_Email}}has-error has-feedback{{end}}"> <div class="form-group {{if .Err_Email}}has-error has-feedback{{end}}">
<label class="col-md-3 control-label">Domain: </label> <label class="col-md-3 control-label">Domain: </label>
<div class="col-md-7"> <div class="col-md-7">
<input name="domain" class="form-control" placeholder="Type account's e-mail address" value="{{.email}}" required="required" title="Email is not valid"> <input name="domain" class="form-control" placeholder="Domain name" value="{{.domain}}" required="required" title="Email is not valid">
</div> </div>
</div> </div>
<div class="form-group {{if .Err_Email}}has-error has-feedback{{end}}"> <div class="form-group {{if .Err_Email}}has-error has-feedback{{end}}">
<label class="col-md-3 control-label">Host: </label> <label class="col-md-3 control-label">Host: </label>
<div class="col-md-7"> <div class="col-md-7">
<input name="domain" class="form-control" placeholder="Type account's e-mail address" value="{{.email}}" required="required" title="Email is not valid"> <input name="host" class="form-control" placeholder="Type account's e-mail address" value="{{.email}}" required="required" title="Email is not valid">
</div> </div>
</div> </div>
<div class="form-group {{if .Err_Email}}has-error has-feedback{{end}}"> <div class="form-group {{if .Err_Email}}has-error has-feedback{{end}}">
<label class="col-md-3 control-label">Port: </label> <label class="col-md-3 control-label">Port: </label>
<div class="col-md-7"> <div class="col-md-7">
<input name="domain" class="form-control" placeholder="Type account's e-mail address" value="{{.email}}" required="required" title="Email is not valid"> <input name="port" class="form-control" placeholder="Type account's e-mail address" value="{{.email}}" required="required" title="Email is not valid">
</div> </div>
</div> </div>
<div class="form-group {{if .Err_Email}}has-error has-feedback{{end}}"> <div class="form-group {{if .Err_Email}}has-error has-feedback{{end}}">
<label class="col-md-3 control-label">Base DN: </label> <label class="col-md-3 control-label">Base DN: </label>
<div class="col-md-7"> <div class="col-md-7">
<input name="domain" class="form-control" placeholder="Type account's e-mail address" value="{{.email}}" required="required" title="Email is not valid"> <input name="base_dn" class="form-control" placeholder="Type account's e-mail address" value="{{.email}}" required="required" title="Email is not valid">
</div> </div>
</div> </div>
<div class="form-group {{if .Err_Email}}has-error has-feedback{{end}}"> <div class="form-group {{if .Err_Email}}has-error has-feedback{{end}}">
<label class="col-md-3 control-label">Search Attributes: </label> <label class="col-md-3 control-label">Search Attributes: </label>
<div class="col-md-7"> <div class="col-md-7">
<input name="domain" class="form-control" placeholder="Type account's e-mail address" value="{{.email}}" required="required" title="Email is not valid"> <input name="attributes" class="form-control" placeholder="Type account's e-mail address" value="{{.email}}" required="required" title="Email is not valid">
</div> </div>
</div> </div>
<div class="form-group {{if .Err_Email}}has-error has-feedback{{end}}"> <div class="form-group {{if .Err_Email}}has-error has-feedback{{end}}">
<label class="col-md-3 control-label">Search Filter: </label> <label class="col-md-3 control-label">Search Filter: </label>
<div class="col-md-7"> <div class="col-md-7">
<input name="domain" class="form-control" placeholder="Type account's e-mail address" value="{{.email}}" required="required" title="Email is not valid"> <input name="filter" class="form-control" placeholder="Type account's e-mail address" value="{{.email}}" required="required" title="Email is not valid">
</div> </div>
</div> </div>
<div class="form-group {{if .Err_Email}}has-error has-feedback{{end}}"> <div class="form-group {{if .Err_Email}}has-error has-feedback{{end}}">
<label class="col-md-3 control-label">Ms Ad SA: </label> <label class="col-md-3 control-label">Ms Ad SA: </label>
<div class="col-md-7"> <div class="col-md-7">
<input name="domain" class="form-control" placeholder="Type account's e-mail address" value="{{.email}}" required="required" title="Email is not valid"> <input name="ms_ad_sa" class="form-control" placeholder="Type account's e-mail address" value="{{.email}}" required="required" title="Email is not valid">
</div> </div>
</div> </div>

View file

@ -14,6 +14,18 @@
{{.CsrfTokenHtml}} {{.CsrfTokenHtml}}
{{template "base/alert" .}} {{template "base/alert" .}}
<input type="hidden" value="{{.User.Id}}" name="userId"/> <input type="hidden" value="{{.User.Id}}" name="userId"/>
<div class="form-group">
<label class="col-md-3 control-label">Auth Source: </label>
<div class="col-md-7">
<select name="logintype" class="form-control">
<option value="0-0"{{if eq 0 .User.LoginSource}} selected{{end}}>Local</option>
{{$tp := .User.LoginSource}}
{{range $key, $val := .LoginSources}}
<option value="{{$val.Type}}-{{$val.Id}}"{{if eq $val.Id $tp}} selected{{end}}>{{$val.Name}}</option>
{{end}}
</select>
</div>
</div>
<div class="form-group"> <div class="form-group">
<label class="col-md-3 control-label">Username: </label> <label class="col-md-3 control-label">Username: </label>
<label class="control-label">{{.User.Name}}</label> <label class="control-label">{{.User.Name}}</label>

View file

@ -13,6 +13,17 @@
<form action="/admin/users/new" method="post" class="form-horizontal"> <form action="/admin/users/new" method="post" class="form-horizontal">
{{.CsrfTokenHtml}} {{.CsrfTokenHtml}}
{{template "base/alert" .}} {{template "base/alert" .}}
<div class="form-group">
<label class="col-md-3 control-label">Auth Source: </label>
<div class="col-md-7">
<select name="logintype" class="form-control">
<option value="0-0">Local</option>
{{range $key, $val := .LoginSources}}
<option value="{{$val.Type}}-{{$val.Id}}">{{$val.Name}}</option>
{{end}}
</select>
</div>
</div>
<div class="form-group {{if .Err_UserName}}has-error has-feedback{{end}}"> <div class="form-group {{if .Err_UserName}}has-error has-feedback{{end}}">
<label class="col-md-3 control-label">Username: </label> <label class="col-md-3 control-label">Username: </label>
<div class="col-md-7"> <div class="col-md-7">

4
web.go
View file

@ -144,7 +144,7 @@ func runWeb(*cli.Context) {
r.Get("/new", admin.NewAuthSource) r.Get("/new", admin.NewAuthSource)
r.Post("/new", bindIgnErr(auth.AuthenticationForm{}), admin.NewAuthSourcePost) r.Post("/new", bindIgnErr(auth.AuthenticationForm{}), admin.NewAuthSourcePost)
r.Get("/:authid", admin.EditAuthSource) r.Get("/:authid", admin.EditAuthSource)
r.Post("/:authid" /*, bindIgnErr(auth.AdminEditUserForm{})*/, admin.EditAuthSourcePost) r.Post("/:authid", bindIgnErr(auth.AuthenticationForm{}), admin.EditAuthSourcePost)
r.Get("/:authid/delete", admin.DeleteAuthSource) r.Get("/:authid/delete", admin.DeleteAuthSource)
}, adminReq) }, adminReq)
@ -196,7 +196,7 @@ func runWeb(*cli.Context) {
protocol := base.Cfg.MustValue("server", "PROTOCOL", "http") protocol := base.Cfg.MustValue("server", "PROTOCOL", "http")
listenAddr := fmt.Sprintf("%s:%s", listenAddr := fmt.Sprintf("%s:%s",
base.Cfg.MustValue("server", "HTTP_ADDR"), base.Cfg.MustValue("server", "HTTP_ADDR", "0.0.0.0"),
base.Cfg.MustValue("server", "HTTP_PORT", "3000")) base.Cfg.MustValue("server", "HTTP_PORT", "3000"))
if protocol == "http" { if protocol == "http" {