package main

import (
	"log"
	"net/http"
)

var adminToken string

func authorizeAdmin(r *http.Request) bool {
	return authorizeToken(r, adminToken)
}

func authorizeToken(r *http.Request, token string) bool {
	if token == "" {
		return false
	}

	reqToken := r.Header.Get("Authorization")
	if reqToken != "" {
		return reqToken == "Bearer "+token
	}

	return r.URL.Query().Get("token") == token
}

func forbidden(w http.ResponseWriter, r *http.Request) {
	log.Printf("denied access to %s from %s", r.URL.Path, r.RemoteAddr)
	http.Error(w, "Forbidden", http.StatusForbidden)
}

func requireToken(token *string, handler http.Handler) http.Handler {
	return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) {
		if !authorizeToken(req, *token) {
			forbidden(w, req)
			return
		}
		handler.ServeHTTP(w, req)
	})
}

func requireAdmin(handler http.Handler) http.Handler {
	return requireToken(&adminToken, handler)
}
