Skip to content

Commit c74c5ff

Browse files
authored
Merge pull request #17 from navetacandra/auth_feature
feat: implement basic authentication at info refs
2 parents c60c671 + 31ee7a7 commit c74c5ff

File tree

3 files changed

+26
-2
lines changed

3 files changed

+26
-2
lines changed

README.md

+3-1
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@ Flags
3333

3434
```
3535
Usage of ./git-http-backend:
36+
-require_auth bool
37+
set require auth enable/disable
3638
-auth_pass_env_var string
3739
set an env var to provide the basic auth pass as
3840
-auth_user_env_var string
@@ -97,4 +99,4 @@ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
9799
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
98100
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
99101
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
100-
```
102+
```````

main.go

+1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99
)
1010

1111
func init() {
12+
flag.BoolVar(&server.DefaultConfig.RequireAuth, "require_auth", server.DefaultConfig.RequireAuth, "enable basic auth")
1213
flag.StringVar(&server.DefaultConfig.AuthPassEnvVar, "auth_pass_env_var", server.DefaultConfig.AuthPassEnvVar, "set an env var to provide the basic auth pass as")
1314
flag.StringVar(&server.DefaultConfig.AuthUserEnvVar, "auth_user_env_var", server.DefaultConfig.AuthUserEnvVar, "set an env var to provide the basic auth user as")
1415
flag.StringVar(&server.DefaultConfig.DefaultEnv, "default_env", server.DefaultConfig.DefaultEnv, "set the default env")

server/server.go

+22-1
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ type Service struct {
2323
}
2424

2525
type Config struct {
26+
RequireAuth bool
2627
AuthPassEnvVar string
2728
AuthUserEnvVar string
2829
DefaultEnv string
@@ -46,6 +47,7 @@ var (
4647
DefaultAddress = ":8080"
4748

4849
DefaultConfig = Config{
50+
RequireAuth: false,
4951
AuthPassEnvVar: "",
5052
AuthUserEnvVar: "",
5153
DefaultEnv: "",
@@ -211,7 +213,19 @@ func getInfoRefs(hr HandlerReq) {
211213
service_name := getServiceType(r)
212214
access := hasAccess(r, dir, service_name, false)
213215
version := r.Header.Get("Git-Protocol")
214-
if access {
216+
217+
user, password, authok := r.BasicAuth()
218+
if DefaultConfig.RequireAuth && !authok {
219+
renderAuthRequire(w)
220+
return
221+
}
222+
223+
if authok && user != DefaultConfig.AuthUserEnvVar && password != DefaultConfig.AuthPassEnvVar {
224+
w.WriteHeader(http.StatusUnauthorized)
225+
return
226+
}
227+
228+
if access {
215229
args := []string{service_name, "--stateless-rpc", "--advertise-refs", "."}
216230
refs := gitCommand(dir, version, args...)
217231

@@ -387,6 +401,13 @@ func renderNoAccess(w http.ResponseWriter) {
387401
w.Write([]byte("Forbidden"))
388402
}
389403

404+
func renderAuthRequire(w http.ResponseWriter) {
405+
w.Header().Add("Content-Type", "text/plain")
406+
w.Header().Add("WWW-Authenticate", "Basic realm=\"authorization needed\"")
407+
w.WriteHeader(http.StatusUnauthorized)
408+
w.Write([]byte("401 Unauthorized"))
409+
}
410+
390411
// Packet-line handling function
391412

392413
func packetFlush() []byte {

0 commit comments

Comments
 (0)