Browse Source

Fix #165

pull/251/head
Unknown 11 years ago
parent
commit
ad5ec45dd6
  1. 1
      .gopmfile
  2. 4
      conf/app.ini
  3. 2
      gogs.go
  4. 8
      models/access.go
  5. 2
      models/action.go
  6. 84
      models/issue.go
  7. 18
      models/login.go
  8. 48
      models/models.go
  9. 32
      models/oauth2.go
  10. 12
      models/publickey.go
  11. 10
      models/release.go
  12. 64
      models/repo.go
  13. 54
      models/user.go
  14. 18
      models/webhook.go
  15. 42
      modules/auth/user.go
  16. 462
      modules/bin/conf.go
  17. 2
      modules/middleware/context.go
  18. 32
      modules/setting/setting.go
  19. 10
      modules/social/social.go
  20. 13
      routers/admin/admin.go
  21. 4
      routers/repo/issue.go
  22. 2
      routers/repo/setting.go
  23. 2
      templates/VERSION
  24. 4
      templates/admin/config.tmpl
  25. 4
      templates/admin/dashboard.tmpl

1
.gopmfile

@ -19,7 +19,6 @@ github.com/gogits/session = `commit:7ab78d4`
github.com/juju2013/goldap = `commit:f4a7f67` github.com/juju2013/goldap = `commit:f4a7f67`
github.com/lib/pq = `commit:529edd9` github.com/lib/pq = `commit:529edd9`
github.com/nfnt/resize = `commit:8aee0d9` github.com/nfnt/resize = `commit:8aee0d9`
github.com/qiniu/log = `commit:891d1cb`
[res] [res]
include = templates|public include = templates|public

4
conf/app.ini

@ -51,6 +51,8 @@ SECRET_KEY = !#@FDEWREWR&*(
LOGIN_REMEMBER_DAYS = 7 LOGIN_REMEMBER_DAYS = 7
COOKIE_USERNAME = gogs_awesome COOKIE_USERNAME = gogs_awesome
COOKIE_REMEMBER_NAME = gogs_incredible COOKIE_REMEMBER_NAME = gogs_incredible
; Reverse proxy authentication header name of user ID
REVERSE_PROXY_AUTHENTICATION_UID = X-WEBAUTH-UID
[service] [service]
ACTIVE_CODE_LIVE_MINUTES = 180 ACTIVE_CODE_LIVE_MINUTES = 180
@ -65,6 +67,8 @@ REQUIRE_SIGNIN_VIEW = false
ENABLE_CACHE_AVATAR = false ENABLE_CACHE_AVATAR = false
; Mail notification ; Mail notification
ENABLE_NOTIFY_MAIL = false ENABLE_NOTIFY_MAIL = false
; More detail: https://github.com/gogits/gogs/issues/165
ENABLE_REVERSE_PROXY_AUTHENTICATION = false
[webhook] [webhook]
; Cron task interval in minutes ; Cron task interval in minutes

2
gogs.go

