mirror of
https://github.com/oauth2-proxy/oauth2-proxy.git
synced 2025-02-19 19:44:16 +02:00
This allows our users to easily copy the base templates should they wish to make changes to them
78 lines
2.2 KiB
Go
78 lines
2.2 KiB
Go
package pagewriter
|
|
|
|
import (
|
|
// Import embed to allow importing default page templates
|
|
_ "embed"
|
|
|
|
"fmt"
|
|
"html/template"
|
|
"os"
|
|
"path/filepath"
|
|
"strings"
|
|
|
|
"github.com/oauth2-proxy/oauth2-proxy/v7/pkg/logger"
|
|
)
|
|
|
|
const (
|
|
errorTemplateName = "error.html"
|
|
signInTemplateName = "sign_in.html"
|
|
)
|
|
|
|
//go:embed error.html
|
|
var defaultErrorTemplate string
|
|
|
|
//go:embed sign_in.html
|
|
var defaultSignInTemplate string
|
|
|
|
// loadTemplates adds the Sign In and Error templates from the custom template
|
|
// directory, or uses the defaults if they do not exist or the custom directory
|
|
// is not provided.
|
|
func loadTemplates(customDir string) (*template.Template, error) {
|
|
t := template.New("").Funcs(template.FuncMap{
|
|
"ToUpper": strings.ToUpper,
|
|
"ToLower": strings.ToLower,
|
|
})
|
|
var err error
|
|
t, err = addTemplate(t, customDir, signInTemplateName, defaultSignInTemplate)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("could not add Sign In template: %v", err)
|
|
}
|
|
t, err = addTemplate(t, customDir, errorTemplateName, defaultErrorTemplate)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("could not add Error template: %v", err)
|
|
}
|
|
|
|
return t, nil
|
|
}
|
|
|
|
// addTemplate will add the template from the custom directory if provided,
|
|
// else it will add the default template.
|
|
func addTemplate(t *template.Template, customDir, fileName, defaultTemplate string) (*template.Template, error) {
|
|
filePath := filepath.Join(customDir, fileName)
|
|
if customDir != "" && isFile(filePath) {
|
|
t, err := t.ParseFiles(filePath)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("failed to parse template %s: %v", filePath, err)
|
|
}
|
|
return t, nil
|
|
}
|
|
t, err := t.Parse(defaultTemplate)
|
|
if err != nil {
|
|
// This should not happen.
|
|
// Default templates should be tested and so should never fail to parse.
|
|
logger.Panic("Could not parse defaultTemplate: ", err)
|
|
}
|
|
return t, nil
|
|
}
|
|
|
|
// isFile checks if the file exists and checks whether it is a regular file.
|
|
// If either of these fail then it cannot be used as a template file.
|
|
func isFile(fileName string) bool {
|
|
info, err := os.Stat(fileName)
|
|
if err != nil {
|
|
logger.Errorf("Could not load file %s: %v, will use default template", fileName, err)
|
|
return false
|
|
}
|
|
return info.Mode().IsRegular()
|
|
}
|