From 63f7c34ba625ca0e10e82cc56ab5f2b7d32a2e59 Mon Sep 17 00:00:00 2001
From: ale <ale@incal.net>
Date: Fri, 16 Feb 2018 18:31:29 +0000
Subject: [PATCH] Update go-sso

---
 vendor/git.autistici.org/id/go-sso/README.md | 123 +++++++++++++++++++
 vendor/git.autistici.org/id/go-sso/sso.go    |  49 ++++++--
 vendor/vendor.json                           |   6 +-
 3 files changed, 163 insertions(+), 15 deletions(-)
 create mode 100644 vendor/git.autistici.org/id/go-sso/README.md

diff --git a/vendor/git.autistici.org/id/go-sso/README.md b/vendor/git.autistici.org/id/go-sso/README.md
new file mode 100644
index 00000000..023f892b
--- /dev/null
+++ b/vendor/git.autistici.org/id/go-sso/README.md
@@ -0,0 +1,123 @@
+sso
+===
+
+Login server (or *identity provider*, IDP) using the
+[ai/sso](https://git.autistici.org/ai/sso) protocol (version 5) for
+single-sign on and [auth-server](https://git.autistici.org/id/auth) to
+authenticate users.
+
+This repository includes a few separate binaries:
+
+* *sso-server* is the login server / IDP
+* *saml-server* is a SSO-to-SAML bridge (for third-party software)
+* *sso-proxy* is a reverse HTTP proxy that adds single-sign-on access
+  controls to backends
+
+# Configuration
+
+The *sso-server* daemon requires a YAML configuration file,
+*/etc/sso/server.yml* by default. It understands the following
+attributes:
+
+* `secret_key_file`: path to the Ed25519 secret key (should be exactly
+64 bytes)
+* `public_key_file`: path to the Ed25519 public key (should be exactly
+32 bytes)
+* `domain`: SSO domain
+* `allowed_services`: a list of regular expressions. A request will be
+  allowed only if the target SSO services matches one of these
+  expressions.
+* `allowed_exchanges`: a list of regular expression source /
+  destination pairs (dictionaries with `src_regexp` and `dst_regexp`
+  attributes). Exchange requests will only be allowed if source and
+  destination SSO services both match one of these pairs.
+* `service_ttls`: a list of dictionaries used to set time-to-live for
+  SSO tickets for specific services. Each dictionary should have the
+  following attributes:
+  * `regexp`: regular expression that should match the SSO service
+  * `ttl`: TTL in seconds
+* `auth_session_lifetime`: time-to-live (in seconds) for the
+  sso-server user authentication session. When it expires, the user
+  will have to login again.
+* `session_secrets`: a list of two (or more, as long as the number is
+  even) secret keys to use for HTTP cookie-based sessions, in
+  *authentication-key*, *encryption-key* pairs. Authentication keys
+  can be 32 bytes (SHA128) or 64 bytes (SHA512), encryption keys
+  should be 16 (AES-128), 24 (AES-192) or 32 (AES-256) bytes long. For
+  key rotation, multiple pairs (old, new) can be specified so that
+  sessions are not immediately invalidated.
+* `csrf_secret`: a secret key used for CSRF protection
+* `auth_service`: the service name to use for the authentication
+  request sent to *auth-server* (generally "sso")
+* `device_manager`: configuration for the device tracking module:
+  * `auth_key`: a long-term key to authenticate HTTP-based cookies
+  * `geo_ip_data_files`: GeoIP databases to use (in mmdb format), if
+    unset the module will use the default GeoLite2-Country db
+* `keystore`: configures the connection to the keystore service
+  * `url`: URL for the keystore service
+  * `sharded`: if true, requests to the keystore service will be
+    partitioned according to the user's *shard* attribute
+  * `tls_config`: client TLS configuration
+    * `cert`: path to the client certificate
+    * `key`: path to the private key
+    * `ca`: path to the CA used to validate the server
+* `http_server`: specifies standard parameters for the HTTP server
+  * `tls`: server-side TLS configuration
+    * `cert`: path to the server certificate
+    * `key`: path to the server's private key
+    * `ca`: path to the CA used to validate clients
+    * `acl`: TLS-based access controls, a list of entries with the
+      following attributes:
+      * `path` is a regular expression to match the request URL path
+      * `cn` is a regular expression that must match the CommonName
+        part of the subject of the client certificate
+  * `trusted_forwarders`: list of trusted IP addresses (reverse
+    proxies). If a request comes from here, we will trust the
+    X-Forwarded-Proto and X-Real-IP headers when determining the
+    client IP address
+  * `max_inflight_requests`: maximum number of in-flight requests to
+    allow before server-side throttling kicks in
+
+## Device tracking
+
+The idea is to track a small amount of non-personally-identifying data
+for each device, and use it to notify users of unexpected
+accesses. This information is tracked by the
+[user-meta-server](https://git.autistici.org/id/usermetadb).
+
+It is implemented very simply, with a long-term cookie stored in the
+browser.
+
+## Key store
+
+On login, the login server can unlock the user's key store
+(see [keystore](https://git.autistici.org/id/keystore)). The
+associated key will be cleared either on logout, or when the login
+session expires.
+
+
+# API
+
+The *sso-server* binary serves different types of HTTP traffic:
+
+* the login/logout interface (user-facing)
+* the SSO login endpoint (user-facing)
+* the SSO ticket exchange endpoint (service-facing)
+
+The ticket exchange API allows a service (the *source*) to exchange a
+valid SSO ticket for itself with a SSO ticket, for the same user,
+meant for a third-party service (*destination*). Its endpoint is
+located at the URL `/exchange` and it accepts the following query
+parameters:
+
+* `cur_tkt`: valid source SSO ticket
+* `cur_svc`: source SSO service
+* `cur_nonce`: nonce for *cur_tkt*
+* `new_svc`: destination SSO service
+* `new_nonce`: nonce for the new SSO ticket
+* `new_groups` (optional): a comma-separated list of groups that the
+  destination service might check membership for
+
+Note that annoyingly *cur_svc* and *cur_nonce* are redundant, as they
+are already contained within *cur_tkt*, but the SSO ticket API won't
+allow us to decode the ticket without verifying it at the same time.
diff --git a/vendor/git.autistici.org/id/go-sso/sso.go b/vendor/git.autistici.org/id/go-sso/sso.go
index 540185aa..13e60014 100644
--- a/vendor/git.autistici.org/id/go-sso/sso.go
+++ b/vendor/git.autistici.org/id/go-sso/sso.go
@@ -11,18 +11,43 @@ import (
 )
 
 var (
-	// Errors.
-	ErrMissingRequiredField     = errors.New("missing required field")
-	ErrBadNonceLength           = errors.New("bad nonce length")
-	ErrDeserialization          = errors.New("deserialization error")
+	// ErrMissingRequiredField is returned when a ticket does not
+	// contain a required field.
+	ErrMissingRequiredField = errors.New("missing required field")
+
+	// ErrDeserialization means that the input is not valid base64.
+	ErrDeserialization = errors.New("deserialization error")
+
+	// ErrUnsupportedTicketVersion is returned for unsupported
+	// ticket versions (either too old or too recent).
 	ErrUnsupportedTicketVersion = errors.New("unsupported ticket version")
-	ErrMessageTooShort          = errors.New("encoded message too short")
-	ErrBadSignature             = errors.New("bad signature")
-	ErrBadService               = errors.New("service mismatch")
-	ErrBadDomain                = errors.New("auth domain mismatch")
-	ErrBadNonce                 = errors.New("nonce mismatch")
-	ErrExpired                  = errors.New("ticket expired")
-	ErrUnauthorized             = errors.New("unauthorized")
+
+	// ErrMessageTooShort means that the input is shorter than the
+	// fixed signature length + minimum ticket size.
+	ErrMessageTooShort = errors.New("encoded message too short")
+
+	// ErrBadSignature is returned when the signature does not
+	// match the given public key.
+	ErrBadSignature = errors.New("bad signature")
+
+	// ErrBadService is returned when validation fails due to a
+	// SSO service mismatch.
+	ErrBadService = errors.New("service mismatch")
+
+	// ErrBadDomain is returned when validation fails due to a SSO
+	// domain mismatch.
+	ErrBadDomain = errors.New("auth domain mismatch")
+
+	// ErrBadNonce is returned when validation fails due to a
+	// nonce mismatch.
+	ErrBadNonce = errors.New("nonce mismatch")
+
+	// ErrExpired means the ticket has expired.
+	ErrExpired = errors.New("ticket expired")
+
+	// ErrUnauthorized is returned when the user lacks the
+	// necessary group membership.
+	ErrUnauthorized = errors.New("unauthorized")
 )
 
 const (
@@ -234,7 +259,7 @@ func (v *ssoValidator) Validate(encoded, nonce, service string, allowedGroups []
 	if t.Expires.Before(time.Now()) {
 		return nil, ErrExpired
 	}
-	if t.Nonce != nonce {
+	if nonce != "" && t.Nonce != nonce {
 		return nil, ErrBadNonce
 	}
 
diff --git a/vendor/vendor.json b/vendor/vendor.json
index 95789792..d81ec44a 100644
--- a/vendor/vendor.json
+++ b/vendor/vendor.json
@@ -33,10 +33,10 @@
 			"revisionTime": "2018-01-12T09:10:27Z"
 		},
 		{
-			"checksumSHA1": "DFjm2ZJpUwioPApa3htGXLEFWl8=",
+			"checksumSHA1": "zvdsYaPEZrgcsRJy1bOo6YF5rVQ=",
 			"path": "git.autistici.org/id/go-sso",
-			"revision": "2f1d893daf6ea55c4c3a704d14cf3c0996e1fec5",
-			"revisionTime": "2017-12-14T07:43:49Z"
+			"revision": "10356d2430081e5f6dc60a68d576ef5b476f83ea",
+			"revisionTime": "2018-02-16T18:29:55Z"
 		},
 		{
 			"checksumSHA1": "spyv5/YFBjYyZLZa1U2LBfDR8PM=",
-- 
GitLab