From 3bbac7bb74f65879decb6351f32f8034e8524d5b Mon Sep 17 00:00:00 2001 From: Nikolay Stupak Date: Fri, 24 May 2019 16:13:15 +0300 Subject: [PATCH] move to GitHub. --- .codecov.yml | 2 + .github/media/screenshot.gif | Bin 0 -> 278602 bytes .gitignore | 0 .golangci.yml | 8 +- CHANGELOG.md | 29 -- Dockerfile | 10 +- LICENSE | 21 + README.md | 332 +++++++++----- ci-testing.yaml | 4 - cmd/werther/main.go | 34 +- cmd/werther/tools.go | 6 +- go.mod | 15 +- go.sum | 22 +- internal/hydra/consent.go | 6 +- internal/hydra/consent_test.go | 240 ++++++++++ internal/hydra/hydra.go | 14 +- internal/hydra/login.go | 6 +- internal/hydra/login_test.go | 246 +++++++++++ internal/hydra/logout.go | 6 +- internal/hydra/logout_test.go | 177 ++++++++ internal/identp/identp.go | 24 +- internal/identp/identp_test.go | 8 +- internal/ldapclient/ldapclient.go | 273 +++++++----- internal/ldapclient/ldapclient_test.go | 588 +++++++++++++++++++++++++ internal/stat/stat.go | 19 +- internal/stat/stat_test.go | 64 +++ internal/web/web.go | 12 +- internal/web/web_test.go | 10 +- 28 files changed, 1840 insertions(+), 336 deletions(-) create mode 100644 .codecov.yml create mode 100644 .github/media/screenshot.gif delete mode 100644 .gitignore delete mode 100644 CHANGELOG.md create mode 100644 LICENSE delete mode 100644 ci-testing.yaml create mode 100644 internal/hydra/consent_test.go create mode 100644 internal/hydra/login_test.go create mode 100644 internal/hydra/logout_test.go create mode 100644 internal/ldapclient/ldapclient_test.go create mode 100644 internal/stat/stat_test.go diff --git a/.codecov.yml b/.codecov.yml new file mode 100644 index 0000000..11f98b7 --- /dev/null +++ b/.codecov.yml @@ -0,0 +1,2 @@ +ignore: + - "internal/web/templates.go" \ No newline at end of file diff --git a/.github/media/screenshot.gif b/.github/media/screenshot.gif new file mode 100644 index 0000000000000000000000000000000000000000..3732f9771e1eed45d3d74cb2c77cde9fb3322f35 GIT binary patch literal 278602 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

