forked from mystiq/dex
Merge pull request #1283 from srenatus/sr/move-github-org/fix-imports
Finish GitHub org move
This commit is contained in:
commit
bb75dcd793
61 changed files with 152 additions and 1238 deletions
|
@ -7,7 +7,7 @@ go:
|
||||||
- 1.9
|
- 1.9
|
||||||
- '1.10'
|
- '1.10'
|
||||||
|
|
||||||
go_import_path: github.com/coreos/dex
|
go_import_path: github.com/dexidp/dex
|
||||||
|
|
||||||
services:
|
services:
|
||||||
- postgresql
|
- postgresql
|
||||||
|
|
|
@ -2,8 +2,8 @@ FROM golang:1.10.2-alpine
|
||||||
|
|
||||||
RUN apk add --no-cache --update alpine-sdk
|
RUN apk add --no-cache --update alpine-sdk
|
||||||
|
|
||||||
COPY . /go/src/github.com/coreos/dex
|
COPY . /go/src/github.com/dexidp/dex
|
||||||
RUN cd /go/src/github.com/coreos/dex && make release-binary
|
RUN cd /go/src/github.com/dexidp/dex && make release-binary
|
||||||
|
|
||||||
FROM alpine:3.4
|
FROM alpine:3.4
|
||||||
# Dex connectors, such as GitHub and Google logins require root certificates.
|
# Dex connectors, such as GitHub and Google logins require root certificates.
|
||||||
|
|
|
@ -31,7 +31,7 @@ $ go get -u github.com/golang/protobuf/{proto,protoc-gen-go}
|
||||||
|
|
||||||
# Download api.proto for a given version.
|
# Download api.proto for a given version.
|
||||||
$ DEX_VERSION=v2.0.0-alpha.5
|
$ DEX_VERSION=v2.0.0-alpha.5
|
||||||
$ wget https://raw.githubusercontent.com/coreos/dex/${DEX_VERSION}/api/api.proto
|
$ wget https://raw.githubusercontent.com/dexidp/dex/${DEX_VERSION}/api/api.proto
|
||||||
|
|
||||||
# Generate the Go client bindings.
|
# Generate the Go client bindings.
|
||||||
$ protoc --go_out=import_path=dexapi:. api.proto
|
$ protoc --go_out=import_path=dexapi:. api.proto
|
||||||
|
@ -39,7 +39,7 @@ $ protoc --go_out=import_path=dexapi:. api.proto
|
||||||
|
|
||||||
Client programs can then be written using the generated code. A Go client which uses dex's internally generated code might look like the following:
|
Client programs can then be written using the generated code. A Go client which uses dex's internally generated code might look like the following:
|
||||||
|
|
||||||
__NOTE:__ Because dex has the `google.golang.org/grpc` package in its `vendor` directory, gRPC code in `github.com/coreos/dex/api` refers to the vendored copy, not copies in a developers GOPATH. Clients must either regenerate the gRPC Go code or vendor dex and remove its `vendor` directory to run this program.
|
__NOTE:__ Because dex has the `google.golang.org/grpc` package in its `vendor` directory, gRPC code in `github.com/dexidp/dex/api` refers to the vendored copy, not copies in a developers GOPATH. Clients must either regenerate the gRPC Go code or vendor dex and remove its `vendor` directory to run this program.
|
||||||
|
|
||||||
```
|
```
|
||||||
package main
|
package main
|
||||||
|
@ -49,7 +49,7 @@ import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"log"
|
"log"
|
||||||
|
|
||||||
"github.com/coreos/dex/api"
|
"github.com/dexidp/dex/api"
|
||||||
"google.golang.org/grpc"
|
"google.golang.org/grpc"
|
||||||
"google.golang.org/grpc/credentials"
|
"google.golang.org/grpc/credentials"
|
||||||
)
|
)
|
||||||
|
|
|
@ -50,6 +50,6 @@ connectors:
|
||||||
```
|
```
|
||||||
|
|
||||||
[oidc-doc]: openid-connect.md
|
[oidc-doc]: openid-connect.md
|
||||||
[issue-863]: https://github.com/coreos/dex/issues/863
|
[issue-863]: https://github.com/dexidp/dex/issues/863
|
||||||
[issue-1065]: https://github.com/coreos/dex/issues/1065
|
[issue-1065]: https://github.com/dexidp/dex/issues/1065
|
||||||
[azure-ad-v1]: https://github.com/coreos/go-oidc/issues/133
|
[azure-ad-v1]: https://github.com/coreos/go-oidc/issues/133
|
||||||
|
|
|
@ -11,7 +11,7 @@ This requires the following tools.
|
||||||
|
|
||||||
And the following permissions.
|
And the following permissions.
|
||||||
|
|
||||||
* Push access to the github.com/coreos/dex git repo.
|
* Push access to the github.com/dexidp/dex git repo.
|
||||||
* Push access to the quay.io/coreos/dex Docker repo.
|
* Push access to the quay.io/coreos/dex Docker repo.
|
||||||
|
|
||||||
## Tagging the release
|
## Tagging the release
|
||||||
|
@ -37,13 +37,13 @@ git tag -s v2.0.0 ea4c04fde83bd6c48f4d43862c406deb4ea9dba2
|
||||||
Push that tag to the CoreOS repo.
|
Push that tag to the CoreOS repo.
|
||||||
|
|
||||||
```
|
```
|
||||||
git push git@github.com:coreos/dex.git v2.0.0
|
git push git@github.com:dexidp/dex.git v2.0.0
|
||||||
```
|
```
|
||||||
|
|
||||||
Draft releases on GitHub and summarize the changes since the last release. See
|
Draft releases on GitHub and summarize the changes since the last release. See
|
||||||
previous releases for the expected format.
|
previous releases for the expected format.
|
||||||
|
|
||||||
https://github.com/coreos/dex/releases
|
https://github.com/dexidp/dex/releases
|
||||||
|
|
||||||
## Minor releases - create a branch
|
## Minor releases - create a branch
|
||||||
|
|
||||||
|
@ -51,7 +51,7 @@ If the release is a minor release (2.1.0, 2.2.0, etc.) create a branch for futur
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
git checkout -b v2.1.x tags/v2.1.0
|
git checkout -b v2.1.x tags/v2.1.0
|
||||||
git push git@github.com:coreos/dex.git v2.1.x
|
git push git@github.com:dexidp/dex.git v2.1.x
|
||||||
```
|
```
|
||||||
|
|
||||||
## Patch releases - cherry pick required commits
|
## Patch releases - cherry pick required commits
|
||||||
|
|
|
@ -5,8 +5,8 @@
|
||||||
Dex requires a Go installation and a GOPATH configured. For setting up a Go workspace, refer to the [official documentation][go-setup]. Clone it down the correct place, and simply type `make` to compile the dex binary.
|
Dex requires a Go installation and a GOPATH configured. For setting up a Go workspace, refer to the [official documentation][go-setup]. Clone it down the correct place, and simply type `make` to compile the dex binary.
|
||||||
|
|
||||||
```
|
```
|
||||||
$ go get github.com/coreos/dex
|
$ go get github.com/dexidp/dex
|
||||||
$ cd $GOPATH/src/github.com/coreos/dex
|
$ cd $GOPATH/src/github.com/dexidp/dex
|
||||||
$ make
|
$ make
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
# Integrations
|
# Integrations
|
||||||
This document tracks the libraries and tools that are compatible with dex. [Join the community](https://github.com/coreos/dex/), and help us keep the list up-to-date.
|
This document tracks the libraries and tools that are compatible with dex. [Join the community](https://github.com/dexidp/dex/), and help us keep the list up-to-date.
|
||||||
|
|
||||||
## Tools
|
## Tools
|
||||||
|
|
||||||
|
|
|
@ -117,10 +117,10 @@ $ curl -H "Authorization: Bearer $token" -k https://( API server host ):443/api/
|
||||||
|
|
||||||
[k8s-authz]: http://kubernetes.io/docs/admin/authorization/
|
[k8s-authz]: http://kubernetes.io/docs/admin/authorization/
|
||||||
[k8s-oidc]: http://kubernetes.io/docs/admin/authentication/#openid-connect-tokens
|
[k8s-oidc]: http://kubernetes.io/docs/admin/authentication/#openid-connect-tokens
|
||||||
[trusted-peers]: https://godoc.org/github.com/coreos/dex/storage#Client
|
[trusted-peers]: https://godoc.org/github.com/dexidp/dex/storage#Client
|
||||||
[coreos-kubernetes]: https://github.com/coreos/coreos-kubernetes/
|
[coreos-kubernetes]: https://github.com/coreos/coreos-kubernetes/
|
||||||
[coreos-baremetal]: https://github.com/coreos/coreos-baremetal/
|
[coreos-baremetal]: https://github.com/coreos/coreos-baremetal/
|
||||||
[dex-healthz]: https://github.com/coreos/dex/issues/682
|
[dex-healthz]: https://github.com/dexidp/dex/issues/682
|
||||||
[github-oauth2]: https://github.com/settings/applications/new
|
[github-oauth2]: https://github.com/settings/applications/new
|
||||||
[node-port]: http://kubernetes.io/docs/user-guide/services/#type-nodeport
|
[node-port]: http://kubernetes.io/docs/user-guide/services/#type-nodeport
|
||||||
[coreos-kubernetes]: https://github.com/coreos/coreos-kubernetes
|
[coreos-kubernetes]: https://github.com/coreos/coreos-kubernetes
|
||||||
|
|
|
@ -13,8 +13,8 @@ Issue number | Relates to
|
||||||
[\#376][dex-issue-376] | userinfo_endpoint
|
[\#376][dex-issue-376] | userinfo_endpoint
|
||||||
[\#1052][dex-issue-1052] | auth_time
|
[\#1052][dex-issue-1052] | auth_time
|
||||||
|
|
||||||
[dex-issue-376]: https://github.com/coreos/dex/issues/376
|
[dex-issue-376]: https://github.com/dexidp/dex/issues/376
|
||||||
[dex-issue-1052]: https://github.com/coreos/dex/issues/1052
|
[dex-issue-1052]: https://github.com/dexidp/dex/issues/1052
|
||||||
|
|
||||||
### Setup
|
### Setup
|
||||||
|
|
||||||
|
@ -159,7 +159,7 @@ OP-OAuth-2nd-Revokes | Incomplete | Unsupported | userinfo_endpoint
|
||||||
|
|
||||||
Once all test cases pass, submit your results by following instructions listed [on the website][oidc-result-submission].
|
Once all test cases pass, submit your results by following instructions listed [on the website][oidc-result-submission].
|
||||||
|
|
||||||
[dex-install]: https://github.com/coreos/dex/blob/master/Documentation/getting-started.md#building-the-dex-binary
|
[dex-install]: https://github.com/dexidp/dex/blob/master/Documentation/getting-started.md#building-the-dex-binary
|
||||||
[aws-ec2-instance]: http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/concepts.htmlSSH
|
[aws-ec2-instance]: http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/concepts.htmlSSH
|
||||||
[aws-ec2-ssh]: http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/AccessingInstancesLinux.html
|
[aws-ec2-ssh]: http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/AccessingInstancesLinux.html
|
||||||
[aws-ec2-quick-start]: http://docs.aws.amazon.com/quickstarts/latest/vmlaunch/step-1-launch-instance.html
|
[aws-ec2-quick-start]: http://docs.aws.amazon.com/quickstarts/latest/vmlaunch/step-1-launch-instance.html
|
||||||
|
|
|
@ -1,3 +1,3 @@
|
||||||
# Production users
|
# Production users
|
||||||
|
|
||||||
This document tracks people and use cases for dex in production. [Join the community](https://github.com/coreos/dex/), and help us keep the list up-to-date.
|
This document tracks people and use cases for dex in production. [Join the community](https://github.com/dexidp/dex/), and help us keep the list up-to-date.
|
|
@ -73,7 +73,7 @@ type RemoteIdentity struct {
|
||||||
|
|
||||||
`UserID` fields will be added to the `AuthRequest`, `AuthCode` and `RefreshToken`
|
`UserID` fields will be added to the `AuthRequest`, `AuthCode` and `RefreshToken`
|
||||||
structs. When a user logs in successfully through a connector
|
structs. When a user logs in successfully through a connector
|
||||||
[here](https://github.com/coreos/dex/blob/95a61454b522edd6643ced36b9d4b9baa8059556/server/handlers.go#L227),
|
[here](https://github.com/dexidp/dex/blob/95a61454b522edd6643ced36b9d4b9baa8059556/server/handlers.go#L227),
|
||||||
the server will attempt to either get the user, or create one if none exists with
|
the server will attempt to either get the user, or create one if none exists with
|
||||||
the remote identity.
|
the remote identity.
|
||||||
|
|
||||||
|
|
|
@ -302,8 +302,8 @@ Each storage implementation bears a large ongoing maintenance cost and needs to
|
||||||
|
|
||||||
Those who still want to construct a proposal for a new storage should review the following packages:
|
Those who still want to construct a proposal for a new storage should review the following packages:
|
||||||
|
|
||||||
* `github.com/coreos/dex/storage`: Interface definitions which the storage must implement. __NOTE:__ This package is not stable.
|
* `github.com/dexidp/dex/storage`: Interface definitions which the storage must implement. __NOTE:__ This package is not stable.
|
||||||
* `github.com/coreos/dex/storage/conformance`: Conformance tests which storage implementations must pass.
|
* `github.com/dexidp/dex/storage/conformance`: Conformance tests which storage implementations must pass.
|
||||||
|
|
||||||
### New storage option requirements
|
### New storage option requirements
|
||||||
|
|
||||||
|
@ -313,7 +313,7 @@ Any proposal to add a new implementation must address the following:
|
||||||
* Transactional requirements: atomic deletes, updates, etc.
|
* Transactional requirements: atomic deletes, updates, etc.
|
||||||
* Is there an established and reasonable Go client?
|
* Is there an established and reasonable Go client?
|
||||||
|
|
||||||
[issues-transaction-tests]: https://github.com/coreos/dex/issues/600
|
[issues-transaction-tests]: https://github.com/dexidp/dex/issues/600
|
||||||
[k8s-api]: https://github.com/kubernetes/kubernetes/blob/master/docs/devel/api-conventions.md#concurrency-control-and-consistency
|
[k8s-api]: https://github.com/kubernetes/kubernetes/blob/master/docs/devel/api-conventions.md#concurrency-control-and-consistency
|
||||||
[psql-conn-options]: https://godoc.org/github.com/lib/pq#hdr-Connection_String_Parameters
|
[psql-conn-options]: https://godoc.org/github.com/lib/pq#hdr-Connection_String_Parameters
|
||||||
[crd]: https://kubernetes.io/docs/tasks/access-kubernetes-api/extend-api-custom-resource-definitions/
|
[crd]: https://kubernetes.io/docs/tasks/access-kubernetes-api/extend-api-custom-resource-definitions/
|
||||||
|
|
|
@ -40,7 +40,7 @@ Notable missing features include:
|
||||||
|
|
||||||
## Support for dex v1
|
## Support for dex v1
|
||||||
|
|
||||||
Dex v1 will continue to live under the `github.com/coreos/dex` repo on a branch. Bug fixes and minor changes will continue to be accepted, but development of new features by the dex team will largely cease.
|
Dex v1 will continue to live under the `github.com/dexidp/dex` repo on a branch. Bug fixes and minor changes will continue to be accepted, but development of new features by the dex team will largely cease.
|
||||||
|
|
||||||
[k8s-api-docs]: http://kubernetes.io/docs/api/
|
[k8s-api-docs]: http://kubernetes.io/docs/api/
|
||||||
[storage-docs]: ./storage.md
|
[storage-docs]: ./storage.md
|
||||||
|
|
8
Makefile
8
Makefile
|
@ -1,5 +1,5 @@
|
||||||
PROJ=dex
|
PROJ=dex
|
||||||
ORG_PATH=github.com/coreos
|
ORG_PATH=github.com/dexidp
|
||||||
REPO_PATH=$(ORG_PATH)/$(PROJ)
|
REPO_PATH=$(ORG_PATH)/$(PROJ)
|
||||||
export PATH := $(PWD)/bin:$(PATH)
|
export PATH := $(PWD)/bin:$(PATH)
|
||||||
|
|
||||||
|
@ -33,10 +33,9 @@ release-binary:
|
||||||
@go build -o /go/bin/dex -v -ldflags $(LD_FLAGS) $(REPO_PATH)/cmd/dex
|
@go build -o /go/bin/dex -v -ldflags $(LD_FLAGS) $(REPO_PATH)/cmd/dex
|
||||||
|
|
||||||
.PHONY: revendor
|
.PHONY: revendor
|
||||||
revendor: bin/license-bill-of-materials
|
revendor:
|
||||||
@glide up -v
|
@glide up -v
|
||||||
@glide-vc --use-lock-file --no-tests --only-code
|
@glide-vc --use-lock-file --no-tests --only-code
|
||||||
@./bin/license-bill-of-materials ./cmd/dex ./cmd/example-app > bill-of-materials.json
|
|
||||||
|
|
||||||
test:
|
test:
|
||||||
@go test -v -i $(shell go list ./... | grep -v '/vendor/')
|
@go test -v -i $(shell go list ./... | grep -v '/vendor/')
|
||||||
|
@ -76,9 +75,6 @@ bin/protoc: scripts/get-protoc
|
||||||
bin/protoc-gen-go:
|
bin/protoc-gen-go:
|
||||||
@go install -v $(REPO_PATH)/vendor/github.com/golang/protobuf/protoc-gen-go
|
@go install -v $(REPO_PATH)/vendor/github.com/golang/protobuf/protoc-gen-go
|
||||||
|
|
||||||
bin/license-bill-of-materials:
|
|
||||||
@CGO_ENABLED=1 go install -v $(REPO_PATH)/vendor/github.com/coreos/license-bill-of-materials
|
|
||||||
|
|
||||||
.PHONY: check-go-version
|
.PHONY: check-go-version
|
||||||
check-go-version:
|
check-go-version:
|
||||||
@./scripts/check-go-version
|
@./scripts/check-go-version
|
||||||
|
|
12
README.md
12
README.md
|
@ -1,8 +1,8 @@
|
||||||
# dex - A federated OpenID Connect provider
|
# dex - A federated OpenID Connect provider
|
||||||
|
|
||||||
[![Travis](https://api.travis-ci.org/coreos/dex.svg)](https://travis-ci.org/coreos/dex)
|
[![Travis](https://api.travis-ci.org/dexidp/dex.svg)](https://travis-ci.org/dexidp/dex)
|
||||||
[![GoDoc](https://godoc.org/github.com/coreos/dex?status.svg)](https://godoc.org/github.com/coreos/dex)
|
[![GoDoc](https://godoc.org/github.com/dexidp/dex?status.svg)](https://godoc.org/github.com/dexidp/dex)
|
||||||
[![Go Report Card](https://goreportcard.com/badge/github.com/coreos/dex)](https://goreportcard.com/report/github.com/coreos/dex)
|
[![Go Report Card](https://goreportcard.com/badge/github.com/dexidp/dex)](https://goreportcard.com/report/github.com/dexidp/dex)
|
||||||
|
|
||||||
![logo](Documentation/logos/dex-horizontal-color.png)
|
![logo](Documentation/logos/dex-horizontal-color.png)
|
||||||
|
|
||||||
|
@ -114,8 +114,8 @@ Due to their public nature, GitHub and mailing lists are NOT appropriate places
|
||||||
[tectonic]: https://tectonic.com/
|
[tectonic]: https://tectonic.com/
|
||||||
[tectonic-console]: https://tectonic.com/enterprise/docs/latest/usage/index.html#tectonic-console
|
[tectonic-console]: https://tectonic.com/enterprise/docs/latest/usage/index.html#tectonic-console
|
||||||
[go-oidc]: https://github.com/coreos/go-oidc
|
[go-oidc]: https://github.com/coreos/go-oidc
|
||||||
[issue-1065]: https://github.com/coreos/dex/issues/1065
|
[issue-1065]: https://github.com/dexidp/dex/issues/1065
|
||||||
[release-notes]: https://github.com/coreos/dex/releases
|
[release-notes]: https://github.com/dexidp/dex/releases
|
||||||
[issues]: https://github.com/coreos/dex/issues
|
[issues]: https://github.com/dexidp/dex/issues
|
||||||
[dex-dev]: https://groups.google.com/forum/#!forum/dex-dev
|
[dex-dev]: https://groups.google.com/forum/#!forum/dex-dev
|
||||||
[disclosure]: https://coreos.com/security/disclosure/
|
[disclosure]: https://coreos.com/security/disclosure/
|
||||||
|
|
|
@ -1,348 +0,0 @@
|
||||||
[
|
|
||||||
{
|
|
||||||
"project": "github.com/beevik/etree",
|
|
||||||
"licenses": [
|
|
||||||
{
|
|
||||||
"type": "BSD 2-clause \"Simplified\" License",
|
|
||||||
"confidence": 0.9658536585365853
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"project": "github.com/beorn7/perks/quantile",
|
|
||||||
"licenses": [
|
|
||||||
{
|
|
||||||
"type": "MIT License",
|
|
||||||
"confidence": 0.9891304347826086
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"project": "github.com/cockroachdb/cockroach-go/crdb",
|
|
||||||
"licenses": [
|
|
||||||
{
|
|
||||||
"type": "Apache License 2.0",
|
|
||||||
"confidence": 0.9988925802879292
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"project": "github.com/coreos/dex",
|
|
||||||
"licenses": [
|
|
||||||
{
|
|
||||||
"type": "Apache License 2.0",
|
|
||||||
"confidence": 1
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"project": "github.com/coreos/etcd",
|
|
||||||
"licenses": [
|
|
||||||
{
|
|
||||||
"type": "Apache License 2.0",
|
|
||||||
"confidence": 1
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"project": "github.com/coreos/go-oidc",
|
|
||||||
"licenses": [
|
|
||||||
{
|
|
||||||
"type": "Apache License 2.0",
|
|
||||||
"confidence": 1
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"project": "github.com/felixge/httpsnoop",
|
|
||||||
"licenses": [
|
|
||||||
{
|
|
||||||
"type": "MIT License",
|
|
||||||
"confidence": 0.9891304347826086
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"project": "github.com/ghodss/yaml",
|
|
||||||
"licenses": [
|
|
||||||
{
|
|
||||||
"type": "BSD 3-clause \"New\" or \"Revised\" License",
|
|
||||||
"confidence": 0.8357142857142857
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"project": "github.com/go-sql-driver/mysql",
|
|
||||||
"licenses": [
|
|
||||||
{
|
|
||||||
"type": "Mozilla Public License 2.0",
|
|
||||||
"confidence": 1
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"project": "github.com/golang/protobuf",
|
|
||||||
"licenses": [
|
|
||||||
{
|
|
||||||
"type": "BSD 3-clause \"New\" or \"Revised\" License",
|
|
||||||
"confidence": 0.92
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"project": "github.com/gorilla/handlers",
|
|
||||||
"licenses": [
|
|
||||||
{
|
|
||||||
"type": "BSD 2-clause \"Simplified\" License",
|
|
||||||
"confidence": 0.9852216748768473
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"project": "github.com/gorilla/mux",
|
|
||||||
"licenses": [
|
|
||||||
{
|
|
||||||
"type": "BSD 3-clause \"New\" or \"Revised\" License",
|
|
||||||
"confidence": 0.9663865546218487
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"project": "github.com/grpc-ecosystem/go-grpc-prometheus",
|
|
||||||
"licenses": [
|
|
||||||
{
|
|
||||||
"type": "Apache License 2.0",
|
|
||||||
"confidence": 1
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"project": "github.com/gtank/cryptopasta",
|
|
||||||
"licenses": [
|
|
||||||
{
|
|
||||||
"type": "Creative Commons Zero v1.0 Universal",
|
|
||||||
"confidence": 0.9642857142857143
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"project": "github.com/jonboulle/clockwork",
|
|
||||||
"licenses": [
|
|
||||||
{
|
|
||||||
"type": "Apache License 2.0",
|
|
||||||
"confidence": 1
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"project": "github.com/lib/pq",
|
|
||||||
"licenses": [
|
|
||||||
{
|
|
||||||
"type": "MIT License",
|
|
||||||
"confidence": 0.9891304347826086
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"project": "github.com/mattn/go-sqlite3",
|
|
||||||
"licenses": [
|
|
||||||
{
|
|
||||||
"type": "MIT License",
|
|
||||||
"confidence": 1
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"project": "github.com/matttproud/golang_protobuf_extensions/pbutil",
|
|
||||||
"licenses": [
|
|
||||||
{
|
|
||||||
"type": "Apache License 2.0",
|
|
||||||
"confidence": 0.9988925802879292
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"project": "github.com/pquerna/cachecontrol",
|
|
||||||
"licenses": [
|
|
||||||
{
|
|
||||||
"type": "Apache License 2.0",
|
|
||||||
"confidence": 1
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"project": "github.com/prometheus/client_golang/prometheus",
|
|
||||||
"licenses": [
|
|
||||||
{
|
|
||||||
"type": "Apache License 2.0",
|
|
||||||
"confidence": 1
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"project": "github.com/prometheus/client_model/go",
|
|
||||||
"licenses": [
|
|
||||||
{
|
|
||||||
"type": "Apache License 2.0",
|
|
||||||
"confidence": 1
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"project": "github.com/prometheus/common",
|
|
||||||
"licenses": [
|
|
||||||
{
|
|
||||||
"type": "Apache License 2.0",
|
|
||||||
"confidence": 1
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"project": "github.com/prometheus/procfs",
|
|
||||||
"licenses": [
|
|
||||||
{
|
|
||||||
"type": "Apache License 2.0",
|
|
||||||
"confidence": 1
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"project": "github.com/russellhaering/goxmldsig",
|
|
||||||
"licenses": [
|
|
||||||
{
|
|
||||||
"type": "Apache License 2.0",
|
|
||||||
"confidence": 0.9573241061130334
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"project": "github.com/sirupsen/logrus",
|
|
||||||
"licenses": [
|
|
||||||
{
|
|
||||||
"type": "MIT License",
|
|
||||||
"confidence": 1
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"project": "github.com/spf13/cobra",
|
|
||||||
"licenses": [
|
|
||||||
{
|
|
||||||
"type": "Apache License 2.0",
|
|
||||||
"confidence": 0.9573241061130334
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"project": "github.com/spf13/pflag",
|
|
||||||
"licenses": [
|
|
||||||
{
|
|
||||||
"type": "BSD 3-clause \"New\" or \"Revised\" License",
|
|
||||||
"confidence": 0.9663865546218487
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"project": "golang.org/x/crypto",
|
|
||||||
"licenses": [
|
|
||||||
{
|
|
||||||
"type": "BSD 3-clause \"New\" or \"Revised\" License",
|
|
||||||
"confidence": 0.9663865546218487
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"project": "golang.org/x/net",
|
|
||||||
"licenses": [
|
|
||||||
{
|
|
||||||
"type": "BSD 3-clause \"New\" or \"Revised\" License",
|
|
||||||
"confidence": 0.9663865546218487
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"project": "golang.org/x/oauth2",
|
|
||||||
"licenses": [
|
|
||||||
{
|
|
||||||
"type": "BSD 3-clause \"New\" or \"Revised\" License",
|
|
||||||
"confidence": 0.9663865546218487
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"project": "golang.org/x/text",
|
|
||||||
"licenses": [
|
|
||||||
{
|
|
||||||
"type": "BSD 3-clause \"New\" or \"Revised\" License",
|
|
||||||
"confidence": 0.9663865546218487
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"project": "google.golang.org/genproto/googleapis/rpc/status",
|
|
||||||
"licenses": [
|
|
||||||
{
|
|
||||||
"type": "Apache License 2.0",
|
|
||||||
"confidence": 1
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"project": "google.golang.org/grpc",
|
|
||||||
"licenses": [
|
|
||||||
{
|
|
||||||
"type": "BSD 3-clause \"New\" or \"Revised\" License",
|
|
||||||
"confidence": 0.979253112033195
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"project": "gopkg.in/asn1-ber.v1",
|
|
||||||
"licenses": [
|
|
||||||
{
|
|
||||||
"type": "BSD 3-clause \"New\" or \"Revised\" License",
|
|
||||||
"confidence": 0.9663865546218487
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"project": "gopkg.in/ldap.v2",
|
|
||||||
"licenses": [
|
|
||||||
{
|
|
||||||
"type": "BSD 3-clause \"New\" or \"Revised\" License",
|
|
||||||
"confidence": 0.9663865546218487
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"project": "gopkg.in/square/go-jose.v2",
|
|
||||||
"licenses": [
|
|
||||||
{
|
|
||||||
"type": "Apache License 2.0",
|
|
||||||
"confidence": 1
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"project": "gopkg.in/square/go-jose.v2/json",
|
|
||||||
"licenses": [
|
|
||||||
{
|
|
||||||
"type": "BSD 3-clause \"New\" or \"Revised\" License",
|
|
||||||
"confidence": 0.9663865546218487
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"project": "gopkg.in/yaml.v2",
|
|
||||||
"licenses": [
|
|
||||||
{
|
|
||||||
"type": "GNU Lesser General Public License v3.0",
|
|
||||||
"confidence": 0.9528301886792453
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "MIT License",
|
|
||||||
"confidence": 0.8975609756097561
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
]
|
|
|
@ -9,12 +9,12 @@ import (
|
||||||
"github.com/sirupsen/logrus"
|
"github.com/sirupsen/logrus"
|
||||||
"golang.org/x/crypto/bcrypt"
|
"golang.org/x/crypto/bcrypt"
|
||||||
|
|
||||||
"github.com/coreos/dex/server"
|
"github.com/dexidp/dex/server"
|
||||||
"github.com/coreos/dex/storage"
|
"github.com/dexidp/dex/storage"
|
||||||
"github.com/coreos/dex/storage/etcd"
|
"github.com/dexidp/dex/storage/etcd"
|
||||||
"github.com/coreos/dex/storage/kubernetes"
|
"github.com/dexidp/dex/storage/kubernetes"
|
||||||
"github.com/coreos/dex/storage/memory"
|
"github.com/dexidp/dex/storage/memory"
|
||||||
"github.com/coreos/dex/storage/sql"
|
"github.com/dexidp/dex/storage/sql"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Config is the config format for the main application.
|
// Config is the config format for the main application.
|
||||||
|
|
|
@ -3,12 +3,13 @@ package main
|
||||||
import (
|
import (
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/coreos/dex/connector/mock"
|
|
||||||
"github.com/coreos/dex/connector/oidc"
|
|
||||||
"github.com/coreos/dex/storage"
|
|
||||||
"github.com/coreos/dex/storage/sql"
|
|
||||||
"github.com/ghodss/yaml"
|
"github.com/ghodss/yaml"
|
||||||
"github.com/kylelemons/godebug/pretty"
|
"github.com/kylelemons/godebug/pretty"
|
||||||
|
|
||||||
|
"github.com/dexidp/dex/connector/mock"
|
||||||
|
"github.com/dexidp/dex/connector/oidc"
|
||||||
|
"github.com/dexidp/dex/storage"
|
||||||
|
"github.com/dexidp/dex/storage/sql"
|
||||||
)
|
)
|
||||||
|
|
||||||
var _ = yaml.YAMLToJSON
|
var _ = yaml.YAMLToJSON
|
||||||
|
|
|
@ -22,9 +22,9 @@ import (
|
||||||
"google.golang.org/grpc"
|
"google.golang.org/grpc"
|
||||||
"google.golang.org/grpc/credentials"
|
"google.golang.org/grpc/credentials"
|
||||||
|
|
||||||
"github.com/coreos/dex/api"
|
"github.com/dexidp/dex/api"
|
||||||
"github.com/coreos/dex/server"
|
"github.com/dexidp/dex/server"
|
||||||
"github.com/coreos/dex/storage"
|
"github.com/dexidp/dex/storage"
|
||||||
)
|
)
|
||||||
|
|
||||||
func commandServe() *cobra.Command {
|
func commandServe() *cobra.Command {
|
||||||
|
|
|
@ -4,8 +4,9 @@ import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"runtime"
|
"runtime"
|
||||||
|
|
||||||
"github.com/coreos/dex/version"
|
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
|
|
||||||
|
"github.com/dexidp/dex/version"
|
||||||
)
|
)
|
||||||
|
|
||||||
func commandVersion() *cobra.Command {
|
func commandVersion() *cobra.Command {
|
||||||
|
|
|
@ -8,8 +8,9 @@ import (
|
||||||
"net/http"
|
"net/http"
|
||||||
"net/url"
|
"net/url"
|
||||||
|
|
||||||
"github.com/coreos/dex/connector"
|
|
||||||
"github.com/sirupsen/logrus"
|
"github.com/sirupsen/logrus"
|
||||||
|
|
||||||
|
"github.com/dexidp/dex/connector"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Config holds the configuration parameters for a connector which returns an
|
// Config holds the configuration parameters for a connector which returns an
|
||||||
|
|
|
@ -19,8 +19,9 @@ import (
|
||||||
"golang.org/x/oauth2"
|
"golang.org/x/oauth2"
|
||||||
"golang.org/x/oauth2/github"
|
"golang.org/x/oauth2/github"
|
||||||
|
|
||||||
"github.com/coreos/dex/connector"
|
|
||||||
"github.com/sirupsen/logrus"
|
"github.com/sirupsen/logrus"
|
||||||
|
|
||||||
|
"github.com/dexidp/dex/connector"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
|
|
@ -11,9 +11,10 @@ import (
|
||||||
"regexp"
|
"regexp"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
|
||||||
"github.com/coreos/dex/connector"
|
|
||||||
"github.com/sirupsen/logrus"
|
"github.com/sirupsen/logrus"
|
||||||
"golang.org/x/oauth2"
|
"golang.org/x/oauth2"
|
||||||
|
|
||||||
|
"github.com/dexidp/dex/connector"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
|
|
@ -12,8 +12,9 @@ import (
|
||||||
|
|
||||||
"gopkg.in/ldap.v2"
|
"gopkg.in/ldap.v2"
|
||||||
|
|
||||||
"github.com/coreos/dex/connector"
|
|
||||||
"github.com/sirupsen/logrus"
|
"github.com/sirupsen/logrus"
|
||||||
|
|
||||||
|
"github.com/dexidp/dex/connector"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Config holds the configuration parameters for the LDAP connector. The LDAP
|
// Config holds the configuration parameters for the LDAP connector. The LDAP
|
||||||
|
|
|
@ -16,7 +16,7 @@ import (
|
||||||
"github.com/kylelemons/godebug/pretty"
|
"github.com/kylelemons/godebug/pretty"
|
||||||
"github.com/sirupsen/logrus"
|
"github.com/sirupsen/logrus"
|
||||||
|
|
||||||
"github.com/coreos/dex/connector"
|
"github.com/dexidp/dex/connector"
|
||||||
)
|
)
|
||||||
|
|
||||||
const envVar = "DEX_LDAP_TESTS"
|
const envVar = "DEX_LDAP_TESTS"
|
||||||
|
|
|
@ -11,8 +11,9 @@ import (
|
||||||
|
|
||||||
"golang.org/x/oauth2"
|
"golang.org/x/oauth2"
|
||||||
|
|
||||||
"github.com/coreos/dex/connector"
|
|
||||||
"github.com/sirupsen/logrus"
|
"github.com/sirupsen/logrus"
|
||||||
|
|
||||||
|
"github.com/dexidp/dex/connector"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
|
|
@ -14,8 +14,9 @@ import (
|
||||||
|
|
||||||
"golang.org/x/oauth2"
|
"golang.org/x/oauth2"
|
||||||
|
|
||||||
"github.com/coreos/dex/connector"
|
|
||||||
"github.com/sirupsen/logrus"
|
"github.com/sirupsen/logrus"
|
||||||
|
|
||||||
|
"github.com/dexidp/dex/connector"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
|
|
@ -8,8 +8,9 @@ import (
|
||||||
"net/http"
|
"net/http"
|
||||||
"net/url"
|
"net/url"
|
||||||
|
|
||||||
"github.com/coreos/dex/connector"
|
|
||||||
"github.com/sirupsen/logrus"
|
"github.com/sirupsen/logrus"
|
||||||
|
|
||||||
|
"github.com/dexidp/dex/connector"
|
||||||
)
|
)
|
||||||
|
|
||||||
// NewCallbackConnector returns a mock connector which requires no user interaction. It always returns
|
// NewCallbackConnector returns a mock connector which requires no user interaction. It always returns
|
||||||
|
|
|
@ -14,7 +14,7 @@ import (
|
||||||
"github.com/sirupsen/logrus"
|
"github.com/sirupsen/logrus"
|
||||||
"golang.org/x/oauth2"
|
"golang.org/x/oauth2"
|
||||||
|
|
||||||
"github.com/coreos/dex/connector"
|
"github.com/dexidp/dex/connector"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Config holds configuration options for OpenID Connect logins.
|
// Config holds configuration options for OpenID Connect logins.
|
||||||
|
@ -41,7 +41,7 @@ type Config struct {
|
||||||
// Domains that don't support basic auth. golang.org/x/oauth2 has an internal
|
// Domains that don't support basic auth. golang.org/x/oauth2 has an internal
|
||||||
// list, but it only matches specific URLs, not top level domains.
|
// list, but it only matches specific URLs, not top level domains.
|
||||||
var brokenAuthHeaderDomains = []string{
|
var brokenAuthHeaderDomains = []string{
|
||||||
// See: https://github.com/coreos/dex/issues/859
|
// See: https://github.com/dexidp/dex/issues/859
|
||||||
"okta.com",
|
"okta.com",
|
||||||
"oktapreview.com",
|
"oktapreview.com",
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,7 +17,7 @@ import (
|
||||||
"github.com/russellhaering/goxmldsig/etreeutils"
|
"github.com/russellhaering/goxmldsig/etreeutils"
|
||||||
"github.com/sirupsen/logrus"
|
"github.com/sirupsen/logrus"
|
||||||
|
|
||||||
"github.com/coreos/dex/connector"
|
"github.com/dexidp/dex/connector"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
|
|
@ -14,7 +14,7 @@ import (
|
||||||
dsig "github.com/russellhaering/goxmldsig"
|
dsig "github.com/russellhaering/goxmldsig"
|
||||||
"github.com/sirupsen/logrus"
|
"github.com/sirupsen/logrus"
|
||||||
|
|
||||||
"github.com/coreos/dex/connector"
|
"github.com/dexidp/dex/connector"
|
||||||
)
|
)
|
||||||
|
|
||||||
// responseTest maps a SAML 2.0 response object to a set of expected values.
|
// responseTest maps a SAML 2.0 response object to a set of expected values.
|
||||||
|
|
|
@ -9,9 +9,10 @@ import (
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"log"
|
"log"
|
||||||
|
|
||||||
"github.com/coreos/dex/api"
|
|
||||||
"google.golang.org/grpc"
|
"google.golang.org/grpc"
|
||||||
"google.golang.org/grpc/credentials"
|
"google.golang.org/grpc/credentials"
|
||||||
|
|
||||||
|
"github.com/dexidp/dex/api"
|
||||||
)
|
)
|
||||||
|
|
||||||
func newDexClient(hostAndPort, caPath, clientCrt, clientKey string) (api.DexClient, error) {
|
func newDexClient(hostAndPort, caPath, clientCrt, clientKey string) (api.DexClient, error) {
|
||||||
|
|
6
glide.lock
generated
6
glide.lock
generated
|
@ -1,5 +1,5 @@
|
||||||
hash: dda54feb39d5947ad20e9d583ccad9be02343dac0f52752944b7cd39668af7a4
|
hash: c41e5b1fbd68f04f14b6e9b2ebab8bf18b857b3dc3a5754e4adf7c1884981de7
|
||||||
updated: 2017-12-20T16:05:04.690191111+01:00
|
updated: 2018-09-05T08:40:39.486766558+02:00
|
||||||
imports:
|
imports:
|
||||||
- name: github.com/beevik/etree
|
- name: github.com/beevik/etree
|
||||||
version: 4cd0dd976db869f817248477718071a28e978df0
|
version: 4cd0dd976db869f817248477718071a28e978df0
|
||||||
|
@ -24,8 +24,6 @@ imports:
|
||||||
- pkg/transport
|
- pkg/transport
|
||||||
- name: github.com/coreos/go-oidc
|
- name: github.com/coreos/go-oidc
|
||||||
version: be73733bb8cc830d0205609b95d125215f8e9c70
|
version: be73733bb8cc830d0205609b95d125215f8e9c70
|
||||||
- name: github.com/coreos/license-bill-of-materials
|
|
||||||
version: d70207c33a3c79a1c0479b208f8b7ab6215144c7
|
|
||||||
- name: github.com/felixge/httpsnoop
|
- name: github.com/felixge/httpsnoop
|
||||||
version: eadd4fad6aac69ae62379194fe0219f3dbc80fd3
|
version: eadd4fad6aac69ae62379194fe0219f3dbc80fd3
|
||||||
- name: github.com/ghodss/yaml
|
- name: github.com/ghodss/yaml
|
||||||
|
|
|
@ -7,7 +7,7 @@
|
||||||
# * Create a separate block for each dependency group.
|
# * Create a separate block for each dependency group.
|
||||||
# * Keep updates to "vendor/" in a separate commit from actual changes.
|
# * Keep updates to "vendor/" in a separate commit from actual changes.
|
||||||
|
|
||||||
package: github.com/coreos/dex
|
package: github.com/dexidp/dex
|
||||||
import:
|
import:
|
||||||
|
|
||||||
- package: github.com/spf13/cobra
|
- package: github.com/spf13/cobra
|
||||||
|
@ -155,10 +155,6 @@ import:
|
||||||
- package: github.com/jonboulle/clockwork
|
- package: github.com/jonboulle/clockwork
|
||||||
version: bcac9884e7502bb2b474c0339d889cb981a2f27f
|
version: bcac9884e7502bb2b474c0339d889cb981a2f27f
|
||||||
|
|
||||||
# License bill of materials generator.
|
|
||||||
- package: github.com/coreos/license-bill-of-materials
|
|
||||||
version: d70207c33a3c79a1c0479b208f8b7ab6215144c7
|
|
||||||
|
|
||||||
# monitoring packages
|
# monitoring packages
|
||||||
- package: github.com/beorn7/perks/quantile
|
- package: github.com/beorn7/perks/quantile
|
||||||
version: 3ac7bf7a47d159a033b107610db8a1b6575507a4
|
version: 3ac7bf7a47d159a033b107610db8a1b6575507a4
|
||||||
|
|
|
@ -10,11 +10,12 @@ import (
|
||||||
// https://github.com/grpc/grpc-go/issues/711
|
// https://github.com/grpc/grpc-go/issues/711
|
||||||
"golang.org/x/net/context"
|
"golang.org/x/net/context"
|
||||||
|
|
||||||
"github.com/coreos/dex/api"
|
|
||||||
"github.com/coreos/dex/server/internal"
|
|
||||||
"github.com/coreos/dex/storage"
|
|
||||||
"github.com/coreos/dex/version"
|
|
||||||
"github.com/sirupsen/logrus"
|
"github.com/sirupsen/logrus"
|
||||||
|
|
||||||
|
"github.com/dexidp/dex/api"
|
||||||
|
"github.com/dexidp/dex/server/internal"
|
||||||
|
"github.com/dexidp/dex/storage"
|
||||||
|
"github.com/dexidp/dex/version"
|
||||||
)
|
)
|
||||||
|
|
||||||
// apiVersion increases every time a new call is added to the API. Clients should use this info
|
// apiVersion increases every time a new call is added to the API. Clients should use this info
|
||||||
|
|
|
@ -7,12 +7,13 @@ import (
|
||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/coreos/dex/api"
|
|
||||||
"github.com/coreos/dex/server/internal"
|
|
||||||
"github.com/coreos/dex/storage"
|
|
||||||
"github.com/coreos/dex/storage/memory"
|
|
||||||
"github.com/sirupsen/logrus"
|
"github.com/sirupsen/logrus"
|
||||||
"google.golang.org/grpc"
|
"google.golang.org/grpc"
|
||||||
|
|
||||||
|
"github.com/dexidp/dex/api"
|
||||||
|
"github.com/dexidp/dex/server/internal"
|
||||||
|
"github.com/dexidp/dex/storage"
|
||||||
|
"github.com/dexidp/dex/storage/memory"
|
||||||
)
|
)
|
||||||
|
|
||||||
// apiClient is a test gRPC client. When constructed, it runs a server in
|
// apiClient is a test gRPC client. When constructed, it runs a server in
|
||||||
|
@ -276,7 +277,7 @@ func TestRefreshToken(t *testing.T) {
|
||||||
|
|
||||||
// Try to delete again.
|
// Try to delete again.
|
||||||
//
|
//
|
||||||
// See https://github.com/coreos/dex/issues/1055
|
// See https://github.com/dexidp/dex/issues/1055
|
||||||
resp, err = client.RevokeRefresh(ctx, &revokeReq)
|
resp, err = client.RevokeRefresh(ctx, &revokeReq)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("Unable to revoke refresh tokens for user: %v", err)
|
t.Fatalf("Unable to revoke refresh tokens for user: %v", err)
|
||||||
|
|
|
@ -15,9 +15,9 @@ import (
|
||||||
"github.com/gorilla/mux"
|
"github.com/gorilla/mux"
|
||||||
jose "gopkg.in/square/go-jose.v2"
|
jose "gopkg.in/square/go-jose.v2"
|
||||||
|
|
||||||
"github.com/coreos/dex/connector"
|
"github.com/dexidp/dex/connector"
|
||||||
"github.com/coreos/dex/server/internal"
|
"github.com/dexidp/dex/server/internal"
|
||||||
"github.com/coreos/dex/storage"
|
"github.com/dexidp/dex/storage"
|
||||||
)
|
)
|
||||||
|
|
||||||
func (s *Server) handleHealth(w http.ResponseWriter, r *http.Request) {
|
func (s *Server) handleHealth(w http.ResponseWriter, r *http.Request) {
|
||||||
|
@ -159,7 +159,7 @@ func (s *Server) handleAuthorization(w http.ResponseWriter, r *http.Request) {
|
||||||
// so users don't hit "not found" database errors if they wait at the login
|
// so users don't hit "not found" database errors if they wait at the login
|
||||||
// screen too long.
|
// screen too long.
|
||||||
//
|
//
|
||||||
// See: https://github.com/coreos/dex/issues/646
|
// See: https://github.com/dexidp/dex/issues/646
|
||||||
authReq.Expiry = s.now().Add(24 * time.Hour) // Totally arbitrary value.
|
authReq.Expiry = s.now().Add(24 * time.Hour) // Totally arbitrary value.
|
||||||
if err := s.storage.CreateAuthRequest(authReq); err != nil {
|
if err := s.storage.CreateAuthRequest(authReq); err != nil {
|
||||||
s.logger.Errorf("Failed to create authorization request: %v", err)
|
s.logger.Errorf("Failed to create authorization request: %v", err)
|
||||||
|
|
|
@ -21,9 +21,9 @@ import (
|
||||||
|
|
||||||
jose "gopkg.in/square/go-jose.v2"
|
jose "gopkg.in/square/go-jose.v2"
|
||||||
|
|
||||||
"github.com/coreos/dex/connector"
|
"github.com/dexidp/dex/connector"
|
||||||
"github.com/coreos/dex/server/internal"
|
"github.com/dexidp/dex/server/internal"
|
||||||
"github.com/coreos/dex/storage"
|
"github.com/dexidp/dex/storage"
|
||||||
)
|
)
|
||||||
|
|
||||||
// TODO(ericchiang): clean this file up and figure out more idiomatic error handling.
|
// TODO(ericchiang): clean this file up and figure out more idiomatic error handling.
|
||||||
|
@ -150,7 +150,7 @@ func signatureAlgorithm(jwk *jose.JSONWebKey) (alg jose.SignatureAlgorithm, err
|
||||||
// value. In the future, we might want to make this configurable on a
|
// value. In the future, we might want to make this configurable on a
|
||||||
// per client basis. For example allowing PS256 or ECDSA variants.
|
// per client basis. For example allowing PS256 or ECDSA variants.
|
||||||
//
|
//
|
||||||
// See https://github.com/coreos/dex/issues/692
|
// See https://github.com/dexidp/dex/issues/692
|
||||||
return jose.RS256, nil
|
return jose.RS256, nil
|
||||||
case *ecdsa.PrivateKey:
|
case *ecdsa.PrivateKey:
|
||||||
// We don't actually support ECDSA keys yet, but they're tested for
|
// We don't actually support ECDSA keys yet, but they're tested for
|
||||||
|
|
|
@ -10,7 +10,7 @@ import (
|
||||||
|
|
||||||
jose "gopkg.in/square/go-jose.v2"
|
jose "gopkg.in/square/go-jose.v2"
|
||||||
|
|
||||||
"github.com/coreos/dex/storage"
|
"github.com/dexidp/dex/storage"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestParseAuthorizationRequest(t *testing.T) {
|
func TestParseAuthorizationRequest(t *testing.T) {
|
||||||
|
|
|
@ -12,8 +12,9 @@ import (
|
||||||
|
|
||||||
"gopkg.in/square/go-jose.v2"
|
"gopkg.in/square/go-jose.v2"
|
||||||
|
|
||||||
"github.com/coreos/dex/storage"
|
|
||||||
"github.com/sirupsen/logrus"
|
"github.com/sirupsen/logrus"
|
||||||
|
|
||||||
|
"github.com/dexidp/dex/storage"
|
||||||
)
|
)
|
||||||
|
|
||||||
var errAlreadyRotated = errors.New("keys already rotated by another server instance")
|
var errAlreadyRotated = errors.New("keys already rotated by another server instance")
|
||||||
|
|
|
@ -6,9 +6,10 @@ import (
|
||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/coreos/dex/storage"
|
|
||||||
"github.com/coreos/dex/storage/memory"
|
|
||||||
"github.com/sirupsen/logrus"
|
"github.com/sirupsen/logrus"
|
||||||
|
|
||||||
|
"github.com/dexidp/dex/storage"
|
||||||
|
"github.com/dexidp/dex/storage/memory"
|
||||||
)
|
)
|
||||||
|
|
||||||
func signingKeyID(t *testing.T, s storage.Storage) string {
|
func signingKeyID(t *testing.T, s storage.Storage) string {
|
||||||
|
|
|
@ -22,17 +22,17 @@ import (
|
||||||
"github.com/prometheus/client_golang/prometheus"
|
"github.com/prometheus/client_golang/prometheus"
|
||||||
"github.com/sirupsen/logrus"
|
"github.com/sirupsen/logrus"
|
||||||
|
|
||||||
"github.com/coreos/dex/connector"
|
"github.com/dexidp/dex/connector"
|
||||||
"github.com/coreos/dex/connector/authproxy"
|
"github.com/dexidp/dex/connector/authproxy"
|
||||||
"github.com/coreos/dex/connector/github"
|
"github.com/dexidp/dex/connector/github"
|
||||||
"github.com/coreos/dex/connector/gitlab"
|
"github.com/dexidp/dex/connector/gitlab"
|
||||||
"github.com/coreos/dex/connector/ldap"
|
"github.com/dexidp/dex/connector/ldap"
|
||||||
"github.com/coreos/dex/connector/linkedin"
|
"github.com/dexidp/dex/connector/linkedin"
|
||||||
"github.com/coreos/dex/connector/microsoft"
|
"github.com/dexidp/dex/connector/microsoft"
|
||||||
"github.com/coreos/dex/connector/mock"
|
"github.com/dexidp/dex/connector/mock"
|
||||||
"github.com/coreos/dex/connector/oidc"
|
"github.com/dexidp/dex/connector/oidc"
|
||||||
"github.com/coreos/dex/connector/saml"
|
"github.com/dexidp/dex/connector/saml"
|
||||||
"github.com/coreos/dex/storage"
|
"github.com/dexidp/dex/storage"
|
||||||
)
|
)
|
||||||
|
|
||||||
// LocalConnector is the local passwordDB connector which is an internal
|
// LocalConnector is the local passwordDB connector which is an internal
|
||||||
|
|
|
@ -13,7 +13,6 @@ import (
|
||||||
"net/http/httputil"
|
"net/http/httputil"
|
||||||
"net/url"
|
"net/url"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
|
||||||
"reflect"
|
"reflect"
|
||||||
"sort"
|
"sort"
|
||||||
"strings"
|
"strings"
|
||||||
|
@ -29,10 +28,10 @@ import (
|
||||||
"golang.org/x/oauth2"
|
"golang.org/x/oauth2"
|
||||||
jose "gopkg.in/square/go-jose.v2"
|
jose "gopkg.in/square/go-jose.v2"
|
||||||
|
|
||||||
"github.com/coreos/dex/connector"
|
"github.com/dexidp/dex/connector"
|
||||||
"github.com/coreos/dex/connector/mock"
|
"github.com/dexidp/dex/connector/mock"
|
||||||
"github.com/coreos/dex/storage"
|
"github.com/dexidp/dex/storage"
|
||||||
"github.com/coreos/dex/storage/memory"
|
"github.com/dexidp/dex/storage/memory"
|
||||||
)
|
)
|
||||||
|
|
||||||
func mustLoad(s string) *rsa.PrivateKey {
|
func mustLoad(s string) *rsa.PrivateKey {
|
||||||
|
@ -91,7 +90,7 @@ func newTestServer(ctx context.Context, t *testing.T, updateConfig func(c *Confi
|
||||||
Issuer: s.URL,
|
Issuer: s.URL,
|
||||||
Storage: memory.New(logger),
|
Storage: memory.New(logger),
|
||||||
Web: WebConfig{
|
Web: WebConfig{
|
||||||
Dir: filepath.Join(os.Getenv("GOPATH"), "src/github.com/coreos/dex/web"),
|
Dir: "../web",
|
||||||
},
|
},
|
||||||
Logger: logger,
|
Logger: logger,
|
||||||
PrometheusRegistry: prometheus.NewRegistry(),
|
PrometheusRegistry: prometheus.NewRegistry(),
|
||||||
|
|
|
@ -13,7 +13,7 @@ import (
|
||||||
|
|
||||||
"golang.org/x/crypto/bcrypt"
|
"golang.org/x/crypto/bcrypt"
|
||||||
|
|
||||||
"github.com/coreos/dex/storage"
|
"github.com/dexidp/dex/storage"
|
||||||
|
|
||||||
"github.com/kylelemons/godebug/pretty"
|
"github.com/kylelemons/godebug/pretty"
|
||||||
)
|
)
|
||||||
|
|
|
@ -8,7 +8,7 @@ import (
|
||||||
|
|
||||||
"golang.org/x/crypto/bcrypt"
|
"golang.org/x/crypto/bcrypt"
|
||||||
|
|
||||||
"github.com/coreos/dex/storage"
|
"github.com/dexidp/dex/storage"
|
||||||
)
|
)
|
||||||
|
|
||||||
// RunTransactionTests runs a test suite aimed a verifying the transaction
|
// RunTransactionTests runs a test suite aimed a verifying the transaction
|
||||||
|
|
|
@ -3,11 +3,12 @@ package etcd
|
||||||
import (
|
import (
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/coreos/dex/storage"
|
|
||||||
"github.com/coreos/etcd/clientv3"
|
"github.com/coreos/etcd/clientv3"
|
||||||
"github.com/coreos/etcd/clientv3/namespace"
|
"github.com/coreos/etcd/clientv3/namespace"
|
||||||
"github.com/coreos/etcd/pkg/transport"
|
"github.com/coreos/etcd/pkg/transport"
|
||||||
"github.com/sirupsen/logrus"
|
"github.com/sirupsen/logrus"
|
||||||
|
|
||||||
|
"github.com/dexidp/dex/storage"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
|
|
|
@ -7,9 +7,10 @@ import (
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/coreos/dex/storage"
|
|
||||||
"github.com/coreos/etcd/clientv3"
|
"github.com/coreos/etcd/clientv3"
|
||||||
"github.com/sirupsen/logrus"
|
"github.com/sirupsen/logrus"
|
||||||
|
|
||||||
|
"github.com/dexidp/dex/storage"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
|
|
@ -9,10 +9,11 @@ import (
|
||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/coreos/dex/storage"
|
|
||||||
"github.com/coreos/dex/storage/conformance"
|
|
||||||
"github.com/coreos/etcd/clientv3"
|
"github.com/coreos/etcd/clientv3"
|
||||||
"github.com/sirupsen/logrus"
|
"github.com/sirupsen/logrus"
|
||||||
|
|
||||||
|
"github.com/dexidp/dex/storage"
|
||||||
|
"github.com/dexidp/dex/storage/conformance"
|
||||||
)
|
)
|
||||||
|
|
||||||
func withTimeout(t time.Duration, f func()) {
|
func withTimeout(t time.Duration, f func()) {
|
||||||
|
|
|
@ -3,8 +3,9 @@ package etcd
|
||||||
import (
|
import (
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/coreos/dex/storage"
|
|
||||||
jose "gopkg.in/square/go-jose.v2"
|
jose "gopkg.in/square/go-jose.v2"
|
||||||
|
|
||||||
|
"github.com/dexidp/dex/storage"
|
||||||
)
|
)
|
||||||
|
|
||||||
// AuthCode is a mirrored struct from storage with JSON struct tags
|
// AuthCode is a mirrored struct from storage with JSON struct tags
|
||||||
|
|
|
@ -27,8 +27,8 @@ import (
|
||||||
"github.com/sirupsen/logrus"
|
"github.com/sirupsen/logrus"
|
||||||
"golang.org/x/net/http2"
|
"golang.org/x/net/http2"
|
||||||
|
|
||||||
"github.com/coreos/dex/storage"
|
"github.com/dexidp/dex/storage"
|
||||||
"github.com/coreos/dex/storage/kubernetes/k8sapi"
|
"github.com/dexidp/dex/storage/kubernetes/k8sapi"
|
||||||
)
|
)
|
||||||
|
|
||||||
type client struct {
|
type client struct {
|
||||||
|
|
|
@ -7,9 +7,10 @@ import (
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/coreos/dex/storage"
|
|
||||||
"github.com/coreos/dex/storage/kubernetes/k8sapi"
|
|
||||||
"github.com/sirupsen/logrus"
|
"github.com/sirupsen/logrus"
|
||||||
|
|
||||||
|
"github.com/dexidp/dex/storage"
|
||||||
|
"github.com/dexidp/dex/storage/kubernetes/k8sapi"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
|
|
@ -5,9 +5,10 @@ import (
|
||||||
"os"
|
"os"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/coreos/dex/storage"
|
|
||||||
"github.com/coreos/dex/storage/conformance"
|
|
||||||
"github.com/sirupsen/logrus"
|
"github.com/sirupsen/logrus"
|
||||||
|
|
||||||
|
"github.com/dexidp/dex/storage"
|
||||||
|
"github.com/dexidp/dex/storage/conformance"
|
||||||
)
|
)
|
||||||
|
|
||||||
const testKubeConfigEnv = "DEX_KUBECONFIG"
|
const testKubeConfigEnv = "DEX_KUBECONFIG"
|
||||||
|
|
|
@ -6,8 +6,8 @@ import (
|
||||||
|
|
||||||
jose "gopkg.in/square/go-jose.v2"
|
jose "gopkg.in/square/go-jose.v2"
|
||||||
|
|
||||||
"github.com/coreos/dex/storage"
|
"github.com/dexidp/dex/storage"
|
||||||
"github.com/coreos/dex/storage/kubernetes/k8sapi"
|
"github.com/dexidp/dex/storage/kubernetes/k8sapi"
|
||||||
)
|
)
|
||||||
|
|
||||||
var tprMeta = k8sapi.TypeMeta{
|
var tprMeta = k8sapi.TypeMeta{
|
||||||
|
|
|
@ -6,8 +6,9 @@ import (
|
||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/coreos/dex/storage"
|
|
||||||
"github.com/sirupsen/logrus"
|
"github.com/sirupsen/logrus"
|
||||||
|
|
||||||
|
"github.com/dexidp/dex/storage"
|
||||||
)
|
)
|
||||||
|
|
||||||
// New returns an in memory storage.
|
// New returns an in memory storage.
|
||||||
|
|
|
@ -4,9 +4,10 @@ import (
|
||||||
"os"
|
"os"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/coreos/dex/storage"
|
|
||||||
"github.com/coreos/dex/storage/conformance"
|
|
||||||
"github.com/sirupsen/logrus"
|
"github.com/sirupsen/logrus"
|
||||||
|
|
||||||
|
"github.com/dexidp/dex/storage"
|
||||||
|
"github.com/dexidp/dex/storage/conformance"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestStorage(t *testing.T) {
|
func TestStorage(t *testing.T) {
|
||||||
|
|
|
@ -6,8 +6,9 @@ import (
|
||||||
"strings"
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/coreos/dex/storage"
|
|
||||||
"github.com/sirupsen/logrus"
|
"github.com/sirupsen/logrus"
|
||||||
|
|
||||||
|
"github.com/dexidp/dex/storage"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestStaticClients(t *testing.T) {
|
func TestStaticClients(t *testing.T) {
|
||||||
|
|
|
@ -6,10 +6,11 @@ import (
|
||||||
"net/url"
|
"net/url"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
|
||||||
"github.com/coreos/dex/storage"
|
|
||||||
"github.com/lib/pq"
|
"github.com/lib/pq"
|
||||||
sqlite3 "github.com/mattn/go-sqlite3"
|
sqlite3 "github.com/mattn/go-sqlite3"
|
||||||
"github.com/sirupsen/logrus"
|
"github.com/sirupsen/logrus"
|
||||||
|
|
||||||
|
"github.com/dexidp/dex/storage"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
|
|
@ -7,9 +7,10 @@ import (
|
||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/coreos/dex/storage"
|
|
||||||
"github.com/coreos/dex/storage/conformance"
|
|
||||||
"github.com/sirupsen/logrus"
|
"github.com/sirupsen/logrus"
|
||||||
|
|
||||||
|
"github.com/dexidp/dex/storage"
|
||||||
|
"github.com/dexidp/dex/storage/conformance"
|
||||||
)
|
)
|
||||||
|
|
||||||
func withTimeout(t time.Duration, f func()) {
|
func withTimeout(t time.Duration, f func()) {
|
||||||
|
|
|
@ -9,7 +9,7 @@ import (
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/coreos/dex/storage"
|
"github.com/dexidp/dex/storage"
|
||||||
)
|
)
|
||||||
|
|
||||||
// TODO(ericchiang): The update, insert, and select methods queries are all
|
// TODO(ericchiang): The update, insert, and select methods queries are all
|
||||||
|
|
19
vendor/github.com/coreos/license-bill-of-materials/LICENSE
generated
vendored
19
vendor/github.com/coreos/license-bill-of-materials/LICENSE
generated
vendored
|
@ -1,19 +0,0 @@
|
||||||
Copyright (c) 2015 Patrick Mézard
|
|
||||||
|
|
||||||
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.
|
|
733
vendor/github.com/coreos/license-bill-of-materials/license-bill-of-materials.go
generated
vendored
733
vendor/github.com/coreos/license-bill-of-materials/license-bill-of-materials.go
generated
vendored
|
@ -1,733 +0,0 @@
|
||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bufio"
|
|
||||||
"bytes"
|
|
||||||
"encoding/json"
|
|
||||||
"flag"
|
|
||||||
"fmt"
|
|
||||||
"io/ioutil"
|
|
||||||
"log"
|
|
||||||
"os"
|
|
||||||
"os/exec"
|
|
||||||
"path/filepath"
|
|
||||||
"regexp"
|
|
||||||
"sort"
|
|
||||||
"strconv"
|
|
||||||
"strings"
|
|
||||||
|
|
||||||
"github.com/coreos/license-bill-of-materials/assets"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Template holds pre-constructed license template info
|
|
||||||
type Template struct {
|
|
||||||
Title string
|
|
||||||
Nickname string
|
|
||||||
Words map[string]int
|
|
||||||
}
|
|
||||||
|
|
||||||
func parseTemplate(content string) (*Template, error) {
|
|
||||||
t := Template{}
|
|
||||||
text := []byte{}
|
|
||||||
state := 0
|
|
||||||
scanner := bufio.NewScanner(strings.NewReader(content))
|
|
||||||
for scanner.Scan() {
|
|
||||||
line := strings.TrimSpace(scanner.Text())
|
|
||||||
if state == 0 {
|
|
||||||
if line == "---" {
|
|
||||||
state = 1
|
|
||||||
}
|
|
||||||
} else if state == 1 {
|
|
||||||
if line == "---" {
|
|
||||||
state = 2
|
|
||||||
} else {
|
|
||||||
if strings.HasPrefix(line, "title:") {
|
|
||||||
t.Title = strings.TrimSpace(line[len("title:"):])
|
|
||||||
} else if strings.HasPrefix(line, "nickname:") {
|
|
||||||
t.Nickname = strings.TrimSpace(line[len("nickname:"):])
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else if state == 2 {
|
|
||||||
text = append(text, scanner.Bytes()...)
|
|
||||||
text = append(text, []byte("\n")...)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
t.Words = makeWordSet(text)
|
|
||||||
return &t, scanner.Err()
|
|
||||||
}
|
|
||||||
|
|
||||||
func loadTemplates() ([]*Template, error) {
|
|
||||||
templates := []*Template{}
|
|
||||||
for _, a := range assets.Assets {
|
|
||||||
templ, err := parseTemplate(a.Content)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
templates = append(templates, templ)
|
|
||||||
}
|
|
||||||
return templates, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
var (
|
|
||||||
reWords = regexp.MustCompile(`[\w']+`)
|
|
||||||
reCopyright = regexp.MustCompile(
|
|
||||||
`(?i)\s*Copyright (?:©|\(c\)|\xC2\xA9)?\s*(?:\d{4}|\[year\]).*`)
|
|
||||||
)
|
|
||||||
|
|
||||||
func cleanLicenseData(data []byte) []byte {
|
|
||||||
data = bytes.ToLower(data)
|
|
||||||
data = reCopyright.ReplaceAll(data, nil)
|
|
||||||
return data
|
|
||||||
}
|
|
||||||
|
|
||||||
func makeWordSet(data []byte) map[string]int {
|
|
||||||
words := map[string]int{}
|
|
||||||
data = cleanLicenseData(data)
|
|
||||||
matches := reWords.FindAll(data, -1)
|
|
||||||
for i, m := range matches {
|
|
||||||
s := string(m)
|
|
||||||
if _, ok := words[s]; !ok {
|
|
||||||
// Non-matching words are likely in the license header, to mention
|
|
||||||
// copyrights and authors. Try to preserve the initial sequences,
|
|
||||||
// to display them later.
|
|
||||||
words[s] = i
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return words
|
|
||||||
}
|
|
||||||
|
|
||||||
// Word holds word and word position in a license
|
|
||||||
type Word struct {
|
|
||||||
Text string
|
|
||||||
Pos int
|
|
||||||
}
|
|
||||||
|
|
||||||
type sortedWords []Word
|
|
||||||
|
|
||||||
func (s sortedWords) Len() int {
|
|
||||||
return len(s)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s sortedWords) Swap(i, j int) {
|
|
||||||
s[i], s[j] = s[j], s[i]
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s sortedWords) Less(i, j int) bool {
|
|
||||||
return s[i].Pos < s[j].Pos
|
|
||||||
}
|
|
||||||
|
|
||||||
// MatchResult represents a matched template and matching metrics
|
|
||||||
type MatchResult struct {
|
|
||||||
Template *Template
|
|
||||||
Score float64
|
|
||||||
ExtraWords []string
|
|
||||||
MissingWords []string
|
|
||||||
}
|
|
||||||
|
|
||||||
func sortAndReturnWords(words []Word) []string {
|
|
||||||
sort.Sort(sortedWords(words))
|
|
||||||
tokens := []string{}
|
|
||||||
for _, w := range words {
|
|
||||||
tokens = append(tokens, w.Text)
|
|
||||||
}
|
|
||||||
return tokens
|
|
||||||
}
|
|
||||||
|
|
||||||
// matchTemplates returns the best license template matching supplied data,
|
|
||||||
// its score between 0 and 1 and the list of words appearing in license but not
|
|
||||||
// in the matched template.
|
|
||||||
func matchTemplates(license []byte, templates []*Template) MatchResult {
|
|
||||||
bestScore := float64(-1)
|
|
||||||
var bestTemplate *Template
|
|
||||||
bestExtra := []Word{}
|
|
||||||
bestMissing := []Word{}
|
|
||||||
words := makeWordSet(license)
|
|
||||||
for _, t := range templates {
|
|
||||||
extra := []Word{}
|
|
||||||
missing := []Word{}
|
|
||||||
common := 0
|
|
||||||
for w, pos := range words {
|
|
||||||
_, ok := t.Words[w]
|
|
||||||
if ok {
|
|
||||||
common++
|
|
||||||
} else {
|
|
||||||
extra = append(extra, Word{
|
|
||||||
Text: w,
|
|
||||||
Pos: pos,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for w, pos := range t.Words {
|
|
||||||
if _, ok := words[w]; !ok {
|
|
||||||
missing = append(missing, Word{
|
|
||||||
Text: w,
|
|
||||||
Pos: pos,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
score := 2 * float64(common) / (float64(len(words)) + float64(len(t.Words)))
|
|
||||||
if score > bestScore {
|
|
||||||
bestScore = score
|
|
||||||
bestTemplate = t
|
|
||||||
bestMissing = missing
|
|
||||||
bestExtra = extra
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return MatchResult{
|
|
||||||
Template: bestTemplate,
|
|
||||||
Score: bestScore,
|
|
||||||
ExtraWords: sortAndReturnWords(bestExtra),
|
|
||||||
MissingWords: sortAndReturnWords(bestMissing),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// fixEnv returns a copy of the process environment where GOPATH is adjusted to
|
|
||||||
// supplied value. It returns nil if gopath is empty.
|
|
||||||
func fixEnv(gopath string) []string {
|
|
||||||
if gopath == "" {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
kept := []string{
|
|
||||||
"GOPATH=" + gopath,
|
|
||||||
}
|
|
||||||
for _, env := range os.Environ() {
|
|
||||||
if !strings.HasPrefix(env, "GOPATH=") {
|
|
||||||
kept = append(kept, env)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return kept
|
|
||||||
}
|
|
||||||
|
|
||||||
// MissingError reports on missing licenses
|
|
||||||
type MissingError struct {
|
|
||||||
Err string
|
|
||||||
}
|
|
||||||
|
|
||||||
func (err *MissingError) Error() string {
|
|
||||||
return err.Err
|
|
||||||
}
|
|
||||||
|
|
||||||
// expandPackages takes a list of package or package expressions and invoke go
|
|
||||||
// list to expand them to packages. In particular, it handles things like "..."
|
|
||||||
// and ".".
|
|
||||||
func expandPackages(gopath string, pkgs []string) ([]string, error) {
|
|
||||||
args := []string{"list"}
|
|
||||||
args = append(args, pkgs...)
|
|
||||||
cmd := exec.Command("go", args...)
|
|
||||||
cmd.Env = fixEnv(gopath)
|
|
||||||
out, err := cmd.CombinedOutput()
|
|
||||||
if err != nil {
|
|
||||||
output := string(out)
|
|
||||||
if strings.Contains(output, "cannot find package") ||
|
|
||||||
strings.Contains(output, "no buildable Go source files") {
|
|
||||||
return nil, &MissingError{Err: output}
|
|
||||||
}
|
|
||||||
return nil, fmt.Errorf("'go %s' failed with:\n%s",
|
|
||||||
strings.Join(args, " "), output)
|
|
||||||
}
|
|
||||||
names := []string{}
|
|
||||||
for _, s := range strings.Split(string(out), "\n") {
|
|
||||||
s = strings.TrimSpace(s)
|
|
||||||
if s != "" {
|
|
||||||
names = append(names, s)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return names, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func listPackagesAndDeps(gopath string, pkgs []string) ([]string, error) {
|
|
||||||
pkgs, err := expandPackages(gopath, pkgs)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
args := []string{"list", "-f", "{{range .Deps}}{{.}}|{{end}}"}
|
|
||||||
args = append(args, pkgs...)
|
|
||||||
cmd := exec.Command("go", args...)
|
|
||||||
cmd.Env = fixEnv(gopath)
|
|
||||||
out, err := cmd.CombinedOutput()
|
|
||||||
if err != nil {
|
|
||||||
output := string(out)
|
|
||||||
if strings.Contains(output, "cannot find package") ||
|
|
||||||
strings.Contains(output, "no buildable Go source files") {
|
|
||||||
return nil, &MissingError{Err: output}
|
|
||||||
}
|
|
||||||
return nil, fmt.Errorf("'go %s' failed with:\n%s",
|
|
||||||
strings.Join(args, " "), output)
|
|
||||||
}
|
|
||||||
deps := []string{}
|
|
||||||
seen := map[string]bool{}
|
|
||||||
for _, s := range strings.Split(string(out), "|") {
|
|
||||||
s = strings.TrimSpace(s)
|
|
||||||
if s != "" && !seen[s] {
|
|
||||||
deps = append(deps, s)
|
|
||||||
seen[s] = true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for _, pkg := range pkgs {
|
|
||||||
if !seen[pkg] {
|
|
||||||
seen[pkg] = true
|
|
||||||
deps = append(deps, pkg)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
sort.Strings(deps)
|
|
||||||
return deps, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func listStandardPackages(gopath string) ([]string, error) {
|
|
||||||
return expandPackages(gopath, []string{"std", "cmd"})
|
|
||||||
}
|
|
||||||
|
|
||||||
// PkgError reports on missing packages
|
|
||||||
type PkgError struct {
|
|
||||||
Err string
|
|
||||||
}
|
|
||||||
|
|
||||||
// PkgInfo holds identifying package info
|
|
||||||
type PkgInfo struct {
|
|
||||||
Name string
|
|
||||||
Dir string
|
|
||||||
Root string
|
|
||||||
ImportPath string
|
|
||||||
Error *PkgError
|
|
||||||
}
|
|
||||||
|
|
||||||
func getPackagesInfo(gopath string, pkgs []string) ([]*PkgInfo, error) {
|
|
||||||
args := []string{"list", "-e", "-json"}
|
|
||||||
// TODO: split the list for platforms which do not support massive argument
|
|
||||||
// lists.
|
|
||||||
args = append(args, pkgs...)
|
|
||||||
cmd := exec.Command("go", args...)
|
|
||||||
cmd.Env = fixEnv(gopath)
|
|
||||||
out, err := cmd.CombinedOutput()
|
|
||||||
if err != nil {
|
|
||||||
return nil, fmt.Errorf("go %s failed with:\n%s",
|
|
||||||
strings.Join(args, " "), string(out))
|
|
||||||
}
|
|
||||||
infos := make([]*PkgInfo, 0, len(pkgs))
|
|
||||||
decoder := json.NewDecoder(bytes.NewBuffer(out))
|
|
||||||
var derr error
|
|
||||||
for _, pkg := range pkgs {
|
|
||||||
info := &PkgInfo{}
|
|
||||||
derr = decoder.Decode(info)
|
|
||||||
if derr != nil {
|
|
||||||
return nil, fmt.Errorf("could not retrieve package information for %s", pkg)
|
|
||||||
}
|
|
||||||
if pkg != info.ImportPath {
|
|
||||||
return nil, fmt.Errorf("package information mismatch: asked for %s, got %s",
|
|
||||||
pkg, info.ImportPath)
|
|
||||||
}
|
|
||||||
if info.Error != nil && info.Name == "" {
|
|
||||||
info.Name = info.ImportPath
|
|
||||||
}
|
|
||||||
infos = append(infos, info)
|
|
||||||
}
|
|
||||||
return infos, err
|
|
||||||
}
|
|
||||||
|
|
||||||
var (
|
|
||||||
reLicense = regexp.MustCompile(`(?i)^(?:` +
|
|
||||||
`((?:un)?licen[sc]e(?:\.[^.]+)?)|` +
|
|
||||||
`(copy(?:ing|right)(?:\.[^.]+)?)|` +
|
|
||||||
`)$`)
|
|
||||||
)
|
|
||||||
|
|
||||||
// scoreLicenseName returns a factor between 0 and 1 weighting how likely
|
|
||||||
// supplied filename is a license file.
|
|
||||||
func scoreLicenseName(name string) int8 {
|
|
||||||
m := reLicense.FindStringSubmatch(name)
|
|
||||||
switch {
|
|
||||||
case m == nil:
|
|
||||||
break
|
|
||||||
case m[1] != "" || m[2] != "":
|
|
||||||
return 1
|
|
||||||
}
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
|
|
||||||
// findLicenses looks for license files in package import path, and down to
|
|
||||||
// parent directories until a file is found or $GOPATH/src is reached. It
|
|
||||||
// returns a slice of paths all viable files, or a slice containing one empty
|
|
||||||
// string if none were found.
|
|
||||||
func findLicenses(info *PkgInfo) ([]string, error) {
|
|
||||||
path := info.ImportPath
|
|
||||||
for ; path != "."; path = filepath.Dir(path) {
|
|
||||||
fis, err := ioutil.ReadDir(filepath.Join(info.Root, "src", path))
|
|
||||||
if err != nil {
|
|
||||||
return []string{""}, err
|
|
||||||
}
|
|
||||||
allViableNames := make([]string, 0)
|
|
||||||
for _, fi := range fis {
|
|
||||||
if !fi.Mode().IsRegular() {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
score := scoreLicenseName(fi.Name())
|
|
||||||
if score == 1 {
|
|
||||||
allViableNames = append(allViableNames, filepath.Join(path, fi.Name()))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if len(allViableNames) > 0 {
|
|
||||||
return allViableNames, nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return []string{""}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// GoPackage represents a top-level package, ex. colors/blue
|
|
||||||
type GoPackage struct {
|
|
||||||
PackageName string
|
|
||||||
RawLicenses []*RawLicense
|
|
||||||
Err string
|
|
||||||
}
|
|
||||||
|
|
||||||
// RawLicense holds template-matched file data
|
|
||||||
type RawLicense struct {
|
|
||||||
Path string
|
|
||||||
Score float64
|
|
||||||
Template *Template
|
|
||||||
ExtraWords []string
|
|
||||||
MissingWords []string
|
|
||||||
}
|
|
||||||
|
|
||||||
func listPackagesWithLicenses(gopath string, pkgs []string) ([]GoPackage, error) {
|
|
||||||
templates, err := loadTemplates()
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
deps, err := listPackagesAndDeps(gopath, pkgs)
|
|
||||||
if err != nil {
|
|
||||||
if _, ok := err.(*MissingError); ok {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return nil, fmt.Errorf("could not list %s dependencies: %s",
|
|
||||||
strings.Join(pkgs, " "), err)
|
|
||||||
}
|
|
||||||
std, err := listStandardPackages(gopath)
|
|
||||||
if err != nil {
|
|
||||||
return nil, fmt.Errorf("could not list standard packages: %s", err)
|
|
||||||
}
|
|
||||||
stdSet := map[string]bool{}
|
|
||||||
for _, n := range std {
|
|
||||||
stdSet[n] = true
|
|
||||||
}
|
|
||||||
infos, err := getPackagesInfo(gopath, deps)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// Cache matched licenses by path. Useful for package with a lot of
|
|
||||||
// subpackages like bleve.
|
|
||||||
matched := map[string]MatchResult{}
|
|
||||||
|
|
||||||
gPackages := []GoPackage{}
|
|
||||||
for _, info := range infos {
|
|
||||||
if info.Error != nil {
|
|
||||||
gPackages = append(gPackages, GoPackage{
|
|
||||||
PackageName: info.Name,
|
|
||||||
Err: info.Error.Err,
|
|
||||||
RawLicenses: []*RawLicense{{Path: ""}},
|
|
||||||
})
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
if stdSet[info.ImportPath] {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
paths, err := findLicenses(info)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
rawLicenseInfos := []*RawLicense{}
|
|
||||||
gPackage := GoPackage{PackageName: info.ImportPath}
|
|
||||||
for _, path := range paths {
|
|
||||||
rl := RawLicense{Path: path}
|
|
||||||
if path != "" {
|
|
||||||
fpath := filepath.Join(info.Root, "src", path)
|
|
||||||
m, ok := matched[fpath]
|
|
||||||
if !ok {
|
|
||||||
data, err := ioutil.ReadFile(fpath)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
m = matchTemplates(data, templates)
|
|
||||||
matched[fpath] = m
|
|
||||||
}
|
|
||||||
rl.Score = m.Score
|
|
||||||
rl.Template = m.Template
|
|
||||||
rl.ExtraWords = m.ExtraWords
|
|
||||||
rl.MissingWords = m.MissingWords
|
|
||||||
}
|
|
||||||
rawLicenseInfos = append(rawLicenseInfos, &rl)
|
|
||||||
}
|
|
||||||
gPackage.RawLicenses = rawLicenseInfos
|
|
||||||
gPackages = append(gPackages, gPackage)
|
|
||||||
}
|
|
||||||
return gPackages, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// longestCommonPrefix returns the longest common prefix over import path
|
|
||||||
// components of supplied licenses.
|
|
||||||
func longestCommonPrefix(gPackages []GoPackage) string {
|
|
||||||
type Node struct {
|
|
||||||
Name string
|
|
||||||
Children map[string]*Node
|
|
||||||
Shared int
|
|
||||||
}
|
|
||||||
// Build a prefix tree. Not super efficient, but easy to do.
|
|
||||||
root := &Node{
|
|
||||||
Children: map[string]*Node{},
|
|
||||||
Shared: len(gPackages),
|
|
||||||
}
|
|
||||||
for _, l := range gPackages {
|
|
||||||
n := root
|
|
||||||
for _, part := range strings.Split(l.PackageName, "/") {
|
|
||||||
c := n.Children[part]
|
|
||||||
if c == nil {
|
|
||||||
c = &Node{
|
|
||||||
Name: part,
|
|
||||||
Children: map[string]*Node{},
|
|
||||||
}
|
|
||||||
n.Children[part] = c
|
|
||||||
}
|
|
||||||
c.Shared++
|
|
||||||
n = c
|
|
||||||
}
|
|
||||||
}
|
|
||||||
n := root
|
|
||||||
prefix := []string{}
|
|
||||||
for {
|
|
||||||
if len(n.Children) != 1 {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
for _, c := range n.Children {
|
|
||||||
if c.Shared == len(gPackages) {
|
|
||||||
// Handle case where there are subpackages:
|
|
||||||
// prometheus/procfs
|
|
||||||
// prometheus/procfs/xfs
|
|
||||||
prefix = append(prefix, c.Name)
|
|
||||||
}
|
|
||||||
n = c
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return strings.Join(prefix, "/")
|
|
||||||
}
|
|
||||||
|
|
||||||
// groupPackagesByLicense returns the input packages after grouping them by license
|
|
||||||
// path and find their longest import path common prefix. Entries with empty
|
|
||||||
// paths are left unchanged.
|
|
||||||
func groupPackagesByLicense(gPackages []GoPackage) ([]GoPackage, error) {
|
|
||||||
paths := map[string][]GoPackage{}
|
|
||||||
for _, gp := range gPackages {
|
|
||||||
for _, rl := range gp.RawLicenses {
|
|
||||||
if rl.Path == "" {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
paths[rl.Path] = append(paths[rl.Path], gp)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for k, v := range paths {
|
|
||||||
if len(v) <= 1 {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
prefix := longestCommonPrefix(v)
|
|
||||||
if prefix == "" {
|
|
||||||
return nil, fmt.Errorf(
|
|
||||||
"packages share the same license but not common prefix: %v", v)
|
|
||||||
}
|
|
||||||
gp := v[0]
|
|
||||||
gp.PackageName = prefix
|
|
||||||
paths[k] = []GoPackage{gp}
|
|
||||||
}
|
|
||||||
kept := []GoPackage{}
|
|
||||||
// Ensures only one package with multiple licenses is appended to the list of
|
|
||||||
// kept packages
|
|
||||||
seen := make(map[string]bool)
|
|
||||||
for _, gp := range gPackages {
|
|
||||||
if len(gp.RawLicenses) == 0 {
|
|
||||||
kept = append(kept, gp)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
for _, rl := range gp.RawLicenses {
|
|
||||||
if rl.Path == "" {
|
|
||||||
kept = append(kept, gp)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
if v, ok := paths[rl.Path]; ok {
|
|
||||||
if _, ok := seen[v[0].PackageName]; !ok {
|
|
||||||
kept = append(kept, v[0])
|
|
||||||
delete(paths, rl.Path)
|
|
||||||
seen[v[0].PackageName] = true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return kept, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
type projectAndLicenses struct {
|
|
||||||
Project string `json:"project"`
|
|
||||||
Licenses []license `json:"licenses,omitempty"`
|
|
||||||
Error string `json:"error,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type license struct {
|
|
||||||
Type string `json:"type,omitempty"`
|
|
||||||
Confidence float64 `json:"confidence,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func licensesToProjectAndLicenses(gPackages []GoPackage) (c []projectAndLicenses, e []projectAndLicenses) {
|
|
||||||
for _, gp := range gPackages {
|
|
||||||
if gp.Err != "" {
|
|
||||||
e = append(e, projectAndLicenses{
|
|
||||||
Project: removeVendor(gp.PackageName),
|
|
||||||
Error: gp.Err,
|
|
||||||
})
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
nt := 0
|
|
||||||
for _, rl := range gp.RawLicenses {
|
|
||||||
if rl.Template == nil {
|
|
||||||
nt++
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if len(gp.RawLicenses) == nt {
|
|
||||||
e = append(e, projectAndLicenses{
|
|
||||||
Project: removeVendor(gp.PackageName),
|
|
||||||
Error: "No license detected",
|
|
||||||
})
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
ls := []license{}
|
|
||||||
for _, rl := range gp.RawLicenses {
|
|
||||||
if rl.Template.Title != "" {
|
|
||||||
ls = append(ls, license{
|
|
||||||
Type: rl.Template.Title,
|
|
||||||
Confidence: rl.Score,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
c = append(c, projectAndLicenses{
|
|
||||||
Project: removeVendor(gp.PackageName),
|
|
||||||
Licenses: ls,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
return c, e
|
|
||||||
}
|
|
||||||
|
|
||||||
func removeVendor(s string) string {
|
|
||||||
v := "/vendor/"
|
|
||||||
i := strings.Index(s, v)
|
|
||||||
if i == -1 {
|
|
||||||
return s
|
|
||||||
}
|
|
||||||
return s[i+len(v):]
|
|
||||||
}
|
|
||||||
|
|
||||||
func truncateFloat(f float64) float64 {
|
|
||||||
nf := fmt.Sprintf("%.3f", f)
|
|
||||||
|
|
||||||
var err error
|
|
||||||
f, err = strconv.ParseFloat(nf, 64)
|
|
||||||
if err != nil {
|
|
||||||
panic("unexpected parse float error")
|
|
||||||
}
|
|
||||||
return f
|
|
||||||
}
|
|
||||||
|
|
||||||
func pkgsToLicenses(pkgs []string, overrides string) (pls []projectAndLicenses, ne []projectAndLicenses) {
|
|
||||||
fplm := make(map[string][]string)
|
|
||||||
if err := json.Unmarshal([]byte(overrides), &pls); err != nil {
|
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
for _, pl := range pls {
|
|
||||||
for _, l := range pl.Licenses {
|
|
||||||
fplm[pl.Project] = append(fplm[pl.Project], l.Type)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
licenses, err := listPackagesWithLicenses("", pkgs)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
if licenses, err = groupPackagesByLicense(licenses); err != nil {
|
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
c, e := licensesToProjectAndLicenses(licenses)
|
|
||||||
|
|
||||||
// detected licenses
|
|
||||||
pls = nil
|
|
||||||
ls := []license{}
|
|
||||||
for _, pl := range c {
|
|
||||||
if fl, ok := fplm[pl.Project]; ok {
|
|
||||||
for _, l := range fl {
|
|
||||||
ls = append(ls, license{
|
|
||||||
Type: l,
|
|
||||||
Confidence: 1.0,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
pl = projectAndLicenses{
|
|
||||||
Project: pl.Project,
|
|
||||||
Licenses: ls,
|
|
||||||
}
|
|
||||||
delete(fplm, pl.Project)
|
|
||||||
}
|
|
||||||
pls = append(pls, pl)
|
|
||||||
}
|
|
||||||
// force add undetected licenses given by overrides
|
|
||||||
ls = nil
|
|
||||||
for proj, fl := range fplm {
|
|
||||||
for _, l := range fl {
|
|
||||||
ls = append(ls, license{
|
|
||||||
Type: l,
|
|
||||||
Confidence: 1.0,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
pls = append(pls, projectAndLicenses{
|
|
||||||
Project: proj,
|
|
||||||
Licenses: ls,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
// missing / error license
|
|
||||||
for _, pl := range e {
|
|
||||||
if _, ok := fplm[pl.Project]; !ok {
|
|
||||||
ne = append(ne, pl)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
sort.Slice(pls, func(i, j int) bool { return pls[i].Project < pls[j].Project })
|
|
||||||
sort.Slice(ne, func(i, j int) bool { return ne[i].Project < ne[j].Project })
|
|
||||||
return pls, ne
|
|
||||||
}
|
|
||||||
|
|
||||||
func main() {
|
|
||||||
of := flag.String("override-file", "", "a file to overwrite licenses")
|
|
||||||
flag.Parse()
|
|
||||||
if flag.NArg() < 1 {
|
|
||||||
log.Fatal("expect at least one package argument")
|
|
||||||
}
|
|
||||||
|
|
||||||
overrides := "[]"
|
|
||||||
if len(*of) != 0 {
|
|
||||||
b, err := ioutil.ReadFile(*of)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
overrides = string(b)
|
|
||||||
}
|
|
||||||
|
|
||||||
c, ne := pkgsToLicenses(flag.Args(), overrides)
|
|
||||||
b, err := json.MarshalIndent(c, "", " ")
|
|
||||||
if err != nil {
|
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
fmt.Println(string(b))
|
|
||||||
|
|
||||||
if len(ne) != 0 {
|
|
||||||
fmt.Println("")
|
|
||||||
b, err := json.MarshalIndent(ne, "", " ")
|
|
||||||
if err != nil {
|
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
fmt.Println(string(b))
|
|
||||||
os.Exit(1)
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
Reference in a new issue