Commit Graph

209 Commits

Author SHA1 Message Date
Matt Drollette 64f31388d4 oauth2: Fix fallback routes and templates (#1402)
Signed-off-by: Matt Drollette <matt@drollette.com>
2019-04-30 07:23:58 +02:00
hackerman bbeee653de
Implement OpenID Connect Front-/Backchannel logout (#1376)
Closes #1368 
Closes #1004 
Closes #834

Signed-off-by: aeneasr <aeneas@ory.sh>
2019-04-25 23:17:57 +02:00
hackerman 957a2d670a
oauth2: Expose revocation endpoint at OIDC Discovery (#1355)
Closes #12678

Signed-off-by: aeneasr <aeneas@ory.sh>
2019-04-11 20:42:49 +02:00
hackerman 95a51deb31
Improve configuration and service management (#1314)
This patch significantly refactors internal configuration and service management with the goal of making configuration changes possible without service restarts. This patch prepares the possibility to configure ORY Hydra from a remote source (etcd, consul) and watch for changes. This patch also introduces the possibility to configure ORY Hydra from a configuration file on top of environment variables.

The following issues have been fixed as well:

- Key rotation of the system secret is now much simpler (closes #1316)
- Database connectivity parameters such as max_conns no longer cause issues with older postgres versions (closes #1327)
- Non-existing routes now return a JSON error instead of `text/plain` when `application/json` was requested (clsoes #1244)
- We now push tags latest, X, X.Y, X.Y.Z to docker hub (closes #1289)
- The quickstart guide no longer builds the source code but instead pulls latest tag (closes #1309)
- We moved to goreleaser and godownloader for release management (closes #1107)
- The quickstart Docker Compose files are now reusable (closes #1196)

The following issues are also resolved:

- Closes #1121 

Signed-off-by: aeneasr <aeneas@ory.sh>
2019-04-02 11:52:21 +02:00
Vadim a18c44ef3b oauth2: Return proper refresh token expiration time (#1300)
Closes #1296

Signed-off-by: Vadim Sabirov <pr0head@gmail.com>
2019-03-17 18:14:30 +01:00
hackerman 3db25f6a69
oauth2: Fix swagger documentation for oauth2/token (#1284)
Closes #1274

Signed-off-by: aeneasr <aeneas@ory.sh>
2019-02-18 10:32:59 +01:00
hackerman 61d068f2ed
oauth2: Improve introspection debugability (#1232)
Signed-off-by: aeneasr <aeneas@ory.sh>
2018-12-13 09:26:02 +01:00
hackerman 11924bf5f7
sql: Resolve index/fk regression issues (#1178)
Closes #1177

Signed-off-by: aeneasr <aeneas@ory.sh>
2018-11-20 00:02:05 +01:00
arekkas 700a4a2eff sdk: Use new api groups everywhere 2018-11-18 23:04:10 +01:00
hackerman 89f5960c9a
sdk: Update swagger endpoint definition (#1166)
Closes #1070

Signed-off-by: aeneasr <aeneas@ory.sh>
2018-11-09 14:10:04 +01:00
hackerman ddafef543c
oauth2: Make client registration endpoint configurable (#1167)
Closes #1072
2018-11-08 17:12:32 +01:00
hackerman e88c7b630b
consent: Properly propagate acr value (#1160)
Closes #1032

Signed-off-by: aeneasr <aeneas@ory.sh>
2018-11-08 11:36:37 +01:00
hackerman fa19d23983
sdk: Document userinfo as GET instead of POST (#1161)
Closes #1049

Signed-off-by: aeneasr <aeneas@ory.sh>
2018-11-05 22:48:29 +01:00
hackerman 3a10df9bff
oauth2: Add OAuth2 audience claim and improve migrations (#1145)
This patch adds the ability to whitelist and request an audience
when performing any OAuth 2.0 Flow. The audience is useful in multi-
tenant environments where access tokens should be restricted to certain
resources.

Closes #883
Closes #1144

Signed-off-by: arekkas <aeneas@ory.am>
2018-11-02 16:46:01 +01:00
JiaLiPassion 1f3a1231c0 cors: Add options cors middleware handler (#1125)
Signed-off-by: JiaLiPassion <JiaLi.Passion@gmail.com>
2018-10-25 17:08:24 +02:00
JiaLiPassion c26019929b oauth2: wellknown should use corsMiddleware (#1116)
Signed-off-by: JiaLiPassion <JiaLi.Passion@gmail.com>
2018-10-24 13:24:06 +02:00
hackerman 65b7406abe
Move dependencies to ory/x (#1095)
Signed-off-by: aeneasr <aeneas@ory.sh>
2018-10-23 06:59:31 -07:00
Amir Aslaminejad 4188f69c45 oauth2: propagate go context down the call path
Signed-off-by: Amir Aslaminejad <aslaminejad@gmail.com>
2018-09-21 16:02:08 +02:00
Amir Aslaminejad b23029b96c oauth2: pass the request context along to the sql store.
Signed-off-by: Amir Aslaminejad <aslaminejad@gmail.com>
2018-09-18 09:48:55 +02:00
hackerman a36d0af611
oauth2: Enable client specific CORS settings (#1009)
Field `allowed_cors_origins` was added to OAuth 2.0 Clients. It enables
CORS for the whitelisted URLS for paths which clients interact with,
such as /oauth2/token.

Closes #975

Signed-off-by: arekkas <aeneas@ory.am>
2018-08-26 14:28:05 +02:00
hackerman c72e64cebd
oauth2: Resolve broken expiry when refreshing id token (#1002)
Closes #985

Signed-off-by: arekkas <aeneas@ory.am>
2018-08-23 00:27:20 +02:00
hackerman 93dcbcf3b9
consent: Add logout api endpoint (#984)
Closes #970

Signed-off-by: Michael DeRazon <mderazon@gmail.com>
Signed-off-by: arekkas <aeneas@ory.am>
2018-08-10 11:27:26 +02:00
arekkas 479acd7ea7 consent: Introduce pairwise support
This patch introduces the OpenID Connect pairwise Subject Identifier Algorithm.

Closes #950

Signed-off-by: arekkas <aeneas@ory.am>
2018-08-10 10:23:19 +02:00
arekkas 78e65521c2 oauth2: Adds subject_type support to oidc discovery
See #950

Signed-off-by: arekkas <aeneas@ory.am>
2018-08-10 10:23:19 +02:00
hackerman 123e37e132
oauth2: Share error details with redirect fallback (#982)
Closes #974

Signed-off-by: arekkas <aeneas@ory.am>
2018-08-08 21:27:52 +02:00
Prateek Malhotra e4e316342e oauth2: Refactor OAuth2 JWT strategy as an interface (#972)
Signed-off-by: Prateek Malhotra <someone1@gmail.com>
2018-08-07 17:00:19 +02:00
arekkas 17e63116c8 oauth2: Removes authorization from introspection
Signed-off-by: arekkas <aeneas@ory.am>
2018-08-06 16:20:36 +02:00
arekkas cfee3eb3d0 cmd: Introduce public and administrative ports
This patch introduces two ports, public and administrative. The public
port is responsible for handling API requests to public endpoints such
as /oauth2/auth, while the administrative port handles requests to
JWK, OAuth 2.0 Client, and Login & Consent endpoints.

Closes #904

Signed-off-by: arekkas <aeneas@ory.am>
2018-08-06 11:29:38 +02:00
arekkas e79014d33b oauth2: Add and enhance access/refresh token tests
This patch introduces more tests for code and refresh flows and the JWT
strategy.

Signed-off-by: arekkas <aeneas@ory.am>
2018-07-23 17:10:30 +02:00
arekkas c932ab4571 oauth2: Adds JWT Access Token strategy
This patch adds the (experimental) ability to issue JSON Web Tokens instead of ORY Hydra's opaque access tokens. Please be aware that this feature has had little real-world and unit testing and may not be suitable for production.

Simple integration tests using the JWT strategy have been added to ensure functionality.

To use the new JWT strategy, set environment variable `OAUTH2_ACCESS_TOKEN_STRATEGY` to `jwt`. For example: `export OAUTH2_ACCESS_TOKEN_STRATEGY=jwt`.

Please be aware that we (ORY) do not recommend using the JWT strategy for various reasons. If you can, use the default and recommended "opaque" strategy instead.

Closes #248

Signed-off-by: arekkas <aeneas@ory.am>
2018-07-23 17:10:30 +02:00
arekkas 00fd517fbf oauth2: Removes tokens when consent is revoked
Closes #856

Signed-off-by: arekkas <aeneas@ory.am>
2018-07-07 14:49:16 +02:00
arekkas bc0b54c545 oauth2: Implements userinfo response signing 2018-06-24 17:24:12 +02:00
arekkas e41fcf263c jwk: Removes buggy rotate command and improves jwk refresh 2018-06-24 17:24:12 +02:00
arekkas 1d02cae554 jwk: Implements proper refreshing strategy 2018-06-24 17:24:12 +02:00
aeneasr 6837046546 oauth2: Declares grant type refresh_token as supported 2018-06-24 17:24:12 +02:00
arekkas 8f2e9314f2 oauth2: Exposes proper oidc configuration 2018-06-24 17:24:12 +02:00
arekkas 259d63a4de oauth2: Adds private_key_jwt authentication method 2018-06-24 17:24:12 +02:00
arekkas 1580677926 oauth2: Adds parameter broadcast to oidc discovery 2018-06-24 17:24:12 +02:00
arekkas ffefb74e06 oauth2: Resolves well-known test issues 2018-06-24 17:24:12 +02:00
arekkas ad86dd18d3 oauth2: Implements dynamic client registration 2018-06-24 17:24:12 +02:00
arekkas 526e3a7dbe oauth2: Resolves issues with broken tests 2018-05-29 12:20:50 +02:00
arekkas f7390459da oauth2: Aligns issuer URL from well known with one from id token 2018-05-29 11:28:19 +02:00
arekkas 7afed882d8 oauth2: Resolves various issues related to audience claims
This patch resolves issues related to the ID and Access Token audience
claim:

* oauth2: Allow multiple audience claims on ID token - closes #790
* oauth2: Reintroduce audience claim - closes #687
2018-05-29 11:28:19 +02:00
arekkas f2ef5b129f oauth2: Ignores JTI in userinfo 2018-05-24 13:31:02 +02:00
arekkas a4d2e73cdd all: Removes access control relics 2018-05-23 18:22:47 +02:00
arekkas d0919141f6 oauth2: Remove rat (requested_at) from userinfo endpoint 2018-05-20 14:18:30 +02:00
arekkas a7edf63cbc oauth2: Trim left slash from userinfo endpoint 2018-05-19 22:44:39 +02:00
arekkas 1940c3c8ff oauth2: Properly uses issuer in JWT 2018-05-19 22:39:01 +02:00
arekkas e387aeaca5 oauth2: Removes duplicate / in .well-known 2018-05-19 21:48:23 +02:00
arekkas fccfc4da6a consent: Properly handle requestedAt across the login/consent flow 2018-05-19 15:19:29 +02:00
arekkas 66304eba38 oauth2: Reverts 307 change 2018-05-18 14:55:16 +02:00
arekkas 2b43ce320a oauth2: Use 307 instead of 302 to redirect 2018-05-18 14:17:21 +02:00
arekkas 3accccdb20 consent: Handles auth time across login & consent flow
This patch improves the handling of auth_time and thus resolves issues with prompt & max_age handling within fosite.
2018-05-17 20:17:48 +02:00
arekkas a002e30577 oauth2: Improves the consent flow design
This patch makes significant changes to the consent flow. First,
the consent flow is being renamed to "User Login and Consent Flow"
and is split into two redirection flows, the "User Login Redirection Flow"
and the "User Consent Flow".

Conceptually, not a lot has changed but the APIs have been cleaned up
and the new flow is a huge step towards OpenID Connect Certification.

Besides easier implementation on the (previously known as) consent app,
this patch introduces a new set of features which lets ORY Hydra
detect previous logins and previously accepted consent requests. In turn,
the user does not need to login or consent on every OAuth2 Authorize Code
Flow.

This patch additionally lays the foundation for revoking tokens per
user or per user and client.

Awesome.

Closes #771
Closes #772
2018-05-04 14:07:36 +02:00
Aeneas bf226dccd4
oauth2: Returns token type on introspection (#832)
This patch adds the ability to return the token type ("refresh_token", "access_token") upon token introspection.
2018-04-30 12:44:40 +02:00
arekkas d72efbf577 all: Removes unused code and updates go dep 2018-04-29 18:25:42 +02:00
arekkas 3d0bf0bda5 Removes policy, warden and groups from this project
We have learned a lot over the last year in terms of how ORY Hydra is being used. Initially, we wanted to avoid the problems facing popular databases like MongoDB or others, which did not include authentication for their management APIs.

For this reason, the Warden API was born and primarily used internally and exposed via HTTP. We learned that access control policies are well received, but also add additional complexity to understanding the software. While we firmly believe that these policies implement best practices for access control in complex systems, we do understand that they add a barrier to getting started with ORY Hydra.

For this reason we are planning on moving the Warden API from this project to ORY Oathkeeper or potentially it's own server. We would add a migration path for existing policy definitions to the new service. The default docker image would combine the services in such a way, that ORY Hydra is protected. We would additionally have an (insecure) docker image without authentication which can be used for testing.

This also opens up the possibility of having more access control mechanisms than access control policies. For example, we can add ACL and RBAC and other mechanisms too.

First I think it makes good sense to move this functionality into a separate service and remove the warden calls internally completely. The reason being that not everyone wants to rely on Hydra's access control. Sometimes it's enough to use a gateway in front and require e.g. an API key for management or whatever. New adopters are always baffled by complexity involved with policies and scopes. Removing that from the core could really help. The user survey has also shown that this stuff is quite complex to grasp.

The idea is to have a separate service which is basically ladon as a HTTP API. I think it makes sense to add some functionality to resolve access tokens so it would basically be very similar to the current warden API - probably even equal. There would definitely be some backup mode where hydra's database tables and migrations are used as to make migration as easy as possible.

Then, we would ship docker images and example set ups where different configurations are shown. One of the configurations would be the current one, so basically what we have now in hydra but with the three services combined in one image.

Closes #807
2018-04-29 18:25:42 +02:00
Aeneas 4125eabb96
docs: Resolves broken swagger definitions (#812) 2018-03-17 11:27:12 +01:00
Aeneas 366ed57d9c
all: Updates license headers (#793) 2018-03-08 10:27:18 +01:00
arekkas ed0aa28c58 oauth2: Adds ability to flush old access tokens
Previously, no way of removing old access tokens from the database.
This patch adds a new endpoint (`POST /oauth2/flush`) capable of
flushing old / stale access tokens.

Additionally, `hydra token flush` was added which is the CLI command
for flushing tokens using the api.

Closes #738
2018-02-06 16:49:23 +01:00
arekkas 7cb4ad28f6 oauth2: Removes unknown claims from userinfo endpoint 2017-12-14 19:25:43 +01:00
arekkas 0d08851268 oauth2: Removes check for authorize code error in auth endpoint 2017-12-14 19:25:43 +01:00
arekkas cba05b496c oauth2: Adds list of supported auth methods to OIDC discovery
Closes #695
2017-12-14 19:25:43 +01:00
arekkas 62547ebaba oauth2: Redirects authorize code errors to consent app 2017-12-10 00:28:37 +01:00
arekkas 34c5f30fd4 oauth2: Adds ability to configure OIDC Discovery 2017-12-09 23:39:34 +01:00
arekkas ae3904fa77 oauth2: Allows POST for userinfo endpoint 2017-12-09 18:33:50 +01:00
arekkas fabee0dcaf oauth2: Adds userinfo endpoint and improves OIDC discovery 2017-12-09 18:13:01 +01:00
arekkas d40432819a oauth2: Adds basic userinfo endpoint
Closes #652
2017-12-09 18:13:01 +01:00
arekkas c630f8e01b oauth2: Removes incorrect audience field from introspection response 2017-12-08 19:43:50 +01:00
Aeneas f5b6558c72
oauth2: Requires firewall check for introspecting access tokens (#678) 2017-12-07 17:44:33 +01:00
Aeneas dcbd6d8fcb
Add license header to all source files (#644)
Closes #643
2017-11-06 13:01:53 +01:00
arekkas a835a54610 oauth2: return consent deny reason to oauth2 initiator 2017-10-05 18:12:34 +02:00
arekkas 6fe4bb2996 all: improve swagger documentation of all modules 2017-10-05 18:12:34 +02:00
arekkas 8fcc8cb251 all: reduce tags to one and clean up sdk 2017-10-05 18:12:34 +02:00
arekkas 5a27d4bf12 all: update swagger definitions and combine in hydra interface 2017-10-05 18:12:34 +02:00
arekkas 783707175b oauth2: implement swagger-based sdk 2017-10-05 18:12:34 +02:00
arekkas 412667bd16 oauth2: improve swagger spec and generate/test client for revoke 2017-10-05 18:12:34 +02:00
arekkas 0c05da3d71 oauth2: improve swagger definitions 2017-10-05 18:12:34 +02:00
arekkas fc3ee34e68 oauth2: replace jwk-based with http-based consent flow
Closes #578
2017-10-05 18:12:34 +02:00
arekkas cff04d7009 docs: add wildcard scope strategy documentation 2017-10-05 18:12:34 +02:00
arekkas a62b9f9128 oauth2: replace HierarchicScopeStrategy with WildcardScopeStrategy
Closes #550
2017-10-05 18:12:34 +02:00
arekkas d0a7e775ad vendor: update to fosite 0.11.0
* oauth2: improves warning when subject claim is empty in id token - closes #460
* oauth2: changes scope semantics to wildcard - closes #550
* oauth2: refresh openid connect id token via refresh_token grant - closes #556
2017-10-05 18:12:34 +02:00
arekkas 13c6915a00 cq: gofmt -w -s 2017-07-06 18:46:36 +02:00
aeneasr b480a3ea2e vendor: resolve logrus case mess 2017-07-06 18:46:36 +02:00
Wyatt Anderson 688103c7ff oauth2: use issuer-prefixed auth URL in challenge redirect (#509)
In order to support running Hydra with a different path prefix behind
a proxy, issue a challenge token with an issuer-prefixed auth redirect
URL instead of the URL received with the auth request.

Signed-off-by: Wyatt Anderson <wanderson@gmail.com>
2017-06-14 16:54:37 +02:00
Aeneas 48c229b62a oauth2: allow redirection to client if consent was denied (#489)
* oauth2: allow redirection to client if consent was denied

Closes #371

* oauth2: allow redirection to client if consent was denied

Closes #371
2017-06-05 12:36:29 +02:00
Aeneas Rekkas (arekkas) a9f500b75a oauth2/introspect: send issuer in introspection
Closes #399
2017-06-05 11:39:31 +02:00
Aeneas ddca997bc6 docs: add health check to swagger and resolve swagger issues (#488)
Closes #355
2017-06-05 11:01:56 +02:00
Aeneas 83118d1df7 vendor: update to latest versions (#482)
* vendor: update to latest versions

* vendor: update to latest versions

* vendor: update to latest versions

* vendor: update to latest versions
2017-06-04 15:37:29 +02:00
Patrick Barker 3769676d48 oauth2: adds /.well-known/openid-configuration - closes #379
Signed-off-by: pbarker <pbarker@datapipe.com>
2017-05-10 09:12:16 +02:00
Aeneas Rekkas (arekkas) 0ebf0ec8cd all: added swagger docs for the rest of the apis 2017-05-07 10:52:08 +02:00
Aeneas Rekkas (arekkas) 9be2ff3164 all: goimports 2017-05-07 10:52:08 +02:00
Aeneas Rekkas (arekkas) e912acc3a1 all: move to new org 2017-05-07 10:52:08 +02:00
Aeneas Rekkas (arekkas) 2869ed16e1 all: move to one logrus instance 2017-05-07 10:52:08 +02:00
Aeneas Rekkas (arekkas) 708c1a2d31 all: move move most writers in handlers to ory/herodot 2017-05-07 10:52:08 +02:00
Aeneas Rekkas (arekkas) 5331bbbc95 oauth2: resolve issue with cookie store 2017-02-11 10:38:36 +01:00
Aeneas Rekkas (arekkas) 971d7ba527 oauth2: remove stray log 2017-01-02 17:04:33 +01:00
aeneasr 35548a82a4 core: resolve issues with SQL migration and update dockerfiles 2016-12-30 10:23:17 +01:00
aeneasr e93840d0ca oauth2/consent: force jti echo in consent response -closes #322 2016-12-30 10:23:17 +01:00
Aeneas Rekkas (arekkas) 6f356d1366 all: migrate to dockertest v3 and resolve broken tests 2016-12-04 18:04:43 +01:00
Aeneas Rekkas (arekkas) 3d61a70aa3 all: improve cli and oauth2 error reporting 2016-12-04 18:04:43 +01:00
Aeneas 00bdd28ef4 oauth2: resolve issues with token introspection on user tokens (#309) 2016-11-17 17:34:07 +01:00
Aeneas 8256356b9b 0.6.0 (#293)
* oauth2: scopes should be separated by %20 and not +, to ensure javascript compatibility - closes #277
* oauth2/introspect: make endpoint rfc7662 compatible - closes #289
* warden: make it clear that ladon.Request.Subject is not required or break bc and remove it - closes #270
* travis: execute gox build only when new commit is a new tag - closes #285
* docs: improve introduction (#267)
* core: (health) monitoring endpoint - closes #216
* oauth2/introspect: make endpoint rfc7662 compatible - closes #289
* connections: remove connections API - closes #265
* oauth2: token revocation endpoint - closes #233
* vendor: update to fosite 0.5.0
* core: add sql support #292
* connections: remove connections API - closes #265
* all: coverage report is missing covered lines of nested packages - closes #296
* cmd: prettify the `hydra token user` output - closes #281
* travis: make it possible for travis-ci to build forked repos - closes #295
2016-10-25 12:01:26 +02:00
Aeneas a92200278a 0.5.0 (#243)
* cmd: hydra token user should show id token in browser - closes #224
* cli: hydra clients import doesn't print client's secret - closes #221
* travis: ld flags are wrong - closes #242
* all: resolve naming inconsistencies in jwk set names used in hydra - closes #239
* sdk: resolve naming inconsistencies - closes #226
* docs: resolve gitbook issue with image assets
* jwk: anonymous request can't read public keys - closes #253
* client: add ability to update client - closes #250
* core: document hard-wired JWK sets - closes #247
* docs: fix images in readme - closes #261
2016-09-22 23:23:31 +02:00
Aeneas Rekkas (arekkas) 39b3fc3b88 vendor: update fosite 0.3.0 2016-08-23 16:20:54 +02:00
Aeneas cd6daedfe4 0.4.0 (#203)
* warden: token introspection is urlencoded, not json - closes #199
* warden: move IntrospectToken from warden sdk to oauth2 - closes #201
* warden: rename InspectToken to IntrospectToken - closes #200 
* oauth2: introspection should return custom session values - closes #205
* oauth2: consent strategy should use at_ext for access token session data - closes #198
* docs: move docs from gitbook to github - closes #204
2016-08-17 14:21:57 +02:00
Aeneas a297f7e57b 🔥 0.2.0 (#165)
* warden: rename `assertion` to `token` - closes #158
* config: do not log database credentials - closes #147
* oauth2: upgrade fosite - close #160
* config: do not store database config in hydra config - closes #164
* oauth2: id_token at_hash / c_hash is null - closes #129
* jwk: improve error message of wrong system secrect - closes #104
* readme: improve images, add benchmarks - closes #161
* cmd: improve connect dialogue - closes #170
* cmd: fix --dry option - closes #157
* firewall: document warden interface sdk
* readme: link openid connect and oauth2 introduction
* cmd: introduce FORCE_ROOT_CLIENT_CREDENTIALS env var - closes #140
* readme: document error redirect to identity provider - closes #96
* internal: fosite store must be consistent to avoid errors - closes #176
* client: add GetConcreteClient to http manager
* cmd: host process now logs basic information on all http requests - closes #178
* all: add memory profiling - closes #179
* warden: resolve nil pointer issue - closes #181
* cmd: clean up env to struct mapping, add more controls
* cmd: bcrypt cost should be configurable - closes #184
* cmd: token lifespans should be configurable - closes #183
* cmd: resolve issues with envirnoment config - closes #182
* cmd: implement tls termination capability - closes #177
* cmd: resolve issues with redirect logic and TLS
* oauth2: implement default oauth2 consent endpoint - closes #185
* warden - closes #188 
* oauth2: id token claims should be set by using id_token - closes #188
* oauth2: oauth2 implicit flow should allow custom protocols - closes #180
* oauth2: core scope should not be mandatory - closes #189
* warden: warden sdk should not make distinction between token and request - closes #190
* warden: rename authorized / allowed endpoints to something more meaningful - closes #162
* ci: improve travis config
2016-08-09 14:05:18 +02:00
Aeneas 24d34b312e warden: resolve date and scope issues
* closes #126 
* closes #125 
* closes #124
2016-06-30 11:11:27 +02:00
Aeneas 00fd93cab2 🔥 0.1-beta 🔥 2016-05-29 11:50:57 +02:00