cKM 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%0A(XJ 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÷or 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 literal 0 HcmV?d00001 diff --git a/.gitignore b/.gitignore deleted file mode 100644 index e69de29..0000000 diff --git a/.golangci.yml b/.golangci.yml index 5878dc3..e825488 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -1,7 +1,7 @@ -# Copyright (C) JSC iCore - All Rights Reserved -# -# Unauthorized copying of this file, via any medium is strictly prohibited -# Proprietary and confidential +# Copyright (c) JSC iCore. + +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. run: test: true diff --git a/CHANGELOG.md b/CHANGELOG.md deleted file mode 100644 index e2bf8f1..0000000 --- a/CHANGELOG.md +++ /dev/null @@ -1,29 +0,0 @@ -# Changelog -All notable changes to this project will be documented in this file. - -The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), -and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). - -## [1.1.1] - 2019-05-15 -### Added -- Add gopkg.i-core.ru/logutil as a logger middleware. -- Add gopkg.i-core.ru/httputil as a HTTP router. -### Changed -- Move to Golang 1.12 when build the application in Docker. -- Update golangci-lint config. -- Update the copyright. -### Removed -- Remove the HTTP handler of Prometheus's metrics. - -## [1.1.0] - 2019-05-15 -### Added -- Add support of logout flow. - -## [1.0.0] - 2019-02-18 -### Added -- Add unit tests for server's logic. - -### Changed -- The url /auth/login accepts the POST parameter login_challenge instead of challenge. -- The OIDC claim roles is enabled in the scope http://i-core.ru/claims/roles only. -- Use go.uber.org/zap without any facade. diff --git a/Dockerfile b/Dockerfile index cade9e3..872bf78 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,7 +1,7 @@ -# Copyright (C) JSC iCore - All Rights Reserved -# -# Unauthorized copying of this file, via any medium is strictly prohibited -# Proprietary and confidential +# Copyright (c) JSC iCore. + +# This source code is licensed under the MIT license found in the +# LICENSE file in the root directory of this source tree. FROM golang:1.12-alpine AS build @@ -16,7 +16,7 @@ COPY go.mod . COPY go.sum . COPY cmd cmd COPY internal internal -RUN env CGO_ENABLED=0 go install -ldflags="-w -s -X gopkg.i-core.ru/werther/cmd/werther.Version=${VERSION}" ./... +RUN env CGO_ENABLED=0 go install -ldflags="-w -s -X main.version=${VERSION}" ./... FROM scratch AS final COPY --from=build /etc/passwd /etc/passwd diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..071df6f --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2019 JSC iCore + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md index 32dd6c4..b6dc822 100644 --- a/README.md +++ b/README.md @@ -1,21 +1,61 @@ -[![GoDoc](https://godoc.das.i-core.ru/gopkg.i-core.ru/werther?status.svg)](https://godoc.das.i-core.ru/gopkg.i-core.ru/werther) +# Werther [1](#myfootnote1) -# Werther +[![GoDoc][doc-img]][doc] [![Build Status][build-img]][build] [![codecov][codecov-img]][codecov] -Werther is an identity provider for ORY Hydra that is an OAuth2 provider. +Werther is an Identity Provider for [ORY Hydra][hydra] over [LDAP][ldap]. +It implements [Login And Consent Flow][hydra-login-consent] and provides basic UI. -**Important!** -**The current version is compatible with ORY Hydra v1.0.0-rc.12 or higher.** +![screenshot](.github/media/screenshot.gif) -## Build +**Features** +- Support [Active Directory][ad]; +- Mapping LDAP attributes to OpenID Connect claims; +- Mapping LDAP groups to user roles; +- OAuth 2.0 scopes; +- Caching users roles; +- UI customization. + +**Limitations** +- Werther grants all requested permissions to a client without displaying the consent page; +- Werther confirms a logout request without displaying the logout confirmation page. + +**Requirements** + +ORY Hydra v1.0.0-rc.12 or higher. + +**Table of Contents** + + + + + +- [Installing](#installing) +- [Usage](#usage) +- [Configuration](#configuration) +- [User roles](#user-roles) +- [UI customization](#ui-customization) +- [Resources](#resources) +- [Footnotes](#footnotes) +- [Contributing](#contributing) +- [License](#license) + + + +## Installing + +### From Docker + +```bash +docker pull icoreru/werter ``` + +### From sources + +```bash go install ./... ``` -## Development - -Assume that your IP is set as $MY_HOST. The instruction will use 4444 TCP port for OAuth2 Provider Hydra, -3000 TCP port for Login Provider Werther, and 8080 TCP port for a callback. Tokens will be expired in ten minutes. +## Usage 1. Create a network: ``` @@ -27,120 +67,206 @@ Assume that your IP is set as $MY_HOST. The instruction will use 4444 TCP port f docker run --network hydra-net -d --restart always --name hydra \ -p 4444:4444 \ -p 4445:4445 \ - -e OAUTH2_EXPOSE_INTERNAL_ERRORS=true \ - -e LOG_LEVEL=debug \ - -e TTL_ACCESS_TOKEN=10m \ - -e TTL_ID_TOKEN=10m \ - -e SERVE_PUBLIC_CORS_ENABLED=true \ - -e SERVE_PUBLIC_CORS_ALLOWED_ORIGINS=http://$MY_HOST:8080 \ - -e SERVE_PUBLIC_CORS_ALLOW_CREDENTIALS=true \ - -e WEBFINGER_OIDC_DISCOVERY_SUPPORTED_SCOPES=profile,email,phone \ - -e WEBFINGER_OIDC_DISCOVERY_SUPPORTED_CLAIMS=name,family_name,given_name,nickname,email,phone_number \ -e URLS_SELF_ISSUER=http://localhost:4444 \ -e URLS_SELF_PUBLIC=http://localhost:4444 \ - -e URLS_LOGIN=http://$MY_HOST:3000/auth/login \ - -e URLS_CONSENT=http://$MY_HOST:3000/auth/consent \ - -e URLS_LOGOUT=http://$MY_HOST:3000/auth/logout \ + -e URLS_LOGIN=http://localhost:8080/auth/login \ + -e URLS_CONSENT=http://localhost:8080/auth/consent \ + -e URLS_LOGOUT=http://localhost:8080/auth/logout \ + -e WEBFINGER_OIDC_DISCOVERY_SUPPORTED_SCOPES=profile,email,phone \ + -e WEBFINGER_OIDC_DISCOVERY_SUPPORTED_CLAIMS=name,family_name,given_name,nickname,email,phone_number \ -e DSN=memory \ - oryd/hydra:v1.0.0-rc.12 serve all --dangerous-force-http + oryd/hydra:v1.0.0-rc.12 serve all ``` - You can learn additional properties with help command: - ``` - docker run -it --rm oryd/hydra:v1.0.0-rc.12 serve --help - ``` + Look for details in [ORY Hydra Configuration][hydra-doc-config] and [ORY Hydra Documentation][hydra-doc]. -3. Register a client: +3. Run Werther: ``` - docker run -it --rm --network hydra-net \ - -e HYDRA_ADMIN_URL=http://hydra:4445 \ - oryd/hydra:$HYDRA_VERSION clients create \ - --skip-tls-verify \ - --id test-client \ - --secret test-secret \ - --response-types id_token,token,"id_token token" \ - --grant-types implicit \ - --scope openid,profile,email \ - --callbacks http://$MY_HOST:8080 \ - --post-logout-callbacks http://$MY_HOST:8080/post-logout-callback - ``` - -4. Run Werther: - ``` - docker run --network hydra-net -d --restart always --name werther -p 3000:8080 \ + docker run --network hydra-net -d --restart always --name werther \ + -p 8080:8080 \ -e WERTHER_IDENTP_HYDRA_URL=http://hydra:4445 \ - -e WERTHER_LDAP_ENDPOINTS=icdc0.icore.local:389,icdc1.icore.local:389 \ - -e WERTHER_LDAP_BINDDN= \ - -e WERTHER_LDAP_BINDPW= \ - -e WERTHER_LDAP_BASEDN="DC=icore,DC=local" \ - -e WERTHER_LDAP_ROLE_BASEDN="OU=AppRoles,OU=Domain Groups,DC=icore,DC=local" \ - hub.das.i-core.ru/p/base-werther + -e WERTHER_LDAP_ENDPOINTS=icdc0.example.local:389,icdc1.example.local:389 \ + -e WERTHER_LDAP_BINDDN= \ + -e WERTHER_LDAP_BINDPW= \ + -e WERTHER_LDAP_BASEDN="DC=example,DC=local" \ + -e WERTHER_LDAP_ROLE_BASEDN="OU=AppRoles,OU=Domain Groups,DC=example,DC=local" \ + icoreru/werther ``` - For all options see option help: - ``` - docker run -it --rm hub.das.i-core.ru/p/base-werther -help - ``` +## Configuration -5. Start an authentication process in a browser to get an access token: - ``` - open http://$MY_HOST:4444/oauth2/auth?client_id=test-client&response_type=token&scope=openid%20profile%20email&state=12345678 - ``` -6. Start an authentication process in a browser to get an access token and id token: - ``` - open http://$MY_HOST:4444/oauth2/auth?client_id=test-client&response_type=id_token%20token&scope=openid%20profile%20email&state=12345678&nonce=87654321 - ``` +The application is configured via environment variables. +Names of the environment variables starts with prefix `WERTHER_`. +See a list of the environment variables using the command: -7. Get user info: - ``` - http get "http://$MY_HOST:4444/userinfo" "Authorization: Bearer " - ``` +``` +werther -h +``` - For example, you can get the next output: - ``` - HTTP/1.1 200 OK - Content-Length: 218 - Content-Type: application/json - Date: Tue, 31 Jul 2018 17:17:51 GMT - Vary: Origin +## User roles +In LDAP user's roles are groups in which a user is a member. + +The environment variable `WERTHER_LDAP_ROLE_DN` is a DN for searching roles. + +For example, create an OU that repserents an application, and then in the created OU +create groups that represent application's roles: + +``` +DC=local +|-- OU=Domain Groups + |-- OU=AppRoles + |-- OU=App1 + |-- CN=app1_role1 (objectClass="group", description="role1") + |-- CN=app1_role2 (objectClass="group", description="role2") +``` + +Run Werther with the environment variable `WERTHER_LDAP_ROLE_DN` +that equals to `OU=AppRoles,OU=Domain Groups,DC=local`. + +In the above example Werther returns user's roles as a value +of the user role's claim `https://github.com/i-core/werther/claims/roles`. + +```json +{ + "https://github.com/i-core/werther/claims/roles": { + "App1": ["role1", "role2"], + } +} +``` + +To customize the roles claim's name you should set a value of the environment variable `WERTHER_LDAP_ROLE_CLAIM`. +For more details about claims naming see [OpenID Connect Core 1.0][oidc-spec-additional-claims]. + +**NB** There are cases when we need to create several roles with the same name in LDAP. +For example, when we want to configure multiple applications or several environments for the same application. + +``` +DC=local +|-- OU=Domain Groups + |-- OU=AppRoles + |-- OU=Test + |-- OU=App1 + |-- CN=test_app1_role1 (objectClass="group", description="role1") + |-- CN=test_app1_role2 (objectClass="group", description="role2") + |-- OU=App2 + |-- CN=test_app2_role1 (objectClass="group",description-"role1") + |-- CN=test_app2_role2 (objectClass="group",description-"role2") + |-- OU=Dev + |-- OU=App1 + |-- CN=dev_app1_role1 (objectClass="group", description="role1") + |-- CN=dev_app1_role3 (objectClass="group", description="role3") + |-- OU=App2 + |-- CN=dev_app2_role1 (objectClass="group",description-"role1") + |-- CN=dev_app2_role4 (objectClass="group",description-"role4") +``` + +Active Directory requires unique CNs in a domain. But in Active Directory +creating groups with the same CN in different OUs is difficult. +Because of it, Werther uses a LDAP attribute as a role's name instead of CN. +A name of a LDAP attribute is specified using the environment variable `WERTHER_LDAP_ROLE_ATTR`, +and has the default value `description`. + +In the above example, Werther returns a response that contains the next roles: +* when the environment variable `WERTHER_LDAP_ROLE_DN` equals to `OU=Test,OU=AppRoles,OU=Domain Groups,DC=local`: + ```json { - "email": "klepa@i-core.ru", - "family_name": "Lepa", - "given_name": "Konstantin", - "http://i-core.ru/claims/roles": { - "HeraldTest1": [ - "user" - ] - }, - "name": "Konstantin Lepa", - "sub": "CN=Konstantin Lepa,OU=Domain Users,DC=icore,DC=local" + "https://github.com/i-core/werther/claims/roles": { + "App1": ["role1", "role2"], + "App2": ["role1", "role2"] + } + } + ``` +* when the environment variable `WERTHER_LDAP_ROLE_DN` equals to `OU=Dev,OU=AppRoles,OU=Domain Groups,DC=local`: + ```json + { + "https://github.com/i-core/werther/claims/roles": { + "App1": ["role1", "role3"], + "App2": ["role1", "role4"] + } } ``` - Look for details in [OpenID Connect Core 1.0](https://openid.net/specs/openid-connect-core-1_0.html#ClaimsParameter). +## UI customization -8. Re-get a token by httpie: - ``` - http --session u1 -F -v get \ - "http://$MY_HOST:4444/oauth2/auth?client_id=test-client&response_type=token&scope=openid%20profile&state=12345678&prompt=none" \ - "Cookie:" - ``` +Werther uses the Go templates to render UI pages. +To customize the UI you should create a directory that contains UI pages' templates. +After that you should set the directory path to the environment variable `WERTHER_WEB_DIR`: -9. Delete a user's session from a browser: - ``` - open "http://$MY_HOST:4444/oauth2/auth/sessions/login/revoke" - ``` +```bash +docker run --network hydra-net -d --restart always --name werther \ + -p 8080:8080 \ + -v /opt/werther/web:/path/to/custom-login-page/dir \ + -e WERTHER_IDENTP_HYDRA_URL=http://hydra:4445 \ + -e WERTHER_LDAP_ENDPOINTS=icdc0.example.local:389,icdc1.example.local:389 \ + -e WERTHER_LDAP_BINDDN= \ + -e WERTHER_LDAP_BINDPW= \ + -e WERTHER_LDAP_BASEDN="DC=example,DC=local" \ + -e WERTHER_LDAP_ROLE_BASEDN="OU=AppRoles,OU=Domain Groups,DC=example,DC=local" \ + -e WERTHER_WEB_DIR=/opt/werther/web + icoreru/werther +``` -10. Log a user out from a browser: - ``` - open http://$MY_HOST:4444/oauth2/sessions/logout?id_token_hint=&post_logout_redirect_uri=http://$MY_HOST:8080/post-logout-callback&state=87654321 - ``` - After a successful logout, a user will be redirected to the page "http://$MY_HOST:8080/post-logout-callback?state=87654321". +### Custom login page +A login page's template should contains blocks `title`, `style`, `script`, `content`. +Each block has access to data that is an object with the next properties: +- `CSRFToken` (string) - a CSRF token; +- `Challenge` (string) - a login challenge ID; +- `LoginURL` (string) - an endpoint that finishes the login process; +- `IsInvalidCredentials` (bool) - specifies that a user types an invalid username or password; +- `IsInternalError` (bool) specifies that an internal server error happens when finishing the login process. -11. (Optional) Sniff TCP packets between Hydra and Werther - ``` - docker run -it --rm --net=container:hydra nicolaka/netshoot tcpdump -i eth0 -A -nn port 4444 - ``` +When a login page's template contains static resources (like styles, scripts, and images) +they must be placed in a subdirectory called `static`. +For a full example of a login page's template see [source code](internal/web/templates). + +## Resources + +- [Introduction to ORY Hydra, OAuth 2.0, and OpenID Connect][hydra-doc]; +- [ORY Hydra: Integrating with (existing) User Management][hydra-login-consent]; +- [Official User Login & Consent Example](https://github.com/ory/hydra-login-consent-node); +- [OpenID Connect Core 1.0][oidc-spec-core]; +- [OpenID Connect Session Management 1.0][oidc-spec-session]; +- [OpenID Connect Front-Channel Logout 1.0][oidc-spec-front-channel-logout]; +- [OpenID Connect Back-Channel Logout 1.0][oidc-spec-back-channel-logout]. + +## Footnotes + +1. Werther is named after robot Werther from [Guest from the Future](https://en.wikipedia.org/wiki/Guest_from_the_Future). + +## Contributing + +Thanks for your interest in contributing to this project. +Get started with our [Contributing Guide][contrib]. + +## License + +The code in this project is licensed under [MIT license][license]. + +[doc-img]: https://godoc.org/github.com/i-core/werther?status.svg +[doc]: https://godoc.org/github.com/i-core/werther + +[build-img]: https://travis-ci.com/i-core/werther.svg?branch=master +[build]: https://travis-ci.com/i-core/werther + +[codecov-img]: https://codecov.io/gh/i-core/werther/branch/master/graph/badge.svg +[codecov]: https://codecov.io/gh/i-core/werther + +[contrib]: https://github.com/i-core/.github/blob/master/CONTRIBUTING.md +[license]: LICENSE + +[ldap]: https://ldap.com/ +[ad]: https://docs.microsoft.com/ru-ru/windows/desktop/AD/active-directory-domain-services + +[hydra]: https://www.ory.sh/ +[hydra-doc]: https://www.ory.sh/docs/hydra/ +[hydra-login-consent]: https://www.ory.sh/docs/hydra/oauth2 +[hydra-doc-config]: https://www.ory.sh/docs/hydra/configuration + +[oidc-spec-core]: https://openid.net/specs/openid-connect-core-1_0.html +[oidc-spec-additional-claims]: https://openid.net/specs/openid-connect-core-1_0.html#AdditionalClaims +[oidc-spec-session]: https://openid.net/specs/openid-connect-session-1_0.html +[oidc-spec-front-channel-logout]: https://openid.net/specs/openid-connect-frontchannel-1_0.html +[oidc-spec-back-channel-logout]: https://openid.net/specs/openid-connect-backchannel-1_0.html \ No newline at end of file diff --git a/ci-testing.yaml b/ci-testing.yaml deleted file mode 100644 index 6f70358..0000000 --- a/ci-testing.yaml +++ /dev/null @@ -1,4 +0,0 @@ -- image: golang:1.11-alpine - shell: go test -v ./... -- image: golangci/golangci-lint:v1.16.0 - shell: golangci-lint -v run diff --git a/cmd/werther/main.go b/cmd/werther/main.go index 5b0a55f..c4fb7d0 100644 --- a/cmd/werther/main.go +++ b/cmd/werther/main.go @@ -1,11 +1,11 @@ /* -Copyright (C) JSC iCore - All Rights Reserved +Copyright (c) JSC iCore. -Unauthorized copying of this file, via any medium is strictly prohibited -Proprietary and confidential +This source code is licensed under the MIT license found in the +LICENSE file in the root directory of this source tree. */ -package main // import "gopkg.i-core.ru/werther/cmd/werther" +package main // import "github.com/i-core/werther/cmd/werther" import ( "flag" @@ -13,27 +13,27 @@ import ( "net/http" "os" + "github.com/i-core/rlog" + "github.com/i-core/routegroup" + "github.com/i-core/werther/internal/identp" + "github.com/i-core/werther/internal/ldapclient" + "github.com/i-core/werther/internal/stat" + "github.com/i-core/werther/internal/web" "github.com/justinas/nosurf" "github.com/kelseyhightower/envconfig" "go.uber.org/zap" - "gopkg.i-core.ru/httputil" - "gopkg.i-core.ru/logutil" - "gopkg.i-core.ru/werther/internal/identp" - "gopkg.i-core.ru/werther/internal/ldapclient" - "gopkg.i-core.ru/werther/internal/stat" - "gopkg.i-core.ru/werther/internal/web" ) -// Version will be filled at compile time. -var Version = "" +// version will be filled at compile time. +var version = "" // Config is a server's configuration. type Config struct { DevMode bool `envconfig:"dev_mode" default:"false" desc:"a development mode"` Listen string `default:":8080" desc:"a host and port to listen on (:)"` - Web web.Config Identp identp.Config LDAP ldapclient.Config + Web web.Config } func main() { @@ -49,7 +49,7 @@ func main() { flag.Parse() if *verflag { - fmt.Println("werther", Version) + fmt.Println("werther", version) os.Exit(0) } @@ -77,12 +77,12 @@ func main() { ldap := ldapclient.New(cnf.LDAP) - router := httputil.NewRouter(nosurf.NewPure, logutil.RequestLog(log)) + router := routegroup.NewRouter(nosurf.NewPure, rlog.NewMiddleware(log)) router.AddRoutes(web.NewStaticHandler(cnf.Web), "/static") router.AddRoutes(identp.NewHandler(cnf.Identp, ldap, htmlRenderer), "/auth") - router.AddRoutes(stat.NewHandler(Version), "/stat") + router.AddRoutes(stat.NewHandler(version), "/stat") log = log.Named("main") - log.Info("Werther started", zap.Any("config", cnf), zap.String("version", Version)) + log.Info("Werther started", zap.Any("config", cnf), zap.String("version", version)) log.Fatal("Werther finished", zap.Error(http.ListenAndServe(cnf.Listen, router))) } diff --git a/cmd/werther/tools.go b/cmd/werther/tools.go index 6c5ff18..f8ea6bb 100644 --- a/cmd/werther/tools.go +++ b/cmd/werther/tools.go @@ -1,10 +1,10 @@ // +build tools /* -Copyright (C) JSC iCore - All Rights Reserved +Copyright (c) JSC iCore. -Unauthorized copying of this file, via any medium is strictly prohibited -Proprietary and confidential +This source code is licensed under the MIT license found in the +LICENSE file in the root directory of this source tree. */ package main diff --git a/go.mod b/go.mod index ead1e11..2141325 100644 --- a/go.mod +++ b/go.mod @@ -1,4 +1,4 @@ -module gopkg.i-core.ru/werther +module github.com/i-core/werther require ( github.com/OneOfOne/xxhash v1.2.2 // indirect @@ -7,22 +7,15 @@ require ( github.com/coocood/freecache v1.0.1 github.com/davecgh/go-spew v1.1.1 // indirect github.com/elazarl/go-bindata-assetfs v1.0.0 - github.com/gofrs/uuid v3.2.0+incompatible // indirect - github.com/julienschmidt/httprouter v1.2.0 // indirect - github.com/justinas/alice v0.0.0-20171023064455-03f45bd4b7da // indirect + github.com/i-core/rlog v1.0.0 + github.com/i-core/routegroup v1.0.0 github.com/justinas/nosurf v0.0.0-20171023064657-7182011986c4 github.com/kelseyhightower/envconfig v1.3.0 github.com/kevinburke/go-bindata v3.13.0+incompatible github.com/pkg/errors v0.8.1 - github.com/pmezard/go-difflib v1.0.0 // indirect github.com/sergi/go-diff v1.0.0 // indirect github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72 // indirect - github.com/stretchr/testify v1.2.2 // indirect - go.uber.org/atomic v1.2.0 // indirect - go.uber.org/multierr v1.1.0 // indirect - go.uber.org/zap v1.9.1 - gopkg.i-core.ru/httputil v1.0.0 - gopkg.i-core.ru/logutil v1.0.0 + go.uber.org/zap v1.10.0 gopkg.in/asn1-ber.v1 v1.0.0-20170511165959-379148ca0225 // indirect gopkg.in/ldap.v2 v2.5.1 ) diff --git a/go.sum b/go.sum index 564515c..7d179e9 100644 --- a/go.sum +++ b/go.sum @@ -6,12 +6,17 @@ github.com/cespare/xxhash v1.0.0 h1:naDmySfoNg0nKS62/ujM6e71ZgM2AoVdaqGwMG0w18A= github.com/cespare/xxhash v1.0.0/go.mod h1:fX/lfQBkSCDXZSUgv6jVIu/EVA3/JNseAX5asI4c4T4= github.com/coocood/freecache v1.0.1 h1:oFyo4msX2c0QIKU+kuMJUwsKamJ+AKc2JJrKcMszJ5M= github.com/coocood/freecache v1.0.1/go.mod h1:ePwxCDzOYvARfHdr1pByNct1at3CoKnsipOHwKlNbzI= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/elazarl/go-bindata-assetfs v1.0.0 h1:G/bYguwHIzWq9ZoyUQqrjTmJbbYn3j3CKKpKinvZLFk= github.com/elazarl/go-bindata-assetfs v1.0.0/go.mod h1:v+YaWX3bdea5J/mo8dSETolEo7R71Vk1u8bnjau5yw4= github.com/gofrs/uuid v3.2.0+incompatible h1:y12jRkkFxsd7GpqdSZ+/KCs/fJbqpEXSGd4+jfEaewE= github.com/gofrs/uuid v3.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= +github.com/i-core/rlog v1.0.0 h1:8CY2rsqvm3Z9cfl3hroppn8LTBwbtL45+ho79JTz8Jg= +github.com/i-core/rlog v1.0.0/go.mod h1:wTQKCF9IKx2HlNQ2M7dUpP3zIOD5ayqF4X3uQFbwY3g= +github.com/i-core/routegroup v1.0.0 h1:kTFVBWTWoT2vbhpk0PDemW3GEKV/DwAkQ3qjKnTNygI= +github.com/i-core/routegroup v1.0.0/go.mod h1:wXq5xEjOOs8xuM2olbaAlxgUbP/u8mVaW0tM/09cmKU= github.com/julienschmidt/httprouter v1.2.0 h1:TDTW5Yz1mjftljbcKqRcrYhd4XeOoI98t+9HbQbYf7g= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/justinas/alice v0.0.0-20171023064455-03f45bd4b7da h1:5y58+OCjoHCYB8182mpf/dEsq0vwTKPOo4zGfH0xW9A= @@ -30,18 +35,15 @@ github.com/sergi/go-diff v1.0.0 h1:Kpca3qRNrduNnOQeazBd0ysaKrUJiIuISHxogkT9RPQ= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72 h1:qLC7fQah7D6K1B0ujays3HV9gkFtllcxhzImRR7ArPQ= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1w= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -go.uber.org/atomic v1.2.0 h1:yVVGhClJ8Xi1y4TxhJZE6QFPrz76BrzhWA01n47mSFk= -go.uber.org/atomic v1.2.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +go.uber.org/atomic v1.4.0 h1:cxzIVoETapQEqDhQu3QfnvXAV4AlzcvUCxkVUFw3+EU= +go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/multierr v1.1.0 h1:HoEmRHQPVSqub6w2z2d2EOVs2fjyFRGyofhKuyDq0QI= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= -go.uber.org/zap v1.9.1 h1:XCJQEf3W6eZaVwhRBof6ImoYGJSITeKWsyeh3HFu/5o= -go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -gopkg.i-core.ru/httputil v1.0.0 h1:A+6RPcU8pNvA/Zf+0Oy9iozyrwycmvDGSCdqgea2/qo= -gopkg.i-core.ru/httputil v1.0.0/go.mod h1:OrmzAZNj0BuwD6hHQ9tUVQZXVhdm7H9OMP5jbN7D8ro= -gopkg.i-core.ru/logutil v1.0.0 h1:KsUIPn1D2UktdMgkiWzXeA2QqzTJIPAgdApJxQSeiOM= -gopkg.i-core.ru/logutil v1.0.0/go.mod h1:FD71nyLCA6P3gkV1WVyvfEtKtS3M+HQXpuUtQT11rrw= +go.uber.org/zap v1.10.0 h1:ORx85nbTijNz8ljznvCMR1ZBIPKFn3jQrag10X2AsuM= +go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= gopkg.in/asn1-ber.v1 v1.0.0-20170511165959-379148ca0225 h1:JBwmEvLfCqgPcIq8MjVMQxsF3LVL4XG/HH0qiG0+IFY= gopkg.in/asn1-ber.v1 v1.0.0-20170511165959-379148ca0225/go.mod h1:cuepJuh7vyXfUyUwEgHQXw849cJrilpS5NeIjOWESAw= gopkg.in/ldap.v2 v2.5.1 h1:wiu0okdNfjlBzg6UWvd1Hn8Y+Ux17/u/4nlk4CQr6tU= diff --git a/internal/hydra/consent.go b/internal/hydra/consent.go index 846dcdf..dcac815 100644 --- a/internal/hydra/consent.go +++ b/internal/hydra/consent.go @@ -1,8 +1,8 @@ /* -Copyright (C) JSC iCore - All Rights Reserved +Copyright (c) JSC iCore. -Unauthorized copying of this file, via any medium is strictly prohibited -Proprietary and confidential +This source code is licensed under the MIT license found in the +LICENSE file in the root directory of this source tree. */ package hydra diff --git a/internal/hydra/consent_test.go b/internal/hydra/consent_test.go new file mode 100644 index 0000000..85e43ab --- /dev/null +++ b/internal/hydra/consent_test.go @@ -0,0 +1,240 @@ +package hydra_test + +import ( + "encoding/json" + "fmt" + "net/http" + "net/http/httptest" + "reflect" + "strconv" + "testing" + + "github.com/i-core/werther/internal/hydra" + "github.com/pkg/errors" +) + +func TestInitiateConsentRequest(t *testing.T) { + testCases := []struct { + name string + challenge string + rememberFor int + reqInfo *hydra.ReqInfo + status int + wantErr error + }{ + { + name: "challenge is missed", + wantErr: hydra.ErrChallengeMissed, + }, + { + name: "challenge is not found", + challenge: "foo", + status: 404, + wantErr: hydra.ErrChallengeNotFound, + }, + { + name: "challenge is expired", + challenge: "foo", + status: 409, + wantErr: hydra.ErrChallengeExpired, + }, + { + name: "happy path", + challenge: "foo", + status: 200, + reqInfo: &hydra.ReqInfo{ + Challenge: "foo", + RequestedScopes: []string{"profile", "email"}, + Skip: true, + Subject: "testSubject", + }, + }, + } + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + h := &testInitiateConsentHandler{reqInfo: tc.reqInfo, status: tc.status} + srv := httptest.NewServer(h) + defer srv.Close() + ldr := hydra.NewConsentReqDoer(srv.URL, tc.rememberFor) + + reqInfo, err := ldr.InitiateRequest(tc.challenge) + + if tc.wantErr != nil { + if err == nil { + t.Fatalf("\ngot no errors\nwant error:\n\t%s", tc.wantErr) + } + err = errors.Cause(err) + if err != tc.wantErr { + t.Fatalf("\ngot error:\n\t%s\nwant error:\n\t%s", err, tc.wantErr) + } + return + } + + if err != nil { + t.Fatalf("\ngot error:\n\t%s\nwant no errors", err) + } + + if h.challenge != tc.challenge { + t.Errorf("\ngot challenge:\n\t%#v\nwant challenge:\n\t%#v", h.challenge, tc.challenge) + } + if !reflect.DeepEqual(tc.reqInfo, reqInfo) { + t.Errorf("\ngot request info:\n\t%#v\nwant request info:\n\t%#v", reqInfo, tc.reqInfo) + } + }) + } +} + +type testInitiateConsentHandler struct { + reqInfo *hydra.ReqInfo + status int + challenge string +} + +func (h *testInitiateConsentHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet || r.URL.Path != "/oauth2/auth/requests/consent" { + w.WriteHeader(http.StatusMethodNotAllowed) + if err := json.NewEncoder(w).Encode(map[string]interface{}{"error": http.StatusText(http.StatusMethodNotAllowed)}); err != nil { + panic(fmt.Sprintf("initial request: failed to write response: %s", err)) + } + return + } + h.challenge = r.URL.Query().Get("consent_challenge") + w.WriteHeader(h.status) + if h.status == http.StatusOK { + if err := json.NewEncoder(w).Encode(h.reqInfo); err != nil { + panic(fmt.Sprintf("initial request: failed to write response: %s", err)) + } + } +} + +func TestAcceptConsentRequest(t *testing.T) { + testCases := []struct { + name string + challenge string + rememberFor int + remember bool + grantScope []interface{} + idToken string + status int + redirect string + wantErr error + }{ + { + name: "challenge is missed", + wantErr: hydra.ErrChallengeMissed, + }, + { + name: "challenge is not found", + challenge: "foo", + rememberFor: 10, + remember: true, + grantScope: []interface{}{"scope1", "scope2"}, + idToken: "testToken", + status: http.StatusNotFound, + wantErr: hydra.ErrChallengeNotFound, + }, + { + name: "happy path", + challenge: "foo", + rememberFor: 10, + remember: true, + grantScope: []interface{}{"scope1", "scope2"}, + idToken: "testToken", + status: http.StatusOK, + redirect: "/test-redirect", + }, + } + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + h := &testAcceptConsentHandler{challenge: tc.challenge, status: tc.status, redirect: tc.redirect} + srv := httptest.NewServer(h) + defer srv.Close() + ldr := hydra.NewConsentReqDoer(srv.URL, tc.rememberFor) + + var grantScope []string + for _, v := range tc.grantScope { + grantScope = append(grantScope, v.(string)) + } + redirect, err := ldr.AcceptConsentRequest(tc.challenge, tc.remember, grantScope, tc.idToken) + + if tc.wantErr != nil { + if err == nil { + t.Fatalf("\ngot no errors\nwant error:\n\t%s", tc.wantErr) + } + err = errors.Cause(err) + if err.Error() != tc.wantErr.Error() { + t.Fatalf("\ngot error:\n\t%s\nwant error:\n\t%s", err, tc.wantErr) + } + return + } + + if err != nil { + t.Fatalf("\ngot error:\n\t%s\nwant no errors", err) + } + + if h.challenge != tc.challenge { + t.Errorf("\ngot challenge:\n\t%#v\nwant challenge:\n\t%#v", h.challenge, tc.challenge) + } + wantData := map[string]interface{}{ + "grant_scope": tc.grantScope, + "remember": tc.remember, + "remember_for": tc.rememberFor, + "session": map[string]interface{}{"id_token": tc.idToken}, + } + if !reflect.DeepEqual(h.data, wantData) { + t.Errorf("\ngot request data:\n\t%#v\nwant request data:\n\t%#v", h.data, wantData) + } + if redirect != tc.redirect { + t.Errorf("\ngot redirect URL:\n\t%#v\nwant redirect URL:\n\t%#v", redirect, tc.redirect) + } + }) + } +} + +type testAcceptConsentHandler struct { + challenge string + data map[string]interface{} + status int + redirect string +} + +func (h *testAcceptConsentHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodPut || r.URL.Path != "/oauth2/auth/requests/consent/accept" { + http.Error(w, http.StatusText(http.StatusMethodNotAllowed), http.StatusMethodNotAllowed) + return + } + + h.challenge = r.URL.Query().Get("consent_challenge") + w.WriteHeader(h.status) + if r.Body != http.NoBody { + // Note: Go JSON Decoder decodes numbers as float64, but we need int. + // So we convert numbers to int manually. + var raw map[string]json.RawMessage + if err := json.NewDecoder(r.Body).Decode(&raw); err != nil { + panic(fmt.Sprintf("accept request: failed to read request body: %s", err)) + } + h.data = make(map[string]interface{}, len(raw)) + for key, val := range raw { + s := string(val) + if i, err := strconv.Atoi(s); err == nil { + h.data[key] = i + continue + } + if f, err := strconv.ParseFloat(s, 64); err == nil { + h.data[key] = f + continue + } + var v interface{} + if err := json.Unmarshal(val, &v); err == nil { + h.data[key] = v + continue + } + h.data[key] = val + } + } + if h.status == http.StatusOK { + if err := json.NewEncoder(w).Encode(map[string]interface{}{"redirect_to": h.redirect}); err != nil { + panic(fmt.Sprintf("accept request: failed to write response: %s", err)) + } + } +} diff --git a/internal/hydra/hydra.go b/internal/hydra/hydra.go index bbf7335..8e14479 100644 --- a/internal/hydra/hydra.go +++ b/internal/hydra/hydra.go @@ -1,8 +1,8 @@ /* -Copyright (C) JSC iCore - All Rights Reserved +Copyright (c) JSC iCore. -Unauthorized copying of this file, via any medium is strictly prohibited -Proprietary and confidential +This source code is licensed under the MIT license found in the +LICENSE file in the root directory of this source tree. */ package hydra @@ -18,6 +18,8 @@ import ( ) var ( + // ErrChallengeMissed is an error that happens when a challenge is missed. + ErrChallengeMissed = errors.New("challenge missed") // ErrUnauthenticated is an error that happens when authentication is failed. ErrUnauthenticated = errors.New("unauthenticated") // ErrChallengeNotFound is an error that happens when an unknown challenge is used. @@ -43,6 +45,9 @@ type ReqInfo struct { } func initiateRequest(typ reqType, hydraURL, challenge string) (*ReqInfo, error) { + if challenge == "" { + return nil, ErrChallengeMissed + } ref, err := url.Parse(fmt.Sprintf("oauth2/auth/requests/%[1]s?%[1]s_challenge=%s", string(typ), challenge)) if err != nil { return nil, err @@ -72,6 +77,9 @@ func initiateRequest(typ reqType, hydraURL, challenge string) (*ReqInfo, error) } func acceptRequest(typ reqType, hydraURL, challenge string, data interface{}) (string, error) { + if challenge == "" { + return "", ErrChallengeMissed + } ref, err := url.Parse(fmt.Sprintf("oauth2/auth/requests/%[1]s/accept?%[1]s_challenge=%s", string(typ), challenge)) if err != nil { return "", err diff --git a/internal/hydra/login.go b/internal/hydra/login.go index 6571260..091fcd8 100644 --- a/internal/hydra/login.go +++ b/internal/hydra/login.go @@ -1,8 +1,8 @@ /* -Copyright (C) JSC iCore - All Rights Reserved +Copyright (c) JSC iCore. -Unauthorized copying of this file, via any medium is strictly prohibited -Proprietary and confidential +This source code is licensed under the MIT license found in the +LICENSE file in the root directory of this source tree. */ package hydra diff --git a/internal/hydra/login_test.go b/internal/hydra/login_test.go new file mode 100644 index 0000000..01a9821 --- /dev/null +++ b/internal/hydra/login_test.go @@ -0,0 +1,246 @@ +package hydra_test + +import ( + "encoding/json" + "fmt" + "net/http" + "net/http/httptest" + "reflect" + "strconv" + "testing" + + "github.com/i-core/werther/internal/hydra" + "github.com/pkg/errors" +) + +func TestInitiateLoginRequest(t *testing.T) { + testCases := []struct { + name string + challenge string + reqInfo *hydra.ReqInfo + status int + wantErr error + }{ + { + name: "challenge is missed", + wantErr: hydra.ErrChallengeMissed, + }, + { + name: "unauthenticated", + challenge: "foo", + status: 401, + wantErr: hydra.ErrUnauthenticated, + }, + { + name: "challenge is not found", + challenge: "foo", + status: 404, + wantErr: hydra.ErrChallengeNotFound, + }, + { + name: "challenge is expired", + challenge: "foo", + status: 409, + wantErr: hydra.ErrChallengeExpired, + }, + { + name: "happy path", + challenge: "foo", + status: 200, + reqInfo: &hydra.ReqInfo{ + Challenge: "foo", + RequestedScopes: []string{"profile", "email"}, + Skip: true, + Subject: "testSubject", + }, + }, + } + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + h := &testInitiateLoginHandler{reqInfo: tc.reqInfo, status: tc.status} + srv := httptest.NewServer(h) + defer srv.Close() + ldr := hydra.NewLoginReqDoer(srv.URL, 0) + + reqInfo, err := ldr.InitiateRequest(tc.challenge) + + if tc.wantErr != nil { + if err == nil { + t.Fatalf("\ngot no errors\nwant error:\n\t%s", tc.wantErr) + } + err = errors.Cause(err) + if err != tc.wantErr { + t.Fatalf("\ngot error:\n\t%s\nwant error:\n\t%s", err, tc.wantErr) + } + return + } + + if err != nil { + t.Fatalf("\ngot error:\n\t%s\nwant no errors", err) + } + + if h.challenge != tc.challenge { + t.Errorf("\ngot challenge:\n\t%#v\nwant challenge:\n\t%#v", h.challenge, tc.challenge) + } + if !reflect.DeepEqual(tc.reqInfo, reqInfo) { + t.Errorf("\ngot request info:\n\t%#v\nwant request info:\n\t%#v", reqInfo, tc.reqInfo) + } + }) + } +} + +type testInitiateLoginHandler struct { + reqInfo *hydra.ReqInfo + status int + challenge string +} + +func (h *testInitiateLoginHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet || r.URL.Path != "/oauth2/auth/requests/login" { + w.WriteHeader(http.StatusMethodNotAllowed) + if err := json.NewEncoder(w).Encode(map[string]interface{}{"error": http.StatusText(http.StatusMethodNotAllowed)}); err != nil { + panic(fmt.Sprintf("initial request: failed to write response: %s", err)) + } + return + } + h.challenge = r.URL.Query().Get("login_challenge") + w.WriteHeader(h.status) + if h.status == http.StatusOK { + if err := json.NewEncoder(w).Encode(h.reqInfo); err != nil { + panic(fmt.Sprintf("initial request: failed to write response: %s", err)) + } + } +} + +func TestAcceptLoginRequest(t *testing.T) { + testCases := []struct { + name string + challenge string + rememberFor int + remember bool + subject string + status int + redirect string + wantErr error + }{ + { + name: "challenge is missed", + wantErr: hydra.ErrChallengeMissed, + }, + { + name: "unauthenticated", + challenge: "foo", + rememberFor: 10, + remember: true, + subject: "testSubject", + status: http.StatusUnauthorized, + wantErr: hydra.ErrUnauthenticated, + }, + { + name: "challenge is not found", + challenge: "foo", + rememberFor: 10, + remember: true, + subject: "testSubject", + status: http.StatusNotFound, + wantErr: hydra.ErrChallengeNotFound, + }, + { + name: "happy path", + challenge: "foo", + rememberFor: 10, + remember: true, + subject: "testSubject", + status: http.StatusOK, + redirect: "/test-redirect", + }, + } + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + h := &testAcceptLoginHandler{challenge: tc.challenge, status: tc.status, redirect: tc.redirect} + srv := httptest.NewServer(h) + defer srv.Close() + ldr := hydra.NewLoginReqDoer(srv.URL, tc.rememberFor) + + redirect, err := ldr.AcceptLoginRequest(tc.challenge, tc.remember, tc.subject) + + if tc.wantErr != nil { + if err == nil { + t.Fatalf("\ngot no errors\nwant error:\n\t%s", tc.wantErr) + } + err = errors.Cause(err) + if err.Error() != tc.wantErr.Error() { + t.Fatalf("\ngot error:\n\t%s\nwant error:\n\t%s", err, tc.wantErr) + } + return + } + + if err != nil { + t.Fatalf("\ngot error:\n\t%s\nwant no errors", err) + } + + if h.challenge != tc.challenge { + t.Errorf("\ngot challenge:\n\t%#v\nwant challenge:\n\t%#v", h.challenge, tc.challenge) + } + wantData := map[string]interface{}{ + "remember": tc.remember, + "remember_for": tc.rememberFor, + "subject": tc.subject, + } + if !reflect.DeepEqual(h.data, wantData) { + t.Errorf("\ngot request data:\n\t%#v\nwant request data:\n\t%#v", h.data, wantData) + } + if redirect != tc.redirect { + t.Errorf("\ngot redirect URL:\n\t%#v\nwant redirect URL:\n\t%#v", redirect, tc.redirect) + } + }) + } +} + +type testAcceptLoginHandler struct { + challenge string + data map[string]interface{} + status int + redirect string +} + +func (h *testAcceptLoginHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodPut || r.URL.Path != "/oauth2/auth/requests/login/accept" { + http.Error(w, http.StatusText(http.StatusMethodNotAllowed), http.StatusMethodNotAllowed) + return + } + + h.challenge = r.URL.Query().Get("login_challenge") + w.WriteHeader(h.status) + if r.Body != http.NoBody { + // Note: Go JSON Decoder decodes numbers as float64, but we need int. + // So we convert numbers to int manually. + var raw map[string]json.RawMessage + if err := json.NewDecoder(r.Body).Decode(&raw); err != nil { + panic(fmt.Sprintf("accept request: failed to read request body: %s", err)) + } + h.data = make(map[string]interface{}, len(raw)) + for key, val := range raw { + s := string(val) + if i, err := strconv.Atoi(s); err == nil { + h.data[key] = i + continue + } + if f, err := strconv.ParseFloat(s, 64); err == nil { + h.data[key] = f + continue + } + var v interface{} + if err := json.Unmarshal(val, &v); err == nil { + h.data[key] = v + continue + } + h.data[key] = val + } + } + if h.status == http.StatusOK { + if err := json.NewEncoder(w).Encode(map[string]interface{}{"redirect_to": h.redirect}); err != nil { + panic(fmt.Sprintf("accept request: failed to write response: %s", err)) + } + } +} diff --git a/internal/hydra/logout.go b/internal/hydra/logout.go index d5135aa..1f97c20 100644 --- a/internal/hydra/logout.go +++ b/internal/hydra/logout.go @@ -1,8 +1,8 @@ /* -Copyright (C) JSC iCore - All Rights Reserved +Copyright (c) JSC iCore. -Unauthorized copying of this file, via any medium is strictly prohibited -Proprietary and confidential +This source code is licensed under the MIT license found in the +LICENSE file in the root directory of this source tree. */ package hydra diff --git a/internal/hydra/logout_test.go b/internal/hydra/logout_test.go new file mode 100644 index 0000000..de8f297 --- /dev/null +++ b/internal/hydra/logout_test.go @@ -0,0 +1,177 @@ +package hydra_test + +import ( + "encoding/json" + "fmt" + "net/http" + "net/http/httptest" + "reflect" + "testing" + + "github.com/i-core/werther/internal/hydra" + "github.com/pkg/errors" +) + +func TestInitiateLogoutRequest(t *testing.T) { + testCases := []struct { + name string + challenge string + reqInfo *hydra.ReqInfo + status int + wantErr error + }{ + { + name: "challenge is missed", + wantErr: hydra.ErrChallengeMissed, + }, + { + name: "challenge is not found", + challenge: "foo", + status: 404, + wantErr: hydra.ErrChallengeNotFound, + }, + { + name: "happy path", + challenge: "foo", + status: 200, + reqInfo: &hydra.ReqInfo{ + Challenge: "foo", + }, + }, + } + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + h := &testInitiateLogoutHandler{reqInfo: tc.reqInfo, status: tc.status} + srv := httptest.NewServer(h) + defer srv.Close() + ldr := hydra.NewLogoutReqDoer(srv.URL) + + reqInfo, err := ldr.InitiateRequest(tc.challenge) + + if tc.wantErr != nil { + if err == nil { + t.Fatalf("\ngot no errors\nwant error:\n\t%s", tc.wantErr) + } + err = errors.Cause(err) + if err != tc.wantErr { + t.Fatalf("\ngot error:\n\t%s\nwant error:\n\t%s", err, tc.wantErr) + } + return + } + + if err != nil { + t.Fatalf("\ngot error:\n\t%s\nwant no errors", err) + } + + if h.challenge != tc.challenge { + t.Errorf("\ngot challenge:\n\t%#v\nwant challenge:\n\t%#v", h.challenge, tc.challenge) + } + if !reflect.DeepEqual(tc.reqInfo, reqInfo) { + t.Errorf("\ngot request info:\n\t%#v\nwant request info:\n\t%#v", reqInfo, tc.reqInfo) + } + }) + } +} + +type testInitiateLogoutHandler struct { + reqInfo *hydra.ReqInfo + status int + challenge string +} + +func (h *testInitiateLogoutHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet || r.URL.Path != "/oauth2/auth/requests/logout" { + w.WriteHeader(http.StatusMethodNotAllowed) + if err := json.NewEncoder(w).Encode(map[string]interface{}{"error": http.StatusText(http.StatusMethodNotAllowed)}); err != nil { + panic(fmt.Sprintf("initial request: failed to write response: %s", err)) + } + return + } + h.challenge = r.URL.Query().Get("logout_challenge") + w.WriteHeader(h.status) + if h.status == http.StatusOK { + if err := json.NewEncoder(w).Encode(h.reqInfo); err != nil { + panic(fmt.Sprintf("initial request: failed to write response: %s", err)) + } + } +} + +func TestAcceptLogoutRequest(t *testing.T) { + testCases := []struct { + name string + challenge string + status int + redirect string + wantErr error + }{ + { + name: "challenge is missed", + wantErr: hydra.ErrChallengeMissed, + }, + { + name: "challenge is not found", + challenge: "foo", + status: http.StatusNotFound, + wantErr: hydra.ErrChallengeNotFound, + }, + { + name: "happy path", + challenge: "foo", + status: http.StatusOK, + redirect: "/test-redirect", + }, + } + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + h := &testAcceptLogoutHandler{challenge: tc.challenge, status: tc.status, redirect: tc.redirect} + srv := httptest.NewServer(h) + defer srv.Close() + ldr := hydra.NewLogoutReqDoer(srv.URL) + + redirect, err := ldr.AcceptLogoutRequest(tc.challenge) + + if tc.wantErr != nil { + if err == nil { + t.Fatalf("\ngot no errors\nwant error:\n\t%s", tc.wantErr) + } + err = errors.Cause(err) + if err.Error() != tc.wantErr.Error() { + t.Fatalf("\ngot error:\n\t%s\nwant error:\n\t%s", err, tc.wantErr) + } + return + } + + if err != nil { + t.Fatalf("\ngot error:\n\t%s\nwant no errors", err) + } + + if h.challenge != tc.challenge { + t.Errorf("\ngot challenge:\n\t%#v\nwant challenge:\n\t%#v", h.challenge, tc.challenge) + } + if redirect != tc.redirect { + t.Errorf("\ngot redirect URL:\n\t%#v\nwant redirect URL:\n\t%#v", redirect, tc.redirect) + } + }) + } +} + +type testAcceptLogoutHandler struct { + challenge string + status int + redirect string +} + +func (h *testAcceptLogoutHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodPut || r.URL.Path != "/oauth2/auth/requests/logout/accept" { + http.Error(w, http.StatusText(http.StatusMethodNotAllowed), http.StatusMethodNotAllowed) + return + } + + h.challenge = r.URL.Query().Get("logout_challenge") + w.WriteHeader(h.status) + if h.status == http.StatusOK { + if err := json.NewEncoder(w).Encode(map[string]interface{}{"redirect_to": h.redirect}); err != nil { + panic(fmt.Sprintf("accept request: failed to write response: %s", err)) + } + } +} diff --git a/internal/identp/identp.go b/internal/identp/identp.go index 15bfd5d..32bdffe 100644 --- a/internal/identp/identp.go +++ b/internal/identp/identp.go @@ -1,8 +1,8 @@ /* -Copyright (C) JSC iCore - All Rights Reserved +Copyright (c) JSC iCore. -Unauthorized copying of this file, via any medium is strictly prohibited -Proprietary and confidential +This source code is licensed under the MIT license found in the +LICENSE file in the root directory of this source tree. */ // Package identp is an implementation of [Login and Consent Flow](https://www.ory.sh/docs/hydra/oauth2) @@ -16,20 +16,20 @@ import ( "strings" "time" + "github.com/i-core/rlog" + "github.com/i-core/werther/internal/hydra" "github.com/justinas/nosurf" "github.com/pkg/errors" "go.uber.org/zap" - "gopkg.i-core.ru/logutil" - "gopkg.i-core.ru/werther/internal/hydra" ) const loginTmplName = "login.tmpl" // Config is a Hydra configuration. type Config struct { - HydraURL string `envconfig:"hydra_url" required:"true" desc:"a server admin URL of ORY Hydra"` - SessionTTL time.Duration `envconfig:"session_ttl" default:"24h" desc:"a session TTL"` - ClaimScopes map[string]string `envconfig:"claim_scopes" default:"name:profile,family_name:profile,given_name:profile,email:email,http%3A%2F%2Fi-core.ru%2Fclaims%2Froles:roles" desc:"a mapping of OIDC claims to scopes (all claims are URL encoded)"` + HydraURL string `envconfig:"hydra_url" required:"true" desc:"an admin URL of ORY Hydra Server"` + SessionTTL time.Duration `envconfig:"session_ttl" default:"24h" desc:"a user session's TTL"` + ClaimScopes map[string]string `envconfig:"claim_scopes" default:"name:profile,family_name:profile,given_name:profile,email:email,http%3A%2F%2Ffithub.com%2Fi-core.ru%2Fwerther%2Fclaims%2Froles:roles" desc:"a mapping of OpenID Connect claims to scopes (all claims are URL encoded)"` } // UserManager is an interface that is used for authentication and providing user's claims. @@ -105,7 +105,7 @@ type oa2LoginReqProcessor interface { func newLoginStartHandler(rproc oa2LoginReqProcessor, tmplRenderer TemplateRenderer) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { - log := logutil.FromContext(r.Context()).Sugar() + log := rlog.FromContext(r.Context()).Sugar() challenge := r.URL.Query().Get("login_challenge") if challenge == "" { log.Debug("No login challenge that is needed by the OAuth2 provider") @@ -157,7 +157,7 @@ func newLoginStartHandler(rproc oa2LoginReqProcessor, tmplRenderer TemplateRende func newLoginEndHandler(ra oa2LoginReqAcceptor, auther authenticator, tmplRenderer TemplateRenderer) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { - log := logutil.FromContext(r.Context()).Sugar() + log := rlog.FromContext(r.Context()).Sugar() r.ParseForm() challenge := r.Form.Get("login_challenge") @@ -223,7 +223,7 @@ type oa2ConsentReqProcessor interface { func newConsentHandler(rproc oa2ConsentReqProcessor, cfinder oidcClaimsFinder, claimScopes map[string]string) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { - log := logutil.FromContext(r.Context()).Sugar() + log := rlog.FromContext(r.Context()).Sugar() challenge := r.URL.Query().Get("consent_challenge") if challenge == "" { @@ -297,7 +297,7 @@ type oa2LogoutReqProcessor interface { func newLogoutHandler(rproc oa2LogoutReqProcessor) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { - log := logutil.FromContext(r.Context()).Sugar() + log := rlog.FromContext(r.Context()).Sugar() challenge := r.URL.Query().Get("logout_challenge") if challenge == "" { diff --git a/internal/identp/identp_test.go b/internal/identp/identp_test.go index 3d990e6..586bd37 100644 --- a/internal/identp/identp_test.go +++ b/internal/identp/identp_test.go @@ -1,8 +1,8 @@ /* -Copyright (C) JSC iCore - All Rights Reserved +Copyright (c) JSC iCore. -Unauthorized copying of this file, via any medium is strictly prohibited -Proprietary and confidential +This source code is licensed under the MIT license found in the +LICENSE file in the root directory of this source tree. */ package identp @@ -18,9 +18,9 @@ import ( "strings" "testing" + "github.com/i-core/werther/internal/hydra" "github.com/justinas/nosurf" "github.com/pkg/errors" - "gopkg.i-core.ru/werther/internal/hydra" ) func TestHandleLoginStart(t *testing.T) { diff --git a/internal/ldapclient/ldapclient.go b/internal/ldapclient/ldapclient.go index a9ff2ca..c7a8b98 100644 --- a/internal/ldapclient/ldapclient.go +++ b/internal/ldapclient/ldapclient.go @@ -1,8 +1,8 @@ /* -Copyright (C) JSC iCore - All Rights Reserved +Copyright (c) JSC iCore. -Unauthorized copying of this file, via any medium is strictly prohibited -Proprietary and confidential +This source code is licensed under the MIT license found in the +LICENSE file in the root directory of this source tree. */ package ldapclient @@ -17,22 +17,44 @@ import ( "time" "github.com/coocood/freecache" + "github.com/i-core/rlog" "github.com/pkg/errors" "go.uber.org/zap" - "gopkg.i-core.ru/logutil" ldap "gopkg.in/ldap.v2" ) +var ( + // errInvalidCredentials is an error that happens when a user's password is invalid. + errInvalidCredentials = fmt.Errorf("invalid credentials") + // errConnectionTimeout is an error that happens when no one LDAP endpoint responds. + errConnectionTimeout = fmt.Errorf("connection timeout") + // errMissedUsername is an error that happens + errMissedUsername = errors.New("username is missed") + // errUnknownUsername is an error that happens + errUnknownUsername = errors.New("unknown username") +) + +type conn interface { + Bind(bindDN, password string) error + SearchUser(user string, attrs ...string) ([]map[string]interface{}, error) + SearchUserRoles(user string, attrs ...string) ([]map[string]interface{}, error) + Close() +} + +type connector interface { + Connect(ctx context.Context, addr string) (conn, error) +} + // Config is a LDAP configuration. type Config struct { Endpoints []string `envconfig:"endpoints" required:"true" desc:"a LDAP's server URLs as \"

:\""` - BaseDN string `envconfig:"basedn" required:"true" desc:"a LDAP base DN for searching users"` BindDN string `envconfig:"binddn" desc:"a LDAP bind DN"` BindPass string `envconfig:"bindpw" json:"-" desc:"a LDAP bind password"` + BaseDN string `envconfig:"basedn" required:"true" desc:"a LDAP base DN for searching users"` + AttrClaims map[string]string `envconfig:"attr_claims" default:"name:name,sn:family_name,givenName:given_name,mail:email" desc:"a mapping of LDAP attributes to OpenID connect claims"` RoleBaseDN string `envconfig:"role_basedn" required:"true" desc:"a LDAP base DN for searching roles"` - RoleAttr string `envconfig:"role_attr" default:"description" desc:"a LDAP attribute for role's name"` - RoleClaim string `ignored:"true"` // is custom OIDC claim name for roles' list - AttrClaims map[string]string `envconfig:"attr_claims" default:"name:name,sn:family_name,givenName:given_name,mail:email" desc:"a mapping of LDAP attributes to OIDC claims"` + RoleAttr string `envconfig:"role_attr" default:"description" desc:"a LDAP group's attribute that contains a role's name"` + RoleClaim string `envconfig:"role_claim" default:"https://github.com/i-core/werther/claims/roles" desc:"a name of an OpenID Connect claim that contains user roles"` CacheSize int `envconfig:"cache_size" default:"512" desc:"a user info cache's size in KiB"` CacheTTL time.Duration `envconfig:"cache_ttl" default:"30m" desc:"a user info cache TTL"` } @@ -40,17 +62,16 @@ type Config struct { // Client is a LDAP client (compatible with Active Directory). type Client struct { Config - cache *freecache.Cache + connector connector + cache *freecache.Cache } // New creates a new LDAP client. func New(cnf Config) *Client { - if cnf.RoleClaim == "" { - cnf.RoleClaim = "http://i-core.ru/claims/roles" - } return &Client{ - Config: cnf, - cache: freecache.NewCache(cnf.CacheSize * 1024), + Config: cnf, + connector: &ldapConnector{BaseDN: cnf.BaseDN, RoleBaseDN: cnf.RoleBaseDN}, + cache: freecache.NewCache(cnf.CacheSize * 1024), } } @@ -64,10 +85,10 @@ func (cli *Client) Authenticate(ctx context.Context, username, password string) var cancel context.CancelFunc ctx, cancel = context.WithCancel(ctx) - cn, ok := <-cli.dialTCP(ctx) + cn, ok := <-cli.connect(ctx) cancel() if !ok { - return false, errors.New("connection timeout") + return false, errConnectionTimeout } defer cn.Close() @@ -81,7 +102,7 @@ func (cli *Client) Authenticate(ctx context.Context, username, password string) } if err := cn.Bind(details["dn"].(string), password); err != nil { - if ldapErr, ok := err.(*ldap.Error); ok && ldapErr.ResultCode == ldap.LDAPResultInvalidCredentials { + if err == errInvalidCredentials { return false, nil } return false, err @@ -89,85 +110,20 @@ func (cli *Client) Authenticate(ctx context.Context, username, password string) // Clear the claims' cache because of possible re-authentication. We don't want stale claims after re-login. if ok := cli.cache.Del([]byte(username)); ok { - log := logutil.FromContext(ctx) + log := rlog.FromContext(ctx) log.Debug("Cleared user's OIDC claims in the cache") } return true, nil } -func (cli *Client) dialTCP(ctx context.Context) <-chan *ldap.Conn { - var ( - wg sync.WaitGroup - ch = make(chan *ldap.Conn) - ) - wg.Add(len(cli.Endpoints)) - for _, addr := range cli.Endpoints { - go func(addr string) { - defer wg.Done() - - log := logutil.FromContext(ctx).Sugar() - - d := net.Dialer{Timeout: ldap.DefaultTimeout} - tcpcn, err := d.DialContext(ctx, "tcp", addr) - if err != nil { - log.Debug("Failed to create a LDAP connection", "address", addr) - return - } - ldapcn := ldap.NewConn(tcpcn, false) - ldapcn.Start() - select { - case <-ctx.Done(): - ldapcn.Close() - log.Debug("a LDAP connection is cancelled", "address", addr) - return - case ch <- ldapcn: - } - }(addr) - } - go func() { - wg.Wait() - close(ch) - }() - return ch -} - -// findBasicUserDetails finds user's LDAP attributes that were specified. It returns nil if no such user. -func (cli *Client) findBasicUserDetails(cn *ldap.Conn, username string, attrs []string) (map[string]interface{}, error) { - if cli.BindDN != "" { - // We need to login to a LDAP server with a service account for retrieving user data. - if err := cn.Bind(cli.BindDN, cli.BindPass); err != nil { - return nil, err - } - } - - query := fmt.Sprintf( - "(&(|(objectClass=organizationalPerson)(objectClass=inetOrgPerson))"+ - "(|(uid=%[1]s)(mail=%[1]s)(userPrincipalName=%[1]s)(sAMAccountName=%[1]s)))", username) - entries, err := cli.searchEntries(cn, cli.BaseDN, query, attrs...) - if err != nil { - return nil, err - } - if len(entries) != 1 { - // We didn't find the user. - return nil, nil - } - - var ( - entry = entries[0] - details = make(map[string]interface{}) - ) - for _, attr := range attrs { - if v, ok := entry[attr]; ok { - details[attr] = v - } - } - return details, nil -} - // FindOIDCClaims finds all OIDC claims for a user. func (cli *Client) FindOIDCClaims(ctx context.Context, username string) (map[string]interface{}, error) { - log := logutil.FromContext(ctx).Sugar() + if username == "" { + return nil, errMissedUsername + } + + log := rlog.FromContext(ctx).Sugar() // Retrieving from LDAP is slow. So, we try to get claims for the given username from the cache. switch cdata, err := cli.cache.Get([]byte(username)); err { @@ -190,10 +146,10 @@ func (cli *Client) FindOIDCClaims(ctx context.Context, username string) (map[str var cancel context.CancelFunc ctx, cancel = context.WithCancel(ctx) - cn, ok := <-cli.dialTCP(ctx) + cn, ok := <-cli.connect(ctx) cancel() if !ok { - return nil, errors.New("connection timeout") + return nil, errConnectionTimeout } defer cn.Close() @@ -208,11 +164,11 @@ func (cli *Client) FindOIDCClaims(ctx context.Context, username string) (map[str return nil, err } if details == nil { - return nil, errors.New("unknown username") + return nil, errUnknownUsername } log.Infow("Retrieved user's info from LDAP", "details", details) - // Transform the retrived attributes to corresponding claims. + // Transform the retrieved attributes to corresponding claims. claims := make(map[string]interface{}) for attr, v := range details { if claim, ok := cli.AttrClaims[attr]; ok { @@ -222,16 +178,15 @@ func (cli *Client) FindOIDCClaims(ctx context.Context, username string) (map[str // User's roles is stored in LDAP as groups. We find all groups in a role's DN // that include the user as a member. - query := fmt.Sprintf("(&(objectClass=group)(member=%s))", details["dn"]) - entries, err := cli.searchEntries(cn, cli.RoleBaseDN, query, "dn", cli.RoleAttr) + entries, err := cn.SearchUserRoles(fmt.Sprintf("%s", details["dn"]), "dn", cli.RoleAttr) if err != nil { return nil, err } - roles := make(map[string][]string) + roles := make(map[string]interface{}) for _, entry := range entries { - roleDN := entry["dn"].(string) - if roleDN == "" { + roleDN, ok := entry["dn"].(string) + if !ok || roleDN == "" { log.Infow("No required LDAP attribute for a role", "ldapAttribute", "dn", "entry", entry) continue } @@ -248,14 +203,19 @@ func (cli *Client) FindOIDCClaims(ctx context.Context, username string) (map[str } // The DN without the role's base DN must contain a CN and OU // where the CN is for uniqueness only, and the OU is an application id. - v := strings.Split(roleDN[:n-k-1], ",") - if len(v) != 2 { + path := strings.Split(roleDN[:n-k-1], ",") + if len(path) != 2 { log.Infow("A role's DN without the role's base DN must contain two nodes only", "roleBaseDN", cli.RoleBaseDN, "roleDN", roleDN) continue } - appID := v[1][len("OU="):] - roles[appID] = append(roles[appID], entry[cli.RoleAttr].(string)) + appID := path[1][len("OU="):] + + var appRoles []interface{} + if v := roles[appID]; v != nil { + appRoles = v.([]interface{}) + } + roles[appID] = append(appRoles, entry[cli.RoleAttr]) } claims[cli.RoleClaim] = roles @@ -271,11 +231,114 @@ func (cli *Client) FindOIDCClaims(ctx context.Context, username string) (map[str return claims, nil } +func (cli *Client) connect(ctx context.Context) <-chan conn { + var ( + wg sync.WaitGroup + ch = make(chan conn) + ) + wg.Add(len(cli.Endpoints)) + for _, addr := range cli.Endpoints { + go func(addr string) { + defer wg.Done() + + log := rlog.FromContext(ctx).Sugar() + cn, err := cli.connector.Connect(ctx, addr) + if err != nil { + log.Debug("Failed to create a LDAP connection", "address", addr) + return + } + select { + case <-ctx.Done(): + cn.Close() + log.Debug("a LDAP connection is cancelled", "address", addr) + return + case ch <- cn: + } + }(addr) + } + go func() { + wg.Wait() + close(ch) + }() + return ch +} + +// findBasicUserDetails finds user's LDAP attributes that were specified. It returns nil if no such user. +func (cli *Client) findBasicUserDetails(cn conn, username string, attrs []string) (map[string]interface{}, error) { + if cli.BindDN != "" { + // We need to login to a LDAP server with a service account for retrieving user data. + if err := cn.Bind(cli.BindDN, cli.BindPass); err != nil { + return nil, errors.Wrap(err, "failed to login to a LDAP woth a service account") + } + } + + entries, err := cn.SearchUser(username, attrs...) + if err != nil { + return nil, err + } + if len(entries) != 1 { + // We didn't find the user. + return nil, nil + } + + var ( + entry = entries[0] + details = make(map[string]interface{}) + ) + for _, attr := range attrs { + if v, ok := entry[attr]; ok { + details[attr] = v + } + } + return details, nil +} + +type ldapConnector struct { + BaseDN string + RoleBaseDN string +} + +func (c *ldapConnector) Connect(ctx context.Context, addr string) (conn, error) { + d := net.Dialer{Timeout: ldap.DefaultTimeout} + tcpcn, err := d.DialContext(ctx, "tcp", addr) + if err != nil { + return nil, err + } + ldapcn := ldap.NewConn(tcpcn, false) + ldapcn.Start() + return &ldapConn{Conn: ldapcn, BaseDN: c.BaseDN, RoleBaseDN: c.RoleBaseDN}, nil +} + +type ldapConn struct { + *ldap.Conn + BaseDN string + RoleBaseDN string +} + +func (c *ldapConn) Bind(bindDN, password string) error { + err := c.Conn.Bind(bindDN, password) + if ldapErr, ok := err.(*ldap.Error); ok && ldapErr.ResultCode == ldap.LDAPResultInvalidCredentials { + return errInvalidCredentials + } + return err +} + +func (c *ldapConn) SearchUser(user string, attrs ...string) ([]map[string]interface{}, error) { + query := fmt.Sprintf( + "(&(|(objectClass=organizationalPerson)(objectClass=inetOrgPerson))"+ + "(|(uid=%[1]s)(mail=%[1]s)(userPrincipalName=%[1]s)(sAMAccountName=%[1]s)))", user) + return c.searchEntries(c.BaseDN, query, attrs) +} + +func (c *ldapConn) SearchUserRoles(user string, attrs ...string) ([]map[string]interface{}, error) { + query := fmt.Sprintf("(&(objectClass=group)(member=%s))", user) + return c.searchEntries(c.RoleBaseDN, query, attrs) +} + // searchEntries executes a LDAP query, and returns a result as entries where each entry is mapping of LDAP attributes. -func (cli *Client) searchEntries(cn *ldap.Conn, baseDN, query string, attrs ...string) ([]map[string]interface{}, error) { - res, err := cn.Search(ldap.NewSearchRequest( - baseDN, ldap.ScopeWholeSubtree, ldap.NeverDerefAliases, 0, 0, false, query, attrs, nil, - )) +func (c *ldapConn) searchEntries(baseDN, query string, attrs []string) ([]map[string]interface{}, error) { + req := ldap.NewSearchRequest(baseDN, ldap.ScopeWholeSubtree, ldap.NeverDerefAliases, 0, 0, false, query, attrs, nil) + res, err := c.Search(req) if err != nil { return nil, err } diff --git a/internal/ldapclient/ldapclient_test.go b/internal/ldapclient/ldapclient_test.go new file mode 100644 index 0000000..37d3264 --- /dev/null +++ b/internal/ldapclient/ldapclient_test.go @@ -0,0 +1,588 @@ +package ldapclient + +import ( + "context" + "fmt" + "reflect" + "strings" + "testing" + "time" + + "github.com/pkg/errors" +) + +var ( + errBindUser = fmt.Errorf("bind user error") + errSearchUser = fmt.Errorf("search user error") + errSearchRoles = fmt.Errorf("search user roles error") + users = []map[string]interface{}{ + { + "dn": "user1", + "pass": "user1", + "a": "valA", + "b": "valB", + "c": "valC", + }, + { + "dn": "user2", + "pass": "user2", + "a": "valA", + "b": "valB", + "c": "valC", + "roles": []map[string]interface{}{ + {"dn": "CN=role1,OU=app1,OU=test,DC=local", "test-roles-attr": "r1"}, + {"dn": "CN=role2,OU=app1,OU=test,DC=local", "test-roles-attr": "r2"}, + }, + }, + { + "dn": "user3", + "pass": "user3", + "a": "valA", + "b": "valB", + "c": "valC", + "roles": []map[string]interface{}{ + {"dn": "CN=role1,OU=app1,OU=test,DC=local", "test-roles-attr": "r1"}, + {"dn": "CN=role2,OU=app1,OU=test,DC=local", "test-roles-attr": "r2"}, + {"dn": "CN=role3,OU=app2,OU=test,DC=local", "test-roles-attr": "r3"}, + {"dn": "CN=role4,OU=app2,OU=test,DC=local", "test-roles-attr": "r4"}, + }, + }, + { + "dn": "user4", + "pass": "user4", + "a": "valA", + "b": "valB", + "c": "valC", + "roles": []map[string]interface{}{ + {"dn": "CN=role1,OU=app1,OU=test,DC=local", "test-roles-attr": "r1"}, + {"test-roles-attr": "r2"}, + }, + }, + { + "dn": "user5", + "pass": "user5", + "a": "valA", + "b": "valB", + "c": "valC", + "roles": []map[string]interface{}{ + {"dn": "CN=role1,OU=app1,OU=test,DC=local", "test-roles-attr": "r1"}, + {"dn": "CN=role2,OU=app1,OU=test,DC=local"}, + }, + }, + { + "dn": "user6", + "pass": "user6", + "a": "valA", + "b": "valB", + "c": "valC", + "roles": []map[string]interface{}{ + {"dn": "CN=role1,OU=test,DC=local", "test-roles-attr": "r1"}, + }, + }, + { + "dn": "serviceUser", + "pass": "servicePass", + }, + } +) + +func TestAuthenticate(t *testing.T) { + testCases := []struct { + name string + connector *testConnector + bindDN string + bindPass string + user string + pass string + wantErr error + wantAuth bool + }{ + { + name: "username is empty", + connector: newTestConnector("ep1", &testConn{users: users}), + }, + { + name: "password is empty", + connector: newTestConnector("ep1", &testConn{users: users}), + user: "user1", + }, + { + name: "connection timeout", + connector: newTestConnector("ep1", fmt.Errorf("failed to connect to endpoint")), + user: "user1", + pass: "user1", + wantErr: errConnectionTimeout, + }, + { + name: "search user error", + connector: newTestConnector("ep1", &testConn{userErr: errSearchUser}), + user: "user1", + pass: "user1", + wantErr: errSearchUser, + }, + { + name: "user is not found", + connector: newTestConnector("ep1", &testConn{}), + user: "user1", + pass: "user1", + }, + { + name: "authentication error", + connector: newTestConnector("ep1", &testConn{users: users, bindErr: errBindUser}), + user: "user1", + pass: "user1", + wantErr: errBindUser, + }, + { + name: "invalid password", + connector: newTestConnector("ep1", &testConn{users: users}), + user: "user1", + pass: "invalid", + }, + { + name: "success auth", + connector: newTestConnector("ep1", &testConn{users: users}), + user: "user1", + pass: "user1", + wantAuth: true, + }, + { + name: "auth with invalid service account", + connector: newTestConnector("ep1", &testConn{users: users}), + bindDN: "serviceUser", + bindPass: "invalid", + user: "user1", + pass: "user1", + wantErr: errInvalidCredentials, + }, + { + name: "auth with valid service account", + connector: newTestConnector("ep1", &testConn{users: users}), + bindDN: "serviceUser", + bindPass: "servicePass", + user: "user1", + pass: "user1", + wantAuth: true, + }, + } + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + client := New(Config{Endpoints: tc.connector.Endpoints(), BindDN: tc.bindDN, BindPass: tc.bindPass}) + client.connector = tc.connector + ok, err := client.Authenticate(context.Background(), tc.user, tc.pass) + + if ok != tc.wantAuth { + t.Errorf("got auth: %t, want auth: %t", ok, tc.wantAuth) + } + if tc.wantErr != nil { + if err == nil { + t.Fatalf("\ngot no errors\nwant error:\n\t%s", tc.wantErr) + } + err = errors.Cause(err) + if err != tc.wantErr { + t.Fatalf("\ngot error:\n\t%s\nwant error:\n\t%s", err, tc.wantErr) + } + return + } + if err != nil { + t.Fatalf("\ngot error:\n\t%s\nwant no errors", err) + } + }) + } +} + +func TestAuthenticateWhenMultipleEndpointsFailed(t *testing.T) { + connector := newTestConnector("ep1", fmt.Errorf("error"), "ep2", fmt.Errorf("error")) + client := New(Config{Endpoints: connector.Endpoints()}) + client.connector = connector + _, err := client.Authenticate(context.Background(), "user1", "user1") + + if err == nil { + t.Fatalf("\ngot no errors\nwant error:\n\t%s", errConnectionTimeout) + } + err = errors.Cause(err) + if err != errConnectionTimeout { + t.Fatalf("\ngot error:\n\t%s\nwant error:\n\t%s", err, errConnectionTimeout) + } +} + +func TestAuthenticateWhenOneEndpointFailedAndOneSuccess(t *testing.T) { + ep2 := &testConn{users: users} + connector := newTestConnector("ep1", fmt.Errorf("error"), "ep2", ep2) + client := New(Config{Endpoints: connector.Endpoints()}) + client.connector = connector + ok, err := client.Authenticate(context.Background(), "user1", "user1") + + if err != nil { + t.Fatalf("\ngot error:\n\t%s\nwant no errors", err) + } + if !ok { + t.Errorf("got auth: %t, want auth: true", ok) + } + if !ep2.authRequest { + t.Error("\ngot: endpoint \"ep2\" is not called, want: endpoint \"ep2\" is called") + } +} + +func TestAuthenticateWhenMultipleEndpointsSuccess(t *testing.T) { + ep1 := &testConn{users: users} + ep2 := &testConn{users: users} + connector := newTestConnector("ep1", ep1, "ep2", ep2) + client := New(Config{Endpoints: connector.Endpoints()}) + client.connector = connector + + ok, err := client.Authenticate(context.Background(), "user1", "user1") + + // Wait for closing all opened LDAP connections. + time.Sleep(100 * time.Millisecond) + + if err != nil { + t.Fatalf("\ngot error:\n\t%s\nwant no errors", err) + } + if !ok { + t.Errorf("got auth: %t, want auth: true", ok) + } + switch { + case ep1.authRequest && ep2.authRequest: + t.Error("got: every endpoint is called, want: only one endpoint is called") + case !ep1.authRequest && !ep2.authRequest: + t.Error("got: no one endpoint is not called, want: only one endpoint is called") + } + var notClosed []string + if !ep1.closed { + notClosed = append(notClosed, "ep1") + } + if !ep2.closed { + notClosed = append(notClosed, "ep2") + } + if len(notClosed) > 0 { + t.Errorf("got: endpoints %s are not closed, want: all endpoints are closed", strings.Join(notClosed, ", ")) + } +} + +func TestFindOIDCClaims(t *testing.T) { + testCases := []struct { + name string + connector *testConnector + bindDN string + bindPass string + user string + attrClaims map[string]string + wantErr error + want map[string]interface{} + }{ + { + name: "username is empty", + connector: newTestConnector("ep1", &testConn{users: users}), + wantErr: errMissedUsername, + }, + { + name: "connection timeout", + connector: newTestConnector("ep1", fmt.Errorf("failed to connect to endpoint")), + user: "user1", + wantErr: errConnectionTimeout, + }, + { + name: "search user error", + connector: newTestConnector("ep1", &testConn{userErr: errSearchUser}), + user: "user1", + wantErr: errSearchUser, + }, + { + name: "user is not found", + connector: newTestConnector("ep1", &testConn{}), + user: "user1", + wantErr: errUnknownUsername, + }, + { + name: "search roles error", + connector: newTestConnector("ep1", &testConn{users: users, rolesErr: errSearchRoles}), + user: "user1", + wantErr: errSearchRoles, + }, + { + name: "extra attributes is filtered from claims", + connector: newTestConnector("ep1", &testConn{users: users}), + user: "user1", + attrClaims: map[string]string{"dn": "name", "a": "claimA", "b": "claimB"}, + want: map[string]interface{}{"name": "user1", "claimA": "valA", "claimB": "valB", "roles": nil}, + }, + { + name: "skip claim if no attribute", + connector: newTestConnector("ep1", &testConn{users: users}), + user: "user1", + attrClaims: map[string]string{"dn": "name", "a": "claimA", "d": "claimD"}, + want: map[string]interface{}{"name": "user1", "claimA": "valA", "roles": nil}, + }, + { + name: "claims with roles for one application", + connector: newTestConnector("ep1", &testConn{users: users}), + user: "user2", + attrClaims: map[string]string{"dn": "name"}, + want: map[string]interface{}{"name": "user1", "test-roles-claim": map[string][]string{"app1": {"r1", "r2"}}}, + }, + { + name: "claims with roles for multiple applications", + connector: newTestConnector("ep1", &testConn{users: users}), + user: "user3", + attrClaims: map[string]string{"dn": "name"}, + want: map[string]interface{}{"name": "user1", "test-roles-claim": map[string][]string{"app1": {"r1", "r2"}, "app2": {"r3", "r4"}}}, + }, + { + name: "skip role without DN", + connector: newTestConnector("ep1", &testConn{users: users}), + user: "user4", + attrClaims: map[string]string{"dn": "name"}, + want: map[string]interface{}{"name": "user1", "roles": map[string][]string{"app1": {"r1"}}}, + }, + { + name: "skip role without role attribute", + connector: newTestConnector("ep1", &testConn{users: users}), + user: "user5", + attrClaims: map[string]string{"dn": "name"}, + want: map[string]interface{}{"name": "user1", "roles": map[string][]string{"app1": {"r1"}}}, + }, + { + name: "skip invalid role without role base DN", + connector: newTestConnector("ep1", &testConn{users: users}), + user: "user6", + attrClaims: map[string]string{"dn": "name"}, + want: map[string]interface{}{"name": "user1", "roles": map[string][]string{"app1": {"r1"}}}, + }, + { + name: "auth with invalid service account", + connector: newTestConnector("ep1", &testConn{users: users}), + bindDN: "serviceUser", + bindPass: "invalid", + user: "user1", + attrClaims: map[string]string{"dn": "name", "a": "claimA", "b": "claimB"}, + wantErr: errInvalidCredentials, + }, + { + name: "auth with valid service account", + connector: newTestConnector("ep1", &testConn{users: users}), + bindDN: "serviceUser", + bindPass: "servicePass", + user: "user1", + attrClaims: map[string]string{"dn": "name", "a": "claimA", "b": "claimB"}, + want: map[string]interface{}{"name": "user1", "claimA": "valA", "claimB": "valB", "roles": nil}, + }, + } + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + client := New(Config{ + Endpoints: tc.connector.Endpoints(), + BindDN: tc.bindDN, + BindPass: tc.bindPass, + AttrClaims: tc.attrClaims, + RoleBaseDN: "OU=test,DC=local", + RoleClaim: "test-roles-claim", + RoleAttr: "test-roles-attr", + }) + client.connector = tc.connector + got, err := client.FindOIDCClaims(context.Background(), tc.user) + + if tc.wantErr != nil { + if err == nil { + t.Fatalf("\ngot no errors\nwant error:\n\t%s", tc.wantErr) + } + err = errors.Cause(err) + if err != tc.wantErr { + t.Fatalf("\ngot error:\n\t%s\nwant error:\n\t%s", err, tc.wantErr) + } + return + } + if err != nil { + t.Fatalf("\ngot error:\n\t%s\nwant no errors", err) + } + + if reflect.DeepEqual(got, tc.want) { + t.Errorf("\ngot claims:\n\t%v\nwant claims:\n\t%v", got, tc.want) + } + }) + } +} + +func TestClaimsCache(t *testing.T) { + ep := &testConn{users: users} + connector := newTestConnector("ep", ep) + client := New(Config{ + Endpoints: connector.Endpoints(), + AttrClaims: map[string]string{"dn": "name", "a": "claimA", "d": "claimD"}, + RoleBaseDN: "OU=test,DC=local", + RoleClaim: "test-roles-claim", + RoleAttr: "test-roles-attr", + }) + client.connector = connector + + ok, err := client.Authenticate(context.Background(), "user2", "user2") + + if err != nil { + t.Fatalf("initial auth: unexpected error: %s", err) + } + if !ok { + t.Fatal("initial auth: got no auth, want auth") + } + + claims1, err := client.FindOIDCClaims(context.Background(), "user2") + + if err != nil { + t.Fatalf("claims request 1: unexpected error: %s", err) + } + if claims1 == nil { + t.Fatal("claims request 1: got no claims, want claims") + } + if !ep.claimsRequest { + t.Fatal("claims request 1: got claims from cache, want claims from ldap") + } + + ep.claimsRequest = false + + claims2, err := client.FindOIDCClaims(context.Background(), "user2") + + if err != nil { + t.Fatalf("claims request 2: unexpected error: %s", err) + } + if claims2 == nil { + t.Fatal("claims request 2: got no claims, want claims") + } + if ep.claimsRequest { + t.Fatal("claims request 2: got claims from ldap, want claims from cache") + } + if !reflect.DeepEqual(claims1, claims2) { + t.Fatalf("claims request 2:\ngot claims:\n\t%v\nwant claims:\n\t%v", claims2, claims1) + } + + ok, err = client.Authenticate(context.Background(), "user2", "user2") + + if err != nil { + t.Fatalf("re-auth: unexpected error: %s", err) + } + if !ok { + t.Fatal("re-auth: got no auth, want auth") + } + + claims3, err := client.FindOIDCClaims(context.Background(), "user2") + + if err != nil { + t.Fatalf("claims request 3: unexpected error: %s", err) + } + if claims3 == nil { + t.Fatal("claims request 3: got no claims, want claims") + } + if !ep.claimsRequest { + t.Fatal("claims request 3: got claims from cache, want claims from ldap") + } +} + +type testConnector struct { + conns map[string]interface{} +} + +func newTestConnector(args ...interface{}) *testConnector { + if len(args)%2 != 0 { + panic("newTestConnector want args in format \"addr1, conn1, addr2, conn2, addr3, err3\"") + } + conns := make(map[string]interface{}) + for i := 0; i < len(args)/2; i++ { + addr, ok := args[i*2].(string) + if !ok { + panic("newTestConnector want args in format \"addr1, conn1, addr2, conn2, addr3, err3\"") + } + + switch arg := args[i*2+1].(type) { + case error, *testConn: + conns[addr] = arg + default: + panic("newTestConnector want args in format \"addr1, conn1, addr2, conn2, addr3, err3\"") + } + } + return &testConnector{conns: conns} +} + +func (c *testConnector) Endpoints() []string { + var eps []string + for addr := range c.conns { + eps = append(eps, addr) + } + return eps +} + +func (c *testConnector) Connect(ctx context.Context, addr string) (conn, error) { + switch v := c.conns[addr].(type) { + case error: + return nil, v + case *testConn: + return v, nil + default: + panic(fmt.Sprintf("Invalid config for endpoint %q", addr)) + } +} + +type testConn struct { + users []map[string]interface{} + bindErr error + userErr error + rolesErr error + authRequest bool + claimsRequest bool + closed bool +} + +func (c *testConn) Bind(bindDN, password string) error { + c.authRequest = true + if c.bindErr != nil { + return c.bindErr + } + user := c.findUser(bindDN) + if user == nil { + return fmt.Errorf("user is not found") + } + if user["pass"] != password { + return errInvalidCredentials + } + return nil +} + +func (c *testConn) SearchUser(bindDN string, attrs ...string) ([]map[string]interface{}, error) { + c.claimsRequest = true + if c.userErr != nil { + return nil, c.userErr + } + user := c.findUser(bindDN) + if user == nil { + return nil, nil + } + return []map[string]interface{}{user}, nil +} + +func (c *testConn) SearchUserRoles(bindDN string, attrs ...string) ([]map[string]interface{}, error) { + if c.rolesErr != nil { + return nil, c.rolesErr + } + user := c.findUser(bindDN) + if user == nil { + return nil, fmt.Errorf("user is not found") + } + switch roles := user["roles"].(type) { + case nil: + return nil, nil + case []map[string]interface{}: + return roles, nil + default: + return nil, fmt.Errorf("invalid test roles") + } +} + +func (c *testConn) findUser(bindDN string) map[string]interface{} { + for _, v := range c.users { + if v["dn"] == bindDN { + return v + } + } + return nil +} + +func (c *testConn) Close() { + c.closed = true +} diff --git a/internal/stat/stat.go b/internal/stat/stat.go index 14f7aa4..4dc9f80 100644 --- a/internal/stat/stat.go +++ b/internal/stat/stat.go @@ -1,11 +1,18 @@ +/* +Copyright (c) JSC iCore. + +This source code is licensed under the MIT license found in the +LICENSE file in the root directory of this source tree. +*/ + package stat import ( "encoding/json" "net/http" + "github.com/i-core/rlog" "go.uber.org/zap" - "gopkg.i-core.ru/logutil" ) // Handler provides HTTP handlers for health checking and versioning. @@ -20,14 +27,14 @@ func NewHandler(version string) *Handler { // AddRoutes registers all required routes for the package stat. func (h *Handler) AddRoutes(apply func(m, p string, h http.Handler, mws ...func(http.Handler) http.Handler)) { - apply(http.MethodGet, "/health/alive", newHealthAliveAndReadyHandler()) - apply(http.MethodGet, "/health/ready", newHealthAliveAndReadyHandler()) + apply(http.MethodGet, "/health/alive", newHealthHandler()) + apply(http.MethodGet, "/health/ready", newHealthHandler()) apply(http.MethodGet, "/version", newVersionHandler(h.version)) } -func newHealthAliveAndReadyHandler() http.HandlerFunc { +func newHealthHandler() http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { - log := logutil.FromContext(r.Context()) + log := rlog.FromContext(r.Context()) resp := struct { Status string `json:"status"` }{ @@ -44,7 +51,7 @@ func newHealthAliveAndReadyHandler() http.HandlerFunc { func newVersionHandler(version string) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { - log := logutil.FromContext(r.Context()) + log := rlog.FromContext(r.Context()) resp := struct { Version string `json:"version"` }{ diff --git a/internal/stat/stat_test.go b/internal/stat/stat_test.go new file mode 100644 index 0000000..ddadf7e --- /dev/null +++ b/internal/stat/stat_test.go @@ -0,0 +1,64 @@ +package stat + +import ( + "encoding/json" + "net/http" + "net/http/httptest" + "reflect" + "testing" + + "github.com/i-core/routegroup" +) + +func TestHealthHandler(t *testing.T) { + rr := httptest.NewRecorder() + h := newHealthHandler() + h.ServeHTTP(rr, httptest.NewRequest(http.MethodGet, "http://example.org", nil)) + testResp(t, rr, http.StatusOK, "application/json", map[string]interface{}{"status": "ok"}) +} + +func TestVersionHandler(t *testing.T) { + rr := httptest.NewRecorder() + h := newVersionHandler("test-version") + h.ServeHTTP(rr, httptest.NewRequest(http.MethodGet, "http://example.org", nil)) + testResp(t, rr, http.StatusOK, "application/json", map[string]interface{}{"version": "test-version"}) +} + +func TestStatHandler(t *testing.T) { + var ( + rr *httptest.ResponseRecorder + router = routegroup.NewRouter() + ) + router.AddRoutes(NewHandler("test-version"), "/stat") + + rr = httptest.NewRecorder() + router.ServeHTTP(rr, httptest.NewRequest(http.MethodGet, "/stat/health/alive", nil)) + testResp(t, rr, http.StatusOK, "application/json", map[string]interface{}{"status": "ok"}) + + rr = httptest.NewRecorder() + router.ServeHTTP(rr, httptest.NewRequest(http.MethodGet, "/stat/health/ready", nil)) + testResp(t, rr, http.StatusOK, "application/json", map[string]interface{}{"status": "ok"}) + + rr = httptest.NewRecorder() + router.ServeHTTP(rr, httptest.NewRequest(http.MethodGet, "/stat/version", nil)) + testResp(t, rr, http.StatusOK, "application/json", map[string]interface{}{"version": "test-version"}) +} + +func testResp(t *testing.T, rr *httptest.ResponseRecorder, wantStatus int, wantMime string, wantBody interface{}) { + if rr.Code != wantStatus { + t.Errorf("got status %d, want status %d", rr.Code, wantStatus) + } + + if gotMime := rr.Header().Get("Content-Type"); gotMime != wantMime { + t.Errorf("got content type %q, want content type %q", gotMime, wantMime) + } + + var gotBody interface{} + if err := json.NewDecoder(rr.Body).Decode(&gotBody); err != nil { + t.Fatalf("failed to decode the request body: %s", err) + } + + if !reflect.DeepEqual(gotBody, wantBody) { + t.Errorf("got body %#v, want body %#v", gotBody, wantBody) + } +} diff --git a/internal/web/web.go b/internal/web/web.go index 4f7d914..7ce0d8f 100644 --- a/internal/web/web.go +++ b/internal/web/web.go @@ -1,8 +1,8 @@ /* -Copyright (C) JSC iCore - All Rights Reserved +Copyright (c) JSC iCore. -Unauthorized copying of this file, via any medium is strictly prohibited -Proprietary and confidential +This source code is licensed under the MIT license found in the +LICENSE file in the root directory of this source tree. */ //go:generate go run github.com/kevinburke/go-bindata/go-bindata -o templates.go -pkg web -prefix templates/ templates/... @@ -20,8 +20,8 @@ import ( "path" assetfs "github.com/elazarl/go-bindata-assetfs" + "github.com/i-core/routegroup" "github.com/pkg/errors" - "gopkg.i-core.ru/httputil" ) // The file systems provide templates and their resources that are stored in the application's internal assets. @@ -39,7 +39,7 @@ type Config struct { // HTMLRenderer renders a HTML page from a Go template. // -// A template's source for a HTML page should contains four blocks: +// A template's source for a HTML page should contain four blocks: // "title", "style", "js", "content". Block "title" should contain the content of the "title" HTML tag. // Block "style" should contain "link" HTML tags that are injected to the head of the page. // Block "js" should contain "script" HTML tags that are injected to the bottom of the page's body. @@ -149,7 +149,7 @@ func NewStaticHandler(cnf Config) *StaticHandler { func (h *StaticHandler) AddRoutes(apply func(m, p string, h http.Handler, mws ...func(http.Handler) http.Handler)) { fileServer := http.FileServer(h.fs) apply(http.MethodGet, "/*filepath", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - r.URL.Path = httputil.PathParam(r.Context(), "filepath") + r.URL.Path = routegroup.PathParam(r.Context(), "filepath") fileServer.ServeHTTP(w, r) })) } diff --git a/internal/web/web_test.go b/internal/web/web_test.go index 71fd52f..0d539b7 100644 --- a/internal/web/web_test.go +++ b/internal/web/web_test.go @@ -1,8 +1,8 @@ /* -Copyright (C) JSC iCore - All Rights Reserved +Copyright (c) JSC iCore. -Unauthorized copying of this file, via any medium is strictly prohibited -Proprietary and confidential +This source code is licensed under the MIT license found in the +LICENSE file in the root directory of this source tree. */ package web @@ -17,7 +17,7 @@ import ( "testing" "github.com/andreyvit/diff" - "gopkg.i-core.ru/httputil" + "github.com/i-core/routegroup" ) func TestHTMLRenderer(t *testing.T) { @@ -170,7 +170,7 @@ func TestStaticHandler(t *testing.T) { r := httptest.NewRequest(http.MethodGet, "/static/"+tc.file, nil) rr := httptest.NewRecorder() - router := httputil.NewRouter() + router := routegroup.NewRouter() router.AddRoutes(NewStaticHandler(cnf), "/static") router.ServeHTTP(rr, r)