2012-12-11 04:59:23 +03:00
package main
import (
2012-12-17 21:38:33 +03:00
"fmt"
2014-08-07 23:16:39 +03:00
"os"
2015-03-20 05:03:00 +02:00
"runtime"
2012-12-11 04:59:23 +03:00
2020-11-09 22:34:55 +02:00
"github.com/ghodss/yaml"
2020-09-29 18:44:42 +02:00
"github.com/oauth2-proxy/oauth2-proxy/v7/pkg/apis/options"
"github.com/oauth2-proxy/oauth2-proxy/v7/pkg/logger"
"github.com/oauth2-proxy/oauth2-proxy/v7/pkg/validation"
2024-07-14 22:09:17 +02:00
"github.com/oauth2-proxy/oauth2-proxy/v7/pkg/version"
2020-11-09 22:17:43 +02:00
"github.com/spf13/pflag"
2012-12-11 04:59:23 +03:00
)
func main ( ) {
2019-02-10 18:37:45 +02:00
logger . SetFlags ( logger . Lshortfile )
2014-11-09 21:51:10 +02:00
2020-11-09 22:17:43 +02:00
configFlagSet := pflag . NewFlagSet ( "oauth2-proxy" , pflag . ContinueOnError )
2021-02-06 17:21:12 +02:00
// Because we parse early to determine alpha vs legacy config, we have to
// ignore any unknown flags for now
configFlagSet . ParseErrorsWhitelist . UnknownFlags = true
2020-11-09 22:17:43 +02:00
config := configFlagSet . String ( "config" , "" , "path to config file" )
alphaConfig := configFlagSet . String ( "alpha-config" , "" , "path to alpha config file (use at your own risk - the structure in this config file may change between minor releases)" )
2020-11-09 22:34:55 +02:00
convertConfig := configFlagSet . Bool ( "convert-config-to-alpha" , false , "if true, the proxy will load configuration as normal and convert existing configuration to the alpha config structure, and print it to stdout" )
2020-11-09 22:17:43 +02:00
showVersion := configFlagSet . Bool ( "version" , false , "print version string" )
configFlagSet . Parse ( os . Args [ 1 : ] )
2014-11-09 21:51:10 +02:00
2014-11-10 04:07:02 +02:00
if * showVersion {
2024-07-14 22:09:17 +02:00
fmt . Printf ( "oauth2-proxy %s (built with %s)\n" , version . VERSION , runtime . Version ( ) )
2014-11-10 04:07:02 +02:00
return
}
2020-11-09 22:34:55 +02:00
if * convertConfig && * alphaConfig != "" {
2022-02-24 09:59:45 +02:00
logger . Fatal ( "cannot use alpha-config and convert-config-to-alpha together" )
2020-11-09 22:34:55 +02:00
}
2020-11-09 22:17:43 +02:00
opts , err := loadConfiguration ( * config , * alphaConfig , configFlagSet , os . Args [ 1 : ] )
2020-05-26 21:06:27 +02:00
if err != nil {
2021-01-07 13:52:50 +02:00
logger . Fatalf ( "ERROR: %v" , err )
2020-05-26 21:06:27 +02:00
}
2020-11-09 22:34:55 +02:00
if * convertConfig {
if err := printConvertedConfig ( opts ) ; err != nil {
logger . Fatalf ( "ERROR: could not convert config: %v" , err )
}
return
}
2021-01-07 13:52:50 +02:00
if err = validation . Validate ( opts ) ; err != nil {
logger . Fatalf ( "%s" , err )
2012-12-11 04:59:23 +03:00
}
2019-02-10 18:37:45 +02:00
2015-06-06 20:37:54 +02:00
validator := NewValidator ( opts . EmailDomains , opts . AuthenticatedEmailsFile )
2020-05-25 15:00:49 +02:00
oauthproxy , err := NewOAuthProxy ( opts , validator )
if err != nil {
2021-01-07 13:52:50 +02:00
logger . Fatalf ( "ERROR: Failed to initialise OAuth2 Proxy: %v" , err )
2020-05-25 15:00:49 +02:00
}
2014-11-09 21:51:10 +02:00
2021-02-14 19:08:04 +02:00
if err := oauthproxy . Start ( ) ; err != nil {
logger . Fatalf ( "ERROR: Failed to start OAuth2 Proxy: %v" , err )
2015-02-11 03:07:40 +02:00
}
2021-01-07 13:52:50 +02:00
}
2020-11-09 22:17:43 +02:00
// loadConfiguration will load in the user's configuration.
// It will either load the alpha configuration (if alphaConfig is given)
// or the legacy configuration.
func loadConfiguration ( config , alphaConfig string , extraFlags * pflag . FlagSet , args [ ] string ) ( * options . Options , error ) {
if alphaConfig != "" {
logger . Printf ( "WARNING: You are using alpha configuration. The structure in this configuration file may change without notice. You MUST remove conflicting options from your existing configuration." )
return loadAlphaOptions ( config , alphaConfig , extraFlags , args )
}
return loadLegacyOptions ( config , extraFlags , args )
}
// loadLegacyOptions loads the old toml options using the legacy flagset
// and legacy options struct.
func loadLegacyOptions ( config string , extraFlags * pflag . FlagSet , args [ ] string ) ( * options . Options , error ) {
optionsFlagSet := options . NewLegacyFlagSet ( )
optionsFlagSet . AddFlagSet ( extraFlags )
if err := optionsFlagSet . Parse ( args ) ; err != nil {
return nil , fmt . Errorf ( "failed to parse flags: %v" , err )
}
legacyOpts := options . NewLegacyOptions ( )
if err := options . Load ( config , optionsFlagSet , legacyOpts ) ; err != nil {
return nil , fmt . Errorf ( "failed to load config: %v" , err )
}
opts , err := legacyOpts . ToOptions ( )
if err != nil {
return nil , fmt . Errorf ( "failed to convert config: %v" , err )
}
return opts , nil
}
// loadAlphaOptions loads the old style config excluding options converted to
// the new alpha format, then merges the alpha options, loaded from YAML,
// into the core configuration.
func loadAlphaOptions ( config , alphaConfig string , extraFlags * pflag . FlagSet , args [ ] string ) ( * options . Options , error ) {
opts , err := loadOptions ( config , extraFlags , args )
if err != nil {
return nil , fmt . Errorf ( "failed to load core options: %v" , err )
}
alphaOpts := & options . AlphaOptions { }
if err := options . LoadYAML ( alphaConfig , alphaOpts ) ; err != nil {
return nil , fmt . Errorf ( "failed to load alpha options: %v" , err )
}
alphaOpts . MergeInto ( opts )
return opts , nil
}
// loadOptions loads the configuration using the old style format into the
// core options.Options struct.
// This means that none of the options that have been converted to alpha config
// will be loaded using this method.
func loadOptions ( config string , extraFlags * pflag . FlagSet , args [ ] string ) ( * options . Options , error ) {
optionsFlagSet := options . NewFlagSet ( )
optionsFlagSet . AddFlagSet ( extraFlags )
if err := optionsFlagSet . Parse ( args ) ; err != nil {
return nil , fmt . Errorf ( "failed to parse flags: %v" , err )
}
opts := options . NewOptions ( )
if err := options . Load ( config , optionsFlagSet , opts ) ; err != nil {
return nil , fmt . Errorf ( "failed to load config: %v" , err )
}
return opts , nil
}
2020-11-09 22:34:55 +02:00
// printConvertedConfig extracts alpha options from the loaded configuration
// and renders these to stdout in YAML format.
func printConvertedConfig ( opts * options . Options ) error {
alphaConfig := & options . AlphaOptions { }
alphaConfig . ExtractFrom ( opts )
data , err := yaml . Marshal ( alphaConfig )
if err != nil {
return fmt . Errorf ( "unable to marshal config: %v" , err )
}
if _ , err := os . Stdout . Write ( data ) ; err != nil {
return fmt . Errorf ( "unable to write output: %v" , err )
}
return nil
}