@ -17,7 +17,7 @@ import (
"github.com/gogits/gogs/modules/setting" "github.com/gogits/gogs/modules/setting"
) )
const APP_VER = "0.4.4.0620 Alpha" const APP_VER = "0.4.5.0621 Alpha"
func init() { func init() {
runtime.GOMAXPROCS(runtime.NumCPU()) runtime.GOMAXPROCS(runtime.NumCPU())

8
models/access.go

@ -30,7 +30,7 @@ type Access struct {
func AddAccess(access *Access) error { func AddAccess(access *Access) error {
access.UserName = strings.ToLower(access.UserName) access.UserName = strings.ToLower(access.UserName)
access.RepoName = strings.ToLower(access.RepoName) access.RepoName = strings.ToLower(access.RepoName)
_, err := orm.Insert(access) _, err := x.Insert(access)
return err return err
} }
@ -38,13 +38,13 @@ func AddAccess(access *Access) error {
func UpdateAccess(access *Access) error { func UpdateAccess(access *Access) error {
access.UserName = strings.ToLower(access.UserName) access.UserName = strings.ToLower(access.UserName)
access.RepoName = strings.ToLower(access.RepoName) access.RepoName = strings.ToLower(access.RepoName)
_, err := orm.Id(access.Id).Update(access) _, err := x.Id(access.Id).Update(access)
return err return err
} }
// DeleteAccess deletes access record. // DeleteAccess deletes access record.
func DeleteAccess(access *Access) error { func DeleteAccess(access *Access) error {
_, err := orm.Delete(access) _, err := x.Delete(access)
return err return err
} }
@ -67,7 +67,7 @@ func HasAccess(uname, repoName string, mode int) (bool, error) {
UserName: strings.ToLower(uname), UserName: strings.ToLower(uname),
RepoName: strings.ToLower(repoName), RepoName: strings.ToLower(repoName),
} }
has, err := orm.Get(access) has, err := x.Get(access)
if err != nil { if err != nil {
return false, err return false, err
} else if !has { } else if !has {

2
models/action.go

@ -209,7 +209,7 @@ func TransferRepoAction(user, newUser *User, repo *Repository) (err error) {
// GetFeeds returns action list of given user in given context. // GetFeeds returns action list of given user in given context.
func GetFeeds(userid, offset int64, isProfile bool) ([]*Action, error) { func GetFeeds(userid, offset int64, isProfile bool) ([]*Action, error) {
actions := make([]*Action, 0, 20) actions := make([]*Action, 0, 20)
sess := orm.Limit(20, int(offset)).Desc("id").Where("user_id=?", userid) sess := x.Limit(20, int(offset)).Desc("id").Where("user_id=?", userid)
if isProfile { if isProfile {
sess.Where("is_private=?", false).And("act_user_id=?", userid) sess.Where("is_private=?", false).And("act_user_id=?", userid)
} else { } else {

84
models/issue.go

@ -92,7 +92,7 @@ func (i *Issue) GetAssignee() (err error) {
// CreateIssue creates new issue for repository. // CreateIssue creates new issue for repository.
func NewIssue(issue *Issue) (err error) { func NewIssue(issue *Issue) (err error) {
sess := orm.NewSession() sess := x.NewSession()
defer sess.Close() defer sess.Close()
if err = sess.Begin(); err != nil { if err = sess.Begin(); err != nil {
return err return err
@ -114,7 +114,7 @@ func NewIssue(issue *Issue) (err error) {
// GetIssueByIndex returns issue by given index in repository. // GetIssueByIndex returns issue by given index in repository.
func GetIssueByIndex(rid, index int64) (*Issue, error) { func GetIssueByIndex(rid, index int64) (*Issue, error) {
issue := &Issue{RepoId: rid, Index: index} issue := &Issue{RepoId: rid, Index: index}
has, err := orm.Get(issue) has, err := x.Get(issue)
if err != nil { if err != nil {
return nil, err return nil, err
} else if !has { } else if !has {
@ -126,7 +126,7 @@ func GetIssueByIndex(rid, index int64) (*Issue, error) {
// GetIssueById returns an issue by ID. // GetIssueById returns an issue by ID.
func GetIssueById(id int64) (*Issue, error) { func GetIssueById(id int64) (*Issue, error) {
issue := &Issue{Id: id} issue := &Issue{Id: id}
has, err := orm.Get(issue) has, err := x.Get(issue)
if err != nil { if err != nil {
return nil, err return nil, err
} else if !has { } else if !has {
@ -137,7 +137,7 @@ func GetIssueById(id int64) (*Issue, error) {
// GetIssues returns a list of issues by given conditions. // GetIssues returns a list of issues by given conditions.
func GetIssues(uid, rid, pid, mid int64, page int, isClosed bool, labelIds, sortType string) ([]Issue, error) { func GetIssues(uid, rid, pid, mid int64, page int, isClosed bool, labelIds, sortType string) ([]Issue, error) {
sess := orm.Limit(20, (page-1)*20) sess := x.Limit(20, (page-1)*20)
if rid > 0 { if rid > 0 {
sess.Where("repo_id=?", rid).And("is_closed=?", isClosed) sess.Where("repo_id=?", rid).And("is_closed=?", isClosed)
@ -193,13 +193,13 @@ const (
// GetIssuesByLabel returns a list of issues by given label and repository. // GetIssuesByLabel returns a list of issues by given label and repository.
func GetIssuesByLabel(repoId int64, label string) ([]*Issue, error) { func GetIssuesByLabel(repoId int64, label string) ([]*Issue, error) {
issues := make([]*Issue, 0, 10) issues := make([]*Issue, 0, 10)
err := orm.Where("repo_id=?", repoId).And("label_ids like '%$" + label + "|%'").Find(&issues) err := x.Where("repo_id=?", repoId).And("label_ids like '%$" + label + "|%'").Find(&issues)
return issues, err return issues, err
} }
// GetIssueCountByPoster returns number of issues of repository by poster. // GetIssueCountByPoster returns number of issues of repository by poster.
func GetIssueCountByPoster(uid, rid int64, isClosed bool) int64 { func GetIssueCountByPoster(uid, rid int64, isClosed bool) int64 {
count, _ := orm.Where("repo_id=?", rid).And("poster_id=?", uid).And("is_closed=?", isClosed).Count(new(Issue)) count, _ := x.Where("repo_id=?", rid).And("poster_id=?", uid).And("is_closed=?", isClosed).Count(new(Issue))
return count return count
} }
@ -241,7 +241,7 @@ func NewIssueUserPairs(rid, iid, oid, pid, aid int64, repoName string) (err erro
isNeedAddPoster = false isNeedAddPoster = false
} }
iu.IsAssigned = iu.Uid == aid iu.IsAssigned = iu.Uid == aid
if _, err = orm.Insert(iu); err != nil { if _, err = x.Insert(iu); err != nil {
return err return err
} }
} }
@ -249,7 +249,7 @@ func NewIssueUserPairs(rid, iid, oid, pid, aid int64, repoName string) (err erro
iu.Uid = pid iu.Uid = pid
iu.IsPoster = true iu.IsPoster = true
iu.IsAssigned = iu.Uid == aid iu.IsAssigned = iu.Uid == aid
if _, err = orm.Insert(iu); err != nil { if _, err = x.Insert(iu); err != nil {
return err return err
} }
} }
@ -270,7 +270,7 @@ func PairsContains(ius []*IssueUser, issueId int64) int {
// GetIssueUserPairs returns issue-user pairs by given repository and user. // GetIssueUserPairs returns issue-user pairs by given repository and user.
func GetIssueUserPairs(rid, uid int64, isClosed bool) ([]*IssueUser, error) { func GetIssueUserPairs(rid, uid int64, isClosed bool) ([]*IssueUser, error) {
ius := make([]*IssueUser, 0, 10) ius := make([]*IssueUser, 0, 10)
err := orm.Where("is_closed=?", isClosed).Find(&ius, &IssueUser{RepoId: rid, Uid: uid}) err := x.Where("is_closed=?", isClosed).Find(&ius, &IssueUser{RepoId: rid, Uid: uid})
return ius, err return ius, err
} }
@ -285,7 +285,7 @@ func GetIssueUserPairsByRepoIds(rids []int64, isClosed bool, page int) ([]*Issue
cond := strings.TrimSuffix(buf.String(), " OR ") cond := strings.TrimSuffix(buf.String(), " OR ")
ius := make([]*IssueUser, 0, 10) ius := make([]*IssueUser, 0, 10)
sess := orm.Limit(20, (page-1)*20).Where("is_closed=?", isClosed) sess := x.Limit(20, (page-1)*20).Where("is_closed=?", isClosed)
if len(cond) > 0 { if len(cond) > 0 {
sess.And(cond) sess.And(cond)
} }
@ -296,7 +296,7 @@ func GetIssueUserPairsByRepoIds(rids []int64, isClosed bool, page int) ([]*Issue
// GetIssueUserPairsByMode returns issue-user pairs by given repository and user. // GetIssueUserPairsByMode returns issue-user pairs by given repository and user.
func GetIssueUserPairsByMode(uid, rid int64, isClosed bool, page, filterMode int) ([]*IssueUser, error) { func GetIssueUserPairsByMode(uid, rid int64, isClosed bool, page, filterMode int) ([]*IssueUser, error) {
ius := make([]*IssueUser, 0, 10) ius := make([]*IssueUser, 0, 10)
sess := orm.Limit(20, (page-1)*20).Where("uid=?", uid).And("is_closed=?", isClosed) sess := x.Limit(20, (page-1)*20).Where("uid=?", uid).And("is_closed=?", isClosed)
if rid > 0 { if rid > 0 {
sess.And("repo_id=?", rid) sess.And("repo_id=?", rid)
} }
@ -335,7 +335,7 @@ func GetIssueStats(rid, uid int64, isShowClosed bool, filterMode int) *IssueStat
issue := new(Issue) issue := new(Issue)
tmpSess := &xorm.Session{} tmpSess := &xorm.Session{}
sess := orm.Where("repo_id=?", rid) sess := x.Where("repo_id=?", rid)
*tmpSess = *sess *tmpSess = *sess
stats.OpenCount, _ = tmpSess.And("is_closed=?", false).Count(issue) stats.OpenCount, _ = tmpSess.And("is_closed=?", false).Count(issue)
*tmpSess = *sess *tmpSess = *sess
@ -347,7 +347,7 @@ func GetIssueStats(rid, uid int64, isShowClosed bool, filterMode int) *IssueStat
} }
if filterMode != FM_MENTION { if filterMode != FM_MENTION {
sess = orm.Where("repo_id=?", rid) sess = x.Where("repo_id=?", rid)
switch filterMode { switch filterMode {
case FM_ASSIGN: case FM_ASSIGN:
sess.And("assignee_id=?", uid) sess.And("assignee_id=?", uid)
@ -361,16 +361,16 @@ func GetIssueStats(rid, uid int64, isShowClosed bool, filterMode int) *IssueStat
*tmpSess = *sess *tmpSess = *sess
stats.ClosedCount, _ = tmpSess.And("is_closed=?", true).Count(issue) stats.ClosedCount, _ = tmpSess.And("is_closed=?", true).Count(issue)
} else { } else {
sess := orm.Where("repo_id=?", rid).And("uid=?", uid).And("is_mentioned=?", true) sess := x.Where("repo_id=?", rid).And("uid=?", uid).And("is_mentioned=?", true)
*tmpSess = *sess *tmpSess = *sess
stats.OpenCount, _ = tmpSess.And("is_closed=?", false).Count(new(IssueUser)) stats.OpenCount, _ = tmpSess.And("is_closed=?", false).Count(new(IssueUser))
*tmpSess = *sess *tmpSess = *sess
stats.ClosedCount, _ = tmpSess.And("is_closed=?", true).Count(new(IssueUser)) stats.ClosedCount, _ = tmpSess.And("is_closed=?", true).Count(new(IssueUser))
} }
nofilter: nofilter:
stats.AssignCount, _ = orm.Where("repo_id=?", rid).And("is_closed=?", isShowClosed).And("assignee_id=?", uid).Count(issue) stats.AssignCount, _ = x.Where("repo_id=?", rid).And("is_closed=?", isShowClosed).And("assignee_id=?", uid).Count(issue)
stats.CreateCount, _ = orm.Where("repo_id=?", rid).And("is_closed=?", isShowClosed).And("poster_id=?", uid).Count(issue) stats.CreateCount, _ = x.Where("repo_id=?", rid).And("is_closed=?", isShowClosed).And("poster_id=?", uid).Count(issue)
stats.MentionCount, _ = orm.Where("repo_id=?", rid).And("uid=?", uid).And("is_closed=?", isShowClosed).And("is_mentioned=?", true).Count(new(IssueUser)) stats.MentionCount, _ = x.Where("repo_id=?", rid).And("uid=?", uid).And("is_closed=?", isShowClosed).And("is_mentioned=?", true).Count(new(IssueUser))
return stats return stats
} }
@ -378,28 +378,28 @@ nofilter:
func GetUserIssueStats(uid int64, filterMode int) *IssueStats { func GetUserIssueStats(uid int64, filterMode int) *IssueStats {
stats := &IssueStats{} stats := &IssueStats{}
issue := new(Issue) issue := new(Issue)
stats.AssignCount, _ = orm.Where("assignee_id=?", uid).And("is_closed=?", false).Count(issue) stats.AssignCount, _ = x.Where("assignee_id=?", uid).And("is_closed=?", false).Count(issue)
stats.CreateCount, _ = orm.Where("poster_id=?", uid).And("is_closed=?", false).Count(issue) stats.CreateCount, _ = x.Where("poster_id=?", uid).And("is_closed=?", false).Count(issue)
return stats return stats
} }
// UpdateIssue updates information of issue. // UpdateIssue updates information of issue.
func UpdateIssue(issue *Issue) error { func UpdateIssue(issue *Issue) error {
_, err := orm.Id(issue.Id).AllCols().Update(issue) _, err := x.Id(issue.Id).AllCols().Update(issue)
return err return err
} }
// UpdateIssueUserByStatus updates issue-user pairs by issue status. // UpdateIssueUserByStatus updates issue-user pairs by issue status.
func UpdateIssueUserPairsByStatus(iid int64, isClosed bool) error { func UpdateIssueUserPairsByStatus(iid int64, isClosed bool) error {
rawSql := "UPDATE `issue_user` SET is_closed = ? WHERE issue_id = ?" rawSql := "UPDATE `issue_user` SET is_closed = ? WHERE issue_id = ?"
_, err := orm.Exec(rawSql, isClosed, iid) _, err := x.Exec(rawSql, isClosed, iid)
return err return err
} }
// UpdateIssueUserPairByAssignee updates issue-user pair for assigning. // UpdateIssueUserPairByAssignee updates issue-user pair for assigning.
func UpdateIssueUserPairByAssignee(aid, iid int64) error { func UpdateIssueUserPairByAssignee(aid, iid int64) error {
rawSql := "UPDATE `issue_user` SET is_assigned = ? WHERE issue_id = ?" rawSql := "UPDATE `issue_user` SET is_assigned = ? WHERE issue_id = ?"
if _, err := orm.Exec(rawSql, false, iid); err != nil { if _, err := x.Exec(rawSql, false, iid); err != nil {
return err return err
} }
@ -408,14 +408,14 @@ func UpdateIssueUserPairByAssignee(aid, iid int64) error {
return nil return nil
} }
rawSql = "UPDATE `issue_user` SET is_assigned = true WHERE uid = ? AND issue_id = ?" rawSql = "UPDATE `issue_user` SET is_assigned = true WHERE uid = ? AND issue_id = ?"
_, err := orm.Exec(rawSql, aid, iid) _, err := x.Exec(rawSql, aid, iid)
return err return err
} }
// UpdateIssueUserPairByRead updates issue-user pair for reading. // UpdateIssueUserPairByRead updates issue-user pair for reading.
func UpdateIssueUserPairByRead(uid, iid int64) error { func UpdateIssueUserPairByRead(uid, iid int64) error {
rawSql := "UPDATE `issue_user` SET is_read = ? WHERE uid = ? AND issue_id = ?" rawSql := "UPDATE `issue_user` SET is_read = ? WHERE uid = ? AND issue_id = ?"
_, err := orm.Exec(rawSql, true, uid, iid) _, err := x.Exec(rawSql, true, uid, iid)
return err return err
} }
@ -423,16 +423,16 @@ func UpdateIssueUserPairByRead(uid, iid int64) error {
func UpdateIssueUserPairsByMentions(uids []int64, iid int64) error { func UpdateIssueUserPairsByMentions(uids []int64, iid int64) error {
for _, uid := range uids { for _, uid := range uids {
iu := &IssueUser{Uid: uid, IssueId: iid} iu := &IssueUser{Uid: uid, IssueId: iid}
has, err := orm.Get(iu) has, err := x.Get(iu)
if err != nil { if err != nil {
return err return err
} }
iu.IsMentioned = true iu.IsMentioned = true
if has { if has {
_, err = orm.Id(iu.Id).AllCols().Update(iu) _, err = x.Id(iu.Id).AllCols().Update(iu)
} else { } else {
_, err = orm.Insert(iu) _, err = x.Insert(iu)
} }
if err != nil { if err != nil {
return err return err
@ -467,7 +467,7 @@ func (m *Label) CalOpenIssues() {
// NewLabel creates new label of repository. // NewLabel creates new label of repository.
func NewLabel(l *Label) error { func NewLabel(l *Label) error {
_, err := orm.Insert(l) _, err := x.Insert(l)
return err return err
} }
@ -478,7 +478,7 @@ func GetLabelById(id int64) (*Label, error) {
} }
l := &Label{Id: id} l := &Label{Id: id}
has, err := orm.Get(l) has, err := x.Get(l)
if err != nil { if err != nil {
return nil, err return nil, err
} else if !has { } else if !has {
@ -490,13 +490,13 @@ func GetLabelById(id int64) (*Label, error) {
// GetLabels returns a list of labels of given repository ID. // GetLabels returns a list of labels of given repository ID.
func GetLabels(repoId int64) ([]*Label, error) { func GetLabels(repoId int64) ([]*Label, error) {
labels := make([]*Label, 0, 10) labels := make([]*Label, 0, 10)
err := orm.Where("repo_id=?", repoId).Find(&labels) err := x.Where("repo_id=?", repoId).Find(&labels)
return labels, err return labels, err
} }
// UpdateLabel updates label information. // UpdateLabel updates label information.
func UpdateLabel(l *Label) error { func UpdateLabel(l *Label) error {
_, err := orm.Id(l.Id).Update(l) _, err := x.Id(l.Id).Update(l)
return err return err
} }
@ -516,7 +516,7 @@ func DeleteLabel(repoId int64, strId string) error {
return err return err
} }
sess := orm.NewSession() sess := x.NewSession()
defer sess.Close() defer sess.Close()
if err = sess.Begin(); err != nil { if err = sess.Begin(); err != nil {
return err return err
@ -569,7 +569,7 @@ func (m *Milestone) CalOpenIssues() {
// NewMilestone creates new milestone of repository. // NewMilestone creates new milestone of repository.
func NewMilestone(m *Milestone) (err error) { func NewMilestone(m *Milestone) (err error) {
sess := orm.NewSession() sess := x.NewSession()
defer sess.Close() defer sess.Close()
if err = sess.Begin(); err != nil { if err = sess.Begin(); err != nil {
return err return err
@ -591,7 +591,7 @@ func NewMilestone(m *Milestone) (err error) {
// GetMilestoneById returns the milestone by given ID. // GetMilestoneById returns the milestone by given ID.
func GetMilestoneById(id int64) (*Milestone, error) { func GetMilestoneById(id int64) (*Milestone, error) {
m := &Milestone{Id: id} m := &Milestone{Id: id}
has, err := orm.Get(m) has, err := x.Get(m)
if err != nil { if err != nil {
return nil, err return nil, err
} else if !has { } else if !has {
@ -603,7 +603,7 @@ func GetMilestoneById(id int64) (*Milestone, error) {
// GetMilestoneByIndex returns the milestone of given repository and index. // GetMilestoneByIndex returns the milestone of given repository and index.
func GetMilestoneByIndex(repoId, idx int64) (*Milestone, error) { func GetMilestoneByIndex(repoId, idx int64) (*Milestone, error) {
m := &Milestone{RepoId: repoId, Index: idx} m := &Milestone{RepoId: repoId, Index: idx}
has, err := orm.Get(m) has, err := x.Get(m)
if err != nil { if err != nil {
return nil, err return nil, err
} else if !has { } else if !has {
@ -615,13 +615,13 @@ func GetMilestoneByIndex(repoId, idx int64) (*Milestone, error) {
// GetMilestones returns a list of milestones of given repository and status. // GetMilestones returns a list of milestones of given repository and status.
func GetMilestones(repoId int64, isClosed bool) ([]*Milestone, error) { func GetMilestones(repoId int64, isClosed bool) ([]*Milestone, error) {
miles := make([]*Milestone, 0, 10) miles := make([]*Milestone, 0, 10)
err := orm.Where("repo_id=?", repoId).And("is_closed=?", isClosed).Find(&miles) err := x.Where("repo_id=?", repoId).And("is_closed=?", isClosed).Find(&miles)
return miles, err return miles, err
} }
// UpdateMilestone updates information of given milestone. // UpdateMilestone updates information of given milestone.
func UpdateMilestone(m *Milestone) error { func UpdateMilestone(m *Milestone) error {
_, err := orm.Id(m.Id).Update(m) _, err := x.Id(m.Id).Update(m)
return err return err
} }
@ -632,7 +632,7 @@ func ChangeMilestoneStatus(m *Milestone, isClosed bool) (err error) {
return err return err
} }
sess := orm.NewSession() sess := x.NewSession()
defer sess.Close() defer sess.Close()
if err = sess.Begin(); err != nil { if err = sess.Begin(); err != nil {
return err return err
@ -658,7 +658,7 @@ func ChangeMilestoneStatus(m *Milestone, isClosed bool) (err error) {
// ChangeMilestoneAssign changes assignment of milestone for issue. // ChangeMilestoneAssign changes assignment of milestone for issue.
func ChangeMilestoneAssign(oldMid, mid int64, issue *Issue) (err error) { func ChangeMilestoneAssign(oldMid, mid int64, issue *Issue) (err error) {
sess := orm.NewSession() sess := x.NewSession()
defer sess.Close() defer sess.Close()
if err = sess.Begin(); err != nil { if err = sess.Begin(); err != nil {
return err return err
@ -717,7 +717,7 @@ func ChangeMilestoneAssign(oldMid, mid int64, issue *Issue) (err error) {
// DeleteMilestone deletes a milestone. // DeleteMilestone deletes a milestone.
func DeleteMilestone(m *Milestone) (err error) { func DeleteMilestone(m *Milestone) (err error) {
sess := orm.NewSession() sess := x.NewSession()
defer sess.Close() defer sess.Close()
if err = sess.Begin(); err != nil { if err = sess.Begin(); err != nil {
return err return err
@ -777,7 +777,7 @@ type Comment struct {
// CreateComment creates comment of issue or commit. // CreateComment creates comment of issue or commit.
func CreateComment(userId, repoId, issueId, commitId, line int64, cmtType int, content string) error { func CreateComment(userId, repoId, issueId, commitId, line int64, cmtType int, content string) error {
sess := orm.NewSession() sess := x.NewSession()
defer sess.Close() defer sess.Close()
if err := sess.Begin(); err != nil { if err := sess.Begin(); err != nil {
return err return err
@ -816,6 +816,6 @@ func CreateComment(userId, repoId, issueId, commitId, line int64, cmtType int, c
// GetIssueComments returns list of comment by given issue id. // GetIssueComments returns list of comment by given issue id.
func GetIssueComments(issueId int64) ([]Comment, error) { func GetIssueComments(issueId int64) ([]Comment, error) {
comments := make([]Comment, 0, 10) comments := make([]Comment, 0, 10)
err := orm.Asc("created").Find(&comments, &Comment{IssueId: issueId}) err := x.Asc("created").Find(&comments, &Comment{IssueId: issueId})
return comments, err return comments, err
} }

18
models/login.go

@ -109,19 +109,19 @@ func (source *LoginSource) BeforeSet(colName string, val xorm.Cell) {
} }
func CreateSource(source *LoginSource) error { func CreateSource(source *LoginSource) error {
_, err := orm.Insert(source) _, err := x.Insert(source)
return err return err
} }
func GetAuths() ([]*LoginSource, error) { func GetAuths() ([]*LoginSource, error) {
var auths = make([]*LoginSource, 0, 5) var auths = make([]*LoginSource, 0, 5)
err := orm.Find(&auths) err := x.Find(&auths)
return auths, err return auths, err
} }
func GetLoginSourceById(id int64) (*LoginSource, error) { func GetLoginSourceById(id int64) (*LoginSource, error) {
source := new(LoginSource) source := new(LoginSource)
has, err := orm.Id(id).Get(source) has, err := x.Id(id).Get(source)
if err != nil { if err != nil {
return nil, err return nil, err
} else if !has { } else if !has {
@ -131,19 +131,19 @@ func GetLoginSourceById(id int64) (*LoginSource, error) {
} }
func UpdateSource(source *LoginSource) error { func UpdateSource(source *LoginSource) error {
_, err := orm.Id(source.Id).AllCols().Update(source) _, err := x.Id(source.Id).AllCols().Update(source)
return err return err
} }
func DelLoginSource(source *LoginSource) error { func DelLoginSource(source *LoginSource) error {
cnt, err := orm.Count(&User{LoginSource: source.Id}) cnt, err := x.Count(&User{LoginSource: source.Id})
if err != nil { if err != nil {
return err return err
} }
if cnt > 0 { if cnt > 0 {
return ErrAuthenticationUserUsed return ErrAuthenticationUserUsed
} }
_, err = orm.Id(source.Id).Delete(&LoginSource{}) _, err = x.Id(source.Id).Delete(&LoginSource{})
return err return err
} }
@ -156,7 +156,7 @@ func UserSignIn(uname, passwd string) (*User, error) {
u = &User{LowerName: strings.ToLower(uname)} u = &User{LowerName: strings.ToLower(uname)}
} }
has, err := orm.Get(u) has, err := x.Get(u)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -182,7 +182,7 @@ func UserSignIn(uname, passwd string) (*User, error) {
} else { } else {
if !has { if !has {
var sources []LoginSource var sources []LoginSource
if err = orm.UseBool().Find(&sources, if err = x.UseBool().Find(&sources,
&LoginSource{IsActived: true, AllowAutoRegister: true}); err != nil { &LoginSource{IsActived: true, AllowAutoRegister: true}); err != nil {
return nil, err return nil, err
} }
@ -209,7 +209,7 @@ func UserSignIn(uname, passwd string) (*User, error) {
} }
var source LoginSource var source LoginSource
hasSource, err := orm.Id(u.LoginSource).Get(&source) hasSource, err := x.Id(u.LoginSource).Get(&source)
if err != nil { if err != nil {
return nil, err return nil, err
} else if !hasSource { } else if !hasSource {

48
models/models.go

@ -18,7 +18,7 @@ import (
) )
var ( var (
orm *xorm.Engine x *xorm.Engine
tables []interface{} tables []interface{}
HasEngine bool HasEngine bool
@ -88,7 +88,7 @@ func NewTestEngine(x *xorm.Engine) (err error) {
func SetEngine() (err error) { func SetEngine() (err error) {
switch DbCfg.Type { switch DbCfg.Type {
case "mysql": case "mysql":
orm, err = xorm.NewEngine("mysql", fmt.Sprintf("%s:%s@tcp(%s)/%s?charset=utf8", x, err = xorm.NewEngine("mysql", fmt.Sprintf("%s:%s@tcp(%s)/%s?charset=utf8",
DbCfg.User, DbCfg.Pwd, DbCfg.Host, DbCfg.Name)) DbCfg.User, DbCfg.Pwd, DbCfg.Host, DbCfg.Name))
case "postgres": case "postgres":
var host, port = "127.0.0.1", "5432" var host, port = "127.0.0.1", "5432"
@ -99,11 +99,11 @@ func SetEngine() (err error) {
if len(fields) > 1 && len(strings.TrimSpace(fields[1])) > 0 { if len(fields) > 1 && len(strings.TrimSpace(fields[1])) > 0 {
port = fields[1] port = fields[1]
} }
orm, err = xorm.NewEngine("postgres", fmt.Sprintf("user=%s password=%s host=%s port=%s dbname=%s sslmode=%s", x, err = xorm.NewEngine("postgres", fmt.Sprintf("user=%s password=%s host=%s port=%s dbname=%s sslmode=%s",
DbCfg.User, DbCfg.Pwd, host, port, DbCfg.Name, DbCfg.SslMode)) DbCfg.User, DbCfg.Pwd, host, port, DbCfg.Name, DbCfg.SslMode))
case "sqlite3": case "sqlite3":
os.MkdirAll(path.Dir(DbCfg.Path), os.ModePerm) os.MkdirAll(path.Dir(DbCfg.Path), os.ModePerm)
orm, err = xorm.NewEngine("sqlite3", DbCfg.Path) x, err = xorm.NewEngine("sqlite3", DbCfg.Path)
default: default:
return fmt.Errorf("Unknown database type: %s", DbCfg.Type) return fmt.Errorf("Unknown database type: %s", DbCfg.Type)
} }
@ -120,11 +120,11 @@ func SetEngine() (err error) {
if err != nil { if err != nil {
return fmt.Errorf("models.init(fail to create xorm.log): %v", err) return fmt.Errorf("models.init(fail to create xorm.log): %v", err)
} }
orm.Logger = xorm.NewSimpleLogger(f) x.Logger = xorm.NewSimpleLogger(f)
orm.ShowSQL = true x.ShowSQL = true
orm.ShowDebug = true x.ShowDebug = true
orm.ShowErr = true x.ShowErr = true
return nil return nil
} }
@ -132,7 +132,7 @@ func NewEngine() (err error) {
if err = SetEngine(); err != nil { if err = SetEngine(); err != nil {
return err return err
} }
if err = orm.Sync(tables...); err != nil { if err = x.Sync2(tables...); err != nil {
return fmt.Errorf("sync database struct error: %v\n", err) return fmt.Errorf("sync database struct error: %v\n", err)
} }
return nil return nil
@ -147,24 +147,24 @@ type Statistic struct {
} }
func GetStatistic() (stats Statistic) { func GetStatistic() (stats Statistic) {
stats.Counter.User, _ = orm.Count(new(User)) stats.Counter.User, _ = x.Count(new(User))
stats.Counter.PublicKey, _ = orm.Count(new(PublicKey)) stats.Counter.PublicKey, _ = x.Count(new(PublicKey))
stats.Counter.Repo, _ = orm.Count(new(Repository)) stats.Counter.Repo, _ = x.Count(new(Repository))
stats.Counter.Watch, _ = orm.Count(new(Watch)) stats.Counter.Watch, _ = x.Count(new(Watch))
stats.Counter.Action, _ = orm.Count(new(Action)) stats.Counter.Action, _ = x.Count(new(Action))
stats.Counter.Access, _ = orm.Count(new(Access)) stats.Counter.Access, _ = x.Count(new(Access))
stats.Counter.Issue, _ = orm.Count(new(Issue)) stats.Counter.Issue, _ = x.Count(new(Issue))
stats.Counter.Comment, _ = orm.Count(new(Comment)) stats.Counter.Comment, _ = x.Count(new(Comment))
stats.Counter.Mirror, _ = orm.Count(new(Mirror)) stats.Counter.Mirror, _ = x.Count(new(Mirror))
stats.Counter.Oauth, _ = orm.Count(new(Oauth2)) stats.Counter.Oauth, _ = x.Count(new(Oauth2))
stats.Counter.Release, _ = orm.Count(new(Release)) stats.Counter.Release, _ = x.Count(new(Release))
stats.Counter.LoginSource, _ = orm.Count(new(LoginSource)) stats.Counter.LoginSource, _ = x.Count(new(LoginSource))
stats.Counter.Webhook, _ = orm.Count(new(Webhook)) stats.Counter.Webhook, _ = x.Count(new(Webhook))
stats.Counter.Milestone, _ = orm.Count(new(Milestone)) stats.Counter.Milestone, _ = x.Count(new(Milestone))
return return
} }
// DumpDatabase dumps all data from database to file system. // DumpDatabase dumps all data from database to file system.
func DumpDatabase(filePath string) error { func DumpDatabase(filePath string) error {
return orm.DumpAllToFile(filePath) return x.DumpAllToFile(filePath)
} }

32
models/oauth2.go

@ -8,16 +8,16 @@ import (
"errors" "errors"
) )
// OT: Oauth2 Type type OauthType int
const ( const (
OT_GITHUB = iota + 1 GITHUB OauthType = iota + 1
OT_GOOGLE GOOGLE
OT_TWITTER TWITTER
OT_QQ QQ
OT_WEIBO WEIBO
OT_BITBUCKET BITBUCKET
OT_OSCHINA FACEBOOK
OT_FACEBOOK
) )
var ( var (
@ -35,18 +35,18 @@ type Oauth2 struct {
} }
func BindUserOauth2(userId, oauthId int64) error { func BindUserOauth2(userId, oauthId int64) error {
_, err := orm.Id(oauthId).Update(&Oauth2{Uid: userId}) _, err := x.Id(oauthId).Update(&Oauth2{Uid: userId})
return err return err
} }
func AddOauth2(oa *Oauth2) error { func AddOauth2(oa *Oauth2) error {
_, err := orm.Insert(oa) _, err := x.Insert(oa)
return err return err
} }
func GetOauth2(identity string) (oa *Oauth2, err error) { func GetOauth2(identity string) (oa *Oauth2, err error) {
oa = &Oauth2{Identity: identity} oa = &Oauth2{Identity: identity}
isExist, err := orm.Get(oa) isExist, err := x.Get(oa)
if err != nil { if err != nil {
return return
} else if !isExist { } else if !isExist {
@ -60,7 +60,7 @@ func GetOauth2(identity string) (oa *Oauth2, err error) {
func GetOauth2ById(id int64) (oa *Oauth2, err error) { func GetOauth2ById(id int64) (oa *Oauth2, err error) {
oa = new(Oauth2) oa = new(Oauth2)
has, err := orm.Id(id).Get(oa) has, err := x.Id(id).Get(oa)
if err != nil { if err != nil {
return nil, err return nil, err
} else if !has { } else if !has {
@ -71,18 +71,18 @@ func GetOauth2ById(id int64) (oa *Oauth2, err error) {
// GetOauthByUserId returns list of oauthes that are releated to given user. // GetOauthByUserId returns list of oauthes that are releated to given user.
func GetOauthByUserId(uid int64) (oas []*Oauth2, err error) { func GetOauthByUserId(uid int64) (oas []*Oauth2, err error) {
err = orm.Find(&oas, Oauth2{Uid: uid}) err = x.Find(&oas, Oauth2{Uid: uid})
return oas, err return oas, err
} }
// DeleteOauth2ById deletes a oauth2 by ID. // DeleteOauth2ById deletes a oauth2 by ID.
func DeleteOauth2ById(id int64) error { func DeleteOauth2ById(id int64) error {
_, err := orm.Delete(&Oauth2{Id: id}) _, err := x.Delete(&Oauth2{Id: id})
return err return err
} }
// CleanUnbindOauth deletes all unbind OAuthes. // CleanUnbindOauth deletes all unbind OAuthes.
func CleanUnbindOauth() error { func CleanUnbindOauth() error {
_, err := orm.Delete(&Oauth2{Uid: -1}) _, err := x.Delete(&Oauth2{Uid: -1})
return err return err
} }

12
models/publickey.go

@ -107,7 +107,7 @@ func saveAuthorizedKeyFile(key *PublicKey) error {
// AddPublicKey adds new public key to database and authorized_keys file. // AddPublicKey adds new public key to database and authorized_keys file.
func AddPublicKey(key *PublicKey) (err error) { func AddPublicKey(key *PublicKey) (err error) {
has, err := orm.Get(key) has, err := x.Get(key)
if err != nil { if err != nil {
return err return err
} else if has { } else if has {
@ -130,11 +130,11 @@ func AddPublicKey(key *PublicKey) (err error) {
key.Fingerprint = strings.Split(stdout, " ")[1] key.Fingerprint = strings.Split(stdout, " ")[1]
// Save SSH key. // Save SSH key.
if _, err = orm.Insert(key); err != nil { if _, err = x.Insert(key); err != nil {
return err return err
} else if err = saveAuthorizedKeyFile(key); err != nil { } else if err = saveAuthorizedKeyFile(key); err != nil {
// Roll back. // Roll back.
if _, err2 := orm.Delete(key); err2 != nil { if _, err2 := x.Delete(key); err2 != nil {
return err2 return err2
} }
return err return err
@ -146,7 +146,7 @@ func AddPublicKey(key *PublicKey) (err error) {
// ListPublicKey returns a list of all public keys that user has. // ListPublicKey returns a list of all public keys that user has.
func ListPublicKey(uid int64) ([]PublicKey, error) { func ListPublicKey(uid int64) ([]PublicKey, error) {
keys := make([]PublicKey, 0, 5) keys := make([]PublicKey, 0, 5)
err := orm.Find(&keys, &PublicKey{OwnerId: uid}) err := x.Find(&keys, &PublicKey{OwnerId: uid})
return keys, err return keys, err
} }
@ -205,14 +205,14 @@ func rewriteAuthorizedKeys(key *PublicKey, p, tmpP string) error {
// DeletePublicKey deletes SSH key information both in database and authorized_keys file. // DeletePublicKey deletes SSH key information both in database and authorized_keys file.
func DeletePublicKey(key *PublicKey) error { func DeletePublicKey(key *PublicKey) error {
has, err := orm.Get(key) has, err := x.Get(key)
if err != nil { if err != nil {
return err return err
} else if !has { } else if !has {
return ErrKeyNotExist return ErrKeyNotExist
} }
if _, err = orm.Delete(key); err != nil { if _, err = x.Delete(key); err != nil {
return err return err
} }

10
models/release.go

@ -43,7 +43,7 @@ func IsReleaseExist(repoId int64, tagName string) (bool, error) {
return false, nil return false, nil
} }
return orm.Get(&Release{RepoId: repoId, LowerTagName: strings.ToLower(tagName)}) return x.Get(&Release{RepoId: repoId, LowerTagName: strings.ToLower(tagName)})
} }
func createTag(gitRepo *git.Repository, rel *Release) error { func createTag(gitRepo *git.Repository, rel *Release) error {
@ -86,7 +86,7 @@ func CreateRelease(gitRepo *git.Repository, rel *Release) error {
return err return err
} }
rel.LowerTagName = strings.ToLower(rel.TagName) rel.LowerTagName = strings.ToLower(rel.TagName)
_, err = orm.InsertOne(rel) _, err = x.InsertOne(rel)
return err return err
} }
@ -100,13 +100,13 @@ func GetRelease(repoId int64, tagName string) (*Release, error) {
} }
rel := &Release{RepoId: repoId, LowerTagName: strings.ToLower(tagName)} rel := &Release{RepoId: repoId, LowerTagName: strings.ToLower(tagName)}
_, err = orm.Get(rel) _, err = x.Get(rel)
return rel, err return rel, err
} }
// GetReleasesByRepoId returns a list of releases of repository. // GetReleasesByRepoId returns a list of releases of repository.
func GetReleasesByRepoId(repoId int64) (rels []*Release, err error) { func GetReleasesByRepoId(repoId int64) (rels []*Release, err error) {
err = orm.Desc("created").Find(&rels, Release{RepoId: repoId}) err = x.Desc("created").Find(&rels, Release{RepoId: repoId})
return rels, err return rels, err
} }
@ -141,6 +141,6 @@ func UpdateRelease(gitRepo *git.Repository, rel *Release) (err error) {
if err = createTag(gitRepo, rel); err != nil { if err = createTag(gitRepo, rel); err != nil {
return err return err
} }
_, err = orm.Id(rel.Id).AllCols().Update(rel) _, err = x.Id(rel.Id).AllCols().Update(rel)
return err return err
} }

64
models/repo.go

@ -147,7 +147,7 @@ func (repo *Repository) GetOwner() (err error) {
// IsRepositoryExist returns true if the repository with given name under user has already existed. // IsRepositoryExist returns true if the repository with given name under user has already existed.
func IsRepositoryExist(u *User, repoName string) (bool, error) { func IsRepositoryExist(u *User, repoName string) (bool, error) {
repo := Repository{OwnerId: u.Id} repo := Repository{OwnerId: u.Id}
has, err := orm.Where("lower_name = ?", strings.ToLower(repoName)).Get(&repo) has, err := x.Where("lower_name = ?", strings.ToLower(repoName)).Get(&repo)
if err != nil { if err != nil {
return has, err return has, err
} else if !has { } else if !has {
@ -197,7 +197,7 @@ func MirrorRepository(repoId int64, userName, repoName, repoPath, url string) er
return errors.New("git clone --mirror: " + stderr) return errors.New("git clone --mirror: " + stderr)
} }
if _, err = orm.InsertOne(&Mirror{ if _, err = x.InsertOne(&Mirror{
RepoId: repoId, RepoId: repoId,
RepoName: strings.ToLower(userName + "/" + repoName), RepoName: strings.ToLower(userName + "/" + repoName),
Interval: 24, Interval: 24,
@ -211,7 +211,7 @@ func MirrorRepository(repoId int64, userName, repoName, repoPath, url string) er
func GetMirror(repoId int64) (*Mirror, error) { func GetMirror(repoId int64) (*Mirror, error) {
m := &Mirror{RepoId: repoId} m := &Mirror{RepoId: repoId}
has, err := orm.Get(m) has, err := x.Get(m)
if err != nil { if err != nil {
return nil, err return nil, err
} else if !has { } else if !has {
@ -221,13 +221,13 @@ func GetMirror(repoId int64) (*Mirror, error) {
} }
func UpdateMirror(m *Mirror) error { func UpdateMirror(m *Mirror) error {
_, err := orm.Id(m.Id).Update(m) _, err := x.Id(m.Id).Update(m)
return err return err
} }
// MirrorUpdate checks and updates mirror repositories. // MirrorUpdate checks and updates mirror repositories.
func MirrorUpdate() { func MirrorUpdate() {
if err := orm.Iterate(new(Mirror), func(idx int, bean interface{}) error { if err := x.Iterate(new(Mirror), func(idx int, bean interface{}) error {
m := bean.(*Mirror) m := bean.(*Mirror)
if m.NextUpdate.After(time.Now()) { if m.NextUpdate.After(time.Now()) {
return nil return nil
@ -481,7 +481,7 @@ func CreateRepository(user *User, name, desc, lang, license string, private, mir
repoPath := RepoPath(user.Name, repo.Name) repoPath := RepoPath(user.Name, repo.Name)
sess := orm.NewSession() sess := x.NewSession()
defer sess.Close() defer sess.Close()
sess.Begin() sess.Begin()
@ -566,13 +566,13 @@ func CreateRepository(user *User, name, desc, lang, license string, private, mir
// It also auto-gets corresponding users. // It also auto-gets corresponding users.
func GetRepositoriesWithUsers(num, offset int) ([]*Repository, error) { func GetRepositoriesWithUsers(num, offset int) ([]*Repository, error) {
repos := make([]*Repository, 0, num) repos := make([]*Repository, 0, num)
if err := orm.Limit(num, offset).Asc("id").Find(&repos); err != nil { if err := x.Limit(num, offset).Asc("id").Find(&repos); err != nil {
return nil, err return nil, err
} }
for _, repo := range repos { for _, repo := range repos {
repo.Owner = &User{Id: repo.OwnerId} repo.Owner = &User{Id: repo.OwnerId}
has, err := orm.Get(repo.Owner) has, err := x.Get(repo.Owner)
if err != nil { if err != nil {
return nil, err return nil, err
} else if !has { } else if !has {
@ -597,11 +597,11 @@ func TransferOwnership(user *User, newOwner string, repo *Repository) (err error
// Update accesses. // Update accesses.
accesses := make([]Access, 0, 10) accesses := make([]Access, 0, 10)
if err = orm.Find(&accesses, &Access{RepoName: user.LowerName + "/" + repo.LowerName}); err != nil { if err = x.Find(&accesses, &Access{RepoName: user.LowerName + "/" + repo.LowerName}); err != nil {
return err return err
} }
sess := orm.NewSession() sess := x.NewSession()
defer sess.Close() defer sess.Close()
if err = sess.Begin(); err != nil { if err = sess.Begin(); err != nil {
return err return err
@ -662,11 +662,11 @@ func TransferOwnership(user *User, newOwner string, repo *Repository) (err error
func ChangeRepositoryName(userName, oldRepoName, newRepoName string) (err error) { func ChangeRepositoryName(userName, oldRepoName, newRepoName string) (err error) {
// Update accesses. // Update accesses.
accesses := make([]Access, 0, 10) accesses := make([]Access, 0, 10)
if err = orm.Find(&accesses, &Access{RepoName: strings.ToLower(userName + "/" + oldRepoName)}); err != nil { if err = x.Find(&accesses, &Access{RepoName: strings.ToLower(userName + "/" + oldRepoName)}); err != nil {
return err return err
} }
sess := orm.NewSession() sess := x.NewSession()
defer sess.Close() defer sess.Close()
if err = sess.Begin(); err != nil { if err = sess.Begin(); err != nil {
return err return err
@ -697,21 +697,21 @@ func UpdateRepository(repo *Repository) error {
if len(repo.Website) > 255 { if len(repo.Website) > 255 {
repo.Website = repo.Website[:255] repo.Website = repo.Website[:255]
} }
_, err := orm.Id(repo.Id).AllCols().Update(repo) _, err := x.Id(repo.Id).AllCols().Update(repo)
return err return err
} }
// DeleteRepository deletes a repository for a user or orgnaztion. // DeleteRepository deletes a repository for a user or orgnaztion.
func DeleteRepository(userId, repoId int64, userName string) (err error) { func DeleteRepository(userId, repoId int64, userName string) (err error) {
repo := &Repository{Id: repoId, OwnerId: userId} repo := &Repository{Id: repoId, OwnerId: userId}
has, err := orm.Get(repo) has, err := x.Get(repo)
if err != nil { if err != nil {
return err return err
} else if !has { } else if !has {
return ErrRepoNotExist return ErrRepoNotExist
} }
sess := orm.NewSession() sess := x.NewSession()
defer sess.Close() defer sess.Close()
if err = sess.Begin(); err != nil { if err = sess.Begin(); err != nil {
return err return err
@ -750,7 +750,7 @@ func DeleteRepository(userId, repoId int64, userName string) (err error) {
} }
// Delete comments. // Delete comments.
if err = orm.Iterate(&Issue{RepoId: repoId}, func(idx int, bean interface{}) error { if err = x.Iterate(&Issue{RepoId: repoId}, func(idx int, bean interface{}) error {
issue := bean.(*Issue) issue := bean.(*Issue)
if _, err = sess.Delete(&Comment{IssueId: issue.Id}); err != nil { if _, err = sess.Delete(&Comment{IssueId: issue.Id}); err != nil {
sess.Rollback() sess.Rollback()
@ -785,7 +785,7 @@ func GetRepositoryByName(userId int64, repoName string) (*Repository, error) {
OwnerId: userId, OwnerId: userId,
LowerName: strings.ToLower(repoName), LowerName: strings.ToLower(repoName),
} }
has, err := orm.Get(repo) has, err := x.Get(repo)
if err != nil { if err != nil {
return nil, err return nil, err
} else if !has { } else if !has {
@ -797,7 +797,7 @@ func GetRepositoryByName(userId int64, repoName string) (*Repository, error) {
// GetRepositoryById returns the repository by given id if exists. // GetRepositoryById returns the repository by given id if exists.
func GetRepositoryById(id int64) (*Repository, error) { func GetRepositoryById(id int64) (*Repository, error) {
repo := &Repository{} repo := &Repository{}
has, err := orm.Id(id).Get(repo) has, err := x.Id(id).Get(repo)
if err != nil { if err != nil {
return nil, err return nil, err
} else if !has { } else if !has {
@ -809,7 +809,7 @@ func GetRepositoryById(id int64) (*Repository, error) {
// GetRepositories returns a list of repositories of given user. // GetRepositories returns a list of repositories of given user.
func GetRepositories(uid int64, private bool) ([]*Repository, error) { func GetRepositories(uid int64, private bool) ([]*Repository, error) {
repos := make([]*Repository, 0, 10) repos := make([]*Repository, 0, 10)
sess := orm.Desc("updated") sess := x.Desc("updated")
if !private { if !private {
sess.Where("is_private=?", false) sess.Where("is_private=?", false)
} }
@ -820,19 +820,19 @@ func GetRepositories(uid int64, private bool) ([]*Repository, error) {
// GetRecentUpdatedRepositories returns the list of repositories that are recently updated. // GetRecentUpdatedRepositories returns the list of repositories that are recently updated.
func GetRecentUpdatedRepositories() (repos []*Repository, err error) { func GetRecentUpdatedRepositories() (repos []*Repository, err error) {
err = orm.Where("is_private=?", false).Limit(5).Desc("updated").Find(&repos) err = x.Where("is_private=?", false).Limit(5).Desc("updated").Find(&repos)
return repos, err return repos, err
} }
// GetRepositoryCount returns the total number of repositories of user. // GetRepositoryCount returns the total number of repositories of user.
func GetRepositoryCount(user *User) (int64, error) { func GetRepositoryCount(user *User) (int64, error) {
return orm.Count(&Repository{OwnerId: user.Id}) return x.Count(&Repository{OwnerId: user.Id})
} }
// GetCollaboratorNames returns a list of user name of repository's collaborators. // GetCollaboratorNames returns a list of user name of repository's collaborators.
func GetCollaboratorNames(repoName string) ([]string, error) { func GetCollaboratorNames(repoName string) ([]string, error) {
accesses := make([]*Access, 0, 10) accesses := make([]*Access, 0, 10)
if err := orm.Find(&accesses, &Access{RepoName: strings.ToLower(repoName)}); err != nil { if err := x.Find(&accesses, &Access{RepoName: strings.ToLower(repoName)}); err != nil {
return nil, err return nil, err
} }
@ -847,7 +847,7 @@ func GetCollaboratorNames(repoName string) ([]string, error) {
func GetCollaborativeRepos(uname string) ([]*Repository, error) { func GetCollaborativeRepos(uname string) ([]*Repository, error) {
uname = strings.ToLower(uname) uname = strings.ToLower(uname)
accesses := make([]*Access, 0, 10) accesses := make([]*Access, 0, 10)
if err := orm.Find(&accesses, &Access{UserName: uname}); err != nil { if err := x.Find(&accesses, &Access{UserName: uname}); err != nil {
return nil, err return nil, err
} }
@ -876,7 +876,7 @@ func GetCollaborativeRepos(uname string) ([]*Repository, error) {
// GetCollaborators returns a list of users of repository's collaborators. // GetCollaborators returns a list of users of repository's collaborators.
func GetCollaborators(repoName string) (us []*User, err error) { func GetCollaborators(repoName string) (us []*User, err error) {
accesses := make([]*Access, 0, 10) accesses := make([]*Access, 0, 10)
if err = orm.Find(&accesses, &Access{RepoName: strings.ToLower(repoName)}); err != nil { if err = x.Find(&accesses, &Access{RepoName: strings.ToLower(repoName)}); err != nil {
return nil, err return nil, err
} }
@ -900,18 +900,18 @@ type Watch struct {
// Watch or unwatch repository. // Watch or unwatch repository.
func WatchRepo(uid, rid int64, watch bool) (err error) { func WatchRepo(uid, rid int64, watch bool) (err error) {
if watch { if watch {
if _, err = orm.Insert(&Watch{RepoId: rid, UserId: uid}); err != nil { if _, err = x.Insert(&Watch{RepoId: rid, UserId: uid}); err != nil {
return err return err
} }
rawSql := "UPDATE `repository` SET num_watches = num_watches + 1 WHERE id = ?" rawSql := "UPDATE `repository` SET num_watches = num_watches + 1 WHERE id = ?"
_, err = orm.Exec(rawSql, rid) _, err = x.Exec(rawSql, rid)
} else { } else {
if _, err = orm.Delete(&Watch{0, uid, rid}); err != nil { if _, err = x.Delete(&Watch{0, uid, rid}); err != nil {
return err return err
} }
rawSql := "UPDATE `repository` SET num_watches = num_watches - 1 WHERE id = ?" rawSql := "UPDATE `repository` SET num_watches = num_watches - 1 WHERE id = ?"
_, err = orm.Exec(rawSql, rid) _, err = x.Exec(rawSql, rid)
} }
return err return err
} }
@ -919,7 +919,7 @@ func WatchRepo(uid, rid int64, watch bool) (err error) {
// GetWatchers returns all watchers of given repository. // GetWatchers returns all watchers of given repository.
func GetWatchers(rid int64) ([]*Watch, error) { func GetWatchers(rid int64) ([]*Watch, error) {
watches := make([]*Watch, 0, 10) watches := make([]*Watch, 0, 10)
err := orm.Find(&watches, &Watch{RepoId: rid}) err := x.Find(&watches, &Watch{RepoId: rid})
return watches, err return watches, err
} }
@ -933,7 +933,7 @@ func NotifyWatchers(act *Action) error {
// Add feed for actioner. // Add feed for actioner.
act.UserId = act.ActUserId act.UserId = act.ActUserId
if _, err = orm.InsertOne(act); err != nil { if _, err = x.InsertOne(act); err != nil {
return errors.New("repo.NotifyWatchers(create action): " + err.Error()) return errors.New("repo.NotifyWatchers(create action): " + err.Error())
} }
@ -944,7 +944,7 @@ func NotifyWatchers(act *Action) error {
act.Id = 0 act.Id = 0
act.UserId = watches[i].UserId act.UserId = watches[i].UserId
if _, err = orm.InsertOne(act); err != nil { if _, err = x.InsertOne(act); err != nil {
return errors.New("repo.NotifyWatchers(create action): " + err.Error()) return errors.New("repo.NotifyWatchers(create action): " + err.Error())
} }
} }
@ -953,7 +953,7 @@ func NotifyWatchers(act *Action) error {
// IsWatching checks if user has watched given repository. // IsWatching checks if user has watched given repository.
func IsWatching(uid, rid int64) bool { func IsWatching(uid, rid int64) bool {
has, _ := orm.Get(&Watch{0, uid, rid}) has, _ := x.Get(&Watch{0, uid, rid})
return has return has
} }

54
models/user.go

@ -110,7 +110,7 @@ func IsUserExist(name string) (bool, error) {
if len(name) == 0 { if len(name) == 0 {
return false, nil return false, nil
} }
return orm.Get(&User{LowerName: strings.ToLower(name)}) return x.Get(&User{LowerName: strings.ToLower(name)})
} }
// IsEmailUsed returns true if the e-mail has been used. // IsEmailUsed returns true if the e-mail has been used.
@ -118,7 +118,7 @@ func IsEmailUsed(email string) (bool, error) {
if len(email) == 0 { if len(email) == 0 {
return false, nil return false, nil
} }
return orm.Get(&User{Email: email}) return x.Get(&User{Email: email})
} }
// GetUserSalt returns a user salt token // GetUserSalt returns a user salt token
@ -153,10 +153,10 @@ func RegisterUser(user *User) (*User, error) {
user.Rands = GetUserSalt() user.Rands = GetUserSalt()
user.Salt = GetUserSalt() user.Salt = GetUserSalt()
user.EncodePasswd() user.EncodePasswd()
if _, err = orm.Insert(user); err != nil { if _, err = x.Insert(user); err != nil {
return nil, err return nil, err
} else if err = os.MkdirAll(UserPath(user.Name), os.ModePerm); err != nil { } else if err = os.MkdirAll(UserPath(user.Name), os.ModePerm); err != nil {
if _, err := orm.Id(user.Id).Delete(&User{}); err != nil { if _, err := x.Id(user.Id).Delete(&User{}); err != nil {
return nil, errors.New(fmt.Sprintf( return nil, errors.New(fmt.Sprintf(
"both create userpath %s and delete table record faild: %v", user.Name, err)) "both create userpath %s and delete table record faild: %v", user.Name, err))
} }
@ -166,7 +166,7 @@ func RegisterUser(user *User) (*User, error) {
if user.Id == 1 { if user.Id == 1 {
user.IsAdmin = true user.IsAdmin = true
user.IsActive = true user.IsActive = true
_, err = orm.Id(user.Id).UseBool().Update(user) _, err = x.Id(user.Id).UseBool().Update(user)
} }
return user, err return user, err
} }
@ -174,7 +174,7 @@ func RegisterUser(user *User) (*User, error) {
// GetUsers returns given number of user objects with offset. // GetUsers returns given number of user objects with offset.
func GetUsers(num, offset int) ([]User, error) { func GetUsers(num, offset int) ([]User, error) {
users := make([]User, 0, num) users := make([]User, 0, num)
err := orm.Limit(num, offset).Asc("id").Find(&users) err := x.Limit(num, offset).Asc("id").Find(&users)
return users, err return users, err
} }
@ -218,11 +218,11 @@ func ChangeUserName(user *User, newUserName string) (err error) {
// Update accesses of user. // Update accesses of user.
accesses := make([]Access, 0, 10) accesses := make([]Access, 0, 10)
if err = orm.Find(&accesses, &Access{UserName: user.LowerName}); err != nil { if err = x.Find(&accesses, &Access{UserName: user.LowerName}); err != nil {
return err return err
} }
sess := orm.NewSession() sess := x.NewSession()
defer sess.Close() defer sess.Close()
if err = sess.Begin(); err != nil { if err = sess.Begin(); err != nil {
return err return err
@ -245,7 +245,7 @@ func ChangeUserName(user *User, newUserName string) (err error) {
for i := range repos { for i := range repos {
accesses = make([]Access, 0, 10) accesses = make([]Access, 0, 10)
// Update accesses of user repository. // Update accesses of user repository.
if err = orm.Find(&accesses, &Access{RepoName: user.LowerName + "/" + repos[i].LowerName}); err != nil { if err = x.Find(&accesses, &Access{RepoName: user.LowerName + "/" + repos[i].LowerName}); err != nil {
return err return err
} }
@ -278,7 +278,7 @@ func UpdateUser(u *User) (err error) {
u.Website = u.Website[:255] u.Website = u.Website[:255]
} }
_, err = orm.Id(u.Id).AllCols().Update(u) _, err = x.Id(u.Id).AllCols().Update(u)
return err return err
} }
@ -295,33 +295,33 @@ func DeleteUser(user *User) error {
// TODO: check issues, other repos' commits // TODO: check issues, other repos' commits
// Delete all followers. // Delete all followers.
if _, err = orm.Delete(&Follow{FollowId: user.Id}); err != nil { if _, err = x.Delete(&Follow{FollowId: user.Id}); err != nil {
return err return err
} }
// Delete oauth2. // Delete oauth2.
if _, err = orm.Delete(&Oauth2{Uid: user.Id}); err != nil { if _, err = x.Delete(&Oauth2{Uid: user.Id}); err != nil {
return err return err
} }
// Delete all feeds. // Delete all feeds.
if _, err = orm.Delete(&Action{UserId: user.Id}); err != nil { if _, err = x.Delete(&Action{UserId: user.Id}); err != nil {
return err return err
} }
// Delete all watches. // Delete all watches.
if _, err = orm.Delete(&Watch{UserId: user.Id}); err != nil { if _, err = x.Delete(&Watch{UserId: user.Id}); err != nil {
return err return err
} }
// Delete all accesses. // Delete all accesses.
if _, err = orm.Delete(&Access{UserName: user.LowerName}); err != nil { if _, err = x.Delete(&Access{UserName: user.LowerName}); err != nil {
return err return err
} }
// Delete all SSH keys. // Delete all SSH keys.
keys := make([]*PublicKey, 0, 10) keys := make([]*PublicKey, 0, 10)
if err = orm.Find(&keys, &PublicKey{OwnerId: user.Id}); err != nil { if err = x.Find(&keys, &PublicKey{OwnerId: user.Id}); err != nil {
return err return err
} }
for _, key := range keys { for _, key := range keys {
@ -335,7 +335,13 @@ func DeleteUser(user *User) error {
return err return err
} }
_, err = orm.Delete(user) _, err = x.Delete(user)
return err
}
// DeleteInactivateUsers deletes all inactivate users.
func DeleteInactivateUsers() error {
_, err := x.Where("is_active=?", false).Delete(new(User))
return err return err
} }
@ -347,7 +353,7 @@ func UserPath(userName string) string {
func GetUserByKeyId(keyId int64) (*User, error) { func GetUserByKeyId(keyId int64) (*User, error) {
user := new(User) user := new(User)
rawSql := "SELECT a.* FROM `user` AS a, public_key AS b WHERE a.id = b.owner_id AND b.id=?" rawSql := "SELECT a.* FROM `user` AS a, public_key AS b WHERE a.id = b.owner_id AND b.id=?"
has, err := orm.Sql(rawSql, keyId).Get(user) has, err := x.Sql(rawSql, keyId).Get(user)
if err != nil { if err != nil {
return nil, err return nil, err
} else if !has { } else if !has {
@ -359,7 +365,7 @@ func GetUserByKeyId(keyId int64) (*User, error) {
// GetUserById returns the user object by given ID if exists. // GetUserById returns the user object by given ID if exists.
func GetUserById(id int64) (*User, error) { func GetUserById(id int64) (*User, error) {
u := new(User) u := new(User)
has, err := orm.Id(id).Get(u) has, err := x.Id(id).Get(u)
if err != nil { if err != nil {
return nil, err return nil, err
} else if !has { } else if !has {
@ -374,7 +380,7 @@ func GetUserByName(name string) (*User, error) {
return nil, ErrUserNotExist return nil, ErrUserNotExist
} }
user := &User{LowerName: strings.ToLower(name)} user := &User{LowerName: strings.ToLower(name)}
has, err := orm.Get(user) has, err := x.Get(user)
if err != nil { if err != nil {
return nil, err return nil, err
} else if !has { } else if !has {
@ -415,7 +421,7 @@ func GetUserByEmail(email string) (*User, error) {
return nil, ErrUserNotExist return nil, ErrUserNotExist
} }
user := &User{Email: strings.ToLower(email)} user := &User{Email: strings.ToLower(email)}
has, err := orm.Get(user) has, err := x.Get(user)
if err != nil { if err != nil {
return nil, err return nil, err
} else if !has { } else if !has {
@ -439,7 +445,7 @@ func SearchUserByName(key string, limit int) (us []*User, err error) {
key = strings.ToLower(key) key = strings.ToLower(key)
us = make([]*User, 0, limit) us = make([]*User, 0, limit)
err = orm.Limit(limit).Where("lower_name like '%" + key + "%'").Find(&us) err = x.Limit(limit).Where("lower_name like '%" + key + "%'").Find(&us)
return us, err return us, err
} }
@ -452,7 +458,7 @@ type Follow struct {
// FollowUser marks someone be another's follower. // FollowUser marks someone be another's follower.
func FollowUser(userId int64, followId int64) (err error) { func FollowUser(userId int64, followId int64) (err error) {
session := orm.NewSession() session := x.NewSession()
defer session.Close() defer session.Close()
session.Begin() session.Begin()
@ -477,7 +483,7 @@ func FollowUser(userId int64, followId int64) (err error) {
// UnFollowUser unmarks someone be another's follower. // UnFollowUser unmarks someone be another's follower.
func UnFollowUser(userId int64, unFollowId int64) (err error) { func UnFollowUser(userId int64, unFollowId int64) (err error) {
session := orm.NewSession() session := x.NewSession()
defer session.Close() defer session.Close()
session.Begin() session.Begin()

18
models/webhook.go

@ -68,14 +68,14 @@ func (w *Webhook) HasPushEvent() bool {
// CreateWebhook creates a new web hook. // CreateWebhook creates a new web hook.
func CreateWebhook(w *Webhook) error { func CreateWebhook(w *Webhook) error {
_, err := orm.Insert(w) _, err := x.Insert(w)
return err return err
} }
// GetWebhookById returns webhook by given ID. // GetWebhookById returns webhook by given ID.
func GetWebhookById(hookId int64) (*Webhook, error) { func GetWebhookById(hookId int64) (*Webhook, error) {
w := &Webhook{Id: hookId} w := &Webhook{Id: hookId}
has, err := orm.Get(w) has, err := x.Get(w)
if err != nil { if err != nil {
return nil, err return nil, err
} else if !has { } else if !has {
@ -86,25 +86,25 @@ func GetWebhookById(hookId int64) (*Webhook, error) {
// GetActiveWebhooksByRepoId returns all active webhooks of repository. // GetActiveWebhooksByRepoId returns all active webhooks of repository.
func GetActiveWebhooksByRepoId(repoId int64) (ws []*Webhook, err error) { func GetActiveWebhooksByRepoId(repoId int64) (ws []*Webhook, err error) {
err = orm.Find(&ws, &Webhook{RepoId: repoId, IsActive: true}) err = x.Find(&ws, &Webhook{RepoId: repoId, IsActive: true})
return ws, err return ws, err
} }
// GetWebhooksByRepoId returns all webhooks of repository. // GetWebhooksByRepoId returns all webhooks of repository.
func GetWebhooksByRepoId(repoId int64) (ws []*Webhook, err error) { func GetWebhooksByRepoId(repoId int64) (ws []*Webhook, err error) {
err = orm.Find(&ws, &Webhook{RepoId: repoId}) err = x.Find(&ws, &Webhook{RepoId: repoId})
return ws, err return ws, err
} }
// UpdateWebhook updates information of webhook. // UpdateWebhook updates information of webhook.
func UpdateWebhook(w *Webhook) error { func UpdateWebhook(w *Webhook) error {
_, err := orm.AllCols().Update(w) _, err := x.AllCols().Update(w)
return err return err
} }
// DeleteWebhook deletes webhook of repository. // DeleteWebhook deletes webhook of repository.
func DeleteWebhook(hookId int64) error { func DeleteWebhook(hookId int64) error {
_, err := orm.Delete(&Webhook{Id: hookId}) _, err := x.Delete(&Webhook{Id: hookId})
return err return err
} }
@ -174,20 +174,20 @@ func CreateHookTask(t *HookTask) error {
return err return err
} }
t.PayloadContent = string(data) t.PayloadContent = string(data)
_, err = orm.Insert(t) _, err = x.Insert(t)
return err return err
} }
// UpdateHookTask updates information of hook task. // UpdateHookTask updates information of hook task.
func UpdateHookTask(t *HookTask) error { func UpdateHookTask(t *HookTask) error {
_, err := orm.AllCols().Update(t) _, err := x.AllCols().Update(t)
return err return err
} }
// DeliverHooks checks and delivers undelivered hooks. // DeliverHooks checks and delivers undelivered hooks.
func DeliverHooks() { func DeliverHooks() {
timeout := time.Duration(setting.WebhookDeliverTimeout) * time.Second timeout := time.Duration(setting.WebhookDeliverTimeout) * time.Second
orm.Where("is_deliveried=?", false).Iterate(new(HookTask), x.Where("is_deliveried=?", false).Iterate(new(HookTask),
func(idx int, bean interface{}) error { func(idx int, bean interface{}) error {
t := bean.(*HookTask) t := bean.(*HookTask)
// Only support JSON now. // Only support JSON now.

42
modules/auth/user.go

@ -16,20 +16,32 @@ import (
"github.com/gogits/gogs/modules/base" "github.com/gogits/gogs/modules/base"
"github.com/gogits/gogs/modules/log" "github.com/gogits/gogs/modules/log"
"github.com/gogits/gogs/modules/middleware/binding" "github.com/gogits/gogs/modules/middleware/binding"
"github.com/gogits/gogs/modules/setting"
) )
// SignedInId returns the id of signed in user. // SignedInId returns the id of signed in user.
func SignedInId(sess session.SessionStore) int64 { func SignedInId(header http.Header, sess session.SessionStore) int64 {
if !models.HasEngine { if !models.HasEngine {
return 0 return 0
} }
uid := sess.Get("userId") id, _ := base.StrTo(header.Get(setting.ReverseProxyAuthUid)).Int64()
if uid == nil { if id <= 0 {
return 0 uid := sess.Get("userId")
if uid == nil {
return 0
}
var ok bool
if id, ok = uid.(int64); !ok {
return 0
}
} }
if id, ok := uid.(int64); ok {
if id > 0 {
if _, err := models.GetUserById(id); err != nil { if _, err := models.GetUserById(id); err != nil {
if err != models.ErrUserNotExist {
log.Error("auth.user.SignedInId(GetUserById): %v", err)
}
return 0 return 0
} }
return id return id
@ -37,21 +49,9 @@ func SignedInId(sess session.SessionStore) int64 {
return 0 return 0
} }
// SignedInName returns the name of signed in user.
func SignedInName(sess session.SessionStore) string {
uname := sess.Get("userName")
if uname == nil {
return ""
}
if s, ok := uname.(string); ok {
return s
}
return ""
}
// SignedInUser returns the user object of signed user. // SignedInUser returns the user object of signed user.
func SignedInUser(sess session.SessionStore) *models.User { func SignedInUser(header http.Header, sess session.SessionStore) *models.User {
uid := SignedInId(sess) uid := SignedInId(header, sess)
if uid <= 0 { if uid <= 0 {
return nil return nil
} }
@ -65,8 +65,8 @@ func SignedInUser(sess session.SessionStore) *models.User {
} }
// IsSignedIn check if any user has signed in. // IsSignedIn check if any user has signed in.
func IsSignedIn(sess session.SessionStore) bool { func IsSignedIn(header http.Header, sess session.SessionStore) bool {
return SignedInId(sess) > 0 return SignedInId(header, sess) > 0
} }
type FeedsForm struct { type FeedsForm struct {

462
modules/bin/conf.go

@ -29,233 +29,241 @@ func conf_app_ini() ([]byte, error) {
return bindata_read([]byte{ return bindata_read([]byte{
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x00, 0xff, 0xb4, 0x59, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x00, 0xff, 0xb4, 0x59,
0xdd, 0x72, 0xdb, 0xc8, 0xb1, 0xbe, 0xc7, 0x53, 0x8c, 0x79, 0x76, 0xcf, 0xdd, 0x72, 0xdb, 0xc8, 0xb1, 0xbe, 0xc7, 0x53, 0x8c, 0x79, 0x76, 0xcf,
0xda, 0xa7, 0x24, 0x92, 0x92, 0x8f, 0x65, 0xad, 0xb4, 0xae, 0x98, 0x22, 0xda, 0xa7, 0x24, 0x92, 0x92, 0x8f, 0x65, 0xaf, 0xbc, 0xae, 0x63, 0x8a,
0x41, 0x09, 0xb1, 0x48, 0x6a, 0x01, 0x48, 0x8e, 0xe3, 0x52, 0xa1, 0x20, 0x04, 0x25, 0x1c, 0xf3, 0x47, 0x0b, 0x40, 0xf2, 0x2a, 0x2e, 0x15, 0x0a,
0x60, 0x48, 0x4e, 0x04, 0x60, 0x20, 0xcc, 0x50, 0x14, 0x73, 0x97, 0x57, 0x02, 0x86, 0xe4, 0x44, 0x00, 0x06, 0xc2, 0x0c, 0x45, 0x31, 0x77, 0x79,
0x48, 0xe5, 0x69, 0xf2, 0x3c, 0xb9, 0xc8, 0x63, 0xe4, 0xeb, 0x01, 0x40, 0x85, 0x54, 0x9e, 0x26, 0xcf, 0x93, 0x8b, 0x3c, 0x46, 0xbe, 0x1e, 0x00,
0x81, 0x34, 0xd7, 0xeb, 0xfc, 0x55, 0x52, 0x16, 0x31, 0xd3, 0xd3, 0xd3, 0x14, 0x28, 0x73, 0xb5, 0xce, 0x5f, 0x25, 0x65, 0x11, 0xf3, 0xd3, 0xd3,
0xfd, 0xf5, 0xff, 0xec, 0x29, 0xeb, 0xe5, 0x39, 0xcb, 0xc2, 0x94, 0x33, 0xdd, 0xf3, 0xf5, 0xd7, 0xdd, 0xb3, 0xef, 0x59, 0x2f, 0xcf, 0x59, 0x16,
0x3d, 0x0f, 0x35, 0x53, 0x73, 0xb9, 0x54, 0x4c, 0x66, 0x8c, 0x3f, 0xf2, 0xa6, 0x9c, 0xe9, 0x45, 0xa8, 0x99, 0x5a, 0xc8, 0x95, 0x62, 0x32, 0x63,
0x62, 0xc5, 0xf2, 0x70, 0x86, 0x0d, 0xa1, 0x13, 0x6e, 0xf5, 0xae, 0xae, 0xfc, 0x9e, 0x17, 0x6b, 0x96, 0x87, 0x73, 0x4c, 0x08, 0x9d, 0x70, 0xab,
0x82, 0x71, 0x6f, 0x64, 0xb3, 0x77, 0xec, 0x5c, 0xce, 0xd4, 0x09, 0xfe, 0x77, 0x7e, 0x1e, 0x4c, 0x7a, 0x63, 0x9b, 0x7d, 0x60, 0xa7, 0x72, 0xae,
0x65, 0xe7, 0x42, 0x33, 0x8f, 0x17, 0x8f, 0x22, 0x2a, 0xf7, 0x2f, 0x27, 0x8e, 0xf1, 0x2f, 0x3b, 0x15, 0x9a, 0x79, 0xbc, 0xb8, 0x17, 0x51, 0x39,
0xe7, 0x13, 0xec, 0x8b, 0x74, 0xd6, 0x99, 0x86, 0x58, 0x95, 0x59, 0x3b, 0x3f, 0x9a, 0x9e, 0x4e, 0x31, 0x2f, 0xd2, 0x79, 0x67, 0x16, 0x62, 0x54,
0xcf, 0x66, 0xd6, 0x29, 0xeb, 0xcf, 0xc3, 0x0c, 0x9c, 0x40, 0x2e, 0xa6, 0x66, 0xed, 0x3c, 0x9b, 0x5b, 0xef, 0x59, 0x7f, 0x11, 0x66, 0x90, 0x84,
0x6c, 0x25, 0x17, 0xac, 0x58, 0x64, 0x2c, 0x91, 0x51, 0x98, 0x24, 0x2b, 0xe5, 0x62, 0xc6, 0xd6, 0x72, 0xc9, 0x8a, 0x65, 0xc6, 0x12, 0x19, 0x85,
0xcb, 0xbd, 0x1e, 0x07, 0xd7, 0x9e, 0xed, 0xe2, 0xe4, 0x4c, 0x68, 0x50, 0x49, 0xb2, 0xb6, 0xdc, 0x8b, 0x49, 0x70, 0xe1, 0xd9, 0x2e, 0x76, 0xce,
0xdb, 0x42, 0xcf, 0x79, 0xc1, 0x5a, 0x31, 0x7f, 0x6c, 0xed, 0xb1, 0x56, 0x85, 0xc6, 0x6a, 0x5b, 0xe8, 0x05, 0x2f, 0x58, 0x2b, 0xe6, 0xf7, 0xad,
0x5e, 0xc8, 0xb8, 0xc5, 0x24, 0x16, 0x34, 0x57, 0x1a, 0x2b, 0x31, 0x9f, 0x3d, 0xd6, 0xca, 0x0b, 0x19, 0xb7, 0x98, 0xc4, 0x80, 0xe6, 0x4a, 0x63,
0x86, 0x8b, 0x04, 0xbc, 0x54, 0x49, 0x63, 0x38, 0x8c, 0x26, 0x03, 0x92, 0x24, 0xe6, 0xb3, 0x70, 0x99, 0x40, 0x96, 0x2a, 0xd7, 0x18, 0x09, 0xe3,
0x0d, 0xdf, 0x96, 0xf5, 0xb9, 0xe0, 0xb9, 0x54, 0x42, 0xcb, 0x62, 0x75, 0xe9, 0x80, 0x74, 0xc3, 0xb7, 0x65, 0x7d, 0x29, 0x78, 0x2e, 0x95, 0xd0,
0x6b, 0xb9, 0x93, 0x89, 0x8f, 0x0d, 0xcb, 0xeb, 0xbb, 0xce, 0x95, 0x1f, 0xb2, 0x58, 0x5f, 0x5b, 0xee, 0x74, 0xea, 0x63, 0xc2, 0xf2, 0xfa, 0xae,
0xf8, 0x9f, 0xae, 0x88, 0xee, 0x2e, 0x54, 0x73, 0x10, 0x2a, 0x48, 0xcf, 0x73, 0xee, 0x07, 0xfe, 0xd5, 0x39, 0xad, 0xbb, 0x09, 0xd5, 0x02, 0x0b,
0x8b, 0x5b, 0xeb, 0xca, 0x9d, 0xf8, 0x93, 0xfe, 0xe4, 0x12, 0x3b, 0x73, 0x15, 0xb4, 0xe7, 0xc5, 0xb5, 0x75, 0xee, 0x4e, 0xfd, 0x69, 0x7f, 0x3a,
0xad, 0x73, 0x6b, 0x30, 0x19, 0xf5, 0x9c, 0x31, 0xbe, 0x8c, 0x90, 0x73, 0xc2, 0xcc, 0x42, 0xeb, 0xdc, 0x1a, 0x4c, 0xc7, 0x3d, 0x67, 0x82, 0x2f,
0xa9, 0xb4, 0xe1, 0x13, 0x5c, 0xbb, 0x44, 0xf2, 0xfd, 0xcb, 0x9a, 0xfe, 0xa3, 0xe4, 0x42, 0x2a, 0x6d, 0xe4, 0x04, 0x17, 0x2e, 0x2d, 0xf9, 0xfe,
0x95, 0x3a, 0xe9, 0x74, 0xbe, 0x7f, 0x59, 0x92, 0xe3, 0xe3, 0xfb, 0x97, 0x65, 0xbd, 0xfe, 0x95, 0x3a, 0xee, 0x74, 0xbe, 0x7f, 0x59, 0x2e, 0xc7,
0x17, 0xbe, 0x7f, 0x15, 0x5c, 0x4d, 0x5c, 0xff, 0x95, 0xea, 0x58, 0xe6, 0xc7, 0xf7, 0x2f, 0xcf, 0x7c, 0xff, 0x3c, 0x38, 0x9f, 0xba, 0xfe, 0x2b,
0xa3, 0x37, 0x18, 0x90, 0x6e, 0xd6, 0x7a, 0x07, 0x1f, 0xaf, 0xbb, 0xdd, 0xd5, 0xb1, 0xcc, 0x47, 0x6f, 0x30, 0x20, 0xdb, 0xac, 0xcd, 0x0c, 0x3e,
0xae, 0xe5, 0x79, 0x17, 0xf5, 0xf7, 0xe1, 0x21, 0xf4, 0x1e, 0x08, 0x15, 0x5e, 0x77, 0xbb, 0x5d, 0xcb, 0xf3, 0xce, 0xea, 0xef, 0xc3, 0x43, 0xd8,
0xde, 0x25, 0x9c, 0xf5, 0x07, 0x63, 0xc2, 0x3f, 0x63, 0x22, 0xab, 0xb5, 0x3d, 0x10, 0x2a, 0xbc, 0x49, 0x38, 0xeb, 0x0f, 0x26, 0xe4, 0xff, 0x8c,
0x4f, 0x65, 0xcc, 0xad, 0xc9, 0x70, 0x78, 0xe9, 0x8c, 0xed, 0x5a, 0xd5, 0x89, 0xac, 0xb6, 0x3e, 0x95, 0x31, 0xb7, 0xa6, 0xc3, 0xe1, 0xc8, 0x99,
0x69, 0x98, 0x28, 0x6e, 0x0d, 0x1c, 0xaf, 0x77, 0x76, 0x69, 0x07, 0xee, 0xd8, 0xb5, 0xa9, 0xb3, 0x30, 0x51, 0xdc, 0x1a, 0x38, 0x5e, 0xef, 0x64,
0xe4, 0xda, 0xb7, 0x5d, 0x32, 0xc1, 0x7a, 0xeb, 0x94, 0x9d, 0xf3, 0x8c, 0x64, 0x07, 0xee, 0xf4, 0xc2, 0xb7, 0x5d, 0xba, 0x82, 0xcd, 0xd4, 0x7b,
0x17, 0xa1, 0xe6, 0x4c, 0x69, 0x9e, 0xab, 0x13, 0xac, 0x7c, 0xc7, 0xa2, 0x76, 0xca, 0x33, 0x5e, 0x84, 0x9a, 0x33, 0xa5, 0x79, 0xae, 0x8e, 0x31,
0x18, 0x66, 0xd5, 0xf3, 0x8e, 0x96, 0x9d, 0x19, 0x0c, 0xd9, 0x89, 0x16, 0xf2, 0x1d, 0x8b, 0x62, 0x5c, 0xab, 0x5e, 0x74, 0xb4, 0xec, 0xcc, 0x71,
0x4a, 0xcb, 0xb4, 0x43, 0x6a, 0x2b, 0x43, 0x30, 0x93, 0xc6, 0x3c, 0xdf, 0x91, 0x9d, 0x68, 0xa9, 0xb4, 0x4c, 0x3b, 0x64, 0xb6, 0x32, 0x0b, 0xe6,
0x9d, 0x4f, 0x48, 0xe5, 0x8e, 0x2a, 0xa2, 0x4e, 0x7e, 0x3f, 0xeb, 0x44, 0xd2, 0x5c, 0xcf, 0x77, 0xa7, 0x53, 0x32, 0xb9, 0xa3, 0x8a, 0xa8, 0x93,
0xc5, 0x2a, 0xc7, 0x19, 0x9d, 0xa8, 0xce, 0xac, 0x62, 0x1b, 0x44, 0xbc, 0xdf, 0xce, 0x3b, 0x51, 0xb1, 0xce, 0xb1, 0x47, 0x27, 0xaa, 0x33, 0xaf,
0xd0, 0x6d, 0xd0, 0xef, 0x47, 0xe1, 0x3b, 0x5d, 0x2c, 0x38, 0xdb, 0x8f, 0xc4, 0x06, 0x11, 0x2f, 0x74, 0x1b, 0xeb, 0xf7, 0xa3, 0xf0, 0x83, 0x2e,
0x17, 0xd8, 0x10, 0x32, 0x7b, 0x77, 0xfc, 0xf6, 0xa8, 0x3b, 0xef, 0xa6, 0x96, 0x9c, 0xed, 0xc7, 0x4b, 0x4c, 0x08, 0x99, 0x7d, 0x78, 0xf7, 0xf6,
0x5d, 0xc5, 0xf6, 0x09, 0xbe, 0x77, 0xe9, 0x8a, 0xfe, 0xb4, 0xf9, 0x53, 0xa8, 0xbb, 0xe8, 0xa6, 0x5d, 0xc5, 0xf6, 0xc9, 0x7d, 0x1f, 0xd2, 0x35,
0x98, 0xe6, 0x09, 0x6f, 0x47, 0x32, 0xb5, 0xfa, 0xb6, 0xeb, 0x07, 0x43, 0xfd, 0x69, 0xf3, 0x87, 0x30, 0xcd, 0x13, 0xde, 0x8e, 0x64, 0x6a, 0xf5,
0xe7, 0x92, 0x94, 0x69, 0x4a, 0xd1, 0x31, 0x6c, 0x73, 0x9e, 0x5a, 0x1f, 0x6d, 0xd7, 0x0f, 0x86, 0xce, 0x88, 0x8c, 0x69, 0x6a, 0xd1, 0x31, 0x62,
0xec, 0x4f, 0x3b, 0x09, 0xee, 0xf9, 0xca, 0xec, 0x9f, 0xb2, 0xeb, 0x3c, 0x73, 0x9e, 0x5a, 0x9f, 0xec, 0xab, 0x9d, 0x0b, 0x6e, 0xf9, 0xda, 0xcc,
0x87, 0xab, 0x24, 0x80, 0x2b, 0x61, 0x72, 0xca, 0x34, 0x07, 0x77, 0x52, 0xbf, 0x67, 0x17, 0x79, 0x0e, 0xa8, 0x24, 0x70, 0x57, 0xc2, 0xe4, 0x8c,
0x38, 0xcc, 0x62, 0x28, 0x0d, 0x51, 0x22, 0x36, 0x15, 0xc0, 0x94, 0x54, 0x69, 0x0e, 0xe9, 0x64, 0x70, 0x98, 0xc5, 0x30, 0x1a, 0xaa, 0x44, 0x6c,
0x06, 0x79, 0xc3, 0x75, 0xe0, 0x63, 0x66, 0x95, 0x2d, 0xe1, 0x6c, 0xdc, 0x26, 0xe0, 0x53, 0x32, 0x19, 0xcb, 0x1b, 0xd0, 0x01, 0xc6, 0xcc, 0x28,
0x38, 0x35, 0x2d, 0xf3, 0x27, 0x1e, 0x2d, 0x34, 0x8f, 0x2d, 0xcf, 0xef, 0x5b, 0x01, 0x6c, 0xdc, 0x80, 0x9a, 0x86, 0xf9, 0x03, 0x8f, 0x96, 0x9a,
0xf9, 0x4e, 0x3f, 0x30, 0x66, 0xbf, 0xea, 0xf9, 0x17, 0x64, 0x42, 0xeb, 0xc7, 0x96, 0xe7, 0xf7, 0x7c, 0xa7, 0x1f, 0x98, 0x6b, 0x3f, 0xef, 0xf9,
0x73, 0x1c, 0xea, 0x10, 0xbe, 0xc3, 0x6f, 0x1b, 0x7e, 0x9a, 0xae, 0xd4, 0x67, 0x74, 0x85, 0xd6, 0x97, 0x38, 0xd4, 0x21, 0xb0, 0xc3, 0xaf, 0x1b,
0x43, 0x62, 0x3c, 0x15, 0x1a, 0xce, 0x0a, 0xae, 0x4a, 0x6f, 0xc5, 0xa2, 0x38, 0x4d, 0xd7, 0xea, 0x2e, 0x31, 0x48, 0x85, 0x85, 0xf3, 0x82, 0xab,
0xd0, 0xfc, 0x35, 0x36, 0x84, 0xfe, 0x41, 0x91, 0xdb, 0x17, 0x2c, 0x9a, 0x12, 0xad, 0x18, 0x14, 0x9a, 0xbf, 0xc6, 0x84, 0xd0, 0x3f, 0x28, 0x82,
0x4b, 0x0a, 0x96, 0xc1, 0x59, 0xed, 0x87, 0xe6, 0xac, 0x75, 0x31, 0xf1, 0x7d, 0xc1, 0xa2, 0x85, 0xa4, 0x60, 0x19, 0x9c, 0xd4, 0x38, 0x34, 0x7b,
0xc8, 0x0b, 0x0e, 0x0e, 0xdf, 0xb6, 0xbb, 0xf8, 0xdf, 0xc1, 0xc9, 0xeb, 0xad, 0xb3, 0xa9, 0x47, 0x28, 0x38, 0x38, 0x7c, 0xdb, 0xee, 0xe2, 0x7f,
0xd7, 0xdd, 0x23, 0xab, 0x0a, 0x37, 0xb2, 0x92, 0x55, 0x05, 0x48, 0x21, 0x07, 0xc7, 0xaf, 0x5f, 0x77, 0x8f, 0xac, 0x2a, 0xdc, 0xe8, 0x96, 0xac,
0xa5, 0xb6, 0xae, 0x7a, 0x9e, 0xf7, 0x71, 0xc0, 0xde, 0x41, 0x84, 0x21, 0x2a, 0x40, 0x0a, 0x29, 0xb5, 0x75, 0xde, 0xf3, 0xbc, 0xcf, 0x03, 0xf6,
0x5d, 0xd4, 0xb8, 0x36, 0x4b, 0x56, 0x7b, 0x8c, 0xd7, 0xf1, 0x53, 0xfa, 0x01, 0x2a, 0x0c, 0xe9, 0xa0, 0xc6, 0xb1, 0x59, 0xb2, 0xde, 0x63, 0xbc,
0x13, 0x49, 0x56, 0xf0, 0x87, 0x85, 0x28, 0x78, 0x29, 0x18, 0x3c, 0x5e, 0x8e, 0x9f, 0x12, 0x4f, 0xa4, 0x59, 0xc1, 0xef, 0x96, 0xa2, 0xe0, 0xa5,
0x4c, 0x57, 0xfb, 0xd3, 0x45, 0x92, 0xb4, 0xe0, 0x84, 0x97, 0xeb, 0xd8, 0x62, 0x40, 0xbc, 0x98, 0xad, 0xf7, 0x67, 0xcb, 0x24, 0x69, 0x01, 0x84,
0x29, 0xe9, 0x6b, 0xb6, 0xb5, 0xfc, 0x86, 0xab, 0x55, 0x41, 0x40, 0xfa, 0xa3, 0x4d, 0xec, 0x94, 0xeb, 0x6b, 0xb1, 0xb5, 0xfe, 0x46, 0xaa, 0x55,
0x1b, 0xbf, 0x69, 0xc7, 0x77, 0x80, 0x23, 0x8c, 0x53, 0x91, 0xdd, 0x9a, 0xb9, 0x80, 0xec, 0x37, 0xb8, 0x69, 0xc7, 0x37, 0x70, 0x47, 0x18, 0xa7,
0x40, 0x8a, 0x16, 0x85, 0xd0, 0x88, 0x37, 0x67, 0x0c, 0xe4, 0x2e, 0x2f, 0x22, 0xbb, 0x36, 0x81, 0x14, 0x2d, 0x0b, 0xa1, 0x11, 0x6f, 0xce, 0x04,
0xe1, 0x89, 0xfd, 0x0f, 0x0d, 0x57, 0x7c, 0xf1, 0xa2, 0x7f, 0xd1, 0x1b, 0x9e, 0x1b, 0x8d, 0x80, 0xc4, 0xfe, 0xa7, 0x06, 0x14, 0x5f, 0xbc, 0xe8,
0x9f, 0xdb, 0xcc, 0xbf, 0x70, 0x3c, 0xe6, 0x4f, 0xd8, 0x07, 0xdb, 0xbe, 0x9f, 0xf5, 0x26, 0xa7, 0x36, 0xf3, 0xcf, 0x1c, 0x8f, 0xf9, 0x53, 0xf6,
0x62, 0x9f, 0x26, 0xd7, 0x2e, 0x33, 0xba, 0x0d, 0x7a, 0x7e, 0x8f, 0x79, 0xc9, 0xb6, 0xcf, 0xd9, 0xd5, 0xf4, 0xc2, 0x65, 0xc6, 0xb6, 0x41, 0xcf,
0xbd, 0xa1, 0xfd, 0xe2, 0x85, 0xe5, 0xd9, 0x7d, 0xd7, 0xf6, 0x03, 0x58, 0xef, 0x31, 0xaf, 0x37, 0xb4, 0x5f, 0xbc, 0xb0, 0x3c, 0xbb, 0xef, 0xda,
0x1f, 0x0c, 0x5e, 0xfc, 0xcf, 0xfb, 0xe1, 0xc0, 0xfe, 0xe8, 0xe2, 0xff, 0x7e, 0x80, 0xdb, 0x87, 0x80, 0x17, 0xff, 0xf5, 0x71, 0x38, 0xb0, 0x3f,
0xff, 0xfb, 0x7f, 0x2f, 0xc1, 0xa9, 0xb7, 0xd0, 0x72, 0x3f, 0x91, 0x33, 0xbb, 0xf8, 0xff, 0x7f, 0xff, 0xcf, 0x4b, 0x48, 0xea, 0x2d, 0xb5, 0xdc,
0x44, 0x47, 0xc1, 0x53, 0x9e, 0xde, 0x41, 0xd7, 0x38, 0x5c, 0x29, 0x0b, 0x4f, 0xe4, 0x1c, 0xd1, 0x51, 0xf0, 0x94, 0xa7, 0x37, 0xb0, 0x35, 0x0e,
0xbe, 0xef, 0x8c, 0x03, 0xd7, 0x1e, 0xd9, 0xa3, 0x33, 0x84, 0xc2, 0xa0, 0xd7, 0xca, 0x02, 0xf6, 0x9d, 0x49, 0xe0, 0xda, 0x63, 0x7b, 0x7c, 0x82,
0xf7, 0xc9, 0xc3, 0xf9, 0xb7, 0x56, 0x7f, 0x32, 0xf9, 0xe0, 0xd8, 0x26, 0x50, 0x18, 0xf4, 0xae, 0x3c, 0xec, 0x7f, 0x6b, 0xf5, 0xa7, 0xd3, 0x4f,
0xc7, 0x34, 0x20, 0x0d, 0xc2, 0x25, 0x57, 0x32, 0xe5, 0xf5, 0xf6, 0xfa, 0x8e, 0x6d, 0x38, 0xa6, 0xe1, 0xd2, 0x20, 0x5c, 0x71, 0x25, 0x53, 0x5e,
0x5c, 0x93, 0x46, 0x64, 0x51, 0xc1, 0x63, 0x41, 0xa8, 0x94, 0xc9, 0x02, 0x4f, 0x6f, 0xf6, 0x35, 0xd7, 0x88, 0x2c, 0x2a, 0x78, 0x2c, 0x4a, 0xaf,
0xd6, 0xbb, 0xb5, 0x7a, 0x7d, 0xdf, 0xb9, 0xb1, 0x83, 0x3e, 0x60, 0x0b, 0xb8, 0x44, 0x8a, 0x0a, 0xa8, 0x29, 0xe4, 0xc3, 0x9a, 0x85, 0x4b, 0x78,
0x2e, 0xe9, 0xd7, 0xc8, 0x19, 0x23, 0xfa, 0xe8, 0xb6, 0x83, 0xe3, 0xae, 0x39, 0x03, 0xc0, 0x0c, 0xde, 0xd9, 0x82, 0x87, 0x31, 0x14, 0x31, 0x54,
0xe5, 0xda, 0x9e, 0x4d, 0x3e, 0x43, 0x56, 0xfa, 0x45, 0x22, 0xb8, 0x2e, 0x0a, 0x20, 0x2e, 0xc1, 0x2c, 0xcc, 0x19, 0x58, 0xae, 0x7d, 0x69, 0xbb,
0xf8, 0xb1, 0x8c, 0xf3, 0x98, 0x69, 0xc9, 0x90, 0x2b, 0xa7, 0xa2, 0x48, 0x9e, 0x1d, 0x80, 0x30, 0x7e, 0xb9, 0x0a, 0x7a, 0x17, 0xfe, 0x99, 0x3d,
0x19, 0xdf, 0x4f, 0x43, 0x91, 0xb0, 0x29, 0x0c, 0x50, 0xf0, 0x99, 0x50, 0x01, 0xac, 0x00, 0xad, 0x29, 0x58, 0xcf, 0xc1, 0x2d, 0xb2, 0x5f, 0xf6,
0xba, 0x0c, 0x27, 0xf0, 0x3c, 0x77, 0x3c, 0x0a, 0x70, 0x1b, 0x99, 0xe6, 0x3f, 0xdb, 0x27, 0x34, 0xb3, 0x8f, 0xef, 0x8a, 0x93, 0x00, 0x92, 0x6b,
0x12, 0x5c, 0xc7, 0x43, 0xc7, 0x1d, 0x35, 0xf0, 0x1d, 0x48, 0xae, 0x58, 0xab, 0xd7, 0xf7, 0x9d, 0x4b, 0x3b, 0xe8, 0xe3, 0x76, 0x82, 0x11, 0xfd,
0x26, 0x35, 0x43, 0x4e, 0x95, 0xcb, 0xea, 0x30, 0x2e, 0xa0, 0x40, 0x30, 0x1a, 0x3b, 0x13, 0x04, 0x39, 0x19, 0x75, 0xf0, 0xae, 0x0b, 0xd1, 0x9e,
0x56, 0x62, 0xd0, 0xc4, 0x44, 0x46, 0x14, 0xc9, 0x45, 0xa6, 0x4b, 0xab, 0x4d, 0xd0, 0x24, 0x30, 0xfc, 0xea, 0x22, 0x44, 0x08, 0x69, 0x92, 0x71,
0xae, 0xb3, 0x87, 0x61, 0xef, 0xc2, 0xe3, 0x27, 0xe3, 0x06, 0x53, 0x23, 0x1e, 0x33, 0x2d, 0x19, 0x28, 0x79, 0x26, 0x8a, 0x94, 0xf1, 0xfd, 0x34,
0x62, 0x8a, 0xc8, 0x63, 0x4a, 0xcc, 0x4c, 0x3e, 0x82, 0xa8, 0x8f, 0x82, 0x14, 0x09, 0x9b, 0xe1, 0x9e, 0x0b, 0x3e, 0x17, 0x4a, 0x97, 0x51, 0x0b,
0x2f, 0xc1, 0x76, 0xa5, 0xe7, 0x22, 0x9b, 0xb5, 0x21, 0xd9, 0xcf, 0xd7, 0x99, 0xa7, 0x8e, 0x47, 0x3c, 0x62, 0x83, 0xd0, 0x46, 0x90, 0x3a, 0x19,
0x8e, 0x6b, 0x07, 0x9e, 0x73, 0x3e, 0x06, 0xfc, 0x37, 0x8e, 0xfd, 0xb1, 0x3a, 0xee, 0xb8, 0x71, 0x8d, 0x03, 0xc9, 0x15, 0xcb, 0xa4, 0x66, 0xa0,
0xc1, 0xa1, 0x1f, 0x46, 0x88, 0xb3, 0xf0, 0x11, 0x6e, 0x03, 0x59, 0x14, 0x6e, 0xb9, 0xaa, 0x36, 0xe3, 0x00, 0x8a, 0x37, 0x03, 0x06, 0x06, 0x87,
0xcb, 0x45, 0xa4, 0x17, 0x05, 0xb7, 0xec, 0xb1, 0xb9, 0xb7, 0xdf, 0xeb, 0x99, 0x00, 0x8c, 0x22, 0xb9, 0xcc, 0x74, 0x09, 0x9e, 0x0d, 0x49, 0x19,
0x5f, 0xd8, 0x41, 0xef, 0x06, 0xc6, 0x77, 0x1b, 0xa7, 0x46, 0x84, 0x01, 0xf1, 0xae, 0xb1, 0xbe, 0x21, 0xd4, 0xa8, 0x98, 0x22, 0xc0, 0x99, 0x12,
0x94, 0x11, 0x53, 0x11, 0x95, 0xfa, 0x57, 0xf4, 0xe3, 0x89, 0xef, 0x0c, 0x73, 0x43, 0x7b, 0x50, 0xf5, 0x5e, 0xf0, 0x15, 0xc4, 0xae, 0xf5, 0x42,
0x3f, 0x05, 0x84, 0xc1, 0x9a, 0xdc, 0xfa, 0xbc, 0xe4, 0x77, 0x73, 0x29, 0x64, 0xf3, 0x36, 0x34, 0xfb, 0xf9, 0xc2, 0x71, 0xed, 0xc0, 0x73, 0x4e,
0xef, 0x29, 0x26, 0xfb, 0x05, 0x8a, 0x97, 0x0e, 0xd5, 0x3d, 0x84, 0x85, 0x27, 0xb8, 0xe5, 0x4b, 0xc7, 0xfe, 0xdc, 0x90, 0xd0, 0x0f, 0x23, 0x84,
0xfa, 0x8f, 0x61, 0x42, 0x52, 0x43, 0x7d, 0xc4, 0xb4, 0xb2, 0xfc, 0x9e, 0x73, 0x78, 0x0f, 0x74, 0x42, 0x17, 0xc5, 0x72, 0x11, 0xe9, 0x65, 0xc1,
0xf7, 0x21, 0x70, 0xc6, 0xc0, 0xf1, 0xa6, 0x47, 0x0c, 0x0e, 0x08, 0x38, 0x2d, 0x7b, 0x62, 0xce, 0xed, 0xf7, 0xfa, 0x67, 0x76, 0xd0, 0xbb, 0x04,
0x9e, 0x08, 0x44, 0x04, 0xca, 0x5c, 0xca, 0xe5, 0x42, 0x13, 0x39, 0x9c, 0xc6, 0xdc, 0xc6, 0xae, 0x31, 0xf9, 0x00, 0xc6, 0x88, 0x59, 0x75, 0x8b,
0x59, 0x66, 0xb1, 0xb2, 0x06, 0x36, 0x19, 0xce, 0x0d, 0x7c, 0x67, 0x64, 0xf5, 0xfa, 0xc9, 0xd4, 0x77, 0x86, 0x57, 0x01, 0xf9, 0xa0, 0xb9, 0x5c,
0x23, 0xbd, 0xe2, 0xc0, 0x1b, 0xdc, 0x46, 0x06, 0xa2, 0x9a, 0x51, 0x8a, 0x82, 0x27, 0x62, 0xae, 0xb1, 0xeb, 0xd8, 0xa4, 0x09, 0x22, 0x7f, 0xa4,
0x34, 0x68, 0x88, 0x7d, 0xb6, 0x98, 0x4e, 0x4d, 0x36, 0xca, 0x66, 0xc8, 0xac, 0xc5, 0xf2, 0x86, 0xf8, 0x8c, 0xc2, 0x42, 0x68, 0x55, 0xb2, 0xaa,
0x2b, 0x48, 0x47, 0x11, 0xea, 0x5e, 0xc6, 0x93, 0x3d, 0x76, 0xcf, 0x79, 0x50, 0x6a, 0xc9, 0x55, 0xe7, 0xe0, 0xe8, 0x4d, 0x2d, 0xf3, 0x39, 0x24,
0x4e, 0xe5, 0x0f, 0x08, 0x08, 0x93, 0x7d, 0xaa, 0x3a, 0x18, 0xcb, 0xec, 0x6c, 0x0e, 0xb1, 0xbe, 0xac, 0xf8, 0xcd, 0x42, 0xca, 0x5b, 0xe2, 0x97,
0x07, 0xcd, 0xee, 0x33, 0x58, 0x6c, 0x49, 0xf5, 0xd7, 0x6c, 0xb6, 0x11, 0x7e, 0x01, 0x5c, 0xe9, 0x50, 0xdd, 0xc2, 0x23, 0xf0, 0xf1, 0x7d, 0x98,
0x00, 0xe3, 0x41, 0x70, 0x76, 0x3d, 0x1c, 0x52, 0x46, 0xb7, 0xc9, 0x22, 0x90, 0x6b, 0xe0, 0x63, 0xf0, 0x93, 0xb2, 0xfc, 0x9e, 0xf7, 0x29, 0x70,
0x07, 0xe4, 0x31, 0x63, 0xaa, 0xd3, 0x88, 0x52, 0xa4, 0xb8, 0x15, 0xdc, 0x26, 0xb8, 0xac, 0xcb, 0x1e, 0x69, 0x79, 0x40, 0xb7, 0xc3, 0x13, 0x01,
0x86, 0x14, 0x23, 0xa0, 0xca, 0x02, 0xed, 0x5d, 0x9f, 0xfd, 0xd6, 0xee, 0x8c, 0x22, 0x65, 0xa7, 0x5c, 0x2e, 0x35, 0x2d, 0x47, 0x60, 0xca, 0x2c,
0xfb, 0xa6, 0x3c, 0xd5, 0xc5, 0xfa, 0x95, 0xaa, 0xc1, 0x2c, 0x0b, 0x1d, 0x56, 0xd6, 0xc0, 0x26, 0x74, 0xb8, 0x81, 0xef, 0x8c, 0x6d, 0xa4, 0x0a,
0x95, 0x04, 0x3a, 0x72, 0xc2, 0x54, 0xaa, 0xf3, 0xf6, 0x8c, 0x7e, 0x53, 0x6c, 0x78, 0x83, 0xd3, 0x08, 0x05, 0x94, 0xff, 0x4a, 0x1d, 0x07, 0x0d,
0x2a, 0x3e, 0x79, 0x73, 0xfc, 0x16, 0x7b, 0x3f, 0xff, 0x5c, 0x6d, 0x3c, 0x63, 0x4f, 0x96, 0xb3, 0x99, 0x61, 0xd6, 0x6c, 0x0e, 0x8e, 0x04, 0xa2,
0x3c, 0x98, 0xd5, 0xc3, 0x37, 0x75, 0x66, 0xaa, 0xd9, 0x4c, 0x0b, 0x99, 0x23, 0xe4, 0xf0, 0x8c, 0x27, 0x7b, 0xec, 0x96, 0xf3, 0x9c, 0x52, 0x39,
0xc2, 0x9d, 0x62, 0x64, 0x1b, 0x65, 0x0d, 0xdd, 0xc9, 0xe8, 0x79, 0x0f, 0xdc, 0x2c, 0x0c, 0x93, 0x56, 0x39, 0x3d, 0x96, 0xd9, 0x0f, 0x9a, 0xdd,
0x8a, 0x2f, 0x8c, 0x47, 0x93, 0x90, 0xe4, 0x75, 0x79, 0xa8, 0xd4, 0x52, 0x66, 0x80, 0xc5, 0x8a, 0x6a, 0x09, 0x33, 0xd9, 0x46, 0x30, 0x4f, 0x06,
0x16, 0x71, 0x9d, 0xbb, 0xd6, 0x79, 0x8b, 0xf2, 0xa8, 0x0c, 0x17, 0x7a, 0xc1, 0xc9, 0xc5, 0x70, 0x48, 0xd9, 0xc9, 0x26, 0x53, 0x0f, 0x08, 0x96,
0xfe, 0x25, 0x86, 0xd5, 0x46, 0x1b, 0x8d, 0xc0, 0x7c, 0x71, 0xf7, 0xe5, 0x13, 0x0a, 0x14, 0x30, 0x0e, 0xe8, 0x7a, 0x0d, 0x6c, 0x92, 0x61, 0x74,
0x7e, 0xff, 0xd2, 0xb1, 0xc7, 0x7e, 0xe0, 0x18, 0x2e, 0xd5, 0x47, 0x99, 0x1b, 0x65, 0xb1, 0xe1, 0x5d, 0x9c, 0xfc, 0xbf, 0xdd, 0xf7, 0x4d, 0xaa,
0x2d, 0xca, 0x12, 0x3f, 0xb9, 0x32, 0x01, 0x66, 0xaa, 0x04, 0x2a, 0x73, 0xad, 0x0b, 0x8f, 0x57, 0xaa, 0xbe, 0xb1, 0x32, 0x69, 0x53, 0x7a, 0x4b,
0x98, 0x8b, 0x8a, 0x15, 0xe9, 0xd3, 0x21, 0xf9, 0xac, 0xde, 0xb5, 0x7f, 0xcd, 0x55, 0xa8, 0x54, 0xe7, 0xed, 0x39, 0xfd, 0xa6, 0x6b, 0x38, 0x7e,
0x51, 0xd5, 0xf1, 0x9a, 0xac, 0x41, 0x62, 0xf2, 0x4a, 0xc7, 0x08, 0xd1, 0xf3, 0xee, 0x2d, 0xe6, 0x7e, 0xfe, 0xb9, 0x9a, 0xb8, 0xbb, 0x33, 0xa3,
0xa1, 0x7f, 0x64, 0x21, 0xfe, 0xc8, 0x2d, 0x7f, 0xf2, 0xc1, 0x1e, 0x7f, 0x87, 0x6f, 0x6a, 0x96, 0xad, 0xc5, 0xcc, 0x0a, 0x99, 0x02, 0xb3, 0x31,
0xe3, 0xa1, 0x28, 0x02, 0x36, 0x81, 0x96, 0xf7, 0x3c, 0xb3, 0x4c, 0x09, 0x98, 0x53, 0x59, 0x43, 0x77, 0x3a, 0x7e, 0x9c, 0x83, 0xe1, 0x26, 0x80,
0xd6, 0x2c, 0x4a, 0x04, 0x47, 0xc4, 0x89, 0xb8, 0x2c, 0x4b, 0x1c, 0x91, 0x4d, 0x34, 0x13, 0xb4, 0xf3, 0x50, 0xa9, 0x95, 0x2c, 0xe2, 0x9a, 0x87,
0xa8, 0x0d, 0x94, 0xd8, 0xaf, 0xd9, 0xc1, 0xe3, 0x94, 0x44, 0x61, 0x8c, 0x37, 0x1c, 0x4c, 0x39, 0x41, 0x12, 0x15, 0x7c, 0xed, 0xc3, 0x6a, 0xa2,
0xa9, 0x94, 0x49, 0x14, 0x35, 0x85, 0xc2, 0x2a, 0x67, 0x65, 0xa9, 0xec, 0x5d, 0x22, 0xe4, 0xeb, 0xf9, 0xfe, 0xc8, 0x01, 0x02, 0x02, 0xc3, 0x01,
0xa0, 0x0b, 0xf8, 0x03, 0x8f, 0xf4, 0x1a, 0x1e, 0xb3, 0xf3, 0x6f, 0xc3, 0xf5, 0x47, 0xc9, 0x7c, 0x65, 0xb9, 0x32, 0x3d, 0x37, 0x51, 0x5c, 0x03,
0xb3, 0x5c, 0x2e, 0x2b, 0x56, 0x00, 0x4a, 0x99, 0x8b, 0x8c, 0x0e, 0x84, 0x2d, 0xcc, 0x45, 0xbb, 0x01, 0x36, 0xd2, 0xcf, 0x22, 0x14, 0x55, 0x35,
0x93, 0xc8, 0xa6, 0xb2, 0xcd, 0x8d, 0x7f, 0x7d, 0x33, 0x39, 0xa4, 0xa4, 0xc9, 0x0e, 0x3c, 0x1a, 0x8e, 0xec, 0x18, 0x25, 0x3a, 0xf4, 0x8f, 0x2c,
0x62, 0xbb, 0x0b, 0xe2, 0x2a, 0xeb, 0x6c, 0x28, 0x25, 0x4b, 0xc8, 0x0e, 0xc4, 0x1f, 0xb8, 0xe5, 0x4f, 0x3f, 0xd9, 0x93, 0x6f, 0xdc, 0x14, 0x45,
0x0d, 0x97, 0x9d, 0x18, 0x7f, 0xf5, 0x54, 0x05, 0x71, 0x05, 0xc9, 0xc3, 0xf0, 0x4d, 0xa0, 0xe5, 0x2d, 0xcf, 0x2c, 0x53, 0x4e, 0x68, 0x16, 0x25,
0xc3, 0xbf, 0x0c, 0x07, 0x32, 0xa6, 0x71, 0x7e, 0xf6, 0xb7, 0xbf, 0xfe, 0x02, 0xac, 0xc7, 0x44, 0x5c, 0xa6, 0x58, 0x8e, 0x70, 0xd7, 0xc6, 0x95,
0xf9, 0xef, 0x7f, 0xfa, 0x0b, 0x95, 0x98, 0x1d, 0x3e, 0x52, 0x84, 0xf9, 0x98, 0xaf, 0xc5, 0x01, 0x71, 0x4a, 0x22, 0xc9, 0xc7, 0x94, 0x96, 0x25,
0xbc, 0x0a, 0x8c, 0x4a, 0x82, 0x76, 0xb7, 0xe1, 0x22, 0xa7, 0x6c, 0xa7, 0x12, 0xb4, 0x42, 0x91, 0x20, 0xe7, 0x65, 0xda, 0xef, 0x80, 0x3e, 0x7f,
0x93, 0xec, 0x3c, 0x55, 0x4a, 0x8e, 0x13, 0x3c, 0x8b, 0xc8, 0x31, 0x96, 0xcf, 0x23, 0xbd, 0x71, 0x8f, 0x99, 0xf9, 0x97, 0xdd, 0xb3, 0x5a, 0xad,
0x5c, 0xdc, 0xc9, 0x5d, 0xa8, 0xc1, 0x0f, 0xb2, 0xb6, 0xae, 0xcf, 0x47, 0x2a, 0x51, 0x70, 0x94, 0x32, 0x07, 0x19, 0x1b, 0xc8, 0x4f, 0x22, 0x9b,
0x33, 0xb1, 0x7f, 0x57, 0x3b, 0xda, 0xe1, 0xaf, 0xb8, 0xe7, 0xd7, 0x8f, 0xc9, 0x36, 0x37, 0xf8, 0xfa, 0xe6, 0xe5, 0xd0, 0x92, 0x0a, 0x87, 0x5d,
0x6e, 0x38, 0x69, 0x85, 0xa0, 0x5e, 0x0a, 0xad, 0x77, 0x25, 0xb6, 0x7f, 0x2e, 0xae, 0xa8, 0x6d, 0xcb, 0x28, 0x59, 0xba, 0xec, 0xd0, 0x48, 0xd9,
0x02, 0xc6, 0x5d, 0x96, 0x47, 0x0c, 0x56, 0xac, 0x9f, 0x51, 0xf8, 0x15, 0xe9, 0xe3, 0x67, 0x77, 0x55, 0x2e, 0xae, 0x5c, 0x72, 0x77, 0xf7, 0x4f,
0xe1, 0x7f, 0xe1, 0xcc, 0x2e, 0xa9, 0x0d, 0x76, 0xff, 0x0d, 0x99, 0x0d, 0xbb, 0x03, 0xb4, 0x6c, 0xc0, 0xcf, 0xfe, 0xfa, 0x97, 0x3f, 0xfd, 0xed,
0xe3, 0x86, 0xdd, 0xbe, 0x41, 0xe4, 0x2f, 0x8f, 0x6c, 0x4a, 0x1c, 0x51, 0x8f, 0x7f, 0xa6, 0x74, 0xb9, 0x03, 0x23, 0x45, 0x98, 0x2f, 0xaa, 0xc0,
0x31, 0xdc, 0xe8, 0x1c, 0x79, 0x8a, 0x19, 0xa5, 0x6c, 0xd0, 0x90, 0xd7, 0xa8, 0x34, 0x68, 0x77, 0x1b, 0x10, 0x79, 0xcf, 0x76, 0x82, 0x64, 0xe7,
0xf1, 0x43, 0x96, 0xab, 0x86, 0x72, 0x6b, 0xd4, 0xa9, 0x88, 0xad, 0xde, 0xae, 0x52, 0x73, 0xec, 0xe0, 0x59, 0x44, 0xc0, 0x58, 0x71, 0x71, 0x23,
0xa0, 0x77, 0xe5, 0x9b, 0x8c, 0x5a, 0xae, 0xd4, 0xfd, 0x5a, 0xb5, 0x5f, 0x77, 0x79, 0x0d, 0x38, 0xc8, 0xda, 0xba, 0xde, 0x1f, 0xcd, 0xc5, 0xfe,
0x35, 0x81, 0xe7, 0xfd, 0x8d, 0x0a, 0x58, 0x95, 0xb4, 0x0d, 0x8e, 0x47, 0x4d, 0x0d, 0xb4, 0xc3, 0xdf, 0x80, 0xe7, 0xf3, 0x5b, 0xb7, 0x40, 0x5a,
0x5d, 0xab, 0x51, 0x0b, 0x8f, 0xba, 0x35, 0xa3, 0x52, 0x16, 0x93, 0xab, 0x79, 0x50, 0xaf, 0x84, 0xd6, 0xbb, 0x88, 0xed, 0x1f, 0x70, 0xe3, 0xae,
0x9a, 0xb2, 0x80, 0x41, 0x86, 0x1c, 0x84, 0x6a, 0xcc, 0xa8, 0x95, 0x5f, 0x9b, 0x47, 0x0c, 0x56, 0xa2, 0x1f, 0xbd, 0xf0, 0x1b, 0xca, 0xff, 0xca,
0x97, 0x81, 0x53, 0x66, 0x0e, 0x9c, 0xb0, 0xd6, 0xc9, 0x51, 0xf7, 0xf5, 0x9e, 0x5d, 0x5a, 0x1b, 0xdf, 0xfd, 0x27, 0x74, 0x36, 0x82, 0x1b, 0xf7,
0x8f, 0x2d, 0x2c, 0xd4, 0xa7, 0xb0, 0xf6, 0xdc, 0xd3, 0x1e, 0x1c, 0x1c, 0xf6, 0x0d, 0x2a, 0x7f, 0xbd, 0x65, 0x5b, 0xe3, 0x88, 0x32, 0xee, 0x56,
0x1e, 0x1c, 0xb4, 0xaa, 0x8a, 0x62, 0xda, 0x29, 0xa5, 0xc0, 0x6c, 0x37, 0x15, 0xcc, 0x53, 0xf4, 0x5b, 0x65, 0xb1, 0x09, 0x5e, 0xc7, 0x0f, 0x59,
0x1e, 0x94, 0x47, 0x9e, 0x71, 0x29, 0x61, 0xa9, 0xda, 0xec, 0x5d, 0x98, 0x8e, 0x9a, 0x95, 0x4f, 0xda, 0xb6, 0x6a, 0xb1, 0xd5, 0x1b, 0xf4, 0xce,
0x60, 0x1e, 0xbb, 0x71, 0x06, 0x06, 0x14, 0x93, 0x81, 0x4e, 0xd9, 0x55, 0x7d, 0xc3, 0xa8, 0xe5, 0x48, 0x5d, 0x7b, 0x56, 0xf3, 0x55, 0x41, 0x7b,
0x21, 0x1f, 0x45, 0x0c, 0xa6, 0xa6, 0xb3, 0x9a, 0x31, 0x99, 0x93, 0xe4, 0xda, 0xdf, 0xca, 0x80, 0x55, 0x4a, 0xdb, 0x92, 0x78, 0xd4, 0xb5, 0x1a,
0xaa, 0x14, 0x0e, 0x67, 0x4e, 0x4c, 0xb3, 0x34, 0x0f, 0x1f, 0xa9, 0x58, 0xb9, 0xf0, 0xa8, 0x5b, 0x0b, 0x2a, 0x75, 0x31, 0x5c, 0xd5, 0xd4, 0x05,
0xad, 0x6a, 0xaa, 0x15, 0xa7, 0x01, 0x94, 0x58, 0xa0, 0x12, 0x96, 0xf2, 0x02, 0x32, 0x70, 0x90, 0x29, 0xdc, 0x50, 0x3d, 0x6f, 0xd2, 0xc0, 0x7b,
0x3d, 0xcf, 0x0f, 0xe8, 0xac, 0xdb, 0xb3, 0x36, 0xfa, 0x6a, 0xea, 0x81, 0x66, 0x36, 0x1c, 0xb3, 0xd6, 0xf1, 0x51, 0xf7, 0xf5, 0x8f, 0x2d, 0x0c,
0xab, 0x5d, 0xd5, 0x7a, 0xd6, 0xbf, 0xe2, 0x91, 0x88, 0x7b, 0x5e, 0x2e, 0xd4, 0xbb, 0x30, 0xf6, 0x58, 0x9f, 0x1f, 0x1c, 0x1c, 0x1e, 0x1c, 0xb4,
0x55, 0x55, 0xd7, 0x20, 0xb5, 0xc7, 0x72, 0x29, 0x13, 0x0f, 0xee, 0xb3, 0xaa, 0x8c, 0x62, 0x6a, 0x36, 0xa5, 0x20, 0x6c, 0xb7, 0x3f, 0x88, 0x47,
0xb7, 0xae, 0x8c, 0x35, 0xc3, 0x67, 0x8c, 0x8e, 0x5e, 0xbf, 0xfd, 0x71, 0x1e, 0xfd, 0x52, 0xba, 0xa5, 0x6a, 0x19, 0x76, 0xf9, 0x04, 0x05, 0xc2,
0xef, 0xa0, 0xdb, 0xdd, 0x0b, 0x31, 0xbc, 0x3c, 0x09, 0x6e, 0xc0, 0x24, 0xa5, 0x33, 0x30, 0x4e, 0x31, 0x0c, 0xf4, 0x9e, 0x9d, 0x17, 0xf2, 0x5e,
0xbd, 0x4f, 0xd0, 0x8f, 0xee, 0xe3, 0xef, 0x7e, 0x5c, 0x50, 0xb7, 0xd2, 0x50, 0x75, 0x69, 0xca, 0xb7, 0x39, 0x93, 0x39, 0x69, 0xae, 0x4a, 0xe5,
0x31, 0x8b, 0x2c, 0x56, 0x59, 0x7d, 0x2b, 0x3a, 0x45, 0xb4, 0x63, 0x35, 0xb0, 0xe7, 0xd8, 0x54, 0x64, 0x8b, 0xf0, 0x9e, 0x92, 0xd5, 0xba, 0x5e,
0x47, 0x9a, 0x13, 0x4e, 0xea, 0x6b, 0xde, 0xd7, 0xc2, 0x06, 0xda, 0xcc, 0xb5, 0xe6, 0xd4, 0x4c, 0x93, 0x08, 0x64, 0xc2, 0x52, 0xbf, 0xc7, 0x5e,
0x03, 0x6b, 0xb4, 0xca, 0x36, 0xf2, 0xbc, 0x6e, 0xeb, 0x6b, 0x95, 0x70, 0x08, 0x5d, 0x42, 0x7b, 0xde, 0x46, 0x8f, 0x40, 0xf5, 0x7c, 0x35, 0xab,
0xa7, 0x57, 0xe9, 0x1e, 0xa1, 0xad, 0x12, 0xdc, 0xd4, 0xf4, 0xba, 0x4f, 0x5a, 0x8f, 0xf6, 0x57, 0x32, 0x12, 0x71, 0xcb, 0xcb, 0xa1, 0x2a, 0xeb,
0xae, 0xda, 0x63, 0x11, 0x90, 0x9e, 0x01, 0xba, 0x64, 0xa1, 0xe9, 0x84, 0x1a, 0x4f, 0xed, 0xb1, 0x5c, 0xca, 0xc4, 0x03, 0x7c, 0xf6, 0x36, 0x99,
0x53, 0x36, 0x34, 0xa8, 0x05, 0x6b, 0xe0, 0xe0, 0x76, 0x26, 0x3a, 0x2a, 0xb1, 0x16, 0xf8, 0xe8, 0xa3, 0xa3, 0xd7, 0x6f, 0x7f, 0xdc, 0x3b, 0xe8,
0x8f, 0x6c, 0xd8, 0xad, 0x8a, 0xd1, 0x92, 0x21, 0xc2, 0xf2, 0xda, 0xb5, 0x76, 0xf7, 0x42, 0x34, 0x62, 0x0f, 0x82, 0x1b, 0x67, 0x92, 0xdd, 0xc7,
0x1b, 0x6d, 0x94, 0x9d, 0x99, 0x31, 0x58, 0x51, 0xe5, 0x34, 0xf7, 0x6f, 0xa8, 0xad, 0xf7, 0xf1, 0x77, 0x3f, 0x2e, 0xa8, 0x5a, 0xe9, 0x98, 0x41,
0x9c, 0xa5, 0x39, 0xb3, 0x6e, 0x07, 0xa9, 0xcf, 0x2e, 0xb9, 0xe0, 0xb8, 0x16, 0xab, 0xac, 0x3e, 0x15, 0xe5, 0x28, 0x6a, 0xbe, 0x5a, 0x22, 0xf5,
0xd9, 0x78, 0x16, 0x1d, 0x01, 0x40, 0x2d, 0xdd, 0x3a, 0x0a, 0x36, 0x98, 0x3c, 0xc7, 0xf5, 0x31, 0x1f, 0x6b, 0x65, 0x03, 0x6d, 0x7a, 0x9b, 0x8d,
0x1c, 0x1f, 0xfd, 0x3f, 0x06, 0xf0, 0xf3, 0xfe, 0xba, 0x19, 0x34, 0x3d, 0xb7, 0xca, 0x5a, 0xf5, 0xb4, 0x6e, 0x51, 0x6a, 0x93, 0x70, 0xa6, 0x57,
0x1e, 0x98, 0x94, 0x1b, 0xcf, 0x5c, 0x12, 0x31, 0xe5, 0x86, 0xcf, 0x8e, 0xd9, 0x1e, 0xa1, 0xac, 0x12, 0xdc, 0xe4, 0xf4, 0xba, 0xe6, 0xaf, 0x4a,
0xe3, 0x9e, 0xed, 0x79, 0xe8, 0x97, 0xd1, 0xdd, 0x0f, 0xed, 0xed, 0xf3, 0x7d, 0x11, 0x90, 0x9d, 0x41, 0x59, 0xbf, 0x61, 0x87, 0x53, 0x16, 0x34,
0x6b, 0x0c, 0x62, 0xf8, 0x98, 0x9a, 0xb3, 0xe9, 0x22, 0x8b, 0xf6, 0xd6, 0xc8, 0x05, 0x1b, 0xc7, 0x01, 0x76, 0x26, 0x3a, 0x2a, 0x44, 0x36, 0xee,
0x7e, 0xae, 0xe6, 0xe1, 0x01, 0x79, 0x37, 0xfe, 0x1e, 0xbe, 0x39, 0xaa, 0xad, 0x8a, 0xd1, 0x52, 0x20, 0xc2, 0xf2, 0xc2, 0xb5, 0x1b, 0x65, 0x94,
0xdc, 0x3b, 0x7e, 0xd3, 0x6a, 0xde, 0x41, 0x34, 0xeb, 0x2b, 0x9c, 0x41, 0x9d, 0x99, 0x96, 0x5e, 0x51, 0xe6, 0x34, 0xe7, 0x6f, 0xed, 0xa5, 0x9e,
0x70, 0xd1, 0xf3, 0x2e, 0x86, 0xd7, 0xe3, 0x3e, 0x2e, 0x31, 0x5b, 0xcf, 0xb9, 0xae, 0x0f, 0xa9, 0x98, 0x2f, 0xa5, 0x60, 0xbb, 0x99, 0x78, 0x54,
0x32, 0x9a, 0x0b, 0x30, 0x12, 0x6f, 0x88, 0x48, 0x86, 0x28, 0x10, 0xc2, 0x1d, 0x01, 0x40, 0x25, 0xdd, 0x26, 0x0a, 0xb6, 0x84, 0xbc, 0x3b, 0xfa,
0xe8, 0xd7, 0x4a, 0xd7, 0xd8, 0xe6, 0x65, 0xa6, 0x2b, 0x84, 0x61, 0xd5, 0xdf, 0x6e, 0xd7, 0x3a, 0xed, 0x6f, 0x8a, 0x41, 0x53, 0xe3, 0x41, 0x48,
0x91, 0x53, 0x18, 0xfa, 0x34, 0x12, 0x27, 0x61, 0xc4, 0xa9, 0xcd, 0xaf, 0x39, 0xf1, 0x28, 0x25, 0x11, 0x33, 0x6e, 0xe4, 0xec, 0xd8, 0xee, 0xd9,
0xd6, 0x8d, 0x6b, 0x3c, 0xcf, 0x94, 0xa5, 0x47, 0x97, 0x12, 0x3f, 0x88, 0x9e, 0x47, 0x2d, 0xc9, 0xc8, 0x19, 0xda, 0x4f, 0xf7, 0x6f, 0x7c, 0x10,
0x4c, 0x2c, 0xb6, 0x02, 0xb2, 0xda, 0xc7, 0x65, 0xee, 0x8d, 0xd3, 0x27, 0x03, 0x63, 0x6a, 0xc1, 0x66, 0xcb, 0x2c, 0xda, 0xdb, 0xe0, 0x5c, 0x2d,
0x44, 0xaa, 0xce, 0xb3, 0x9e, 0x34, 0xce, 0xdd, 0xad, 0x6e, 0xdf, 0xfa, 0xc2, 0x03, 0x42, 0x37, 0xfe, 0x1e, 0xbe, 0x39, 0xaa, 0xe0, 0x1d, 0xbf,
0x8c, 0xf6, 0xa9, 0x7c, 0xa6, 0xa9, 0xe6, 0xec, 0x46, 0x42, 0xa8, 0xba, 0x69, 0x35, 0xcf, 0xa0, 0x35, 0x9b, 0x23, 0x9c, 0x41, 0x70, 0xd6, 0xf3,
0xa2, 0x66, 0x46, 0xa0, 0x34, 0x64, 0xb0, 0x43, 0xa3, 0x5a, 0xca, 0x51, 0xce, 0x86, 0x17, 0x93, 0x3e, 0x0e, 0x31, 0x53, 0x8f, 0x3a, 0x9a, 0x03,
0xcf, 0xe4, 0x5b, 0xa2, 0xd4, 0x67, 0xcb, 0x39, 0x06, 0xae, 0x94, 0xa6, 0xd0, 0xde, 0x6f, 0xa9, 0x48, 0x17, 0x51, 0x20, 0x84, 0x51, 0xaf, 0x95,
0x21, 0x29, 0xa6, 0x78, 0x1e, 0x9a, 0x47, 0x91, 0x14, 0x94, 0x22, 0x87, 0xd0, 0x78, 0x2a, 0xcb, 0x74, 0x8a, 0x08, 0xc3, 0xaa, 0xec, 0xa7, 0x30,
0xa7, 0xd1, 0xeb, 0x8a, 0xaa, 0x43, 0xa7, 0x3a, 0xb6, 0x67, 0xe2, 0xbe, 0xf4, 0xa9, 0xbd, 0x4f, 0xc2, 0x88, 0x53, 0x2f, 0x51, 0x8d, 0x1b, 0x68,
0x65, 0x55, 0xb3, 0x71, 0xb5, 0xfa, 0x9f, 0x6c, 0xf2, 0xb7, 0xfa, 0xfb, 0x3c, 0xf6, 0xc7, 0x25, 0xa2, 0x4b, 0x8d, 0xef, 0x44, 0x26, 0x96, 0x4f,
0xae, 0xf1, 0x9b, 0x5a, 0x71, 0xbf, 0x80, 0x19, 0x48, 0xcd, 0x01, 0xbf, 0x02, 0xb2, 0x9a, 0xc7, 0x61, 0xee, 0xa5, 0xd3, 0x27, 0x8f, 0x54, 0x95,
0x5b, 0xcc, 0xe8, 0x87, 0x83, 0x0e, 0x8b, 0xfe, 0x7e, 0x0c, 0x0b, 0xa3, 0x67, 0xdd, 0xce, 0x9c, 0xba, 0x4f, 0x5a, 0x0a, 0xeb, 0x0b, 0xca, 0xa7,
0xbf, 0x5d, 0x14, 0xb2, 0xa0, 0x1f, 0x7d, 0xcc, 0xdd, 0x18, 0x93, 0xb6, 0xf2, 0xc9, 0xa9, 0x7a, 0x33, 0x68, 0x10, 0x42, 0x55, 0x15, 0x35, 0x19,
0x53, 0x63, 0xc9, 0xc1, 0xba, 0xb4, 0x6f, 0x6c, 0x4a, 0xef, 0xe6, 0xd3, 0x81, 0x68, 0xc8, 0xf8, 0x0e, 0x85, 0x6a, 0xa9, 0x47, 0xfd, 0xbe, 0xf0,
0xaa, 0x53, 0x7c, 0x8d, 0x8d, 0x51, 0xbd, 0x1c, 0x05, 0xc9, 0x0c, 0xed, 0x44, 0x95, 0x7a, 0x6f, 0xd9, 0x2c, 0x01, 0x4a, 0x69, 0x1a, 0x92, 0x61,
0x6a, 0xfd, 0x76, 0x7d, 0x6c, 0x7d, 0xc2, 0xa0, 0xb1, 0x4d, 0x4e, 0x8b, 0x8a, 0xe7, 0xa1, 0x79, 0xe0, 0x49, 0xb1, 0x52, 0xe4, 0x40, 0x1a, 0xbd,
0x0d, 0x5a, 0x7a, 0xaa, 0xa9, 0xf3, 0x03, 0xb6, 0xcb, 0x77, 0x02, 0xfc, 0x14, 0xa9, 0x3a, 0x74, 0xaa, 0x6d, 0x7b, 0x26, 0xee, 0x5b, 0x56, 0xd5,
0x30, 0xae, 0x45, 0x6f, 0x2b, 0x26, 0xb0, 0x15, 0x43, 0x71, 0x94, 0x29, 0xe7, 0x57, 0xa3, 0xff, 0xce, 0x22, 0xff, 0x49, 0x7d, 0xdf, 0x35, 0xb8,
0x2c, 0x10, 0x13, 0x15, 0x2b, 0xa4, 0xc6, 0xef, 0x97, 0x0a, 0xf5, 0x3e, 0xa9, 0x0d, 0xf7, 0x0b, 0x5c, 0x03, 0x99, 0x39, 0xe0, 0x37, 0xcb, 0x39,
0x32, 0x80, 0x4e, 0x25, 0x8d, 0xb0, 0x70, 0xd9, 0x3a, 0x69, 0xbf, 0xfa, 0xfd, 0x70, 0x50, 0x61, 0xd1, 0xdf, 0xcf, 0x61, 0x61, 0xec, 0xb7, 0x8b,
0x32, 0x01, 0x60, 0xd6, 0x0f, 0xdc, 0x89, 0xdf, 0xf3, 0x1b, 0x91, 0x3f, 0x42, 0x16, 0xf4, 0xa3, 0x5f, 0x08, 0xea, 0xa8, 0x9f, 0x52, 0x63, 0x29,
0x0a, 0x9f, 0x10, 0xaf, 0x19, 0xd2, 0xd5, 0xc2, 0x3c, 0x0a, 0x80, 0x95, 0xc1, 0x1a, 0xa1, 0x85, 0x22, 0x7a, 0x37, 0x9f, 0x56, 0x4d, 0xf1, 0xb5,
0x02, 0x17, 0x18, 0x98, 0xe4, 0xdc, 0xe0, 0x61, 0xe0, 0x06, 0xe0, 0xa3, 0x6f, 0x8c, 0xe9, 0x65, 0xbf, 0x49, 0xd7, 0xd0, 0xae, 0xc6, 0xaf, 0x37,
0xde, 0xef, 0x02, 0x7a, 0x53, 0xf3, 0x6a, 0x13, 0x18, 0x23, 0x10, 0x23, 0xdb, 0x36, 0x3b, 0x8c, 0x37, 0x9e, 0x2e, 0xa7, 0xc1, 0xc6, 0x5a, 0x7a,
0x85, 0x4c, 0x8d, 0x40, 0x13, 0x53, 0xfd, 0x35, 0x3e, 0x87, 0xc7, 0x28, 0x76, 0xaa, 0xf9, 0x01, 0xd3, 0xe5, 0x9b, 0x07, 0x7e, 0x18, 0x68, 0xd1,
0x27, 0x61, 0x06, 0x86, 0xec, 0xa7, 0x9f, 0xf0, 0xb5, 0xc7, 0x10, 0xcf, 0x3b, 0x91, 0x09, 0x6c, 0x45, 0xcf, 0x00, 0x32, 0xc5, 0x0d, 0xc4, 0xb4,
0xa3, 0x33, 0xc3, 0xd7, 0x73, 0x7e, 0x8f, 0x0c, 0x75, 0xe1, 0x0c, 0xcd, 0x8a, 0x15, 0x52, 0xe3, 0xf7, 0x4b, 0x85, 0x7c, 0x1f, 0x19, 0x87, 0xce,
0x03, 0xdf, 0xb1, 0x09, 0xd8, 0x59, 0x4a, 0xfd, 0x1e, 0x69, 0x1d, 0xa3, 0x24, 0xf5, 0xc9, 0x80, 0x6c, 0x4d, 0xda, 0xaf, 0xbe, 0x26, 0x80, 0xd1,
0xb3, 0x5e, 0x7d, 0xa9, 0xd7, 0x00, 0x93, 0xed, 0xa7, 0x2f, 0x34, 0xb3, 0xf4, 0x34, 0x70, 0xa7, 0x7e, 0xcf, 0x6f, 0x44, 0xfe, 0x38, 0x7c, 0x40,
0x9f, 0x72, 0x81, 0x8a, 0x62, 0x9e, 0x39, 0x48, 0x1c, 0x62, 0x40, 0xb2, 0xbc, 0x66, 0xa0, 0xab, 0xa5, 0x79, 0xe0, 0x80, 0x28, 0x05, 0x29, 0xb8,
0xbc, 0x8c, 0x79, 0xc2, 0x69, 0xa6, 0x9f, 0xd2, 0xa8, 0x9f, 0x42, 0x6c, 0x60, 0xd2, 0x73, 0x4b, 0x86, 0x71, 0x37, 0x1c, 0x3e, 0xee, 0xfd, 0x12,
0xa2, 0xd8, 0x84, 0xeb, 0xad, 0x11, 0x66, 0xfd, 0x18, 0xd2, 0xf0, 0x80, 0xd0, 0xfb, 0xa0, 0x57, 0x5f, 0x81, 0xb9, 0x04, 0x12, 0xa4, 0xc0, 0xd4,
0x6c, 0x97, 0xf9, 0xb3, 0x86, 0x3d, 0x4f, 0x99, 0xcb, 0xab, 0xaa, 0x5f, 0x08, 0x34, 0x31, 0xd3, 0xcf, 0xc9, 0x39, 0x7c, 0x87, 0x74, 0x12, 0x66,
0x96, 0x7c, 0x7a, 0x96, 0x28, 0x5f, 0x86, 0x2b, 0x40, 0x52, 0xa4, 0xa0, 0x10, 0xc8, 0x7e, 0xfa, 0x09, 0x5f, 0x7b, 0x0c, 0xf1, 0x3c, 0x3e, 0x31,
0x70, 0xc6, 0x77, 0x24, 0x77, 0xd7, 0x46, 0x71, 0x19, 0x63, 0x20, 0x0d, 0x72, 0x3d, 0xe7, 0x77, 0x60, 0xa8, 0x33, 0x67, 0x68, 0x1e, 0x2b, 0xdf,
0x90, 0x72, 0x46, 0x5e, 0xf3, 0x55, 0xd2, 0xc7, 0x79, 0xc4, 0x61, 0xb1, 0x99, 0x80, 0x9d, 0xa7, 0x54, 0xef, 0x91, 0xd5, 0x31, 0x2a, 0xeb, 0xf5,
0xe6, 0xbd, 0x9c, 0xf3, 0xac, 0xd9, 0x5e, 0x80, 0x49, 0x82, 0xeb, 0xbe, 0xd7, 0x76, 0x0d, 0xd0, 0x3e, 0x5f, 0x7d, 0x65, 0x99, 0xfd, 0x90, 0x0b,
0xc6, 0xb5, 0x59, 0x2e, 0xaa, 0x90, 0xd1, 0x51, 0x4e, 0xe1, 0xb0, 0xc8, 0x64, 0x14, 0xf3, 0x64, 0x43, 0xea, 0x90, 0x00, 0xd2, 0xe5, 0x65, 0xcc,
0xc4, 0x53, 0x99, 0x17, 0x16, 0x71, 0xbe, 0x15, 0x13, 0x44, 0xd2, 0x7c, 0x13, 0x4e, 0x0f, 0x07, 0x33, 0x7a, 0x4f, 0x48, 0xa1, 0x36, 0xad, 0xd8,
0xeb, 0xc5, 0x37, 0x18, 0x5c, 0x34, 0xbb, 0x99, 0xfa, 0xb5, 0x76, 0xfd, 0x76, 0xd7, 0x5b, 0xa3, 0xcc, 0xe6, 0x61, 0xa7, 0x81, 0x80, 0x6c, 0xd7,
0x0a, 0x66, 0xd2, 0xcc, 0x16, 0x4e, 0xb4, 0xb8, 0x81, 0xd3, 0xd7, 0x26, 0xf5, 0x67, 0x8d, 0xfb, 0xa4, 0xe7, 0x9b, 0x2a, 0xeb, 0x97, 0x29, 0x9f,
0xf3, 0x4d, 0x11, 0x06, 0x22, 0x9c, 0x65, 0xb8, 0x50, 0x44, 0x35, 0x78, 0xde, 0x3e, 0xca, 0x57, 0xee, 0xca, 0x21, 0x29, 0x28, 0x28, 0x9c, 0xf3,
0xe5, 0x50, 0x6d, 0xd2, 0x64, 0xab, 0x31, 0xc5, 0x7f, 0x95, 0x70, 0x6b, 0x1d, 0xe4, 0xee, 0xda, 0x48, 0x2e, 0x13, 0x34, 0xa4, 0x01, 0x28, 0x67,
0xac, 0xdf, 0x9c, 0xd2, 0xbf, 0x7d, 0x12, 0x2f, 0x2d, 0xcc, 0xa9, 0xa3, 0xec, 0x35, 0x5f, 0x58, 0x7d, 0xec, 0x47, 0x1c, 0x16, 0x1b, 0xd9, 0xab,
0x40, 0xfe, 0x8b, 0xc2, 0x8c, 0xdd, 0x91, 0x9a, 0x9c, 0xe0, 0x43, 0x93, 0x05, 0xcf, 0x9a, 0xe5, 0x05, 0x84, 0x24, 0x38, 0xee, 0x39, 0xa9, 0xcd,
0xc4, 0xab, 0x9c, 0xf8, 0xb9, 0x75, 0xf0, 0xbe, 0xf1, 0x70, 0xdb, 0xda, 0x74, 0x51, 0x85, 0x8c, 0x8e, 0x72, 0x0a, 0x87, 0x65, 0x26, 0x1e, 0x4a,
0x6b, 0x1d, 0x6e, 0x7c, 0xdf, 0x92, 0x5d, 0x6c, 0x7a, 0x2a, 0xf1, 0x9a, 0x5e, 0x58, 0xc6, 0xf9, 0x93, 0x98, 0xa0, 0x25, 0xcd, 0x77, 0x6b, 0x7c,
0xd0, 0xad, 0xf3, 0xf2, 0x36, 0x7c, 0xcf, 0x8f, 0xa8, 0x0d, 0x08, 0x37, 0x43, 0xc0, 0x59, 0xb3, 0x9a, 0xa9, 0x5f, 0x9e, 0x37, 0x2f, 0x7a, 0x86,
0x5f, 0x53, 0xd9, 0xc6, 0xc3, 0xa6, 0x35, 0x70, 0x89, 0x7b, 0x49, 0x78, 0x66, 0x9e, 0xf8, 0x89, 0x06, 0xb7, 0xfc, 0xf4, 0x5c, 0x67, 0xbe, 0xad,
0x86, 0x93, 0x31, 0xfd, 0x37, 0x8a, 0x27, 0x59, 0xa4, 0xa5, 0x84, 0x27, 0xc2, 0x40, 0x84, 0xf3, 0x0c, 0x07, 0x8a, 0xa8, 0x76, 0x5e, 0xd9, 0x54,
0xe6, 0x61, 0xf4, 0x84, 0xfe, 0x79, 0xbf, 0x7e, 0xb1, 0x37, 0xe9, 0xe7, 0x1b, 0x9a, 0x6c, 0x35, 0xba, 0xf8, 0x67, 0x17, 0x3e, 0x69, 0xeb, 0xb7,
0x37, 0xc8, 0xce, 0x05, 0x3a, 0x89, 0x77, 0x0b, 0x3d, 0x3d, 0xb6, 0xc8, 0xbb, 0xf4, 0x6f, 0xef, 0xc4, 0xcb, 0x1b, 0xe6, 0x54, 0x51, 0x80, 0xff,
0x79, 0x88, 0xc9, 0x3f, 0x02, 0x00, 0x00, 0xff, 0xff, 0xb6, 0x1e, 0x92, 0xa2, 0x30, 0x63, 0x37, 0x64, 0x26, 0x27, 0xf7, 0xa1, 0x48, 0xe2, 0x15,
0x4d, 0xf7, 0x18, 0x00, 0x00, 0x27, 0x7e, 0x69, 0x1d, 0x7c, 0x6c, 0x3c, 0x42, 0xb7, 0xf6, 0x5a, 0x87,
0x5b, 0xdf, 0xd7, 0x74, 0x2f, 0x36, 0x3d, 0x95, 0x78, 0x4d, 0xd7, 0x6d,
0x78, 0xf9, 0xa9, 0xfb, 0x1e, 0x1f, 0x84, 0x1b, 0x2e, 0xdc, 0x7e, 0x19,
0x66, 0x5b, 0x8f, 0xb4, 0xd6, 0xc0, 0x25, 0xe9, 0xe5, 0xc2, 0x13, 0xec,
0x8c, 0xe9, 0xbf, 0xb7, 0x3c, 0xc8, 0x22, 0x2d, 0x35, 0x3c, 0x36, 0x8f,
0xbc, 0xc7, 0xf4, 0xcf, 0xc7, 0xcd, 0x7f, 0x7d, 0x30, 0xf4, 0xf3, 0x7f,
0x60, 0xe7, 0x02, 0x95, 0xc4, 0x87, 0xa5, 0x9e, 0xbd, 0xb3, 0x08, 0x3c,
0x24, 0xe4, 0xef, 0x01, 0x00, 0x00, 0xff, 0xff, 0xca, 0xc7, 0x79, 0x5b,
0xc3, 0x19, 0x00, 0x00,
}, },
"conf/app.ini", "conf/app.ini",
) )

2
modules/middleware/context.go

@ -358,7 +358,7 @@ func InitContext() martini.Handler {
}) })
// Get user from session if logined. // Get user from session if logined.
user := auth.SignedInUser(ctx.Session) user := auth.SignedInUser(ctx.req.Header, ctx.Session)
ctx.User = user ctx.User = user
ctx.IsSigned = user != nil ctx.IsSigned = user != nil

32
modules/setting/setting.go

@ -47,11 +47,12 @@ var (
StaticRootPath string StaticRootPath string
// Security settings. // Security settings.
InstallLock bool InstallLock bool
SecretKey string SecretKey string
LogInRememberDays int LogInRememberDays int
CookieUserName string CookieUserName string
CookieRememberName string CookieRememberName string
ReverseProxyAuthUid string
// Webhook settings. // Webhook settings.
WebhookTaskInterval int WebhookTaskInterval int
@ -163,6 +164,7 @@ func NewConfigContext() {
LogInRememberDays = Cfg.MustInt("security", "LOGIN_REMEMBER_DAYS") LogInRememberDays = Cfg.MustInt("security", "LOGIN_REMEMBER_DAYS")
CookieUserName = Cfg.MustValue("security", "COOKIE_USERNAME") CookieUserName = Cfg.MustValue("security", "COOKIE_USERNAME")
CookieRememberName = Cfg.MustValue("security", "COOKIE_REMEMBER_NAME") CookieRememberName = Cfg.MustValue("security", "COOKIE_REMEMBER_NAME")
ReverseProxyAuthUid = Cfg.MustValue("security", "REVERSE_PROXY_AUTHENTICATION_UID", "X-WEBAUTH-UID")
RunUser = Cfg.MustValue("", "RUN_USER") RunUser = Cfg.MustValue("", "RUN_USER")
curUser := os.Getenv("USER") curUser := os.Getenv("USER")
@ -191,14 +193,15 @@ func NewConfigContext() {
} }
var Service struct { var Service struct {
RegisterEmailConfirm bool RegisterEmailConfirm bool
DisableRegistration bool DisableRegistration bool
RequireSignInView bool RequireSignInView bool
EnableCacheAvatar bool EnableCacheAvatar bool
NotifyMail bool EnableNotifyMail bool
LdapAuth bool EnableReverseProxyAuth bool
ActiveCodeLives int LdapAuth bool
ResetPwdCodeLives int ActiveCodeLives int
ResetPwdCodeLives int
} }
func newService() { func newService() {
@ -207,6 +210,7 @@ func newService() {
Service.DisableRegistration = Cfg.MustBool("service", "DISABLE_REGISTRATION") Service.DisableRegistration = Cfg.MustBool("service", "DISABLE_REGISTRATION")
Service.RequireSignInView = Cfg.MustBool("service", "REQUIRE_SIGNIN_VIEW") Service.RequireSignInView = Cfg.MustBool("service", "REQUIRE_SIGNIN_VIEW")
Service.EnableCacheAvatar = Cfg.MustBool("service", "ENABLE_CACHE_AVATAR") Service.EnableCacheAvatar = Cfg.MustBool("service", "ENABLE_CACHE_AVATAR")
Service.EnableReverseProxyAuth = Cfg.MustBool("service", "ENABLE_REVERSE_PROXY_AUTHENTICATION")
} }
var logLevels = map[string]string{ var logLevels = map[string]string{
@ -395,7 +399,7 @@ func newNotifyMailService() {
log.Warn("Notify Mail Service: Mail Service is not enabled") log.Warn("Notify Mail Service: Mail Service is not enabled")
return return
} }
Service.NotifyMail = true Service.EnableNotifyMail = true
log.Info("Notify Mail Service Enabled") log.Info("Notify Mail Service Enabled")
} }

10
modules/social/social.go

@ -120,7 +120,7 @@ type SocialGithub struct {
} }
func (s *SocialGithub) Type() int { func (s *SocialGithub) Type() int {
return models.OT_GITHUB return int(models.GITHUB)
} }
func newGitHubOauth(config *oauth.Config) { func newGitHubOauth(config *oauth.Config) {
@ -174,7 +174,7 @@ type SocialGoogle struct {
} }
func (s *SocialGoogle) Type() int { func (s *SocialGoogle) Type() int {
return models.OT_GOOGLE return int(models.GOOGLE)
} }
func newGoogleOauth(config *oauth.Config) { func newGoogleOauth(config *oauth.Config) {
@ -229,7 +229,7 @@ type SocialTencent struct {
} }
func (s *SocialTencent) Type() int { func (s *SocialTencent) Type() int {
return models.OT_QQ return int(models.QQ)
} }
func newTencentOauth(config *oauth.Config) { func newTencentOauth(config *oauth.Config) {
@ -295,7 +295,7 @@ type SocialTwitter struct {
} }
func (s *SocialTwitter) Type() int { func (s *SocialTwitter) Type() int {
return models.OT_TWITTER return int(models.TWITTER)
} }
func newTwitterOauth(config *oauth.Config) { func newTwitterOauth(config *oauth.Config) {
@ -351,7 +351,7 @@ type SocialWeibo struct {
} }
func (s *SocialWeibo) Type() int { func (s *SocialWeibo) Type() int {
return models.OT_WEIBO return int(models.WEIBO)
} }
func newWeiboOauth(config *oauth.Config) { func newWeiboOauth(config *oauth.Config) {

13
routers/admin/admin.go

@ -102,8 +102,11 @@ func updateSystemStatus() {
} }
// Operation types. // Operation types.
type AdminOperation int
const ( const (
OT_CLEAN_OAUTH = iota + 1 CLEAN_UNBIND_OAUTH AdminOperation = iota + 1
CLEAN_INACTIVATE_USER
) )
func Dashboard(ctx *middleware.Context) { func Dashboard(ctx *middleware.Context) {
@ -116,10 +119,13 @@ func Dashboard(ctx *middleware.Context) {
var err error var err error
var success string var success string
switch op { switch AdminOperation(op) {
case OT_CLEAN_OAUTH: case CLEAN_UNBIND_OAUTH:
success = "All unbind OAuthes have been deleted." success = "All unbind OAuthes have been deleted."
err = models.CleanUnbindOauth() err = models.CleanUnbindOauth()
case CLEAN_INACTIVATE_USER:
success = "All inactivate accounts have been deleted."
err = models.DeleteInactivateUsers()
} }
if err != nil { if err != nil {
@ -190,6 +196,7 @@ func Config(ctx *middleware.Context) {
ctx.Data["StaticRootPath"] = setting.StaticRootPath ctx.Data["StaticRootPath"] = setting.StaticRootPath
ctx.Data["LogRootPath"] = setting.LogRootPath ctx.Data["LogRootPath"] = setting.LogRootPath
ctx.Data["ScriptType"] = setting.ScriptType ctx.Data["ScriptType"] = setting.ScriptType
ctx.Data["ReverseProxyAuthUid"] = setting.ReverseProxyAuthUid
ctx.Data["Service"] = setting.Service ctx.Data["Service"] = setting.Service

4
routers/repo/issue.go

@ -250,7 +250,7 @@ func CreateIssuePost(ctx *middleware.Context, params martini.Params, form auth.C
} }
// Mail watchers and mentions. // Mail watchers and mentions.
if setting.Service.NotifyMail { if setting.Service.EnableNotifyMail {
tos, err := mailer.SendIssueNotifyMail(ctx.User, ctx.Repo.Owner, ctx.Repo.Repository, issue) tos, err := mailer.SendIssueNotifyMail(ctx.User, ctx.Repo.Owner, ctx.Repo.Repository, issue)
if err != nil { if err != nil {
ctx.Handle(500, "issue.CreateIssue(SendIssueNotifyMail)", err) ctx.Handle(500, "issue.CreateIssue(SendIssueNotifyMail)", err)
@ -685,7 +685,7 @@ func Comment(ctx *middleware.Context, params martini.Params) {
} }
// Mail watchers and mentions. // Mail watchers and mentions.
if setting.Service.NotifyMail { if setting.Service.EnableNotifyMail {
issue.Content = content issue.Content = content
tos, err := mailer.SendIssueNotifyMail(ctx.User, ctx.Repo.Owner, ctx.Repo.Repository, issue) tos, err := mailer.SendIssueNotifyMail(ctx.User, ctx.Repo.Owner, ctx.Repo.Repository, issue)
if err != nil { if err != nil {

2
routers/repo/setting.go

@ -192,7 +192,7 @@ func CollaborationPost(ctx *middleware.Context) {
return return
} }
if setting.Service.NotifyMail { if setting.Service.EnableNotifyMail {
if err = mailer.SendCollaboratorMail(ctx.Render, u, ctx.User, ctx.Repo.Repository); err != nil { if err = mailer.SendCollaboratorMail(ctx.Render, u, ctx.User, ctx.Repo.Repository); err != nil {
ctx.Handle(500, "setting.CollaborationPost(SendCollaboratorMail)", err) ctx.Handle(500, "setting.CollaborationPost(SendCollaboratorMail)", err)
return return

2
templates/VERSION

@ -1 +1 @@
0.4.4.0620 Alpha 0.4.5.0621 Alpha

4
templates/admin/config.tmpl

@ -36,6 +36,8 @@
<dd>{{.LogRootPath}}</dd> <dd>{{.LogRootPath}}</dd>
<dt>Script Type</dt> <dt>Script Type</dt>
<dd>{{.ScriptType}}</dd> <dd>{{.ScriptType}}</dd>
<dt>Reverse Authentication UID</dt>
<dd>{{.ReverseProxyAuthUid}}</dd>
</dl> </dl>
</div> </div>
</div> </div>
@ -77,7 +79,7 @@
<dt>Require Sign In View</dt> <dt>Require Sign In View</dt>
<dd><i class="fa fa{{if .Service.RequireSignInView}}-check{{end}}-square-o"></i></dd> <dd><i class="fa fa{{if .Service.RequireSignInView}}-check{{end}}-square-o"></i></dd>
<dt>Mail Notification</dt> <dt>Mail Notification</dt>
<dd><i class="fa fa{{if .Service.NotifyMail}}-check{{end}}-square-o"></i></dd> <dd><i class="fa fa{{if .Service.EnableNotifyMail}}-check{{end}}-square-o"></i></dd>
<dt>Enable Cache Avatar</dt> <dt>Enable Cache Avatar</dt>
<dd><i class="fa fa{{if .Service.EnableCacheAvatar}}-check{{end}}-square-o"></i></dd> <dd><i class="fa fa{{if .Service.EnableCacheAvatar}}-check{{end}}-square-o"></i></dd>
<hr/> <hr/>

4
templates/admin/dashboard.tmpl

@ -32,6 +32,10 @@
<td>Clean unbind OAuthes</td> <td>Clean unbind OAuthes</td>
<td><i class="fa fa-caret-square-o-right"></i> <a href="/admin?op=1">Run</a></td> <td><i class="fa fa-caret-square-o-right"></i> <a href="/admin?op=1">Run</a></td>
</tr> </tr>
<tr>
<td>Delete inactivate accounts</td>
<td><i class="fa fa-caret-square-o-right"></i> <a href="/admin?op=2">Run</a></td>
</tr>
</tbody> </tbody>
</table> </table>
</div> </div>

Loading…
Cancel
Save