2012-12-11 04:59:23 +03:00
package main
import (
2012-12-17 21:38:33 +03:00
"fmt"
2019-03-20 15:44:51 +02:00
"math/rand"
2014-08-07 23:16:39 +03:00
"os"
2020-04-04 17:12:38 +02:00
"os/signal"
2015-03-20 05:03:00 +02:00
"runtime"
2020-04-04 17:12:38 +02:00
"syscall"
2014-11-08 20:26:55 +02:00
"time"
2012-12-11 04:59:23 +03:00
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"
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 )
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)" )
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 {
2020-03-29 15:54:36 +02:00
fmt . Printf ( "oauth2-proxy %s (built with %s)\n" , VERSION , runtime . Version ( ) )
2014-11-10 04:07:02 +02:00
return
}
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 {
2020-11-09 22:17:43 +02:00
logger . Printf ( "ERROR: %v" , err )
2020-05-26 21:06:27 +02:00
os . Exit ( 1 )
}
2020-04-13 14:50:34 +02:00
err = validation . Validate ( opts )
2012-12-11 04:59:23 +03:00
if err != nil {
2019-02-10 18:37:45 +02:00
logger . Printf ( "%s" , err )
2014-11-09 21:51:10 +02:00
os . Exit ( 1 )
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 {
2020-08-10 12:44:08 +02:00
logger . Errorf ( "ERROR: Failed to initialise OAuth2 Proxy: %v" , err )
2020-05-25 15:00:49 +02:00
os . Exit ( 1 )
}
2014-11-09 21:51:10 +02:00
2019-03-20 15:44:51 +02:00
rand . Seed ( time . Now ( ) . UnixNano ( ) )
2015-06-08 03:51:47 +02:00
s := & Server {
2020-07-29 21:10:14 +02:00
Handler : oauthproxy ,
2015-06-08 03:51:47 +02:00
Opts : opts ,
2020-04-04 17:12:38 +02:00
stop : make ( chan struct { } , 1 ) ,
2015-02-11 03:07:40 +02:00
}
2020-04-04 17:12:38 +02:00
// Observe signals in background goroutine.
go func ( ) {
sigint := make ( chan os . Signal , 1 )
signal . Notify ( sigint , os . Interrupt , syscall . SIGTERM )
<- sigint
s . stop <- struct { } { } // notify having caught signal
} ( )
2015-06-08 03:51:47 +02:00
s . ListenAndServe ( )
2012-12-11 04:59:23 +03: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
}