2014-04-26 14:21:04 +08:00
|
|
|
package models
|
|
|
|
|
2014-05-03 10:48:14 +08:00
|
|
|
import (
|
|
|
|
"encoding/json"
|
2014-05-05 16:40:25 +08:00
|
|
|
"errors"
|
2014-05-03 10:48:14 +08:00
|
|
|
"time"
|
2014-04-26 14:21:04 +08:00
|
|
|
|
2014-05-03 10:48:14 +08:00
|
|
|
"github.com/go-xorm/core"
|
2014-05-05 16:40:25 +08:00
|
|
|
"github.com/go-xorm/xorm"
|
2014-05-03 10:48:14 +08:00
|
|
|
"github.com/gogits/gogs/modules/auth/ldap"
|
|
|
|
)
|
2014-04-26 14:21:04 +08:00
|
|
|
|
2014-05-05 16:40:25 +08:00
|
|
|
// Login types.
|
|
|
|
const (
|
2014-04-26 14:21:04 +08:00
|
|
|
LT_PLAIN = iota + 1
|
|
|
|
LT_LDAP
|
|
|
|
LT_SMTP
|
2014-05-05 16:40:25 +08:00
|
|
|
)
|
|
|
|
|
|
|
|
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",
|
|
|
|
}
|
2014-04-26 14:21:04 +08:00
|
|
|
|
|
|
|
var _ core.Conversion = &LDAPConfig{}
|
|
|
|
|
|
|
|
type LDAPConfig struct {
|
2014-05-03 10:48:14 +08:00
|
|
|
ldap.Ldapsource
|
2014-04-26 14:21:04 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
// implement
|
|
|
|
func (cfg *LDAPConfig) FromDB(bs []byte) error {
|
2014-05-03 10:48:14 +08:00
|
|
|
return json.Unmarshal(bs, &cfg.Ldapsource)
|
2014-04-26 14:21:04 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
func (cfg *LDAPConfig) ToDB() ([]byte, error) {
|
2014-05-03 10:48:14 +08:00
|
|
|
return json.Marshal(cfg.Ldapsource)
|
2014-04-26 14:21:04 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
type LoginSource struct {
|
2014-05-03 10:48:14 +08:00
|
|
|
Id int64
|
|
|
|
Type int
|
2014-05-05 16:40:25 +08:00
|
|
|
Name string `xorm:"unique"`
|
|
|
|
IsActived bool `xorm:"not null default false"`
|
2014-05-03 10:48:14 +08:00
|
|
|
Cfg core.Conversion `xorm:"TEXT"`
|
|
|
|
Created time.Time `xorm:"created"`
|
|
|
|
Updated time.Time `xorm:"updated"`
|
|
|
|
}
|
|
|
|
|
2014-05-05 16:40:25 +08:00
|
|
|
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)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-05-03 10:48:14 +08:00
|
|
|
func GetAuths() ([]*LoginSource, error) {
|
|
|
|
var auths = make([]*LoginSource, 0)
|
|
|
|
err := orm.Find(&auths)
|
|
|
|
return auths, err
|
|
|
|
}
|
|
|
|
|
2014-05-05 16:40:25 +08:00
|
|
|
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
|
|
|
|
}
|
|
|
|
|
2014-05-03 10:48:14 +08:00
|
|
|
func AddLDAPSource(name string, cfg *LDAPConfig) error {
|
|
|
|
_, err := orm.Insert(&LoginSource{Type: LT_LDAP,
|
|
|
|
Name: name,
|
|
|
|
IsActived: true,
|
|
|
|
Cfg: cfg,
|
|
|
|
})
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
2014-05-05 16:40:25 +08:00
|
|
|
func UpdateLDAPSource(source *LoginSource) error {
|
|
|
|
_, err := orm.AllCols().Id(source.Id).Update(source)
|
2014-05-03 10:48:14 +08:00
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
2014-05-05 16:40:25 +08:00
|
|
|
func DelLoginSource(source *LoginSource) error {
|
|
|
|
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{})
|
2014-05-03 10:48:14 +08:00
|
|
|
return err
|
2014-04-26 14:21:04 +08:00
|
|
|
}
|