Merge branch 'master' into go-mod
This commit is contained in:
		
						commit
						56f51417ae
					
				
							
								
								
									
										20
									
								
								CHANGELOG.md
								
								
								
								
							
							
						
						
									
										20
									
								
								CHANGELOG.md
								
								
								
								
							|  | @ -2,6 +2,23 @@ | ||||||
| 
 | 
 | ||||||
| ## Breaking Changes | ## Breaking Changes | ||||||
| 
 | 
 | ||||||
|  | - [#186](https://github.com/pusher/oauth2_proxy/pull/186) Make config consistent | ||||||
|  |   - This PR changes configuration options so that all flags have a config counterpart | ||||||
|  |   of the same name but with underscores (`_`) in place of hyphens (`-`). | ||||||
|  |   This change affects the following flags: | ||||||
|  |   - The `--tls-key` flag is now `--tls-key-file` to be consistent with existing | ||||||
|  |   file flags and the existing config and environment settings | ||||||
|  |   - The `--tls-cert` flag is now `--tls-cert-file` to be consistent with existing | ||||||
|  |   file flags and the existing config and environment settings | ||||||
|  |   This change affects the following existing configuration options: | ||||||
|  |   - The `proxy-prefix` option is now `proxy_prefix`. | ||||||
|  |   This PR changes environment variables so that all flags have an environment | ||||||
|  |   counterpart of the same name but capitalised, with underscores (`_`) in place | ||||||
|  |   of hyphens (`-`) and with the prefix `OAUTH2_PROXY_`. | ||||||
|  |   This change affects the following existing environment variables: | ||||||
|  |   - The `OAUTH2_SKIP_OIDC_DISCOVERY` environment variable is now `OAUTH2_PROXY_SKIP_OIDC_DISCOVERY`. | ||||||
|  |   - The `OAUTH2_OIDC_JWKS_URL` environment variable is now `OAUTH2_PROXY_OIDC_JWKS_URL`. | ||||||
|  | 
 | ||||||
| - [#146](https://github.com/pusher/oauth2_proxy/pull/146) Use full email address as `User` if the auth response did not contain a `User` field (@gargath) | - [#146](https://github.com/pusher/oauth2_proxy/pull/146) Use full email address as `User` if the auth response did not contain a `User` field (@gargath) | ||||||
|   - This change modifies the contents of the `X-Forwarded-User` header supplied by the proxy for users where the auth response from the IdP did not contain |   - This change modifies the contents of the `X-Forwarded-User` header supplied by the proxy for users where the auth response from the IdP did not contain | ||||||
|     a username. |     a username. | ||||||
|  | @ -14,6 +31,8 @@ | ||||||
| 
 | 
 | ||||||
| ## Changes since v3.2.0 | ## Changes since v3.2.0 | ||||||
| 
 | 
 | ||||||
|  | - [#186](https://github.com/pusher/oauth2_proxy/pull/186) Make config consistent (@JoelSpeed) | ||||||
|  | - [#187](https://github.com/pusher/oauth2_proxy/pull/187) Move root packages to pkg folder (@JoelSpeed) | ||||||
| - [#65](https://github.com/pusher/oauth2_proxy/pull/65) Improvements to authenticate requests with a JWT bearer token in the `Authorization` header via | - [#65](https://github.com/pusher/oauth2_proxy/pull/65) Improvements to authenticate requests with a JWT bearer token in the `Authorization` header via | ||||||
|   the `-skip-jwt-bearer-token` options. |   the `-skip-jwt-bearer-token` options. | ||||||
|   - Additional verifiers can be configured via the `-extra-jwt-issuers` flag if the JWT issuers is either an OpenID provider or has a JWKS URL |   - Additional verifiers can be configured via the `-extra-jwt-issuers` flag if the JWT issuers is either an OpenID provider or has a JWKS URL | ||||||
|  | @ -65,6 +84,7 @@ | ||||||
| - [#195](https://github.com/pusher/outh2_proxy/pull/195) Add `-banner` flag for overriding the banner line that is displayed (@steakunderscore) | - [#195](https://github.com/pusher/outh2_proxy/pull/195) Add `-banner` flag for overriding the banner line that is displayed (@steakunderscore) | ||||||
| - [#198](https://github.com/pusher/outh2_proxy/pull/198) Switch from gometalinter to golangci-lint (@steakunderscore) | - [#198](https://github.com/pusher/outh2_proxy/pull/198) Switch from gometalinter to golangci-lint (@steakunderscore) | ||||||
| - [#159](https://github.com/pusher/oauth2_proxy/pull/159) Add option to skip the OIDC provider verified email check: `--insecure-oidc-allow-unverified-email` | - [#159](https://github.com/pusher/oauth2_proxy/pull/159) Add option to skip the OIDC provider verified email check: `--insecure-oidc-allow-unverified-email` | ||||||
|  | - [#210](https://github.com/pusher/oauth2_proxy/pull/210) Update base image from Alpine 3.9 to 3.10 (@steakunderscore) | ||||||
| - [#211](https://github.com/pusher/oauth2_proxy/pull/211) Switch from dep to go modules (@steakunderscore) | - [#211](https://github.com/pusher/oauth2_proxy/pull/211) Switch from dep to go modules (@steakunderscore) | ||||||
| 
 | 
 | ||||||
| # v3.2.0 | # v3.2.0 | ||||||
|  |  | ||||||
|  | @ -19,7 +19,7 @@ RUN go mod download | ||||||
| RUN ./configure && make build && touch jwt_signing_key.pem | RUN ./configure && make build && touch jwt_signing_key.pem | ||||||
| 
 | 
 | ||||||
| # Copy binary to alpine | # Copy binary to alpine | ||||||
| FROM alpine:3.9 | FROM alpine:3.10 | ||||||
| COPY --from=builder /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ca-certificates.crt | COPY --from=builder /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ca-certificates.crt | ||||||
| COPY --from=builder /go/src/github.com/pusher/oauth2_proxy/oauth2_proxy /bin/oauth2_proxy | COPY --from=builder /go/src/github.com/pusher/oauth2_proxy/oauth2_proxy /bin/oauth2_proxy | ||||||
| COPY --from=builder /go/src/github.com/pusher/oauth2_proxy/jwt_signing_key.pem /etc/ssl/private/jwt_signing_key.pem | COPY --from=builder /go/src/github.com/pusher/oauth2_proxy/jwt_signing_key.pem /etc/ssl/private/jwt_signing_key.pem | ||||||
|  |  | ||||||
|  | @ -19,7 +19,7 @@ RUN go mod download | ||||||
| RUN ./configure && GOARCH=arm64 make build && touch jwt_signing_key.pem | RUN ./configure && GOARCH=arm64 make build && touch jwt_signing_key.pem | ||||||
| 
 | 
 | ||||||
| # Copy binary to alpine | # Copy binary to alpine | ||||||
| FROM arm64v8/alpine:3.9 | FROM arm64v8/alpine:3.10 | ||||||
| COPY --from=builder /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ca-certificates.crt | COPY --from=builder /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ca-certificates.crt | ||||||
| COPY --from=builder /go/src/github.com/pusher/oauth2_proxy/oauth2_proxy /bin/oauth2_proxy | COPY --from=builder /go/src/github.com/pusher/oauth2_proxy/oauth2_proxy /bin/oauth2_proxy | ||||||
| COPY --from=builder /go/src/github.com/pusher/oauth2_proxy/jwt_signing_key.pem /etc/ssl/private/jwt_signing_key.pem | COPY --from=builder /go/src/github.com/pusher/oauth2_proxy/jwt_signing_key.pem /etc/ssl/private/jwt_signing_key.pem | ||||||
|  |  | ||||||
|  | @ -19,7 +19,7 @@ RUN go mod download | ||||||
| RUN ./configure && GOARCH=arm GOARM=6 make build && touch jwt_signing_key.pem | RUN ./configure && GOARCH=arm GOARM=6 make build && touch jwt_signing_key.pem | ||||||
| 
 | 
 | ||||||
| # Copy binary to alpine | # Copy binary to alpine | ||||||
| FROM arm32v6/alpine:3.9 | FROM arm32v6/alpine:3.10 | ||||||
| COPY --from=builder /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ca-certificates.crt | COPY --from=builder /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ca-certificates.crt | ||||||
| COPY --from=builder /go/src/github.com/pusher/oauth2_proxy/oauth2_proxy /bin/oauth2_proxy | COPY --from=builder /go/src/github.com/pusher/oauth2_proxy/oauth2_proxy /bin/oauth2_proxy | ||||||
| COPY --from=builder /go/src/github.com/pusher/oauth2_proxy/jwt_signing_key.pem /etc/ssl/private/jwt_signing_key.pem | COPY --from=builder /go/src/github.com/pusher/oauth2_proxy/jwt_signing_key.pem /etc/ssl/private/jwt_signing_key.pem | ||||||
|  |  | ||||||
|  | @ -120,17 +120,14 @@ Multiple upstreams can either be configured by supplying a comma separated list | ||||||
| 
 | 
 | ||||||
| ### Environment variables | ### Environment variables | ||||||
| 
 | 
 | ||||||
| The following environment variables can be used in place of the corresponding command-line arguments: | Every command line argument can be specified as an environment variable by | ||||||
|  | prefixing it with `OAUTH2_PROXY_`, capitalising it, and replacing hypens (`-`) | ||||||
|  | with underscores (`_`). This is particularly useful for storing secrets outside | ||||||
|  | of a configuration file or the command line. | ||||||
|  | 
 | ||||||
|  | For example, the `--cookie-secret` flag becomes `OAUTH2_PROXY_COOKIE_SECRET` and | ||||||
|  | the `--set-authorization-header` flag becomes `OAUTH2_PROXY_SET_AUTHORIZATION_HEADER`. | ||||||
| 
 | 
 | ||||||
| - `OAUTH2_PROXY_CLIENT_ID` |  | ||||||
| - `OAUTH2_PROXY_CLIENT_SECRET` |  | ||||||
| - `OAUTH2_PROXY_COOKIE_NAME` |  | ||||||
| - `OAUTH2_PROXY_COOKIE_SECRET` |  | ||||||
| - `OAUTH2_PROXY_COOKIE_DOMAIN` |  | ||||||
| - `OAUTH2_PROXY_COOKIE_PATH` |  | ||||||
| - `OAUTH2_PROXY_COOKIE_EXPIRE` |  | ||||||
| - `OAUTH2_PROXY_COOKIE_REFRESH` |  | ||||||
| - `OAUTH2_PROXY_SIGNATURE_KEY` |  | ||||||
| 
 | 
 | ||||||
| ## Logging Configuration | ## Logging Configuration | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -7,7 +7,7 @@ import ( | ||||||
| 	"io" | 	"io" | ||||||
| 	"os" | 	"os" | ||||||
| 
 | 
 | ||||||
| 	"github.com/pusher/oauth2_proxy/logger" | 	"github.com/pusher/oauth2_proxy/pkg/logger" | ||||||
| 	"golang.org/x/crypto/bcrypt" | 	"golang.org/x/crypto/bcrypt" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
							
								
								
									
										2
									
								
								http.go
								
								
								
								
							
							
						
						
									
										2
									
								
								http.go
								
								
								
								
							|  | @ -7,7 +7,7 @@ import ( | ||||||
| 	"strings" | 	"strings" | ||||||
| 	"time" | 	"time" | ||||||
| 
 | 
 | ||||||
| 	"github.com/pusher/oauth2_proxy/logger" | 	"github.com/pusher/oauth2_proxy/pkg/logger" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| // Server represents an HTTP server
 | // Server represents an HTTP server
 | ||||||
|  |  | ||||||
|  | @ -10,7 +10,7 @@ import ( | ||||||
| 	"net/http" | 	"net/http" | ||||||
| 	"time" | 	"time" | ||||||
| 
 | 
 | ||||||
| 	"github.com/pusher/oauth2_proxy/logger" | 	"github.com/pusher/oauth2_proxy/pkg/logger" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| // responseLogger is wrapper of http.ResponseWriter that keeps track of its HTTP status
 | // responseLogger is wrapper of http.ResponseWriter that keeps track of its HTTP status
 | ||||||
|  |  | ||||||
|  | @ -9,7 +9,7 @@ import ( | ||||||
| 	"testing" | 	"testing" | ||||||
| 	"time" | 	"time" | ||||||
| 
 | 
 | ||||||
| 	"github.com/pusher/oauth2_proxy/logger" | 	"github.com/pusher/oauth2_proxy/pkg/logger" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| func TestLoggingHandler_ServeHTTP(t *testing.T) { | func TestLoggingHandler_ServeHTTP(t *testing.T) { | ||||||
|  |  | ||||||
							
								
								
									
										2
									
								
								main.go
								
								
								
								
							
							
						
						
									
										2
									
								
								main.go
								
								
								
								
							|  | @ -12,7 +12,7 @@ import ( | ||||||
| 
 | 
 | ||||||
| 	"github.com/BurntSushi/toml" | 	"github.com/BurntSushi/toml" | ||||||
| 	options "github.com/mreiferson/go-options" | 	options "github.com/mreiferson/go-options" | ||||||
| 	"github.com/pusher/oauth2_proxy/logger" | 	"github.com/pusher/oauth2_proxy/pkg/logger" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| func main() { | func main() { | ||||||
|  |  | ||||||
|  | @ -16,9 +16,9 @@ import ( | ||||||
| 
 | 
 | ||||||
| 	"github.com/coreos/go-oidc" | 	"github.com/coreos/go-oidc" | ||||||
| 	"github.com/mbland/hmacauth" | 	"github.com/mbland/hmacauth" | ||||||
| 	"github.com/pusher/oauth2_proxy/cookie" |  | ||||||
| 	"github.com/pusher/oauth2_proxy/logger" |  | ||||||
| 	sessionsapi "github.com/pusher/oauth2_proxy/pkg/apis/sessions" | 	sessionsapi "github.com/pusher/oauth2_proxy/pkg/apis/sessions" | ||||||
|  | 	"github.com/pusher/oauth2_proxy/pkg/encryption" | ||||||
|  | 	"github.com/pusher/oauth2_proxy/pkg/logger" | ||||||
| 	"github.com/pusher/oauth2_proxy/providers" | 	"github.com/pusher/oauth2_proxy/providers" | ||||||
| 	"github.com/yhat/wsutil" | 	"github.com/yhat/wsutil" | ||||||
| ) | ) | ||||||
|  | @ -584,7 +584,7 @@ func (p *OAuthProxy) SignOut(rw http.ResponseWriter, req *http.Request) { | ||||||
| 
 | 
 | ||||||
| // OAuthStart starts the OAuth2 authentication flow
 | // OAuthStart starts the OAuth2 authentication flow
 | ||||||
| func (p *OAuthProxy) OAuthStart(rw http.ResponseWriter, req *http.Request) { | func (p *OAuthProxy) OAuthStart(rw http.ResponseWriter, req *http.Request) { | ||||||
| 	nonce, err := cookie.Nonce() | 	nonce, err := encryption.Nonce() | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		logger.Printf("Error obtaining nonce: %s", err.Error()) | 		logger.Printf("Error obtaining nonce: %s", err.Error()) | ||||||
| 		p.ErrorPage(rw, 500, "Internal Error", err.Error()) | 		p.ErrorPage(rw, 500, "Internal Error", err.Error()) | ||||||
|  |  | ||||||
|  | @ -18,8 +18,8 @@ import ( | ||||||
| 
 | 
 | ||||||
| 	"github.com/coreos/go-oidc" | 	"github.com/coreos/go-oidc" | ||||||
| 	"github.com/mbland/hmacauth" | 	"github.com/mbland/hmacauth" | ||||||
| 	"github.com/pusher/oauth2_proxy/logger" |  | ||||||
| 	"github.com/pusher/oauth2_proxy/pkg/apis/sessions" | 	"github.com/pusher/oauth2_proxy/pkg/apis/sessions" | ||||||
|  | 	"github.com/pusher/oauth2_proxy/pkg/logger" | ||||||
| 	"github.com/pusher/oauth2_proxy/pkg/sessions/cookie" | 	"github.com/pusher/oauth2_proxy/pkg/sessions/cookie" | ||||||
| 	"github.com/pusher/oauth2_proxy/providers" | 	"github.com/pusher/oauth2_proxy/providers" | ||||||
| 	"github.com/stretchr/testify/assert" | 	"github.com/stretchr/testify/assert" | ||||||
|  |  | ||||||
							
								
								
									
										42
									
								
								options.go
								
								
								
								
							
							
						
						
									
										42
									
								
								options.go
								
								
								
								
							|  | @ -17,10 +17,10 @@ import ( | ||||||
| 	oidc "github.com/coreos/go-oidc" | 	oidc "github.com/coreos/go-oidc" | ||||||
| 	"github.com/dgrijalva/jwt-go" | 	"github.com/dgrijalva/jwt-go" | ||||||
| 	"github.com/mbland/hmacauth" | 	"github.com/mbland/hmacauth" | ||||||
| 	"github.com/pusher/oauth2_proxy/cookie" |  | ||||||
| 	"github.com/pusher/oauth2_proxy/logger" |  | ||||||
| 	"github.com/pusher/oauth2_proxy/pkg/apis/options" | 	"github.com/pusher/oauth2_proxy/pkg/apis/options" | ||||||
| 	sessionsapi "github.com/pusher/oauth2_proxy/pkg/apis/sessions" | 	sessionsapi "github.com/pusher/oauth2_proxy/pkg/apis/sessions" | ||||||
|  | 	"github.com/pusher/oauth2_proxy/pkg/encryption" | ||||||
|  | 	"github.com/pusher/oauth2_proxy/pkg/logger" | ||||||
| 	"github.com/pusher/oauth2_proxy/pkg/sessions" | 	"github.com/pusher/oauth2_proxy/pkg/sessions" | ||||||
| 	"github.com/pusher/oauth2_proxy/providers" | 	"github.com/pusher/oauth2_proxy/providers" | ||||||
| 	"gopkg.in/natefinch/lumberjack.v2" | 	"gopkg.in/natefinch/lumberjack.v2" | ||||||
|  | @ -29,15 +29,15 @@ import ( | ||||||
| // Options holds Configuration Options that can be set by Command Line Flag,
 | // Options holds Configuration Options that can be set by Command Line Flag,
 | ||||||
| // or Config File
 | // or Config File
 | ||||||
| type Options struct { | type Options struct { | ||||||
| 	ProxyPrefix     string `flag:"proxy-prefix" cfg:"proxy-prefix" env:"OAUTH2_PROXY_PROXY_PREFIX"` | 	ProxyPrefix     string `flag:"proxy-prefix" cfg:"proxy_prefix" env:"OAUTH2_PROXY_PROXY_PREFIX"` | ||||||
| 	ProxyWebSockets bool   `flag:"proxy-websockets" cfg:"proxy_websockets" env:"OAUTH2_PROXY_PROXY_WEBSOCKETS"` | 	ProxyWebSockets bool   `flag:"proxy-websockets" cfg:"proxy_websockets" env:"OAUTH2_PROXY_PROXY_WEBSOCKETS"` | ||||||
| 	HTTPAddress     string `flag:"http-address" cfg:"http_address" env:"OAUTH2_PROXY_HTTP_ADDRESS"` | 	HTTPAddress     string `flag:"http-address" cfg:"http_address" env:"OAUTH2_PROXY_HTTP_ADDRESS"` | ||||||
| 	HTTPSAddress    string `flag:"https-address" cfg:"https_address" env:"OAUTH2_PROXY_HTTPS_ADDRESS"` | 	HTTPSAddress    string `flag:"https-address" cfg:"https_address" env:"OAUTH2_PROXY_HTTPS_ADDRESS"` | ||||||
| 	RedirectURL     string `flag:"redirect-url" cfg:"redirect_url" env:"OAUTH2_PROXY_REDIRECT_URL"` | 	RedirectURL     string `flag:"redirect-url" cfg:"redirect_url" env:"OAUTH2_PROXY_REDIRECT_URL"` | ||||||
| 	ClientID        string `flag:"client-id" cfg:"client_id" env:"OAUTH2_PROXY_CLIENT_ID"` | 	ClientID        string `flag:"client-id" cfg:"client_id" env:"OAUTH2_PROXY_CLIENT_ID"` | ||||||
| 	ClientSecret    string `flag:"client-secret" cfg:"client_secret" env:"OAUTH2_PROXY_CLIENT_SECRET"` | 	ClientSecret    string `flag:"client-secret" cfg:"client_secret" env:"OAUTH2_PROXY_CLIENT_SECRET"` | ||||||
| 	TLSCertFile     string `flag:"tls-cert" cfg:"tls_cert_file" env:"OAUTH2_PROXY_TLS_CERT_FILE"` | 	TLSCertFile     string `flag:"tls-cert-file" cfg:"tls_cert_file" env:"OAUTH2_PROXY_TLS_CERT_FILE"` | ||||||
| 	TLSKeyFile      string `flag:"tls-key" cfg:"tls_key_file" env:"OAUTH2_PROXY_TLS_KEY_FILE"` | 	TLSKeyFile      string `flag:"tls-key-file" cfg:"tls_key_file" env:"OAUTH2_PROXY_TLS_KEY_FILE"` | ||||||
| 
 | 
 | ||||||
| 	AuthenticatedEmailsFile  string   `flag:"authenticated-emails-file" cfg:"authenticated_emails_file" env:"OAUTH2_PROXY_AUTHENTICATED_EMAILS_FILE"` | 	AuthenticatedEmailsFile  string   `flag:"authenticated-emails-file" cfg:"authenticated_emails_file" env:"OAUTH2_PROXY_AUTHENTICATED_EMAILS_FILE"` | ||||||
| 	AzureTenant              string   `flag:"azure-tenant" cfg:"azure_tenant" env:"OAUTH2_PROXY_AZURE_TENANT"` | 	AzureTenant              string   `flag:"azure-tenant" cfg:"azure_tenant" env:"OAUTH2_PROXY_AZURE_TENANT"` | ||||||
|  | @ -82,8 +82,8 @@ type Options struct { | ||||||
| 	Provider                         string `flag:"provider" cfg:"provider" env:"OAUTH2_PROXY_PROVIDER"` | 	Provider                         string `flag:"provider" cfg:"provider" env:"OAUTH2_PROXY_PROVIDER"` | ||||||
| 	OIDCIssuerURL                    string `flag:"oidc-issuer-url" cfg:"oidc_issuer_url" env:"OAUTH2_PROXY_OIDC_ISSUER_URL"` | 	OIDCIssuerURL                    string `flag:"oidc-issuer-url" cfg:"oidc_issuer_url" env:"OAUTH2_PROXY_OIDC_ISSUER_URL"` | ||||||
| 	InsecureOIDCAllowUnverifiedEmail bool   `flag:"insecure-oidc-allow-unverified-email" cfg:"insecure_oidc_allow_unverified_email" env:"OAUTH2_PROXY_INSECURE_OIDC_ALLOW_UNVERIFIED_EMAIL"` | 	InsecureOIDCAllowUnverifiedEmail bool   `flag:"insecure-oidc-allow-unverified-email" cfg:"insecure_oidc_allow_unverified_email" env:"OAUTH2_PROXY_INSECURE_OIDC_ALLOW_UNVERIFIED_EMAIL"` | ||||||
| 	SkipOIDCDiscovery                bool   `flag:"skip-oidc-discovery" cfg:"skip_oidc_discovery" env:"OAUTH2_SKIP_OIDC_DISCOVERY"` | 	SkipOIDCDiscovery                bool   `flag:"skip-oidc-discovery" cfg:"skip_oidc_discovery" env:"OAUTH2_PROXY_SKIP_OIDC_DISCOVERY"` | ||||||
| 	OIDCJwksURL                      string `flag:"oidc-jwks-url" cfg:"oidc_jwks_url" env:"OAUTH2_OIDC_JWKS_URL"` | 	OIDCJwksURL                      string `flag:"oidc-jwks-url" cfg:"oidc_jwks_url" env:"OAUTH2_PROXY_OIDC_JWKS_URL"` | ||||||
| 	LoginURL                         string `flag:"login-url" cfg:"login_url" env:"OAUTH2_PROXY_LOGIN_URL"` | 	LoginURL                         string `flag:"login-url" cfg:"login_url" env:"OAUTH2_PROXY_LOGIN_URL"` | ||||||
| 	RedeemURL                        string `flag:"redeem-url" cfg:"redeem_url" env:"OAUTH2_PROXY_REDEEM_URL"` | 	RedeemURL                        string `flag:"redeem-url" cfg:"redeem_url" env:"OAUTH2_PROXY_REDEEM_URL"` | ||||||
| 	ProfileURL                       string `flag:"profile-url" cfg:"profile_url" env:"OAUTH2_PROXY_PROFILE_URL"` | 	ProfileURL                       string `flag:"profile-url" cfg:"profile_url" env:"OAUTH2_PROXY_PROFILE_URL"` | ||||||
|  | @ -93,18 +93,18 @@ type Options struct { | ||||||
| 	ApprovalPrompt                   string `flag:"approval-prompt" cfg:"approval_prompt" env:"OAUTH2_PROXY_APPROVAL_PROMPT"` | 	ApprovalPrompt                   string `flag:"approval-prompt" cfg:"approval_prompt" env:"OAUTH2_PROXY_APPROVAL_PROMPT"` | ||||||
| 
 | 
 | ||||||
| 	// Configuration values for logging
 | 	// Configuration values for logging
 | ||||||
| 	LoggingFilename       string `flag:"logging-filename" cfg:"logging_filename" env:"OAUTH2_LOGGING_FILENAME"` | 	LoggingFilename       string `flag:"logging-filename" cfg:"logging_filename" env:"OAUTH2_PROXY_LOGGING_FILENAME"` | ||||||
| 	LoggingMaxSize        int    `flag:"logging-max-size" cfg:"logging_max_size" env:"OAUTH2_LOGGING_MAX_SIZE"` | 	LoggingMaxSize        int    `flag:"logging-max-size" cfg:"logging_max_size" env:"OAUTH2_PROXY_LOGGING_MAX_SIZE"` | ||||||
| 	LoggingMaxAge         int    `flag:"logging-max-age" cfg:"logging_max_age" env:"OAUTH2_LOGGING_MAX_AGE"` | 	LoggingMaxAge         int    `flag:"logging-max-age" cfg:"logging_max_age" env:"OAUTH2_PROXY_LOGGING_MAX_AGE"` | ||||||
| 	LoggingMaxBackups     int    `flag:"logging-max-backups" cfg:"logging_max_backups" env:"OAUTH2_LOGGING_MAX_BACKUPS"` | 	LoggingMaxBackups     int    `flag:"logging-max-backups" cfg:"logging_max_backups" env:"OAUTH2_PROXY_LOGGING_MAX_BACKUPS"` | ||||||
| 	LoggingLocalTime      bool   `flag:"logging-local-time" cfg:"logging_local_time" env:"OAUTH2_LOGGING_LOCAL_TIME"` | 	LoggingLocalTime      bool   `flag:"logging-local-time" cfg:"logging_local_time" env:"OAUTH2_PROXY_LOGGING_LOCAL_TIME"` | ||||||
| 	LoggingCompress       bool   `flag:"logging-compress" cfg:"logging_compress" env:"OAUTH2_LOGGING_COMPRESS"` | 	LoggingCompress       bool   `flag:"logging-compress" cfg:"logging_compress" env:"OAUTH2_PROXY_LOGGING_COMPRESS"` | ||||||
| 	StandardLogging       bool   `flag:"standard-logging" cfg:"standard_logging" env:"OAUTH2_STANDARD_LOGGING"` | 	StandardLogging       bool   `flag:"standard-logging" cfg:"standard_logging" env:"OAUTH2_PROXY_STANDARD_LOGGING"` | ||||||
| 	StandardLoggingFormat string `flag:"standard-logging-format" cfg:"standard_logging_format" env:"OAUTH2_STANDARD_LOGGING_FORMAT"` | 	StandardLoggingFormat string `flag:"standard-logging-format" cfg:"standard_logging_format" env:"OAUTH2_PROXY_STANDARD_LOGGING_FORMAT"` | ||||||
| 	RequestLogging        bool   `flag:"request-logging" cfg:"request_logging" env:"OAUTH2_REQUEST_LOGGING"` | 	RequestLogging        bool   `flag:"request-logging" cfg:"request_logging" env:"OAUTH2_PROXY_REQUEST_LOGGING"` | ||||||
| 	RequestLoggingFormat  string `flag:"request-logging-format" cfg:"request_logging_format" env:"OAUTH2_REQUEST_LOGGING_FORMAT"` | 	RequestLoggingFormat  string `flag:"request-logging-format" cfg:"request_logging_format" env:"OAUTH2_PROXY_REQUEST_LOGGING_FORMAT"` | ||||||
| 	AuthLogging           bool   `flag:"auth-logging" cfg:"auth_logging" env:"OAUTH2_LOGGING_AUTH_LOGGING"` | 	AuthLogging           bool   `flag:"auth-logging" cfg:"auth_logging" env:"OAUTH2_PROXY_LOGGING_AUTH_LOGGING"` | ||||||
| 	AuthLoggingFormat     string `flag:"auth-logging-format" cfg:"auth_logging_format" env:"OAUTH2_AUTH_LOGGING_FORMAT"` | 	AuthLoggingFormat     string `flag:"auth-logging-format" cfg:"auth_logging_format" env:"OAUTH2_PROXY_AUTH_LOGGING_FORMAT"` | ||||||
| 
 | 
 | ||||||
| 	SignatureKey    string `flag:"signature-key" cfg:"signature_key" env:"OAUTH2_PROXY_SIGNATURE_KEY"` | 	SignatureKey    string `flag:"signature-key" cfg:"signature_key" env:"OAUTH2_PROXY_SIGNATURE_KEY"` | ||||||
| 	AcrValues       string `flag:"acr-values" cfg:"acr_values" env:"OAUTH2_PROXY_ACR_VALUES"` | 	AcrValues       string `flag:"acr-values" cfg:"acr_values" env:"OAUTH2_PROXY_ACR_VALUES"` | ||||||
|  | @ -299,7 +299,7 @@ func (o *Options) Validate() error { | ||||||
| 	} | 	} | ||||||
| 	msgs = parseProviderInfo(o, msgs) | 	msgs = parseProviderInfo(o, msgs) | ||||||
| 
 | 
 | ||||||
| 	var cipher *cookie.Cipher | 	var cipher *encryption.Cipher | ||||||
| 	if o.PassAccessToken || o.SetAuthorization || o.PassAuthorization || (o.CookieRefresh != time.Duration(0)) { | 	if o.PassAccessToken || o.SetAuthorization || o.PassAuthorization || (o.CookieRefresh != time.Duration(0)) { | ||||||
| 		validCookieSecretSize := false | 		validCookieSecretSize := false | ||||||
| 		for _, i := range []int{16, 24, 32} { | 		for _, i := range []int{16, 24, 32} { | ||||||
|  | @ -324,7 +324,7 @@ func (o *Options) Validate() error { | ||||||
| 				len(secretBytes(o.CookieSecret)), suffix)) | 				len(secretBytes(o.CookieSecret)), suffix)) | ||||||
| 		} else { | 		} else { | ||||||
| 			var err error | 			var err error | ||||||
| 			cipher, err = cookie.NewCipher(secretBytes(o.CookieSecret)) | 			cipher, err = encryption.NewCipher(secretBytes(o.CookieSecret)) | ||||||
| 			if err != nil { | 			if err != nil { | ||||||
| 				msgs = append(msgs, fmt.Sprintf("cookie-secret error: %v", err)) | 				msgs = append(msgs, fmt.Sprintf("cookie-secret error: %v", err)) | ||||||
| 			} | 			} | ||||||
|  |  | ||||||
|  | @ -1,13 +1,11 @@ | ||||||
| package options | package options | ||||||
| 
 | 
 | ||||||
| import ( | import "github.com/pusher/oauth2_proxy/pkg/encryption" | ||||||
| 	"github.com/pusher/oauth2_proxy/cookie" |  | ||||||
| ) |  | ||||||
| 
 | 
 | ||||||
| // SessionOptions contains configuration options for the SessionStore providers.
 | // SessionOptions contains configuration options for the SessionStore providers.
 | ||||||
| type SessionOptions struct { | type SessionOptions struct { | ||||||
| 	Type   string `flag:"session-store-type" cfg:"session_store_type" env:"OAUTH2_PROXY_SESSION_STORE_TYPE"` | 	Type   string `flag:"session-store-type" cfg:"session_store_type" env:"OAUTH2_PROXY_SESSION_STORE_TYPE"` | ||||||
| 	Cipher *cookie.Cipher | 	Cipher *encryption.Cipher | ||||||
| 	CookieStoreOptions | 	CookieStoreOptions | ||||||
| 	RedisStoreOptions | 	RedisStoreOptions | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -7,7 +7,7 @@ import ( | ||||||
| 	"strings" | 	"strings" | ||||||
| 	"time" | 	"time" | ||||||
| 
 | 
 | ||||||
| 	"github.com/pusher/oauth2_proxy/cookie" | 	"github.com/pusher/oauth2_proxy/pkg/encryption" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| // SessionState is used to store information about the currently authenticated user session
 | // SessionState is used to store information about the currently authenticated user session
 | ||||||
|  | @ -66,7 +66,7 @@ func (s *SessionState) String() string { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // EncodeSessionState returns string representation of the current session
 | // EncodeSessionState returns string representation of the current session
 | ||||||
| func (s *SessionState) EncodeSessionState(c *cookie.Cipher) (string, error) { | func (s *SessionState) EncodeSessionState(c *encryption.Cipher) (string, error) { | ||||||
| 	var ss SessionState | 	var ss SessionState | ||||||
| 	if c == nil { | 	if c == nil { | ||||||
| 		// Store only Email and User when cipher is unavailable
 | 		// Store only Email and User when cipher is unavailable
 | ||||||
|  | @ -133,7 +133,7 @@ func legacyDecodeSessionStatePlain(v string) (*SessionState, error) { | ||||||
| 
 | 
 | ||||||
| // legacyDecodeSessionState attempts to decode the session state string
 | // legacyDecodeSessionState attempts to decode the session state string
 | ||||||
| // generated by v3.1.0 or older
 | // generated by v3.1.0 or older
 | ||||||
| func legacyDecodeSessionState(v string, c *cookie.Cipher) (*SessionState, error) { | func legacyDecodeSessionState(v string, c *encryption.Cipher) (*SessionState, error) { | ||||||
| 	chunks := strings.Split(v, "|") | 	chunks := strings.Split(v, "|") | ||||||
| 
 | 
 | ||||||
| 	if c == nil { | 	if c == nil { | ||||||
|  | @ -176,7 +176,7 @@ func legacyDecodeSessionState(v string, c *cookie.Cipher) (*SessionState, error) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // DecodeSessionState decodes the session cookie string into a SessionState
 | // DecodeSessionState decodes the session cookie string into a SessionState
 | ||||||
| func DecodeSessionState(v string, c *cookie.Cipher) (*SessionState, error) { | func DecodeSessionState(v string, c *encryption.Cipher) (*SessionState, error) { | ||||||
| 	var ssj SessionStateJSON | 	var ssj SessionStateJSON | ||||||
| 	var ss *SessionState | 	var ss *SessionState | ||||||
| 	err := json.Unmarshal([]byte(v), &ssj) | 	err := json.Unmarshal([]byte(v), &ssj) | ||||||
|  |  | ||||||
|  | @ -5,8 +5,8 @@ import ( | ||||||
| 	"testing" | 	"testing" | ||||||
| 	"time" | 	"time" | ||||||
| 
 | 
 | ||||||
| 	"github.com/pusher/oauth2_proxy/cookie" |  | ||||||
| 	"github.com/pusher/oauth2_proxy/pkg/apis/sessions" | 	"github.com/pusher/oauth2_proxy/pkg/apis/sessions" | ||||||
|  | 	"github.com/pusher/oauth2_proxy/pkg/encryption" | ||||||
| 	"github.com/stretchr/testify/assert" | 	"github.com/stretchr/testify/assert" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
|  | @ -14,9 +14,9 @@ const secret = "0123456789abcdefghijklmnopqrstuv" | ||||||
| const altSecret = "0000000000abcdefghijklmnopqrstuv" | const altSecret = "0000000000abcdefghijklmnopqrstuv" | ||||||
| 
 | 
 | ||||||
| func TestSessionStateSerialization(t *testing.T) { | func TestSessionStateSerialization(t *testing.T) { | ||||||
| 	c, err := cookie.NewCipher([]byte(secret)) | 	c, err := encryption.NewCipher([]byte(secret)) | ||||||
| 	assert.Equal(t, nil, err) | 	assert.Equal(t, nil, err) | ||||||
| 	c2, err := cookie.NewCipher([]byte(altSecret)) | 	c2, err := encryption.NewCipher([]byte(altSecret)) | ||||||
| 	assert.Equal(t, nil, err) | 	assert.Equal(t, nil, err) | ||||||
| 	s := &sessions.SessionState{ | 	s := &sessions.SessionState{ | ||||||
| 		Email:        "user@domain.com", | 		Email:        "user@domain.com", | ||||||
|  | @ -54,9 +54,9 @@ func TestSessionStateSerialization(t *testing.T) { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func TestSessionStateSerializationWithUser(t *testing.T) { | func TestSessionStateSerializationWithUser(t *testing.T) { | ||||||
| 	c, err := cookie.NewCipher([]byte(secret)) | 	c, err := encryption.NewCipher([]byte(secret)) | ||||||
| 	assert.Equal(t, nil, err) | 	assert.Equal(t, nil, err) | ||||||
| 	c2, err := cookie.NewCipher([]byte(altSecret)) | 	c2, err := encryption.NewCipher([]byte(altSecret)) | ||||||
| 	assert.Equal(t, nil, err) | 	assert.Equal(t, nil, err) | ||||||
| 	s := &sessions.SessionState{ | 	s := &sessions.SessionState{ | ||||||
| 		User:         "just-user", | 		User:         "just-user", | ||||||
|  | @ -146,7 +146,7 @@ func TestExpired(t *testing.T) { | ||||||
| type testCase struct { | type testCase struct { | ||||||
| 	sessions.SessionState | 	sessions.SessionState | ||||||
| 	Encoded string | 	Encoded string | ||||||
| 	Cipher  *cookie.Cipher | 	Cipher  *encryption.Cipher | ||||||
| 	Error   bool | 	Error   bool | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -203,7 +203,7 @@ func TestDecodeSessionState(t *testing.T) { | ||||||
| 	eString := string(eJSON) | 	eString := string(eJSON) | ||||||
| 	eUnix := e.Unix() | 	eUnix := e.Unix() | ||||||
| 
 | 
 | ||||||
| 	c, err := cookie.NewCipher([]byte(secret)) | 	c, err := encryption.NewCipher([]byte(secret)) | ||||||
| 	assert.NoError(t, err) | 	assert.NoError(t, err) | ||||||
| 
 | 
 | ||||||
| 	testCases := []testCase{ | 	testCases := []testCase{ | ||||||
|  |  | ||||||
|  | @ -6,8 +6,8 @@ import ( | ||||||
| 	"strings" | 	"strings" | ||||||
| 	"time" | 	"time" | ||||||
| 
 | 
 | ||||||
| 	"github.com/pusher/oauth2_proxy/logger" |  | ||||||
| 	"github.com/pusher/oauth2_proxy/pkg/apis/options" | 	"github.com/pusher/oauth2_proxy/pkg/apis/options" | ||||||
|  | 	"github.com/pusher/oauth2_proxy/pkg/logger" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| // MakeCookie constructs a cookie from the given parameters,
 | // MakeCookie constructs a cookie from the given parameters,
 | ||||||
|  |  | ||||||
|  | @ -1,4 +1,4 @@ | ||||||
| package cookie | package encryption | ||||||
| 
 | 
 | ||||||
| import ( | import ( | ||||||
| 	"crypto/aes" | 	"crypto/aes" | ||||||
|  | @ -1,4 +1,4 @@ | ||||||
| package cookie | package encryption | ||||||
| 
 | 
 | ||||||
| import ( | import ( | ||||||
| 	"encoding/base64" | 	"encoding/base64" | ||||||
|  | @ -1,4 +1,4 @@ | ||||||
| package cookie | package encryption | ||||||
| 
 | 
 | ||||||
| import ( | import ( | ||||||
| 	"crypto/rand" | 	"crypto/rand" | ||||||
|  | @ -1,4 +1,4 @@ | ||||||
| package api | package requests | ||||||
| 
 | 
 | ||||||
| import ( | import ( | ||||||
| 	"encoding/json" | 	"encoding/json" | ||||||
|  | @ -7,7 +7,7 @@ import ( | ||||||
| 	"net/http" | 	"net/http" | ||||||
| 
 | 
 | ||||||
| 	"github.com/bitly/go-simplejson" | 	"github.com/bitly/go-simplejson" | ||||||
| 	"github.com/pusher/oauth2_proxy/logger" | 	"github.com/pusher/oauth2_proxy/pkg/logger" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| // Request parses the request body into a simplejson.Json object
 | // Request parses the request body into a simplejson.Json object
 | ||||||
|  | @ -1,4 +1,4 @@ | ||||||
| package api | package requests | ||||||
| 
 | 
 | ||||||
| import ( | import ( | ||||||
| 	"io/ioutil" | 	"io/ioutil" | ||||||
|  | @ -8,10 +8,10 @@ import ( | ||||||
| 	"strings" | 	"strings" | ||||||
| 	"time" | 	"time" | ||||||
| 
 | 
 | ||||||
| 	"github.com/pusher/oauth2_proxy/cookie" |  | ||||||
| 	"github.com/pusher/oauth2_proxy/pkg/apis/options" | 	"github.com/pusher/oauth2_proxy/pkg/apis/options" | ||||||
| 	"github.com/pusher/oauth2_proxy/pkg/apis/sessions" | 	"github.com/pusher/oauth2_proxy/pkg/apis/sessions" | ||||||
| 	"github.com/pusher/oauth2_proxy/pkg/cookies" | 	"github.com/pusher/oauth2_proxy/pkg/cookies" | ||||||
|  | 	"github.com/pusher/oauth2_proxy/pkg/encryption" | ||||||
| 	"github.com/pusher/oauth2_proxy/pkg/sessions/utils" | 	"github.com/pusher/oauth2_proxy/pkg/sessions/utils" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
|  | @ -28,7 +28,7 @@ var _ sessions.SessionStore = &SessionStore{} | ||||||
| // interface that stores sessions in client side cookies
 | // interface that stores sessions in client side cookies
 | ||||||
| type SessionStore struct { | type SessionStore struct { | ||||||
| 	CookieOptions *options.CookieOptions | 	CookieOptions *options.CookieOptions | ||||||
| 	CookieCipher  *cookie.Cipher | 	CookieCipher  *encryption.Cipher | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // Save takes a sessions.SessionState and stores the information from it
 | // Save takes a sessions.SessionState and stores the information from it
 | ||||||
|  | @ -53,7 +53,7 @@ func (s *SessionStore) Load(req *http.Request) (*sessions.SessionState, error) { | ||||||
| 		// always http.ErrNoCookie
 | 		// always http.ErrNoCookie
 | ||||||
| 		return nil, fmt.Errorf("Cookie %q not present", s.CookieOptions.CookieName) | 		return nil, fmt.Errorf("Cookie %q not present", s.CookieOptions.CookieName) | ||||||
| 	} | 	} | ||||||
| 	val, _, ok := cookie.Validate(c, s.CookieOptions.CookieSecret, s.CookieOptions.CookieExpire) | 	val, _, ok := encryption.Validate(c, s.CookieOptions.CookieSecret, s.CookieOptions.CookieExpire) | ||||||
| 	if !ok { | 	if !ok { | ||||||
| 		return nil, errors.New("Cookie Signature not valid") | 		return nil, errors.New("Cookie Signature not valid") | ||||||
| 	} | 	} | ||||||
|  | @ -96,7 +96,7 @@ func (s *SessionStore) setSessionCookie(rw http.ResponseWriter, req *http.Reques | ||||||
| // authentication details
 | // authentication details
 | ||||||
| func (s *SessionStore) makeSessionCookie(req *http.Request, value string, now time.Time) []*http.Cookie { | func (s *SessionStore) makeSessionCookie(req *http.Request, value string, now time.Time) []*http.Cookie { | ||||||
| 	if value != "" { | 	if value != "" { | ||||||
| 		value = cookie.SignedValue(s.CookieOptions.CookieSecret, s.CookieOptions.CookieName, value, now) | 		value = encryption.SignedValue(s.CookieOptions.CookieSecret, s.CookieOptions.CookieName, value, now) | ||||||
| 	} | 	} | ||||||
| 	c := s.makeCookie(req, s.CookieOptions.CookieName, value, s.CookieOptions.CookieExpire, now) | 	c := s.makeCookie(req, s.CookieOptions.CookieName, value, s.CookieOptions.CookieExpire, now) | ||||||
| 	if len(c.Value) > 4096-len(s.CookieOptions.CookieName) { | 	if len(c.Value) > 4096-len(s.CookieOptions.CookieName) { | ||||||
|  |  | ||||||
|  | @ -13,10 +13,10 @@ import ( | ||||||
| 	"time" | 	"time" | ||||||
| 
 | 
 | ||||||
| 	"github.com/go-redis/redis" | 	"github.com/go-redis/redis" | ||||||
| 	"github.com/pusher/oauth2_proxy/cookie" |  | ||||||
| 	"github.com/pusher/oauth2_proxy/pkg/apis/options" | 	"github.com/pusher/oauth2_proxy/pkg/apis/options" | ||||||
| 	"github.com/pusher/oauth2_proxy/pkg/apis/sessions" | 	"github.com/pusher/oauth2_proxy/pkg/apis/sessions" | ||||||
| 	"github.com/pusher/oauth2_proxy/pkg/cookies" | 	"github.com/pusher/oauth2_proxy/pkg/cookies" | ||||||
|  | 	"github.com/pusher/oauth2_proxy/pkg/encryption" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| // TicketData is a structure representing the ticket used in server session storage
 | // TicketData is a structure representing the ticket used in server session storage
 | ||||||
|  | @ -28,7 +28,7 @@ type TicketData struct { | ||||||
| // SessionStore is an implementation of the sessions.SessionStore
 | // SessionStore is an implementation of the sessions.SessionStore
 | ||||||
| // interface that stores sessions in redis
 | // interface that stores sessions in redis
 | ||||||
| type SessionStore struct { | type SessionStore struct { | ||||||
| 	CookieCipher  *cookie.Cipher | 	CookieCipher  *encryption.Cipher | ||||||
| 	CookieOptions *options.CookieOptions | 	CookieOptions *options.CookieOptions | ||||||
| 	Client        *redis.Client | 	Client        *redis.Client | ||||||
| } | } | ||||||
|  | @ -106,7 +106,7 @@ func (store *SessionStore) Load(req *http.Request) (*sessions.SessionState, erro | ||||||
| 		return nil, fmt.Errorf("error loading session: %s", err) | 		return nil, fmt.Errorf("error loading session: %s", err) | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	val, _, ok := cookie.Validate(requestCookie, store.CookieOptions.CookieSecret, store.CookieOptions.CookieExpire) | 	val, _, ok := encryption.Validate(requestCookie, store.CookieOptions.CookieSecret, store.CookieOptions.CookieExpire) | ||||||
| 	if !ok { | 	if !ok { | ||||||
| 		return nil, fmt.Errorf("Cookie Signature not valid") | 		return nil, fmt.Errorf("Cookie Signature not valid") | ||||||
| 	} | 	} | ||||||
|  | @ -166,7 +166,7 @@ func (store *SessionStore) Clear(rw http.ResponseWriter, req *http.Request) erro | ||||||
| 		return fmt.Errorf("error retrieving cookie: %v", err) | 		return fmt.Errorf("error retrieving cookie: %v", err) | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	val, _, ok := cookie.Validate(requestCookie, store.CookieOptions.CookieSecret, store.CookieOptions.CookieExpire) | 	val, _, ok := encryption.Validate(requestCookie, store.CookieOptions.CookieSecret, store.CookieOptions.CookieExpire) | ||||||
| 	if !ok { | 	if !ok { | ||||||
| 		return fmt.Errorf("Cookie Signature not valid") | 		return fmt.Errorf("Cookie Signature not valid") | ||||||
| 	} | 	} | ||||||
|  | @ -186,7 +186,7 @@ func (store *SessionStore) Clear(rw http.ResponseWriter, req *http.Request) erro | ||||||
| // makeCookie makes a cookie, signing the value if present
 | // makeCookie makes a cookie, signing the value if present
 | ||||||
| func (store *SessionStore) makeCookie(req *http.Request, value string, expires time.Duration, now time.Time) *http.Cookie { | func (store *SessionStore) makeCookie(req *http.Request, value string, expires time.Duration, now time.Time) *http.Cookie { | ||||||
| 	if value != "" { | 	if value != "" { | ||||||
| 		value = cookie.SignedValue(store.CookieOptions.CookieSecret, store.CookieOptions.CookieName, value, now) | 		value = encryption.SignedValue(store.CookieOptions.CookieSecret, store.CookieOptions.CookieName, value, now) | ||||||
| 	} | 	} | ||||||
| 	return cookies.MakeCookieFromOptions( | 	return cookies.MakeCookieFromOptions( | ||||||
| 		req, | 		req, | ||||||
|  | @ -230,7 +230,7 @@ func (store *SessionStore) getTicket(requestCookie *http.Cookie) (*TicketData, e | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	// An existing cookie exists, try to retrieve the ticket
 | 	// An existing cookie exists, try to retrieve the ticket
 | ||||||
| 	val, _, ok := cookie.Validate(requestCookie, store.CookieOptions.CookieSecret, store.CookieOptions.CookieExpire) | 	val, _, ok := encryption.Validate(requestCookie, store.CookieOptions.CookieSecret, store.CookieOptions.CookieExpire) | ||||||
| 	if !ok { | 	if !ok { | ||||||
| 		// Cookie is invalid, create a new ticket
 | 		// Cookie is invalid, create a new ticket
 | ||||||
| 		return newTicket() | 		return newTicket() | ||||||
|  |  | ||||||
|  | @ -13,10 +13,10 @@ import ( | ||||||
| 	"github.com/alicebob/miniredis" | 	"github.com/alicebob/miniredis" | ||||||
| 	. "github.com/onsi/ginkgo" | 	. "github.com/onsi/ginkgo" | ||||||
| 	. "github.com/onsi/gomega" | 	. "github.com/onsi/gomega" | ||||||
| 	"github.com/pusher/oauth2_proxy/cookie" |  | ||||||
| 	"github.com/pusher/oauth2_proxy/pkg/apis/options" | 	"github.com/pusher/oauth2_proxy/pkg/apis/options" | ||||||
| 	sessionsapi "github.com/pusher/oauth2_proxy/pkg/apis/sessions" | 	sessionsapi "github.com/pusher/oauth2_proxy/pkg/apis/sessions" | ||||||
| 	"github.com/pusher/oauth2_proxy/pkg/cookies" | 	"github.com/pusher/oauth2_proxy/pkg/cookies" | ||||||
|  | 	"github.com/pusher/oauth2_proxy/pkg/encryption" | ||||||
| 	"github.com/pusher/oauth2_proxy/pkg/sessions" | 	"github.com/pusher/oauth2_proxy/pkg/sessions" | ||||||
| 	sessionscookie "github.com/pusher/oauth2_proxy/pkg/sessions/cookie" | 	sessionscookie "github.com/pusher/oauth2_proxy/pkg/sessions/cookie" | ||||||
| 	"github.com/pusher/oauth2_proxy/pkg/sessions/redis" | 	"github.com/pusher/oauth2_proxy/pkg/sessions/redis" | ||||||
|  | @ -158,7 +158,7 @@ var _ = Describe("NewSessionStore", func() { | ||||||
| 				BeforeEach(func() { | 				BeforeEach(func() { | ||||||
| 					By("Using a valid cookie with a different providers session encoding") | 					By("Using a valid cookie with a different providers session encoding") | ||||||
| 					broken := "BrokenSessionFromADifferentSessionImplementation" | 					broken := "BrokenSessionFromADifferentSessionImplementation" | ||||||
| 					value := cookie.SignedValue(cookieOpts.CookieSecret, cookieOpts.CookieName, broken, time.Now()) | 					value := encryption.SignedValue(cookieOpts.CookieSecret, cookieOpts.CookieName, broken, time.Now()) | ||||||
| 					cookie := cookies.MakeCookieFromOptions(request, cookieOpts.CookieName, value, cookieOpts, cookieOpts.CookieExpire, time.Now()) | 					cookie := cookies.MakeCookieFromOptions(request, cookieOpts.CookieName, value, cookieOpts, cookieOpts.CookieExpire, time.Now()) | ||||||
| 					request.AddCookie(cookie) | 					request.AddCookie(cookie) | ||||||
| 
 | 
 | ||||||
|  | @ -354,7 +354,7 @@ var _ = Describe("NewSessionStore", func() { | ||||||
| 				_, err := rand.Read(secret) | 				_, err := rand.Read(secret) | ||||||
| 				Expect(err).ToNot(HaveOccurred()) | 				Expect(err).ToNot(HaveOccurred()) | ||||||
| 				cookieOpts.CookieSecret = base64.URLEncoding.EncodeToString(secret) | 				cookieOpts.CookieSecret = base64.URLEncoding.EncodeToString(secret) | ||||||
| 				cipher, err := cookie.NewCipher(utils.SecretBytes(cookieOpts.CookieSecret)) | 				cipher, err := encryption.NewCipher(utils.SecretBytes(cookieOpts.CookieSecret)) | ||||||
| 				Expect(err).ToNot(HaveOccurred()) | 				Expect(err).ToNot(HaveOccurred()) | ||||||
| 				Expect(cipher).ToNot(BeNil()) | 				Expect(cipher).ToNot(BeNil()) | ||||||
| 				opts.Cipher = cipher | 				opts.Cipher = cipher | ||||||
|  |  | ||||||
|  | @ -3,17 +3,17 @@ package utils | ||||||
| import ( | import ( | ||||||
| 	"encoding/base64" | 	"encoding/base64" | ||||||
| 
 | 
 | ||||||
| 	"github.com/pusher/oauth2_proxy/cookie" |  | ||||||
| 	"github.com/pusher/oauth2_proxy/pkg/apis/sessions" | 	"github.com/pusher/oauth2_proxy/pkg/apis/sessions" | ||||||
|  | 	"github.com/pusher/oauth2_proxy/pkg/encryption" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| // CookieForSession serializes a session state for storage in a cookie
 | // CookieForSession serializes a session state for storage in a cookie
 | ||||||
| func CookieForSession(s *sessions.SessionState, c *cookie.Cipher) (string, error) { | func CookieForSession(s *sessions.SessionState, c *encryption.Cipher) (string, error) { | ||||||
| 	return s.EncodeSessionState(c) | 	return s.EncodeSessionState(c) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // SessionFromCookie deserializes a session from a cookie value
 | // SessionFromCookie deserializes a session from a cookie value
 | ||||||
| func SessionFromCookie(v string, c *cookie.Cipher) (s *sessions.SessionState, err error) { | func SessionFromCookie(v string, c *encryption.Cipher) (s *sessions.SessionState, err error) { | ||||||
| 	return sessions.DecodeSessionState(v, c) | 	return sessions.DecodeSessionState(v, c) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -7,9 +7,9 @@ import ( | ||||||
| 	"net/url" | 	"net/url" | ||||||
| 
 | 
 | ||||||
| 	"github.com/bitly/go-simplejson" | 	"github.com/bitly/go-simplejson" | ||||||
| 	"github.com/pusher/oauth2_proxy/api" |  | ||||||
| 	"github.com/pusher/oauth2_proxy/logger" |  | ||||||
| 	"github.com/pusher/oauth2_proxy/pkg/apis/sessions" | 	"github.com/pusher/oauth2_proxy/pkg/apis/sessions" | ||||||
|  | 	"github.com/pusher/oauth2_proxy/pkg/logger" | ||||||
|  | 	"github.com/pusher/oauth2_proxy/pkg/requests" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| // AzureProvider represents an Azure based Identity Provider
 | // AzureProvider represents an Azure based Identity Provider
 | ||||||
|  | @ -102,7 +102,7 @@ func (p *AzureProvider) GetEmailAddress(s *sessions.SessionState) (string, error | ||||||
| 	} | 	} | ||||||
| 	req.Header = getAzureHeader(s.AccessToken) | 	req.Header = getAzureHeader(s.AccessToken) | ||||||
| 
 | 
 | ||||||
| 	json, err := api.Request(req) | 	json, err := requests.Request(req) | ||||||
| 
 | 
 | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return "", err | 		return "", err | ||||||
|  |  | ||||||
|  | @ -6,8 +6,8 @@ import ( | ||||||
| 	"net/http" | 	"net/http" | ||||||
| 	"net/url" | 	"net/url" | ||||||
| 
 | 
 | ||||||
| 	"github.com/pusher/oauth2_proxy/api" |  | ||||||
| 	"github.com/pusher/oauth2_proxy/pkg/apis/sessions" | 	"github.com/pusher/oauth2_proxy/pkg/apis/sessions" | ||||||
|  | 	"github.com/pusher/oauth2_proxy/pkg/requests" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| // FacebookProvider represents an Facebook based Identity Provider
 | // FacebookProvider represents an Facebook based Identity Provider
 | ||||||
|  | @ -69,7 +69,7 @@ func (p *FacebookProvider) GetEmailAddress(s *sessions.SessionState) (string, er | ||||||
| 		Email string | 		Email string | ||||||
| 	} | 	} | ||||||
| 	var r result | 	var r result | ||||||
| 	err = api.RequestJSON(req, &r) | 	err = requests.RequestJSON(req, &r) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return "", err | 		return "", err | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | @ -10,8 +10,8 @@ import ( | ||||||
| 	"strconv" | 	"strconv" | ||||||
| 	"strings" | 	"strings" | ||||||
| 
 | 
 | ||||||
| 	"github.com/pusher/oauth2_proxy/logger" |  | ||||||
| 	"github.com/pusher/oauth2_proxy/pkg/apis/sessions" | 	"github.com/pusher/oauth2_proxy/pkg/apis/sessions" | ||||||
|  | 	"github.com/pusher/oauth2_proxy/pkg/logger" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| // GitHubProvider represents an GitHub based Identity Provider
 | // GitHubProvider represents an GitHub based Identity Provider
 | ||||||
|  |  | ||||||
|  | @ -4,9 +4,9 @@ import ( | ||||||
| 	"net/http" | 	"net/http" | ||||||
| 	"net/url" | 	"net/url" | ||||||
| 
 | 
 | ||||||
| 	"github.com/pusher/oauth2_proxy/api" |  | ||||||
| 	"github.com/pusher/oauth2_proxy/logger" |  | ||||||
| 	"github.com/pusher/oauth2_proxy/pkg/apis/sessions" | 	"github.com/pusher/oauth2_proxy/pkg/apis/sessions" | ||||||
|  | 	"github.com/pusher/oauth2_proxy/pkg/logger" | ||||||
|  | 	"github.com/pusher/oauth2_proxy/pkg/requests" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| // GitLabProvider represents an GitLab based Identity Provider
 | // GitLabProvider represents an GitLab based Identity Provider
 | ||||||
|  | @ -53,7 +53,7 @@ func (p *GitLabProvider) GetEmailAddress(s *sessions.SessionState) (string, erro | ||||||
| 		logger.Printf("failed building request %s", err) | 		logger.Printf("failed building request %s", err) | ||||||
| 		return "", err | 		return "", err | ||||||
| 	} | 	} | ||||||
| 	json, err := api.Request(req) | 	json, err := requests.Request(req) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		logger.Printf("failed making request %s", err) | 		logger.Printf("failed making request %s", err) | ||||||
| 		return "", err | 		return "", err | ||||||
|  |  | ||||||
|  | @ -13,8 +13,8 @@ import ( | ||||||
| 	"strings" | 	"strings" | ||||||
| 	"time" | 	"time" | ||||||
| 
 | 
 | ||||||
| 	"github.com/pusher/oauth2_proxy/logger" |  | ||||||
| 	"github.com/pusher/oauth2_proxy/pkg/apis/sessions" | 	"github.com/pusher/oauth2_proxy/pkg/apis/sessions" | ||||||
|  | 	"github.com/pusher/oauth2_proxy/pkg/logger" | ||||||
| 	"golang.org/x/oauth2" | 	"golang.org/x/oauth2" | ||||||
| 	"golang.org/x/oauth2/google" | 	"golang.org/x/oauth2/google" | ||||||
| 	admin "google.golang.org/api/admin/directory/v1" | 	admin "google.golang.org/api/admin/directory/v1" | ||||||
|  |  | ||||||
|  | @ -5,8 +5,8 @@ import ( | ||||||
| 	"net/http" | 	"net/http" | ||||||
| 	"net/url" | 	"net/url" | ||||||
| 
 | 
 | ||||||
| 	"github.com/pusher/oauth2_proxy/api" | 	"github.com/pusher/oauth2_proxy/pkg/logger" | ||||||
| 	"github.com/pusher/oauth2_proxy/logger" | 	"github.com/pusher/oauth2_proxy/pkg/requests" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| // stripToken is a helper function to obfuscate "access_token"
 | // stripToken is a helper function to obfuscate "access_token"
 | ||||||
|  | @ -55,7 +55,7 @@ func validateToken(p Provider, accessToken string, header http.Header) bool { | ||||||
| 		params := url.Values{"access_token": {accessToken}} | 		params := url.Values{"access_token": {accessToken}} | ||||||
| 		endpoint = endpoint + "?" + params.Encode() | 		endpoint = endpoint + "?" + params.Encode() | ||||||
| 	} | 	} | ||||||
| 	resp, err := api.RequestUnparsedResponse(endpoint, header) | 	resp, err := requests.RequestUnparsedResponse(endpoint, header) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		logger.Printf("GET %s", stripToken(endpoint)) | 		logger.Printf("GET %s", stripToken(endpoint)) | ||||||
| 		logger.Printf("token validation request failed: %s", err) | 		logger.Printf("token validation request failed: %s", err) | ||||||
|  |  | ||||||
|  | @ -6,8 +6,8 @@ import ( | ||||||
| 	"net/http" | 	"net/http" | ||||||
| 	"net/url" | 	"net/url" | ||||||
| 
 | 
 | ||||||
| 	"github.com/pusher/oauth2_proxy/api" |  | ||||||
| 	"github.com/pusher/oauth2_proxy/pkg/apis/sessions" | 	"github.com/pusher/oauth2_proxy/pkg/apis/sessions" | ||||||
|  | 	"github.com/pusher/oauth2_proxy/pkg/requests" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| // LinkedInProvider represents an LinkedIn based Identity Provider
 | // LinkedInProvider represents an LinkedIn based Identity Provider
 | ||||||
|  | @ -61,7 +61,7 @@ func (p *LinkedInProvider) GetEmailAddress(s *sessions.SessionState) (string, er | ||||||
| 	} | 	} | ||||||
| 	req.Header = getLinkedInHeader(s.AccessToken) | 	req.Header = getLinkedInHeader(s.AccessToken) | ||||||
| 
 | 
 | ||||||
| 	json, err := api.Request(req) | 	json, err := requests.Request(req) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return "", err | 		return "", err | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | @ -10,8 +10,8 @@ import ( | ||||||
| 	"net/url" | 	"net/url" | ||||||
| 	"time" | 	"time" | ||||||
| 
 | 
 | ||||||
| 	"github.com/pusher/oauth2_proxy/cookie" |  | ||||||
| 	"github.com/pusher/oauth2_proxy/pkg/apis/sessions" | 	"github.com/pusher/oauth2_proxy/pkg/apis/sessions" | ||||||
|  | 	"github.com/pusher/oauth2_proxy/pkg/encryption" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| // Redeem provides a default implementation of the OAuth2 token redemption process
 | // Redeem provides a default implementation of the OAuth2 token redemption process
 | ||||||
|  | @ -96,12 +96,12 @@ func (p *ProviderData) GetLoginURL(redirectURI, state string) string { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // CookieForSession serializes a session state for storage in a cookie
 | // CookieForSession serializes a session state for storage in a cookie
 | ||||||
| func (p *ProviderData) CookieForSession(s *sessions.SessionState, c *cookie.Cipher) (string, error) { | func (p *ProviderData) CookieForSession(s *sessions.SessionState, c *encryption.Cipher) (string, error) { | ||||||
| 	return s.EncodeSessionState(c) | 	return s.EncodeSessionState(c) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // SessionFromCookie deserializes a session from a cookie value
 | // SessionFromCookie deserializes a session from a cookie value
 | ||||||
| func (p *ProviderData) SessionFromCookie(v string, c *cookie.Cipher) (s *sessions.SessionState, err error) { | func (p *ProviderData) SessionFromCookie(v string, c *encryption.Cipher) (s *sessions.SessionState, err error) { | ||||||
| 	return sessions.DecodeSessionState(v, c) | 	return sessions.DecodeSessionState(v, c) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -1,8 +1,8 @@ | ||||||
| package providers | package providers | ||||||
| 
 | 
 | ||||||
| import ( | import ( | ||||||
| 	"github.com/pusher/oauth2_proxy/cookie" |  | ||||||
| 	"github.com/pusher/oauth2_proxy/pkg/apis/sessions" | 	"github.com/pusher/oauth2_proxy/pkg/apis/sessions" | ||||||
|  | 	"github.com/pusher/oauth2_proxy/pkg/encryption" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| // Provider represents an upstream identity provider implementation
 | // Provider represents an upstream identity provider implementation
 | ||||||
|  | @ -15,8 +15,8 @@ type Provider interface { | ||||||
| 	ValidateSessionState(*sessions.SessionState) bool | 	ValidateSessionState(*sessions.SessionState) bool | ||||||
| 	GetLoginURL(redirectURI, finalRedirect string) string | 	GetLoginURL(redirectURI, finalRedirect string) string | ||||||
| 	RefreshSessionIfNeeded(*sessions.SessionState) (bool, error) | 	RefreshSessionIfNeeded(*sessions.SessionState) (bool, error) | ||||||
| 	SessionFromCookie(string, *cookie.Cipher) (*sessions.SessionState, error) | 	SessionFromCookie(string, *encryption.Cipher) (*sessions.SessionState, error) | ||||||
| 	CookieForSession(*sessions.SessionState, *cookie.Cipher) (string, error) | 	CookieForSession(*sessions.SessionState, *encryption.Cipher) (string, error) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // New provides a new Provider based on the configured provider string
 | // New provides a new Provider based on the configured provider string
 | ||||||
|  |  | ||||||
|  | @ -4,7 +4,7 @@ import ( | ||||||
| 	"html/template" | 	"html/template" | ||||||
| 	"path" | 	"path" | ||||||
| 
 | 
 | ||||||
| 	"github.com/pusher/oauth2_proxy/logger" | 	"github.com/pusher/oauth2_proxy/pkg/logger" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| func loadTemplates(dir string) *template.Template { | func loadTemplates(dir string) *template.Template { | ||||||
|  |  | ||||||
|  | @ -8,7 +8,7 @@ import ( | ||||||
| 	"sync/atomic" | 	"sync/atomic" | ||||||
| 	"unsafe" | 	"unsafe" | ||||||
| 
 | 
 | ||||||
| 	"github.com/pusher/oauth2_proxy/logger" | 	"github.com/pusher/oauth2_proxy/pkg/logger" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| // UserMap holds information from the authenticated emails file
 | // UserMap holds information from the authenticated emails file
 | ||||||
|  |  | ||||||
|  | @ -7,7 +7,7 @@ import ( | ||||||
| 	"path/filepath" | 	"path/filepath" | ||||||
| 	"time" | 	"time" | ||||||
| 
 | 
 | ||||||
| 	"github.com/pusher/oauth2_proxy/logger" | 	"github.com/pusher/oauth2_proxy/pkg/logger" | ||||||
| 	fsnotify "gopkg.in/fsnotify/fsnotify.v1" | 	fsnotify "gopkg.in/fsnotify/fsnotify.v1" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -2,7 +2,7 @@ | ||||||
| 
 | 
 | ||||||
| package main | package main | ||||||
| 
 | 
 | ||||||
| import "github.com/pusher/oauth2_proxy/logger" | import "github.com/pusher/oauth2_proxy/pkg/logger" | ||||||
| 
 | 
 | ||||||
| func WatchForUpdates(filename string, done <-chan bool, action func()) { | func WatchForUpdates(filename string, done <-chan bool, action func()) { | ||||||
| 	logger.Printf("file watching not implemented on this platform") | 	logger.Printf("file watching not implemented on this platform") | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue