Skip to content

Commit ffb3f41

Browse files
committed
Create a session on ReverseProxy and ensure that ReverseProxy users cannot change username
ReverseProxy users should generate a session on reverse proxy username change. Also prevent ReverseProxy users from changing their username. Fix go-gitea#2407 Signed-off-by: Andrew Thornton <art27@cantab.net>
1 parent 1ba8b95 commit ffb3f41

File tree

4 files changed

+36
-8
lines changed

4 files changed

+36
-8
lines changed

modules/auth/sso/reverseproxy.go

+15-5
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import (
1212
"code.gitea.io/gitea/models"
1313
"code.gitea.io/gitea/modules/log"
1414
"code.gitea.io/gitea/modules/setting"
15+
"code.gitea.io/gitea/modules/web/middleware"
1516

1617
gouuid "github.com/google/uuid"
1718
)
@@ -68,13 +69,22 @@ func (r *ReverseProxy) VerifyAuthData(req *http.Request, w http.ResponseWriter,
6869

6970
user, err := models.GetUserByName(username)
7071
if err != nil {
71-
if models.IsErrUserNotExist(err) && r.isAutoRegisterAllowed() {
72-
return r.newUser(req)
72+
if !models.IsErrUserNotExist(err) || r.isAutoRegisterAllowed() {
73+
log.Error("GetUserByName: %v", err)
74+
return nil
7375
}
74-
log.Error("GetUserByName: %v", err)
75-
return nil
76+
user = r.newUser(req)
7677
}
7778

79+
// Make sure requests to API paths and PWA resources do not create a new session
80+
if !middleware.IsAPIPath(req) && !isAttachmentDownload(req) && !isGitOrLFSPath(req) {
81+
if sess.Get("uid").(int64) != user.ID {
82+
handleSignIn(w, req, sess, user)
83+
}
84+
}
85+
log.Info("Setting IsReverseProxy")
86+
store.GetData()["IsReverseProxy"] = true
87+
7888
return user
7989
}
8090

@@ -102,13 +112,13 @@ func (r *ReverseProxy) newUser(req *http.Request) *models.User {
102112
user := &models.User{
103113
Name: username,
104114
Email: email,
105-
Passwd: username,
106115
IsActive: true,
107116
}
108117
if err := models.CreateUser(user); err != nil {
109118
// FIXME: should I create a system notice?
110119
log.Error("CreateUser: %v", err)
111120
return nil
112121
}
122+
113123
return user
114124
}

modules/auth/sso/sso.go

+16-1
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,12 @@ import (
99
"fmt"
1010
"net/http"
1111
"reflect"
12+
"regexp"
1213
"strings"
1314

1415
"code.gitea.io/gitea/models"
1516
"code.gitea.io/gitea/modules/log"
17+
"code.gitea.io/gitea/modules/setting"
1618
"code.gitea.io/gitea/modules/web/middleware"
1719
)
1820

@@ -27,8 +29,8 @@ import (
2729
// for users that have already signed in.
2830
var ssoMethods = []SingleSignOn{
2931
&OAuth2{},
30-
&Session{},
3132
&ReverseProxy{},
33+
&Session{},
3234
&Basic{},
3335
}
3436

@@ -98,6 +100,19 @@ func isAttachmentDownload(req *http.Request) bool {
98100
return strings.HasPrefix(req.URL.Path, "/attachments/") && req.Method == "GET"
99101
}
100102

103+
var gitPathRe = regexp.MustCompile(`^/[a-zA-Z0-9_.-]+/[a-zA-Z0-9_.-]+/(?:git-(?:(?:upload)|(?:receive))-pack$)|(?:info/refs$)|(?:HEAD$)|(?:objects/)`)
104+
var lfsPathRe = regexp.MustCompile(`^/[a-zA-Z0-9_.-]+/[a-zA-Z0-9_.-]+/info/lfs/`)
105+
106+
func isGitOrLFSPath(req *http.Request) bool {
107+
if gitPathRe.MatchString(req.URL.Path) {
108+
return true
109+
}
110+
if setting.LFS.StartServer {
111+
return lfsPathRe.MatchString(req.URL.Path)
112+
}
113+
return false
114+
}
115+
101116
// handleSignIn clears existing session variables and stores new ones for the specified user object
102117
func handleSignIn(resp http.ResponseWriter, req *http.Request, sess SessionStore, user *models.User) {
103118
_ = sess.Delete("openid_verified_uri")

modules/context/context.go

+3
Original file line numberDiff line numberDiff line change
@@ -683,6 +683,9 @@ func Contexter() func(next http.Handler) http.Handler {
683683
} else {
684684
ctx.Data["SignedUserID"] = int64(0)
685685
ctx.Data["SignedUserName"] = ""
686+
687+
// ensure the session uid is deleted
688+
_ = ctx.Session.Delete("uid")
686689
}
687690

688691
ctx.Resp.Header().Set(`X-Frame-Options`, `SAMEORIGIN`)

templates/user/settings/profile.tmpl

+2-2
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@
1515
<span class="text red hide" id="name-change-prompt"> {{.i18n.Tr "settings.change_username_prompt"}}</span>
1616
<span class="text red hide" id="name-change-redirect-prompt"> {{.i18n.Tr "settings.change_username_redirect_prompt"}}</span>
1717
</label>
18-
<input id="username" name="name" value="{{.SignedUser.Name}}" data-name="{{.SignedUser.Name}}" autofocus required {{if not .SignedUser.IsLocal}}disabled{{end}}>
19-
{{if not .SignedUser.IsLocal}}
18+
<input id="username" name="name" value="{{.SignedUser.Name}}" data-name="{{.SignedUser.Name}}" autofocus required {{if or (not .SignedUser.IsLocal) .IsReverseProxy}}disabled{{end}}>
19+
{{if or (not .SignedUser.IsLocal) .IsReverseProxy}}
2020
<p class="help text blue">{{$.i18n.Tr "settings.password_username_disabled"}}</p>
2121
{{end}}
2222
</div>

0 commit comments

Comments
 (0)