mirror of
https://github.com/genuinetools/reg.git
synced 2024-05-20 12:08:33 -04:00
Updated Clair and adjusted to fit (#140)
* conform to new clair API spec * update clair dep * don't think these flags are required anymore
This commit is contained in:
parent
73fdd32040
commit
e13ca36072
55
Gopkg.lock
generated
55
Gopkg.lock
generated
|
@ -13,7 +13,7 @@
|
|||
revision = "d6e3b3328b783f23731bc4d058875b0371ff8109"
|
||||
|
||||
[[projects]]
|
||||
digest = "1:b3c77c2fbbd0b3cb8308c698e0bba22cdc7c07b38992315d85e3a7dc75a19487"
|
||||
digest = "1:52200fa7808b1ee999b1f5a8daf19a6c79b6e2077956125f55c100e633d8bde3"
|
||||
name = "github.com/Microsoft/go-winio"
|
||||
packages = ["."]
|
||||
pruneopts = "NUT"
|
||||
|
@ -46,19 +46,20 @@
|
|||
|
||||
[[projects]]
|
||||
branch = "master"
|
||||
digest = "1:22bbe18ccf641e6538c0b449a8d20eea45ba2972d6753fc119a41344b31e71c6"
|
||||
digest = "1:2b7e45c96a900225df4288dd1a8a2a1c34477027274cbba6ff5320110aa7a02a"
|
||||
name = "github.com/coreos/clair"
|
||||
packages = [
|
||||
"api/v3/clairpb",
|
||||
"database",
|
||||
"ext/versionfmt",
|
||||
"pkg/pagination",
|
||||
]
|
||||
pruneopts = "NUT"
|
||||
revision = "9a9b1f7a13fa1cb796fe6dfb45ed241f39ce9f01"
|
||||
revision = "d0a3fe9206309b34e562887f886d908f51e0821a"
|
||||
|
||||
[[projects]]
|
||||
branch = "master"
|
||||
digest = "1:328f1fa7607c0d67bc624558f29c5dea379b8038fbf49dc661d84b7c13e77994"
|
||||
digest = "1:30aa048f2c90ef2d0568cce07cb8afbaeabbec3ccd75f99d22864039c273bcc8"
|
||||
name = "github.com/docker/cli"
|
||||
packages = [
|
||||
"cli/config/configfile",
|
||||
|
@ -70,7 +71,7 @@
|
|||
|
||||
[[projects]]
|
||||
branch = "master"
|
||||
digest = "1:ad0a0dbc184d34441705ff591078f27d24a5424608dfac1e69a48925b04687be"
|
||||
digest = "1:f8b9eb707f84a5f01f1537f2086962590855bb63a616eb35c02c437f60431018"
|
||||
name = "github.com/docker/distribution"
|
||||
packages = [
|
||||
".",
|
||||
|
@ -95,7 +96,7 @@
|
|||
|
||||
[[projects]]
|
||||
branch = "master"
|
||||
digest = "1:badf65de9a2ca950648a5d2ffa73eba5feb483fe1ca472133f93b5813528e151"
|
||||
digest = "1:f8ac8d8219f7afe01d3821f3ed2327af7263390227369456c2a603f8659e88d3"
|
||||
name = "github.com/docker/docker"
|
||||
packages = [
|
||||
"api",
|
||||
|
@ -135,14 +136,14 @@
|
|||
|
||||
[[projects]]
|
||||
branch = "master"
|
||||
digest = "1:9bcdcf400ce17ff098a7f2f8e96b0d3624e062694587a07631c0c71d188ea512"
|
||||
digest = "1:3d29840a1e0fee12b70d874896b3c4f63507049e2dac83a066b583ff513c67bf"
|
||||
name = "github.com/docker/docker-ce"
|
||||
packages = ["components/cli/cli/config"]
|
||||
pruneopts = "NUT"
|
||||
revision = "2ec1cede27a3dc04c44f8ed2feb1efb00c724d63"
|
||||
|
||||
[[projects]]
|
||||
digest = "1:15e7be8bdfcc1ea804cedc8e3187605c58642cddd1d333781b888e4873c1ed5b"
|
||||
digest = "1:8866486038791fe65ea1abf660041423954b1f3fb99ea6a0ad8424422e943458"
|
||||
name = "github.com/docker/docker-credential-helpers"
|
||||
packages = [
|
||||
"client",
|
||||
|
@ -154,7 +155,7 @@
|
|||
|
||||
[[projects]]
|
||||
branch = "master"
|
||||
digest = "1:d131afebb270bf014e49fcdff0da3e861124976b7c1402181fac5196a57f3b31"
|
||||
digest = "1:2a47f7eb1a2c30428d1ee6808cb66d4deb17e68a3e55d696f03c8068552ba5e8"
|
||||
name = "github.com/docker/go-connections"
|
||||
packages = [
|
||||
"nat",
|
||||
|
@ -188,6 +189,14 @@
|
|||
pruneopts = "NUT"
|
||||
revision = "aabc10ec26b754e797f9028f4589c5b7bd90dc20"
|
||||
|
||||
[[projects]]
|
||||
branch = "master"
|
||||
digest = "1:e101620a1bea7755f45d9cca76bfd505e3f4678b47f37209838ddab235341d1c"
|
||||
name = "github.com/fernet/fernet-go"
|
||||
packages = ["."]
|
||||
pruneopts = "NUT"
|
||||
revision = "9eac43b88a5efb8651d24de9b68e87567e029736"
|
||||
|
||||
[[projects]]
|
||||
branch = "master"
|
||||
digest = "1:26bac590d2ee7a8ace363d3b8f84e3f790e732470ba54995c9bf722827fc96c4"
|
||||
|
@ -205,7 +214,7 @@
|
|||
version = "v1.1.0"
|
||||
|
||||
[[projects]]
|
||||
digest = "1:fdf99f45db4d12ad9c70a482d66a0a5f7fbc9ae15bac61bf0a3a0f95aa37db3d"
|
||||
digest = "1:6aef947ba53156da1a66ee891d70d61835e0dcfc9f0d728ae1132db651e81c22"
|
||||
name = "github.com/golang/protobuf"
|
||||
packages = [
|
||||
"jsonpb",
|
||||
|
@ -222,7 +231,7 @@
|
|||
version = "v1.1.0"
|
||||
|
||||
[[projects]]
|
||||
digest = "1:21c8b3a5b2d66f5ba6731f12133ccbf970947a6f4e78f0d46b64c49f8a4034c1"
|
||||
digest = "1:2e3c336fc7fde5c984d2841455a658a6d626450b1754a854b3b32e7a8f49a07a"
|
||||
name = "github.com/google/go-cmp"
|
||||
packages = [
|
||||
"cmp",
|
||||
|
@ -251,7 +260,7 @@
|
|||
version = "v1.6.2"
|
||||
|
||||
[[projects]]
|
||||
digest = "1:7dd8047d931d48ddfccafcb1b1724537a0e4f0a4a074d2754860e584d42fe3c4"
|
||||
digest = "1:5c3363169fc963321cd0789dda2ddff90562817d277e78011b0e1bbf51a6b473"
|
||||
name = "github.com/grpc-ecosystem/grpc-gateway"
|
||||
packages = [
|
||||
"runtime",
|
||||
|
@ -287,7 +296,7 @@
|
|||
revision = "c9281466c8b2f606084ac71339773efd177436e7"
|
||||
|
||||
[[projects]]
|
||||
digest = "1:7c5c09ec84d18b0dc5ec0de36c1b8d12d3bf1815d04b90dc50ab082f3b8f13f1"
|
||||
digest = "1:11db38d694c130c800d0aefb502fb02519e514dc53d9804ce51d1ad25ec27db6"
|
||||
name = "github.com/opencontainers/image-spec"
|
||||
packages = [
|
||||
"specs-go",
|
||||
|
@ -298,7 +307,7 @@
|
|||
version = "v1.0.1"
|
||||
|
||||
[[projects]]
|
||||
digest = "1:90df7d52082e30a65e4ad45c48802654eb6714c4b8b68906de739c6453332fe6"
|
||||
digest = "1:918dbd46ad099418ce9760291bb156ebf23d441aad4cb682dd9bf09e2d3c0c7b"
|
||||
name = "github.com/opencontainers/runc"
|
||||
packages = ["libcontainer/user"]
|
||||
pruneopts = "NUT"
|
||||
|
@ -323,7 +332,7 @@
|
|||
|
||||
[[projects]]
|
||||
branch = "master"
|
||||
digest = "1:f6e9577742d287da75604a1c3d2cb8f0e39b7fcb9620c455a8a2871918d966d2"
|
||||
digest = "1:f434beb84b411972e928573deaf8776680c5359d2c6859720a86fc23fe06d27c"
|
||||
name = "github.com/prometheus/client_golang"
|
||||
packages = [
|
||||
"prometheus",
|
||||
|
@ -334,7 +343,7 @@
|
|||
|
||||
[[projects]]
|
||||
branch = "master"
|
||||
digest = "1:0f37e09b3e92aaeda5991581311f8dbf38944b36a3edec61cc2d1991f527554a"
|
||||
digest = "1:2d5cd61daa5565187e1d96bae64dbbc6080dacf741448e9629c64fd93203b0d4"
|
||||
name = "github.com/prometheus/client_model"
|
||||
packages = ["go"]
|
||||
pruneopts = "NUT"
|
||||
|
@ -342,7 +351,7 @@
|
|||
|
||||
[[projects]]
|
||||
branch = "master"
|
||||
digest = "1:3bbebf77a04cda10bd07834d1686141608aca01c1aeb400d504d8aa026793b5a"
|
||||
digest = "1:768b555b86742de2f28beb37f1dedce9a75f91f871d75b5717c96399c1a78c08"
|
||||
name = "github.com/prometheus/common"
|
||||
packages = [
|
||||
"expfmt",
|
||||
|
@ -354,7 +363,7 @@
|
|||
|
||||
[[projects]]
|
||||
branch = "master"
|
||||
digest = "1:37e418257b05a9e9fabbf836df2d8f3613313e80a909da6b9597b759ebca61cd"
|
||||
digest = "1:6621142cd60b7150ab66f38ff36303ca55843dc5a635c1f9a28f95ecddab72b4"
|
||||
name = "github.com/prometheus/procfs"
|
||||
packages = [
|
||||
".",
|
||||
|
@ -383,7 +392,7 @@
|
|||
|
||||
[[projects]]
|
||||
branch = "master"
|
||||
digest = "1:5e5881179e790b3f0dce6b9f770c1905ea804010e8ce6b1442df5c31e6df1cf3"
|
||||
digest = "1:fef55c9d9f298ab9816a672db63040c2de40d7895de3b8ee74e53979f433b93e"
|
||||
name = "golang.org/x/net"
|
||||
packages = [
|
||||
"context",
|
||||
|
@ -402,7 +411,7 @@
|
|||
|
||||
[[projects]]
|
||||
branch = "master"
|
||||
digest = "1:64107e3c8f52f341891a565d117bf263ed396fe0c16bad19634b25be25debfaa"
|
||||
digest = "1:5420733d35e5e562fffc7c5b99660f3587af042b5420f19b17fe0426e6a5259d"
|
||||
name = "golang.org/x/sys"
|
||||
packages = [
|
||||
"unix",
|
||||
|
@ -412,7 +421,7 @@
|
|||
revision = "ac767d655b305d4e9612f5f6e33120b9176c4ad4"
|
||||
|
||||
[[projects]]
|
||||
digest = "1:a0f29009397dc27c9dc8440f0945d49e5cbb9b72d0b0fc745474d9bfdea2d9f8"
|
||||
digest = "1:e7071ed636b5422cc51c0e3a6cebc229d6c9fffc528814b519a980641422d619"
|
||||
name = "golang.org/x/text"
|
||||
packages = [
|
||||
"collate",
|
||||
|
@ -436,7 +445,7 @@
|
|||
|
||||
[[projects]]
|
||||
branch = "master"
|
||||
digest = "1:924394986a8dbd26970da8adb0ad37d65fbfcd07d9b55f0e4eebd0a1afaaa890"
|
||||
digest = "1:eff11a4ed88d9d3e28dd697961c550af1c4d0d3dccdc6252715b9a65a1d541bb"
|
||||
name = "google.golang.org/genproto"
|
||||
packages = [
|
||||
"googleapis/api/annotations",
|
||||
|
@ -446,7 +455,7 @@
|
|||
revision = "e92b116572682a5b432ddd840aeaba2a559eeff1"
|
||||
|
||||
[[projects]]
|
||||
digest = "1:f778941d5c2e46da5e0f5d553d3e80bf70eb40d2e80bb4c649b625b9133f3d5f"
|
||||
digest = "1:d0e5846da58e4e20d1bbd7502b24f31d37e3ac1e02a9042d95bd93c2d0c139dd"
|
||||
name = "google.golang.org/grpc"
|
||||
packages = [
|
||||
".",
|
||||
|
|
|
@ -7,16 +7,14 @@ import (
|
|||
"github.com/coreos/clair/api/v3/clairpb"
|
||||
)
|
||||
|
||||
// GetAncestry displays an ancestry and optionally all of its features and vulnerabilities.
|
||||
func (c *Clair) GetAncestry(name string, features, vulnerabilities bool) (*clairpb.GetAncestryResponse_Ancestry, error) {
|
||||
// GetAncestry displays an ancestry and all of its features and vulnerabilities.
|
||||
func (c *Clair) GetAncestry(name string) (*clairpb.GetAncestryResponse_Ancestry, error) {
|
||||
c.Logf("clair.ancestry.get name=%s", name)
|
||||
|
||||
client := clairpb.NewAncestryServiceClient(c.grpcConn)
|
||||
|
||||
resp, err := client.GetAncestry(context.Background(), &clairpb.GetAncestryRequest{
|
||||
AncestryName: name,
|
||||
WithVulnerabilities: vulnerabilities,
|
||||
WithFeatures: features,
|
||||
AncestryName: name,
|
||||
})
|
||||
if err != nil {
|
||||
return nil, err
|
||||
|
|
|
@ -115,7 +115,7 @@ func (c *Clair) VulnerabilitiesV3(r *registry.Registry, repo, tag string) (Vulne
|
|||
}
|
||||
|
||||
// Get the ancestry.
|
||||
vl, err := c.GetAncestry(layers[0].Digest.String(), true, true)
|
||||
vl, err := c.GetAncestry(layers[0].Digest.String())
|
||||
if err != nil {
|
||||
return report, err
|
||||
}
|
||||
|
@ -125,17 +125,19 @@ func (c *Clair) VulnerabilitiesV3(r *registry.Registry, repo, tag string) (Vulne
|
|||
}
|
||||
|
||||
// Get the vulns.
|
||||
for _, f := range vl.Features {
|
||||
for _, v := range f.Vulnerabilities {
|
||||
report.Vulns = append(report.Vulns, Vulnerability{
|
||||
Name: v.Name,
|
||||
NamespaceName: v.NamespaceName,
|
||||
Description: v.Description,
|
||||
Link: v.Link,
|
||||
Severity: v.Severity,
|
||||
Metadata: map[string]interface{}{v.Metadata: ""},
|
||||
FixedBy: v.FixedBy,
|
||||
})
|
||||
for _, l := range vl.GetLayers() {
|
||||
for _, f := range l.GetDetectedFeatures() {
|
||||
for _, v := range f.GetVulnerabilities() {
|
||||
report.Vulns = append(report.Vulns, Vulnerability{
|
||||
Name: v.Name,
|
||||
NamespaceName: v.NamespaceName,
|
||||
Description: v.Description,
|
||||
Link: v.Link,
|
||||
Severity: v.Severity,
|
||||
Metadata: map[string]interface{}{v.Metadata: ""},
|
||||
FixedBy: v.FixedBy,
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
330
vendor/github.com/coreos/clair/api/v3/clairpb/clair.pb.go
generated
vendored
330
vendor/github.com/coreos/clair/api/v3/clairpb/clair.pb.go
generated
vendored
|
@ -21,6 +21,8 @@ It has these top-level messages:
|
|||
PagedVulnerableAncestries
|
||||
MarkNotificationAsReadRequest
|
||||
MarkNotificationAsReadResponse
|
||||
GetStatusRequest
|
||||
GetStatusResponse
|
||||
*/
|
||||
package clairpb
|
||||
|
||||
|
@ -236,10 +238,6 @@ func (m *ClairStatus) GetLastUpdateTime() *google_protobuf.Timestamp {
|
|||
type GetAncestryRequest struct {
|
||||
// The name of the desired ancestry.
|
||||
AncestryName string `protobuf:"bytes,1,opt,name=ancestry_name,json=ancestryName" json:"ancestry_name,omitempty"`
|
||||
// Whether to include vulnerabilities or not in the response.
|
||||
WithVulnerabilities bool `protobuf:"varint,2,opt,name=with_vulnerabilities,json=withVulnerabilities" json:"with_vulnerabilities,omitempty"`
|
||||
// Whether to include features or not in the response.
|
||||
WithFeatures bool `protobuf:"varint,3,opt,name=with_features,json=withFeatures" json:"with_features,omitempty"`
|
||||
}
|
||||
|
||||
func (m *GetAncestryRequest) Reset() { *m = GetAncestryRequest{} }
|
||||
|
@ -254,20 +252,6 @@ func (m *GetAncestryRequest) GetAncestryName() string {
|
|||
return ""
|
||||
}
|
||||
|
||||
func (m *GetAncestryRequest) GetWithVulnerabilities() bool {
|
||||
if m != nil {
|
||||
return m.WithVulnerabilities
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func (m *GetAncestryRequest) GetWithFeatures() bool {
|
||||
if m != nil {
|
||||
return m.WithFeatures
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
type GetAncestryResponse struct {
|
||||
// The ancestry requested.
|
||||
Ancestry *GetAncestryResponse_Ancestry `protobuf:"bytes,1,opt,name=ancestry" json:"ancestry,omitempty"`
|
||||
|
@ -294,24 +278,49 @@ func (m *GetAncestryResponse) GetStatus() *ClairStatus {
|
|||
return nil
|
||||
}
|
||||
|
||||
type GetAncestryResponse_AncestryLayer struct {
|
||||
// The layer's information.
|
||||
Layer *Layer `protobuf:"bytes,1,opt,name=layer" json:"layer,omitempty"`
|
||||
// The features detected in this layer.
|
||||
DetectedFeatures []*Feature `protobuf:"bytes,2,rep,name=detected_features,json=detectedFeatures" json:"detected_features,omitempty"`
|
||||
}
|
||||
|
||||
func (m *GetAncestryResponse_AncestryLayer) Reset() { *m = GetAncestryResponse_AncestryLayer{} }
|
||||
func (m *GetAncestryResponse_AncestryLayer) String() string { return proto.CompactTextString(m) }
|
||||
func (*GetAncestryResponse_AncestryLayer) ProtoMessage() {}
|
||||
func (*GetAncestryResponse_AncestryLayer) Descriptor() ([]byte, []int) {
|
||||
return fileDescriptor0, []int{5, 0}
|
||||
}
|
||||
|
||||
func (m *GetAncestryResponse_AncestryLayer) GetLayer() *Layer {
|
||||
if m != nil {
|
||||
return m.Layer
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m *GetAncestryResponse_AncestryLayer) GetDetectedFeatures() []*Feature {
|
||||
if m != nil {
|
||||
return m.DetectedFeatures
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
type GetAncestryResponse_Ancestry struct {
|
||||
// The name of the desired ancestry.
|
||||
Name string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"`
|
||||
// The list of features present in the ancestry.
|
||||
// This will only be provided if requested.
|
||||
Features []*Feature `protobuf:"bytes,2,rep,name=features" json:"features,omitempty"`
|
||||
// The layers present in the ancestry.
|
||||
Layers []*Layer `protobuf:"bytes,3,rep,name=layers" json:"layers,omitempty"`
|
||||
// The configured list of feature listers used to scan this ancestry.
|
||||
ScannedListers []string `protobuf:"bytes,4,rep,name=scanned_listers,json=scannedListers" json:"scanned_listers,omitempty"`
|
||||
// The configured list of namespace detectors used to scan an ancestry.
|
||||
ScannedDetectors []string `protobuf:"bytes,5,rep,name=scanned_detectors,json=scannedDetectors" json:"scanned_detectors,omitempty"`
|
||||
// The list of layers along with detected features in each.
|
||||
Layers []*GetAncestryResponse_AncestryLayer `protobuf:"bytes,6,rep,name=layers" json:"layers,omitempty"`
|
||||
}
|
||||
|
||||
func (m *GetAncestryResponse_Ancestry) Reset() { *m = GetAncestryResponse_Ancestry{} }
|
||||
func (m *GetAncestryResponse_Ancestry) String() string { return proto.CompactTextString(m) }
|
||||
func (*GetAncestryResponse_Ancestry) ProtoMessage() {}
|
||||
func (*GetAncestryResponse_Ancestry) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{5, 0} }
|
||||
func (*GetAncestryResponse_Ancestry) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{5, 1} }
|
||||
|
||||
func (m *GetAncestryResponse_Ancestry) GetName() string {
|
||||
if m != nil {
|
||||
|
@ -320,20 +329,6 @@ func (m *GetAncestryResponse_Ancestry) GetName() string {
|
|||
return ""
|
||||
}
|
||||
|
||||
func (m *GetAncestryResponse_Ancestry) GetFeatures() []*Feature {
|
||||
if m != nil {
|
||||
return m.Features
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m *GetAncestryResponse_Ancestry) GetLayers() []*Layer {
|
||||
if m != nil {
|
||||
return m.Layers
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m *GetAncestryResponse_Ancestry) GetScannedListers() []string {
|
||||
if m != nil {
|
||||
return m.ScannedListers
|
||||
|
@ -348,13 +343,21 @@ func (m *GetAncestryResponse_Ancestry) GetScannedDetectors() []string {
|
|||
return nil
|
||||
}
|
||||
|
||||
func (m *GetAncestryResponse_Ancestry) GetLayers() []*GetAncestryResponse_AncestryLayer {
|
||||
if m != nil {
|
||||
return m.Layers
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
type PostAncestryRequest struct {
|
||||
// The name of the ancestry being scanned.
|
||||
// If scanning OCI images, this should be the hash of the manifest.
|
||||
AncestryName string `protobuf:"bytes,1,opt,name=ancestry_name,json=ancestryName" json:"ancestry_name,omitempty"`
|
||||
// The format of the image being uploaded.
|
||||
Format string `protobuf:"bytes,2,opt,name=format" json:"format,omitempty"`
|
||||
// The layers to be scanned for this particular ancestry.
|
||||
// The layers to be scanned for this Ancestry, ordered in the way that i th
|
||||
// layer is the parent of i + 1 th layer.
|
||||
Layers []*PostAncestryRequest_PostLayer `protobuf:"bytes,3,rep,name=layers" json:"layers,omitempty"`
|
||||
}
|
||||
|
||||
|
@ -677,6 +680,31 @@ func (m *MarkNotificationAsReadResponse) String() string { return pro
|
|||
func (*MarkNotificationAsReadResponse) ProtoMessage() {}
|
||||
func (*MarkNotificationAsReadResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{12} }
|
||||
|
||||
type GetStatusRequest struct {
|
||||
}
|
||||
|
||||
func (m *GetStatusRequest) Reset() { *m = GetStatusRequest{} }
|
||||
func (m *GetStatusRequest) String() string { return proto.CompactTextString(m) }
|
||||
func (*GetStatusRequest) ProtoMessage() {}
|
||||
func (*GetStatusRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{13} }
|
||||
|
||||
type GetStatusResponse struct {
|
||||
// The status of the current Clair instance.
|
||||
Status *ClairStatus `protobuf:"bytes,1,opt,name=status" json:"status,omitempty"`
|
||||
}
|
||||
|
||||
func (m *GetStatusResponse) Reset() { *m = GetStatusResponse{} }
|
||||
func (m *GetStatusResponse) String() string { return proto.CompactTextString(m) }
|
||||
func (*GetStatusResponse) ProtoMessage() {}
|
||||
func (*GetStatusResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{14} }
|
||||
|
||||
func (m *GetStatusResponse) GetStatus() *ClairStatus {
|
||||
if m != nil {
|
||||
return m.Status
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func init() {
|
||||
proto.RegisterType((*Vulnerability)(nil), "coreos.clair.Vulnerability")
|
||||
proto.RegisterType((*Feature)(nil), "coreos.clair.Feature")
|
||||
|
@ -684,6 +712,7 @@ func init() {
|
|||
proto.RegisterType((*ClairStatus)(nil), "coreos.clair.ClairStatus")
|
||||
proto.RegisterType((*GetAncestryRequest)(nil), "coreos.clair.GetAncestryRequest")
|
||||
proto.RegisterType((*GetAncestryResponse)(nil), "coreos.clair.GetAncestryResponse")
|
||||
proto.RegisterType((*GetAncestryResponse_AncestryLayer)(nil), "coreos.clair.GetAncestryResponse.AncestryLayer")
|
||||
proto.RegisterType((*GetAncestryResponse_Ancestry)(nil), "coreos.clair.GetAncestryResponse.Ancestry")
|
||||
proto.RegisterType((*PostAncestryRequest)(nil), "coreos.clair.PostAncestryRequest")
|
||||
proto.RegisterType((*PostAncestryRequest_PostLayer)(nil), "coreos.clair.PostAncestryRequest.PostLayer")
|
||||
|
@ -695,6 +724,8 @@ func init() {
|
|||
proto.RegisterType((*PagedVulnerableAncestries_IndexedAncestryName)(nil), "coreos.clair.PagedVulnerableAncestries.IndexedAncestryName")
|
||||
proto.RegisterType((*MarkNotificationAsReadRequest)(nil), "coreos.clair.MarkNotificationAsReadRequest")
|
||||
proto.RegisterType((*MarkNotificationAsReadResponse)(nil), "coreos.clair.MarkNotificationAsReadResponse")
|
||||
proto.RegisterType((*GetStatusRequest)(nil), "coreos.clair.GetStatusRequest")
|
||||
proto.RegisterType((*GetStatusResponse)(nil), "coreos.clair.GetStatusResponse")
|
||||
}
|
||||
|
||||
// Reference imports to suppress errors if they are not otherwise used.
|
||||
|
@ -907,83 +938,152 @@ var _NotificationService_serviceDesc = grpc.ServiceDesc{
|
|||
Metadata: "api/v3/clairpb/clair.proto",
|
||||
}
|
||||
|
||||
// Client API for StatusService service
|
||||
|
||||
type StatusServiceClient interface {
|
||||
// The RPC used to show the internal state of current Clair instance.
|
||||
GetStatus(ctx context.Context, in *GetStatusRequest, opts ...grpc.CallOption) (*GetStatusResponse, error)
|
||||
}
|
||||
|
||||
type statusServiceClient struct {
|
||||
cc *grpc.ClientConn
|
||||
}
|
||||
|
||||
func NewStatusServiceClient(cc *grpc.ClientConn) StatusServiceClient {
|
||||
return &statusServiceClient{cc}
|
||||
}
|
||||
|
||||
func (c *statusServiceClient) GetStatus(ctx context.Context, in *GetStatusRequest, opts ...grpc.CallOption) (*GetStatusResponse, error) {
|
||||
out := new(GetStatusResponse)
|
||||
err := grpc.Invoke(ctx, "/coreos.clair.StatusService/GetStatus", in, out, c.cc, opts...)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return out, nil
|
||||
}
|
||||
|
||||
// Server API for StatusService service
|
||||
|
||||
type StatusServiceServer interface {
|
||||
// The RPC used to show the internal state of current Clair instance.
|
||||
GetStatus(context.Context, *GetStatusRequest) (*GetStatusResponse, error)
|
||||
}
|
||||
|
||||
func RegisterStatusServiceServer(s *grpc.Server, srv StatusServiceServer) {
|
||||
s.RegisterService(&_StatusService_serviceDesc, srv)
|
||||
}
|
||||
|
||||
func _StatusService_GetStatus_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
|
||||
in := new(GetStatusRequest)
|
||||
if err := dec(in); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if interceptor == nil {
|
||||
return srv.(StatusServiceServer).GetStatus(ctx, in)
|
||||
}
|
||||
info := &grpc.UnaryServerInfo{
|
||||
Server: srv,
|
||||
FullMethod: "/coreos.clair.StatusService/GetStatus",
|
||||
}
|
||||
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
|
||||
return srv.(StatusServiceServer).GetStatus(ctx, req.(*GetStatusRequest))
|
||||
}
|
||||
return interceptor(ctx, in, info, handler)
|
||||
}
|
||||
|
||||
var _StatusService_serviceDesc = grpc.ServiceDesc{
|
||||
ServiceName: "coreos.clair.StatusService",
|
||||
HandlerType: (*StatusServiceServer)(nil),
|
||||
Methods: []grpc.MethodDesc{
|
||||
{
|
||||
MethodName: "GetStatus",
|
||||
Handler: _StatusService_GetStatus_Handler,
|
||||
},
|
||||
},
|
||||
Streams: []grpc.StreamDesc{},
|
||||
Metadata: "api/v3/clairpb/clair.proto",
|
||||
}
|
||||
|
||||
func init() { proto.RegisterFile("api/v3/clairpb/clair.proto", fileDescriptor0) }
|
||||
|
||||
var fileDescriptor0 = []byte{
|
||||
// 1191 bytes of a gzipped FileDescriptorProto
|
||||
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x57, 0x4f, 0x73, 0xdb, 0x44,
|
||||
0x14, 0x1f, 0x29, 0x71, 0xec, 0x3c, 0x3b, 0x7f, 0xba, 0x76, 0x53, 0x45, 0x69, 0x8b, 0x23, 0xe8,
|
||||
0xb4, 0x93, 0x30, 0xf6, 0xc4, 0xe1, 0x50, 0xc2, 0x81, 0x49, 0xda, 0xa6, 0x74, 0xa6, 0x74, 0x3a,
|
||||
0x2a, 0xe4, 0x00, 0x07, 0xcf, 0x5a, 0x7a, 0x4e, 0x34, 0x91, 0x25, 0xa3, 0x5d, 0x3b, 0xf1, 0x74,
|
||||
0x7a, 0xe1, 0xca, 0x09, 0x38, 0xf0, 0x19, 0xb8, 0xf0, 0x25, 0xb8, 0x72, 0x02, 0x8e, 0x70, 0x63,
|
||||
0x06, 0xbe, 0x00, 0x77, 0x66, 0x57, 0x2b, 0x45, 0x72, 0xd4, 0x24, 0xa5, 0x27, 0xeb, 0xfd, 0xde,
|
||||
0x9f, 0x7d, 0x7f, 0x7e, 0x6f, 0x37, 0x01, 0x93, 0x0e, 0xbd, 0xf6, 0x78, 0xbb, 0xed, 0xf8, 0xd4,
|
||||
0x8b, 0x86, 0xbd, 0xf8, 0xb7, 0x35, 0x8c, 0x42, 0x1e, 0x92, 0x9a, 0x13, 0x46, 0x18, 0xb2, 0x96,
|
||||
0xc4, 0xcc, 0x77, 0x0e, 0xc3, 0xf0, 0xd0, 0xc7, 0xb6, 0xd4, 0xf5, 0x46, 0xfd, 0x36, 0xf7, 0x06,
|
||||
0xc8, 0x38, 0x1d, 0x0c, 0x63, 0x73, 0xf3, 0xa6, 0x32, 0x10, 0x11, 0x69, 0x10, 0x84, 0x9c, 0x72,
|
||||
0x2f, 0x0c, 0x58, 0xac, 0xb5, 0x7e, 0xd0, 0x61, 0xe1, 0x60, 0xe4, 0x07, 0x18, 0xd1, 0x9e, 0xe7,
|
||||
0x7b, 0x7c, 0x42, 0x08, 0xcc, 0x06, 0x74, 0x80, 0x86, 0xd6, 0xd4, 0xee, 0xcd, 0xdb, 0xf2, 0x9b,
|
||||
0xdc, 0x81, 0x45, 0xf1, 0xcb, 0x86, 0xd4, 0xc1, 0xae, 0xd4, 0xea, 0x52, 0xbb, 0x90, 0xa2, 0xcf,
|
||||
0x84, 0x59, 0x13, 0xaa, 0x2e, 0x32, 0x27, 0xf2, 0x86, 0xe2, 0x08, 0x63, 0x46, 0xda, 0x64, 0x21,
|
||||
0x11, 0xdc, 0xf7, 0x82, 0x63, 0x63, 0x36, 0x0e, 0x2e, 0xbe, 0x89, 0x09, 0x15, 0x86, 0x63, 0x8c,
|
||||
0x3c, 0x3e, 0x31, 0x4a, 0x12, 0x4f, 0x65, 0xa1, 0x1b, 0x20, 0xa7, 0x2e, 0xe5, 0xd4, 0x98, 0x8b,
|
||||
0x75, 0x89, 0x4c, 0x56, 0xa1, 0xd2, 0xf7, 0x4e, 0xd1, 0xed, 0xf6, 0x26, 0x46, 0x59, 0xea, 0xca,
|
||||
0x52, 0xde, 0x9b, 0x90, 0x3d, 0xb8, 0x46, 0xfb, 0x7d, 0x74, 0x38, 0xba, 0xdd, 0x31, 0x46, 0x4c,
|
||||
0x14, 0x6c, 0x54, 0x9a, 0x33, 0xf7, 0xaa, 0x9d, 0xeb, 0xad, 0x6c, 0xfb, 0x5a, 0xfb, 0x48, 0xf9,
|
||||
0x28, 0x42, 0x7b, 0x39, 0xb1, 0x3f, 0x50, 0xe6, 0xd6, 0x2f, 0x1a, 0x94, 0x95, 0xf6, 0x6d, 0x7a,
|
||||
0x62, 0x40, 0x59, 0x65, 0xa0, 0xfa, 0x91, 0x88, 0x22, 0x80, 0xfa, 0xec, 0xf6, 0xc3, 0x68, 0x40,
|
||||
0xb9, 0xea, 0xca, 0x82, 0x42, 0xf7, 0x25, 0x48, 0x1e, 0xc1, 0xd2, 0x38, 0x33, 0x20, 0x0f, 0x99,
|
||||
0x51, 0x92, 0x95, 0xac, 0xe5, 0x2b, 0xc9, 0x4d, 0xd1, 0x9e, 0xf6, 0xb1, 0xd6, 0xa0, 0xf4, 0x94,
|
||||
0x4e, 0x30, 0x12, 0xb5, 0x1c, 0x51, 0x76, 0x94, 0xd4, 0x22, 0xbe, 0xad, 0x6f, 0x34, 0xa8, 0x3e,
|
||||
0x10, 0x51, 0x5e, 0x70, 0xca, 0x47, 0x4c, 0x24, 0xed, 0x7b, 0x8c, 0x63, 0xc4, 0x0c, 0xad, 0x39,
|
||||
0x23, 0x92, 0x56, 0x22, 0xb9, 0x09, 0xf3, 0x2e, 0x72, 0x74, 0x78, 0x18, 0x31, 0x43, 0x97, 0xba,
|
||||
0x33, 0x80, 0x3c, 0x84, 0x65, 0x9f, 0x32, 0xde, 0x1d, 0x0d, 0x5d, 0xca, 0xb1, 0x2b, 0xa8, 0x28,
|
||||
0xab, 0xae, 0x76, 0xcc, 0x56, 0x4c, 0xc3, 0x56, 0xc2, 0xd3, 0xd6, 0x67, 0x09, 0x4f, 0xed, 0x45,
|
||||
0xe1, 0xf3, 0xb9, 0x74, 0x11, 0xa0, 0xf5, 0xad, 0x06, 0xe4, 0x31, 0xf2, 0xdd, 0xc0, 0x41, 0xc6,
|
||||
0xa3, 0x89, 0x8d, 0x5f, 0x8d, 0x90, 0x71, 0xf2, 0x2e, 0x2c, 0x50, 0x05, 0x75, 0x33, 0xd3, 0xa8,
|
||||
0x25, 0xa0, 0x6c, 0xf7, 0x16, 0x34, 0x4e, 0x3c, 0x7e, 0xd4, 0x9d, 0x6e, 0x99, 0x98, 0x4d, 0xc5,
|
||||
0xae, 0x0b, 0xdd, 0x41, 0x5e, 0x25, 0xe2, 0x4a, 0x97, 0x7e, 0x3c, 0x6c, 0x26, 0x33, 0xae, 0xd8,
|
||||
0x35, 0x01, 0x2a, 0x02, 0x30, 0xeb, 0x6f, 0x1d, 0xea, 0xb9, 0x9c, 0xd8, 0x30, 0x0c, 0x18, 0x92,
|
||||
0x7d, 0xa8, 0x24, 0xe7, 0xcb, 0x7c, 0xaa, 0x9d, 0x8d, 0xfc, 0x58, 0x0a, 0x9c, 0x5a, 0x29, 0x90,
|
||||
0xfa, 0x92, 0x2d, 0x98, 0x63, 0xb2, 0xf7, 0x32, 0xd3, 0x6a, 0x67, 0x35, 0x1f, 0x25, 0x33, 0x1c,
|
||||
0x5b, 0x19, 0x9a, 0xbf, 0x6b, 0x50, 0x49, 0x22, 0x15, 0x32, 0x74, 0x0b, 0x2a, 0x69, 0x4d, 0xfa,
|
||||
0x45, 0xe4, 0x4f, 0xcd, 0xc8, 0x26, 0xcc, 0xf9, 0x82, 0x25, 0xa2, 0x09, 0xc2, 0xa1, 0x9e, 0x77,
|
||||
0x90, 0x0c, 0xb2, 0x95, 0x09, 0xb9, 0x0b, 0x4b, 0xcc, 0xa1, 0x41, 0x80, 0x6e, 0x37, 0x61, 0xcb,
|
||||
0xac, 0x64, 0xc4, 0xa2, 0x82, 0x9f, 0x2a, 0xd2, 0x6c, 0xc2, 0xb5, 0xc4, 0xf0, 0x8c, 0x3c, 0x25,
|
||||
0x69, 0xba, 0xac, 0x14, 0x0f, 0x13, 0xdc, 0xfa, 0x53, 0x87, 0xfa, 0xf3, 0x90, 0xfd, 0xbf, 0xf1,
|
||||
0xaf, 0xc0, 0x9c, 0xda, 0xa5, 0x78, 0x19, 0x95, 0x44, 0x1e, 0x4c, 0xd5, 0xb5, 0x99, 0xaf, 0xab,
|
||||
0xe0, 0x3c, 0x89, 0xe5, 0xea, 0x35, 0x7f, 0xd6, 0x60, 0x3e, 0x45, 0x8b, 0xf6, 0x48, 0x60, 0x43,
|
||||
0xca, 0x8f, 0xd4, 0xe1, 0xf2, 0x9b, 0xd8, 0x50, 0x3e, 0x42, 0xea, 0x9e, 0x9d, 0x7d, 0xff, 0x0d,
|
||||
0xce, 0x6e, 0x7d, 0x12, 0xbb, 0x3e, 0x0a, 0x84, 0x36, 0x09, 0x64, 0xee, 0x40, 0x2d, 0xab, 0x20,
|
||||
0xcb, 0x30, 0x73, 0x8c, 0x13, 0x95, 0x8a, 0xf8, 0x24, 0x0d, 0x28, 0x8d, 0xa9, 0x3f, 0x4a, 0x2e,
|
||||
0xa5, 0x58, 0xd8, 0xd1, 0xef, 0x6b, 0xd6, 0x13, 0x68, 0xe4, 0x8f, 0x54, 0x4c, 0x3e, 0x63, 0xa0,
|
||||
0x76, 0x45, 0x06, 0x5a, 0x3f, 0x69, 0xb0, 0xf2, 0x18, 0xf9, 0xb3, 0x90, 0x7b, 0x7d, 0xcf, 0x91,
|
||||
0xef, 0x4a, 0x32, 0xad, 0x0f, 0x60, 0x25, 0xf4, 0xdd, 0xdc, 0x1a, 0x4e, 0xba, 0x43, 0x7a, 0x98,
|
||||
0x8c, 0xad, 0x11, 0xfa, 0x6e, 0xee, 0xc6, 0x7a, 0x4e, 0x0f, 0x51, 0x78, 0x05, 0x78, 0x52, 0xe4,
|
||||
0x15, 0x97, 0xd1, 0x08, 0xf0, 0xe4, 0xbc, 0x57, 0x03, 0x4a, 0xbe, 0x37, 0xf0, 0xb8, 0x5c, 0xdc,
|
||||
0x92, 0x1d, 0x0b, 0xe9, 0x46, 0xcc, 0x9e, 0x6d, 0x84, 0xf5, 0x87, 0x0e, 0x37, 0xce, 0x25, 0xac,
|
||||
0xea, 0x3f, 0x80, 0x5a, 0x90, 0xc1, 0x55, 0x17, 0x3a, 0xe7, 0xb6, 0xb9, 0xc8, 0xb9, 0x95, 0x03,
|
||||
0x73, 0x71, 0xcc, 0x7f, 0x34, 0xa8, 0x65, 0xd5, 0x85, 0xab, 0x6a, 0x40, 0xd9, 0x89, 0x90, 0x72,
|
||||
0x74, 0x55, 0xa5, 0x89, 0x28, 0x5e, 0xc0, 0x38, 0x1c, 0xba, 0xea, 0x01, 0x49, 0x65, 0xe1, 0xe5,
|
||||
0xa2, 0x8f, 0xc2, 0x2b, 0xae, 0x32, 0x11, 0xc9, 0x87, 0x30, 0x13, 0xfa, 0xae, 0x7c, 0x4e, 0xab,
|
||||
0x9d, 0xbb, 0x53, 0x84, 0xa3, 0x87, 0x98, 0xf6, 0xde, 0x47, 0x45, 0x04, 0x0f, 0x99, 0x2d, 0x7c,
|
||||
0x84, 0x6b, 0x80, 0x27, 0xf2, 0xb5, 0x7d, 0x13, 0xd7, 0x00, 0x4f, 0xac, 0x5f, 0x75, 0x58, 0x7d,
|
||||
0xad, 0x09, 0x59, 0x87, 0x9a, 0x33, 0x8a, 0x22, 0x0c, 0x78, 0x96, 0x08, 0x55, 0x85, 0xc9, 0x49,
|
||||
0xae, 0xc1, 0x7c, 0x80, 0xa7, 0x3c, 0x3b, 0xf2, 0x8a, 0x00, 0x2e, 0x18, 0xf3, 0x2e, 0x2c, 0xe4,
|
||||
0xe8, 0x22, 0x3b, 0x71, 0xc9, 0xe3, 0x98, 0xf7, 0x20, 0x5f, 0x02, 0xd0, 0x34, 0x4d, 0xf5, 0xb8,
|
||||
0x7e, 0x74, 0xc5, 0xc2, 0x5b, 0x4f, 0x02, 0x17, 0x4f, 0xd1, 0xdd, 0xcd, 0xdc, 0x42, 0x76, 0x26,
|
||||
0x9c, 0xf9, 0x31, 0xd4, 0x0b, 0x4c, 0x44, 0x31, 0x9e, 0x80, 0x65, 0x17, 0x4a, 0x76, 0x2c, 0xa4,
|
||||
0xd4, 0xd0, 0x33, 0x9c, 0xdd, 0x86, 0x5b, 0x9f, 0xd2, 0xe8, 0x38, 0x4b, 0xa1, 0x5d, 0x66, 0x23,
|
||||
0x75, 0x93, 0x55, 0x2b, 0xe0, 0x93, 0xd5, 0x84, 0xdb, 0xaf, 0x73, 0x8a, 0x19, 0xdb, 0xf9, 0x57,
|
||||
0x83, 0xa5, 0x24, 0xa3, 0x17, 0x18, 0x8d, 0x3d, 0x07, 0xc9, 0x08, 0xaa, 0x99, 0xe7, 0x8a, 0x34,
|
||||
0x2f, 0x78, 0xc9, 0xe4, 0xd1, 0xe6, 0xfa, 0xa5, 0x6f, 0x9d, 0xb5, 0xfe, 0xf5, 0x6f, 0x7f, 0x7d,
|
||||
0xaf, 0xaf, 0x91, 0xd5, 0x76, 0x72, 0x51, 0xb7, 0x5f, 0xe6, 0xee, 0xf1, 0x57, 0xe4, 0x18, 0x6a,
|
||||
0xd9, 0x1b, 0x89, 0xac, 0x5f, 0x7a, 0x41, 0x9a, 0xd6, 0x45, 0x26, 0xea, 0xe4, 0x86, 0x3c, 0x79,
|
||||
0xd1, 0x9a, 0x4f, 0x4f, 0xde, 0xd1, 0x36, 0x3a, 0x3f, 0xea, 0x50, 0xcf, 0xb6, 0x25, 0xa9, 0xfd,
|
||||
0x15, 0x2c, 0x4d, 0x2d, 0x37, 0x79, 0xef, 0x92, 0xdd, 0x8f, 0x53, 0xb9, 0x73, 0xa5, 0x1b, 0xc2,
|
||||
0xba, 0x25, 0xb3, 0xb9, 0x41, 0xae, 0xb7, 0xb3, 0xb7, 0x03, 0x6b, 0xbf, 0x8c, 0x7b, 0xf0, 0x9d,
|
||||
0x06, 0x2b, 0xc5, 0x13, 0x23, 0x53, 0x6f, 0xd5, 0x85, 0x64, 0x30, 0xdf, 0xbf, 0x9a, 0x71, 0x3e,
|
||||
0xa9, 0x8d, 0xe2, 0xa4, 0xf6, 0x6e, 0x43, 0xdd, 0x09, 0x07, 0xf9, 0x88, 0xc3, 0xde, 0x17, 0x65,
|
||||
0xf5, 0x5f, 0x49, 0x6f, 0x4e, 0xfe, 0x31, 0xb7, 0xfd, 0x5f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xe6,
|
||||
0x24, 0x28, 0x46, 0xae, 0x0c, 0x00, 0x00,
|
||||
// 1237 bytes of a gzipped FileDescriptorProto
|
||||
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x57, 0x4b, 0x6f, 0x1b, 0xd5,
|
||||
0x17, 0xd7, 0xd8, 0x71, 0x1c, 0x1f, 0xdb, 0x49, 0x7a, 0x93, 0xa6, 0x93, 0x49, 0x1f, 0xc9, 0xfc,
|
||||
0xff, 0x55, 0x4b, 0x8b, 0x6c, 0xe1, 0xb2, 0x68, 0xcb, 0x02, 0xa5, 0x8f, 0x84, 0x4a, 0xa5, 0xaa,
|
||||
0xa6, 0xd0, 0x05, 0x08, 0x59, 0xd7, 0x33, 0xc7, 0xc9, 0x28, 0xe3, 0x19, 0x33, 0xf7, 0xda, 0x89,
|
||||
0x55, 0x95, 0x05, 0x5b, 0x76, 0xb0, 0xe0, 0x33, 0xb0, 0xe1, 0x1b, 0xb0, 0x62, 0xcb, 0x02, 0xc1,
|
||||
0x16, 0x76, 0x2c, 0xf8, 0x02, 0xec, 0xd1, 0x7d, 0x4d, 0x66, 0x12, 0xe7, 0xd1, 0xb2, 0xf2, 0x9c,
|
||||
0xf7, 0xeb, 0x77, 0xcf, 0x49, 0xc0, 0xa1, 0xc3, 0xb0, 0x3d, 0xbe, 0xd3, 0xf6, 0x23, 0x1a, 0xa6,
|
||||
0xc3, 0x9e, 0xfa, 0x6d, 0x0d, 0xd3, 0x84, 0x27, 0xa4, 0xe1, 0x27, 0x29, 0x26, 0xac, 0x25, 0x79,
|
||||
0xce, 0xb5, 0x9d, 0x24, 0xd9, 0x89, 0xb0, 0x2d, 0x65, 0xbd, 0x51, 0xbf, 0xcd, 0xc3, 0x01, 0x32,
|
||||
0x4e, 0x07, 0x43, 0xa5, 0xee, 0x5c, 0xd6, 0x0a, 0xc2, 0x23, 0x8d, 0xe3, 0x84, 0x53, 0x1e, 0x26,
|
||||
0x31, 0x53, 0x52, 0xf7, 0xfb, 0x12, 0x34, 0x5f, 0x8e, 0xa2, 0x18, 0x53, 0xda, 0x0b, 0xa3, 0x90,
|
||||
0x4f, 0x08, 0x81, 0x99, 0x98, 0x0e, 0xd0, 0xb6, 0xd6, 0xad, 0x9b, 0x35, 0x4f, 0x7e, 0x93, 0xeb,
|
||||
0x30, 0x2f, 0x7e, 0xd9, 0x90, 0xfa, 0xd8, 0x95, 0xd2, 0x92, 0x94, 0x36, 0x33, 0xee, 0x33, 0xa1,
|
||||
0xb6, 0x0e, 0xf5, 0x00, 0x99, 0x9f, 0x86, 0x43, 0x11, 0xc2, 0x2e, 0x4b, 0x9d, 0x3c, 0x4b, 0x38,
|
||||
0x8f, 0xc2, 0x78, 0xcf, 0x9e, 0x51, 0xce, 0xc5, 0x37, 0x71, 0x60, 0x8e, 0xe1, 0x18, 0xd3, 0x90,
|
||||
0x4f, 0xec, 0x8a, 0xe4, 0x67, 0xb4, 0x90, 0x0d, 0x90, 0xd3, 0x80, 0x72, 0x6a, 0xcf, 0x2a, 0x99,
|
||||
0xa1, 0xc9, 0x2a, 0xcc, 0xf5, 0xc3, 0x03, 0x0c, 0xba, 0xbd, 0x89, 0x5d, 0x95, 0xb2, 0xaa, 0xa4,
|
||||
0x1f, 0x4c, 0xc8, 0x03, 0xb8, 0x40, 0xfb, 0x7d, 0xf4, 0x39, 0x06, 0xdd, 0x31, 0xa6, 0x4c, 0x14,
|
||||
0x6c, 0xcf, 0xad, 0x97, 0x6f, 0xd6, 0x3b, 0x17, 0x5b, 0xf9, 0xf6, 0xb5, 0xb6, 0x90, 0xf2, 0x51,
|
||||
0x8a, 0xde, 0xa2, 0xd1, 0x7f, 0xa9, 0xd5, 0xdd, 0x5f, 0x2c, 0xa8, 0x6a, 0xe9, 0x7f, 0xe9, 0x89,
|
||||
0x0d, 0x55, 0x9d, 0x81, 0xee, 0x87, 0x21, 0x85, 0x03, 0xfd, 0xd9, 0xed, 0x27, 0xe9, 0x80, 0x72,
|
||||
0xdd, 0x95, 0xa6, 0xe6, 0x6e, 0x49, 0x26, 0x79, 0x0c, 0x0b, 0xe3, 0xdc, 0x80, 0x42, 0x64, 0x76,
|
||||
0x45, 0x56, 0xb2, 0x56, 0xac, 0xa4, 0x30, 0x45, 0xef, 0xa8, 0x8d, 0xbb, 0x06, 0x95, 0xa7, 0x74,
|
||||
0x82, 0xa9, 0xa8, 0x65, 0x97, 0xb2, 0x5d, 0x53, 0x8b, 0xf8, 0x76, 0xbf, 0xb1, 0xa0, 0xfe, 0x50,
|
||||
0x78, 0x79, 0xc1, 0x29, 0x1f, 0x31, 0x91, 0x74, 0x14, 0x32, 0x8e, 0x29, 0xb3, 0xad, 0xf5, 0xb2,
|
||||
0x48, 0x5a, 0x93, 0xe4, 0x32, 0xd4, 0x02, 0xe4, 0xe8, 0xf3, 0x24, 0x65, 0x76, 0x49, 0xca, 0x0e,
|
||||
0x19, 0xe4, 0x11, 0x2c, 0x46, 0x94, 0xf1, 0xee, 0x68, 0x18, 0x50, 0x8e, 0x5d, 0x01, 0x45, 0x59,
|
||||
0x75, 0xbd, 0xe3, 0xb4, 0x14, 0x0c, 0x5b, 0x06, 0xa7, 0xad, 0x4f, 0x0c, 0x4e, 0xbd, 0x79, 0x61,
|
||||
0xf3, 0xa9, 0x34, 0x11, 0x4c, 0xf7, 0x1e, 0x90, 0x6d, 0xe4, 0x9b, 0xb1, 0x8f, 0x8c, 0xa7, 0x13,
|
||||
0x0f, 0xbf, 0x1c, 0x21, 0xe3, 0xe4, 0x7f, 0xd0, 0xa4, 0x9a, 0xd5, 0xcd, 0x0d, 0xa3, 0x61, 0x98,
|
||||
0xa2, 0xdb, 0xee, 0xaf, 0x65, 0x58, 0x2a, 0xd8, 0xb2, 0x61, 0x12, 0x33, 0x24, 0x5b, 0x30, 0x67,
|
||||
0xf4, 0xa4, 0x5d, 0xbd, 0x73, 0xab, 0xd8, 0xbd, 0x29, 0x46, 0xad, 0x8c, 0x91, 0xd9, 0x92, 0xf7,
|
||||
0x60, 0x96, 0xc9, 0x16, 0xc9, 0x61, 0xd7, 0x3b, 0xab, 0x45, 0x2f, 0xb9, 0x1e, 0x7a, 0x5a, 0xd1,
|
||||
0xf9, 0x0a, 0x9a, 0xc6, 0x91, 0x1a, 0xc0, 0x3b, 0x50, 0x89, 0xc4, 0x87, 0x4e, 0x64, 0xa9, 0xe8,
|
||||
0x42, 0xea, 0x78, 0x4a, 0x43, 0xe0, 0x58, 0x35, 0x17, 0x83, 0x6e, 0x5f, 0x61, 0x51, 0x75, 0xfd,
|
||||
0x64, 0x1c, 0x1b, 0x7d, 0xcd, 0x60, 0xce, 0x4f, 0x16, 0xcc, 0x99, 0x04, 0xa6, 0x02, 0xf9, 0x06,
|
||||
0x2c, 0x30, 0x9f, 0xc6, 0x31, 0x06, 0x5d, 0x33, 0xf4, 0x19, 0x39, 0xd8, 0x79, 0xcd, 0x7e, 0xaa,
|
||||
0x67, 0x7f, 0x1b, 0x2e, 0x18, 0xc5, 0x43, 0x0c, 0x54, 0xa4, 0xea, 0xa2, 0x16, 0x3c, 0xca, 0xa0,
|
||||
0xb0, 0x0d, 0xb3, 0xb2, 0x06, 0x66, 0xcf, 0xca, 0x7c, 0xdb, 0xe7, 0xef, 0xb7, 0x6a, 0x81, 0x36,
|
||||
0x77, 0xff, 0x2c, 0xc1, 0xd2, 0xf3, 0x84, 0xbd, 0x15, 0x1e, 0xc8, 0x0a, 0xcc, 0xea, 0xb7, 0xa5,
|
||||
0x1e, 0xa7, 0xa6, 0xc8, 0xc3, 0x2c, 0xbb, 0xb2, 0xcc, 0xee, 0x76, 0x31, 0xbb, 0x29, 0xf1, 0x24,
|
||||
0xaf, 0x90, 0x99, 0xf3, 0xb3, 0x05, 0xb5, 0x8c, 0x3b, 0xed, 0x5d, 0x09, 0xde, 0x90, 0xf2, 0x5d,
|
||||
0x1d, 0x5c, 0x7e, 0x13, 0x0f, 0xaa, 0xbb, 0x48, 0x83, 0xc3, 0xd8, 0x77, 0xdf, 0x20, 0x76, 0xeb,
|
||||
0x23, 0x65, 0xfa, 0x38, 0x16, 0x52, 0xe3, 0xc8, 0xb9, 0x0f, 0x8d, 0xbc, 0x80, 0x2c, 0x42, 0x79,
|
||||
0x0f, 0x27, 0x3a, 0x15, 0xf1, 0x49, 0x96, 0xa1, 0x32, 0xa6, 0xd1, 0xc8, 0x2c, 0x29, 0x45, 0xdc,
|
||||
0x2f, 0xdd, 0xb5, 0xdc, 0x27, 0xb0, 0x5c, 0x0c, 0xa9, 0x9f, 0xcc, 0x21, 0xd4, 0xad, 0x73, 0x42,
|
||||
0xdd, 0xfd, 0xd1, 0x82, 0x95, 0x6d, 0xe4, 0xcf, 0x12, 0x1e, 0xf6, 0x43, 0x5f, 0xde, 0x19, 0x33,
|
||||
0xad, 0xf7, 0x61, 0x25, 0x89, 0x82, 0x6e, 0x7e, 0x2b, 0x4d, 0xba, 0x43, 0xba, 0x63, 0xc6, 0xb6,
|
||||
0x9c, 0x44, 0x41, 0x61, 0x83, 0x3d, 0xa7, 0x3b, 0x28, 0xac, 0x62, 0xdc, 0x9f, 0x66, 0xa5, 0xca,
|
||||
0x58, 0x8e, 0x71, 0xff, 0xb8, 0xd5, 0x32, 0x54, 0xa2, 0x70, 0x10, 0x72, 0xb9, 0x7a, 0x2a, 0x9e,
|
||||
0x22, 0x32, 0xe8, 0xcf, 0x1c, 0x42, 0xdf, 0xfd, 0xa3, 0x04, 0x97, 0x8e, 0x25, 0xac, 0xeb, 0x7f,
|
||||
0x09, 0x8d, 0x38, 0xc7, 0xd7, 0x5d, 0xe8, 0x1c, 0x83, 0xf1, 0x34, 0xe3, 0x56, 0x81, 0x59, 0xf0,
|
||||
0xe3, 0xfc, 0x6d, 0x41, 0x23, 0x2f, 0x9e, 0xfa, 0x26, 0x6d, 0xa8, 0xfa, 0x29, 0x52, 0x8e, 0x81,
|
||||
0xae, 0xd4, 0x90, 0xe2, 0x22, 0x2a, 0x77, 0x18, 0xe8, 0x83, 0x92, 0xd1, 0xc2, 0x2a, 0xc0, 0x08,
|
||||
0x85, 0x95, 0xaa, 0xd2, 0x90, 0xe4, 0x1e, 0x94, 0x93, 0x28, 0x90, 0xe7, 0xb5, 0xde, 0xb9, 0x71,
|
||||
0x04, 0x70, 0x74, 0x07, 0xb3, 0xde, 0x47, 0xa8, 0x81, 0x10, 0x22, 0xf3, 0x84, 0x8d, 0x30, 0x8d,
|
||||
0x71, 0x5f, 0x5e, 0xdf, 0x37, 0x31, 0x8d, 0x71, 0xdf, 0xfd, 0xad, 0x04, 0xab, 0x27, 0xaa, 0x90,
|
||||
0x0d, 0x68, 0xf8, 0xa3, 0x34, 0xc5, 0x98, 0xe7, 0x81, 0x50, 0xd7, 0x3c, 0x39, 0xc9, 0x35, 0xa8,
|
||||
0xc5, 0x78, 0xc0, 0xf3, 0x23, 0x9f, 0x13, 0x8c, 0x53, 0xc6, 0xbc, 0x09, 0xcd, 0x02, 0x5c, 0x64,
|
||||
0x27, 0xce, 0x38, 0x96, 0x45, 0x0b, 0xf2, 0x39, 0x00, 0xcd, 0xd2, 0xd4, 0xc7, 0xf6, 0x83, 0x73,
|
||||
0x16, 0xde, 0x7a, 0x12, 0x07, 0x78, 0x80, 0xc1, 0x66, 0x6e, 0x0b, 0x79, 0x39, 0x77, 0xce, 0x87,
|
||||
0xb0, 0x34, 0x45, 0x45, 0x14, 0x13, 0x0a, 0xb6, 0xec, 0x42, 0xc5, 0x53, 0x44, 0x06, 0x8d, 0x52,
|
||||
0x0e, 0xb3, 0x77, 0xe0, 0xca, 0xc7, 0x34, 0xdd, 0xcb, 0x43, 0x68, 0x93, 0x79, 0x48, 0x03, 0xf3,
|
||||
0xd4, 0xa6, 0xe0, 0xc9, 0x5d, 0x87, 0xab, 0x27, 0x19, 0x29, 0xc4, 0xba, 0x04, 0x16, 0xb7, 0x91,
|
||||
0xeb, 0x07, 0xad, 0x3c, 0xb9, 0x5b, 0x70, 0x21, 0xc7, 0x7b, 0xeb, 0xbd, 0xd0, 0xf9, 0xc7, 0x82,
|
||||
0x05, 0x53, 0xed, 0x0b, 0x4c, 0xc7, 0xa1, 0x8f, 0x64, 0x04, 0xf5, 0xdc, 0x0d, 0x20, 0xeb, 0xa7,
|
||||
0x9c, 0x07, 0x99, 0x8c, 0xb3, 0x71, 0xe6, 0x01, 0x71, 0x37, 0xbe, 0xfe, 0xfd, 0xaf, 0xef, 0x4a,
|
||||
0x6b, 0x64, 0xb5, 0x6d, 0x8e, 0x40, 0xfb, 0x55, 0xe1, 0x46, 0xbc, 0x26, 0x7b, 0xd0, 0xc8, 0x6f,
|
||||
0x3b, 0xb2, 0x71, 0xe6, 0xf2, 0x75, 0xdc, 0xd3, 0x54, 0x74, 0xe4, 0x65, 0x19, 0x79, 0xde, 0xad,
|
||||
0x65, 0x91, 0xef, 0x5b, 0xb7, 0x3a, 0x3f, 0x94, 0x60, 0x29, 0xdf, 0x72, 0x53, 0xfb, 0x6b, 0x58,
|
||||
0x38, 0xb2, 0x38, 0xc8, 0xff, 0xcf, 0xd8, 0x2b, 0x2a, 0x95, 0xeb, 0xe7, 0xda, 0x3e, 0xee, 0x15,
|
||||
0x99, 0xcd, 0x25, 0x72, 0xb1, 0x9d, 0xdf, 0x3c, 0xac, 0xfd, 0x4a, 0xf5, 0xe0, 0x5b, 0x0b, 0x56,
|
||||
0xa6, 0xa3, 0x81, 0x1c, 0xb9, 0x83, 0xa7, 0x02, 0xcd, 0x79, 0xf7, 0x7c, 0xca, 0xc5, 0xa4, 0x6e,
|
||||
0x4d, 0x4f, 0xaa, 0x13, 0x43, 0x53, 0xa1, 0xc6, 0x34, 0xe9, 0x0b, 0xa8, 0x65, 0xe0, 0x23, 0x57,
|
||||
0x8f, 0x15, 0x5e, 0x40, 0xaa, 0x73, 0xed, 0x44, 0xb9, 0x8e, 0xbe, 0x20, 0xa3, 0xd7, 0x48, 0xb5,
|
||||
0xad, 0x30, 0xf9, 0xe0, 0x2a, 0x2c, 0xf9, 0xc9, 0xa0, 0x68, 0x36, 0xec, 0x7d, 0x56, 0xd5, 0xff,
|
||||
0x71, 0xf5, 0x66, 0xe5, 0x1f, 0xaa, 0x77, 0xfe, 0x0d, 0x00, 0x00, 0xff, 0xff, 0x7b, 0xd2, 0x74,
|
||||
0xfa, 0x8a, 0x0d, 0x00, 0x00,
|
||||
}
|
||||
|
|
95
vendor/github.com/coreos/clair/api/v3/clairpb/clair.pb.gw.go
generated
vendored
95
vendor/github.com/coreos/clair/api/v3/clairpb/clair.pb.gw.go
generated
vendored
|
@ -28,10 +28,6 @@ var _ status.Status
|
|||
var _ = runtime.String
|
||||
var _ = utilities.NewDoubleArray
|
||||
|
||||
var (
|
||||
filter_AncestryService_GetAncestry_0 = &utilities.DoubleArray{Encoding: map[string]int{"ancestry_name": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}}
|
||||
)
|
||||
|
||||
func request_AncestryService_GetAncestry_0(ctx context.Context, marshaler runtime.Marshaler, client AncestryServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
|
||||
var protoReq GetAncestryRequest
|
||||
var metadata runtime.ServerMetadata
|
||||
|
@ -54,10 +50,6 @@ func request_AncestryService_GetAncestry_0(ctx context.Context, marshaler runtim
|
|||
return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "ancestry_name", err)
|
||||
}
|
||||
|
||||
if err := runtime.PopulateQueryParameters(&protoReq, req.URL.Query(), filter_AncestryService_GetAncestry_0); err != nil {
|
||||
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
|
||||
}
|
||||
|
||||
msg, err := client.GetAncestry(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD))
|
||||
return msg, metadata, err
|
||||
|
||||
|
@ -140,6 +132,15 @@ func request_NotificationService_MarkNotificationAsRead_0(ctx context.Context, m
|
|||
|
||||
}
|
||||
|
||||
func request_StatusService_GetStatus_0(ctx context.Context, marshaler runtime.Marshaler, client StatusServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
|
||||
var protoReq GetStatusRequest
|
||||
var metadata runtime.ServerMetadata
|
||||
|
||||
msg, err := client.GetStatus(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD))
|
||||
return msg, metadata, err
|
||||
|
||||
}
|
||||
|
||||
// RegisterAncestryServiceHandlerFromEndpoint is same as RegisterAncestryServiceHandler but
|
||||
// automatically dials to "endpoint" and closes the connection when "ctx" gets done.
|
||||
func RegisterAncestryServiceHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) {
|
||||
|
@ -361,3 +362,81 @@ var (
|
|||
|
||||
forward_NotificationService_MarkNotificationAsRead_0 = runtime.ForwardResponseMessage
|
||||
)
|
||||
|
||||
// RegisterStatusServiceHandlerFromEndpoint is same as RegisterStatusServiceHandler but
|
||||
// automatically dials to "endpoint" and closes the connection when "ctx" gets done.
|
||||
func RegisterStatusServiceHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) {
|
||||
conn, err := grpc.Dial(endpoint, opts...)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer func() {
|
||||
if err != nil {
|
||||
if cerr := conn.Close(); cerr != nil {
|
||||
grpclog.Printf("Failed to close conn to %s: %v", endpoint, cerr)
|
||||
}
|
||||
return
|
||||
}
|
||||
go func() {
|
||||
<-ctx.Done()
|
||||
if cerr := conn.Close(); cerr != nil {
|
||||
grpclog.Printf("Failed to close conn to %s: %v", endpoint, cerr)
|
||||
}
|
||||
}()
|
||||
}()
|
||||
|
||||
return RegisterStatusServiceHandler(ctx, mux, conn)
|
||||
}
|
||||
|
||||
// RegisterStatusServiceHandler registers the http handlers for service StatusService to "mux".
|
||||
// The handlers forward requests to the grpc endpoint over "conn".
|
||||
func RegisterStatusServiceHandler(ctx context.Context, mux *runtime.ServeMux, conn *grpc.ClientConn) error {
|
||||
return RegisterStatusServiceHandlerClient(ctx, mux, NewStatusServiceClient(conn))
|
||||
}
|
||||
|
||||
// RegisterStatusServiceHandler registers the http handlers for service StatusService to "mux".
|
||||
// The handlers forward requests to the grpc endpoint over the given implementation of "StatusServiceClient".
|
||||
// Note: the gRPC framework executes interceptors within the gRPC handler. If the passed in "StatusServiceClient"
|
||||
// doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in
|
||||
// "StatusServiceClient" to call the correct interceptors.
|
||||
func RegisterStatusServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux, client StatusServiceClient) error {
|
||||
|
||||
mux.Handle("GET", pattern_StatusService_GetStatus_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
|
||||
ctx, cancel := context.WithCancel(req.Context())
|
||||
defer cancel()
|
||||
if cn, ok := w.(http.CloseNotifier); ok {
|
||||
go func(done <-chan struct{}, closed <-chan bool) {
|
||||
select {
|
||||
case <-done:
|
||||
case <-closed:
|
||||
cancel()
|
||||
}
|
||||
}(ctx.Done(), cn.CloseNotify())
|
||||
}
|
||||
inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
|
||||
rctx, err := runtime.AnnotateContext(ctx, mux, req)
|
||||
if err != nil {
|
||||
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
|
||||
return
|
||||
}
|
||||
resp, md, err := request_StatusService_GetStatus_0(rctx, inboundMarshaler, client, req, pathParams)
|
||||
ctx = runtime.NewServerMetadataContext(ctx, md)
|
||||
if err != nil {
|
||||
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
|
||||
return
|
||||
}
|
||||
|
||||
forward_StatusService_GetStatus_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
|
||||
|
||||
})
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
var (
|
||||
pattern_StatusService_GetStatus_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0}, []string{"status"}, ""))
|
||||
)
|
||||
|
||||
var (
|
||||
forward_StatusService_GetStatus_0 = runtime.ForwardResponseMessage
|
||||
)
|
||||
|
|
13
vendor/github.com/coreos/clair/api/v3/clairpb/convert.go
generated
vendored
13
vendor/github.com/coreos/clair/api/v3/clairpb/convert.go
generated
vendored
|
@ -122,19 +122,8 @@ func VulnerabilityWithFixedInFromDatabaseModel(dbVuln database.VulnerabilityWith
|
|||
return vuln, nil
|
||||
}
|
||||
|
||||
// AncestryFromDatabaseModel converts database ancestry to api ancestry.
|
||||
func AncestryFromDatabaseModel(dbAncestry database.Ancestry) *GetAncestryResponse_Ancestry {
|
||||
ancestry := &GetAncestryResponse_Ancestry{
|
||||
Name: dbAncestry.Name,
|
||||
}
|
||||
for _, layer := range dbAncestry.Layers {
|
||||
ancestry.Layers = append(ancestry.Layers, LayerFromDatabaseModel(layer))
|
||||
}
|
||||
return ancestry
|
||||
}
|
||||
|
||||
// LayerFromDatabaseModel converts database layer to api layer.
|
||||
func LayerFromDatabaseModel(dbLayer database.Layer) *Layer {
|
||||
func LayerFromDatabaseModel(dbLayer database.LayerMetadata) *Layer {
|
||||
layer := Layer{Hash: dbLayer.Hash}
|
||||
return &layer
|
||||
}
|
||||
|
|
48
vendor/github.com/coreos/clair/database/database.go
generated
vendored
48
vendor/github.com/coreos/clair/database/database.go
generated
vendored
|
@ -20,6 +20,8 @@ import (
|
|||
"errors"
|
||||
"fmt"
|
||||
"time"
|
||||
|
||||
"github.com/coreos/clair/pkg/pagination"
|
||||
)
|
||||
|
||||
var (
|
||||
|
@ -91,18 +93,11 @@ type Session interface {
|
|||
|
||||
// UpsertAncestry inserts or replaces an ancestry and its namespaced
|
||||
// features and processors used to scan the ancestry.
|
||||
UpsertAncestry(ancestry Ancestry, features []NamespacedFeature, processedBy Processors) error
|
||||
UpsertAncestry(Ancestry) error
|
||||
|
||||
// FindAncestry retrieves an ancestry with processors used to scan the
|
||||
// ancestry. If the ancestry is not found, return false.
|
||||
//
|
||||
// The ancestry's processors are returned to short cut processing ancestry
|
||||
// if it has been processed by all processors in the current Clair instance.
|
||||
FindAncestry(name string) (ancestry Ancestry, processedBy Processors, found bool, err error)
|
||||
|
||||
// FindAncestryFeatures retrieves an ancestry with all detected namespaced
|
||||
// features. If the ancestry is not found, return false.
|
||||
FindAncestryFeatures(name string) (ancestry AncestryWithFeatures, found bool, err error)
|
||||
// FindAncestry retrieves an ancestry with all detected
|
||||
// namespaced features. If the ancestry is not found, return false.
|
||||
FindAncestry(name string) (ancestry Ancestry, found bool, err error)
|
||||
|
||||
// PersistFeatures inserts a set of features if not in the database.
|
||||
PersistFeatures(features []Feature) error
|
||||
|
@ -125,22 +120,16 @@ type Session interface {
|
|||
// PersistNamespaces inserts a set of namespaces if not in the database.
|
||||
PersistNamespaces([]Namespace) error
|
||||
|
||||
// PersistLayer inserts a layer if not in the datastore.
|
||||
PersistLayer(Layer) error
|
||||
|
||||
// PersistLayerContent persists a layer's content in the database. The given
|
||||
// PersistLayer persists a layer's content in the database. The given
|
||||
// namespaces and features can be partial content of this layer.
|
||||
//
|
||||
// The layer, namespaces and features are expected to be already existing
|
||||
// in the database.
|
||||
PersistLayerContent(hash string, namespaces []Namespace, features []Feature, processedBy Processors) error
|
||||
PersistLayer(hash string, namespaces []Namespace, features []Feature, processedBy Processors) error
|
||||
|
||||
// FindLayer retrieves a layer and the processors scanned the layer.
|
||||
FindLayer(hash string) (layer Layer, processedBy Processors, found bool, err error)
|
||||
|
||||
// FindLayerWithContent returns a layer with all detected features and
|
||||
// FindLayer returns a layer with all detected features and
|
||||
// namespaces.
|
||||
FindLayerWithContent(hash string) (layer LayerWithContent, found bool, err error)
|
||||
FindLayer(hash string) (layer Layer, found bool, err error)
|
||||
|
||||
// InsertVulnerabilities inserts a set of UNIQUE vulnerabilities with
|
||||
// affected features into database, assuming that all vulnerabilities
|
||||
|
@ -168,20 +157,13 @@ type Session interface {
|
|||
// affected ancestries affected by old or new vulnerability.
|
||||
//
|
||||
// Because the number of affected ancestries maybe large, they are paginated
|
||||
// and their pages are specified by the given encrypted PageNumbers, which,
|
||||
// if empty, are always considered first page.
|
||||
//
|
||||
// Session interface implementation should have encrypt and decrypt
|
||||
// functions for PageNumber.
|
||||
FindVulnerabilityNotification(name string, limit int,
|
||||
oldVulnerabilityPage PageNumber,
|
||||
newVulnerabilityPage PageNumber) (
|
||||
noti VulnerabilityNotificationWithVulnerable,
|
||||
found bool, err error)
|
||||
// and their pages are specified by the paination token, which, if empty, are
|
||||
// always considered first page.
|
||||
FindVulnerabilityNotification(name string, limit int, oldVulnerabilityPage pagination.Token, newVulnerabilityPage pagination.Token) (noti VulnerabilityNotificationWithVulnerable, found bool, err error)
|
||||
|
||||
// MarkNotificationNotified marks a Notification as notified now, assuming
|
||||
// MarkNotificationAsRead marks a Notification as notified now, assuming
|
||||
// the requested notification is in the database.
|
||||
MarkNotificationNotified(name string) error
|
||||
MarkNotificationAsRead(name string) error
|
||||
|
||||
// DeleteNotification removes a Notification in the database.
|
||||
DeleteNotification(name string) error
|
||||
|
|
74
vendor/github.com/coreos/clair/database/mock.go
generated
vendored
74
vendor/github.com/coreos/clair/database/mock.go
generated
vendored
|
@ -14,39 +14,40 @@
|
|||
|
||||
package database
|
||||
|
||||
import "time"
|
||||
import (
|
||||
"time"
|
||||
|
||||
"github.com/coreos/clair/pkg/pagination"
|
||||
)
|
||||
|
||||
// MockSession implements Session and enables overriding each available method.
|
||||
// The default behavior of each method is to simply panic.
|
||||
type MockSession struct {
|
||||
FctCommit func() error
|
||||
FctRollback func() error
|
||||
FctUpsertAncestry func(Ancestry, []NamespacedFeature, Processors) error
|
||||
FctFindAncestry func(name string) (Ancestry, Processors, bool, error)
|
||||
FctFindAncestryFeatures func(name string) (AncestryWithFeatures, bool, error)
|
||||
FctUpsertAncestry func(Ancestry) error
|
||||
FctFindAncestry func(name string) (Ancestry, bool, error)
|
||||
FctFindAffectedNamespacedFeatures func(features []NamespacedFeature) ([]NullableAffectedNamespacedFeature, error)
|
||||
FctPersistNamespaces func([]Namespace) error
|
||||
FctPersistFeatures func([]Feature) error
|
||||
FctPersistNamespacedFeatures func([]NamespacedFeature) error
|
||||
FctCacheAffectedNamespacedFeatures func([]NamespacedFeature) error
|
||||
FctPersistLayer func(Layer) error
|
||||
FctPersistLayerContent func(hash string, namespaces []Namespace, features []Feature, processedBy Processors) error
|
||||
FctFindLayer func(name string) (Layer, Processors, bool, error)
|
||||
FctFindLayerWithContent func(name string) (LayerWithContent, bool, error)
|
||||
FctPersistLayer func(hash string, namespaces []Namespace, features []Feature, processedBy Processors) error
|
||||
FctFindLayer func(name string) (Layer, bool, error)
|
||||
FctInsertVulnerabilities func([]VulnerabilityWithAffected) error
|
||||
FctFindVulnerabilities func([]VulnerabilityID) ([]NullableVulnerability, error)
|
||||
FctDeleteVulnerabilities func([]VulnerabilityID) error
|
||||
FctInsertVulnerabilityNotifications func([]VulnerabilityNotification) error
|
||||
FctFindNewNotification func(lastNotified time.Time) (NotificationHook, bool, error)
|
||||
FctFindVulnerabilityNotification func(name string, limit int, oldPage PageNumber, newPage PageNumber) (
|
||||
FctFindVulnerabilityNotification func(name string, limit int, oldPage pagination.Token, newPage pagination.Token) (
|
||||
vuln VulnerabilityNotificationWithVulnerable, ok bool, err error)
|
||||
FctMarkNotificationNotified func(name string) error
|
||||
FctDeleteNotification func(name string) error
|
||||
FctUpdateKeyValue func(key, value string) error
|
||||
FctFindKeyValue func(key string) (string, bool, error)
|
||||
FctLock func(name string, owner string, duration time.Duration, renew bool) (bool, time.Time, error)
|
||||
FctUnlock func(name, owner string) error
|
||||
FctFindLock func(name string) (string, time.Time, bool, error)
|
||||
FctMarkNotificationAsRead func(name string) error
|
||||
FctDeleteNotification func(name string) error
|
||||
FctUpdateKeyValue func(key, value string) error
|
||||
FctFindKeyValue func(key string) (string, bool, error)
|
||||
FctLock func(name string, owner string, duration time.Duration, renew bool) (bool, time.Time, error)
|
||||
FctUnlock func(name, owner string) error
|
||||
FctFindLock func(name string) (string, time.Time, bool, error)
|
||||
}
|
||||
|
||||
func (ms *MockSession) Commit() error {
|
||||
|
@ -63,27 +64,20 @@ func (ms *MockSession) Rollback() error {
|
|||
panic("required mock function not implemented")
|
||||
}
|
||||
|
||||
func (ms *MockSession) UpsertAncestry(ancestry Ancestry, features []NamespacedFeature, processedBy Processors) error {
|
||||
func (ms *MockSession) UpsertAncestry(ancestry Ancestry) error {
|
||||
if ms.FctUpsertAncestry != nil {
|
||||
return ms.FctUpsertAncestry(ancestry, features, processedBy)
|
||||
return ms.FctUpsertAncestry(ancestry)
|
||||
}
|
||||
panic("required mock function not implemented")
|
||||
}
|
||||
|
||||
func (ms *MockSession) FindAncestry(name string) (Ancestry, Processors, bool, error) {
|
||||
func (ms *MockSession) FindAncestry(name string) (Ancestry, bool, error) {
|
||||
if ms.FctFindAncestry != nil {
|
||||
return ms.FctFindAncestry(name)
|
||||
}
|
||||
panic("required mock function not implemented")
|
||||
}
|
||||
|
||||
func (ms *MockSession) FindAncestryFeatures(name string) (AncestryWithFeatures, bool, error) {
|
||||
if ms.FctFindAncestryFeatures != nil {
|
||||
return ms.FctFindAncestryFeatures(name)
|
||||
}
|
||||
panic("required mock function not implemented")
|
||||
}
|
||||
|
||||
func (ms *MockSession) FindAffectedNamespacedFeatures(features []NamespacedFeature) ([]NullableAffectedNamespacedFeature, error) {
|
||||
if ms.FctFindAffectedNamespacedFeatures != nil {
|
||||
return ms.FctFindAffectedNamespacedFeatures(features)
|
||||
|
@ -119,34 +113,20 @@ func (ms *MockSession) CacheAffectedNamespacedFeatures(namespacedFeatures []Name
|
|||
panic("required mock function not implemented")
|
||||
}
|
||||
|
||||
func (ms *MockSession) PersistLayer(layer Layer) error {
|
||||
func (ms *MockSession) PersistLayer(hash string, namespaces []Namespace, features []Feature, processedBy Processors) error {
|
||||
if ms.FctPersistLayer != nil {
|
||||
return ms.FctPersistLayer(layer)
|
||||
return ms.FctPersistLayer(hash, namespaces, features, processedBy)
|
||||
}
|
||||
panic("required mock function not implemented")
|
||||
}
|
||||
|
||||
func (ms *MockSession) PersistLayerContent(hash string, namespaces []Namespace, features []Feature, processedBy Processors) error {
|
||||
if ms.FctPersistLayerContent != nil {
|
||||
return ms.FctPersistLayerContent(hash, namespaces, features, processedBy)
|
||||
}
|
||||
panic("required mock function not implemented")
|
||||
}
|
||||
|
||||
func (ms *MockSession) FindLayer(name string) (Layer, Processors, bool, error) {
|
||||
func (ms *MockSession) FindLayer(name string) (Layer, bool, error) {
|
||||
if ms.FctFindLayer != nil {
|
||||
return ms.FctFindLayer(name)
|
||||
}
|
||||
panic("required mock function not implemented")
|
||||
}
|
||||
|
||||
func (ms *MockSession) FindLayerWithContent(name string) (LayerWithContent, bool, error) {
|
||||
if ms.FctFindLayerWithContent != nil {
|
||||
return ms.FctFindLayerWithContent(name)
|
||||
}
|
||||
panic("required mock function not implemented")
|
||||
}
|
||||
|
||||
func (ms *MockSession) InsertVulnerabilities(vulnerabilities []VulnerabilityWithAffected) error {
|
||||
if ms.FctInsertVulnerabilities != nil {
|
||||
return ms.FctInsertVulnerabilities(vulnerabilities)
|
||||
|
@ -182,7 +162,7 @@ func (ms *MockSession) FindNewNotification(lastNotified time.Time) (Notification
|
|||
panic("required mock function not implemented")
|
||||
}
|
||||
|
||||
func (ms *MockSession) FindVulnerabilityNotification(name string, limit int, oldPage PageNumber, newPage PageNumber) (
|
||||
func (ms *MockSession) FindVulnerabilityNotification(name string, limit int, oldPage pagination.Token, newPage pagination.Token) (
|
||||
VulnerabilityNotificationWithVulnerable, bool, error) {
|
||||
if ms.FctFindVulnerabilityNotification != nil {
|
||||
return ms.FctFindVulnerabilityNotification(name, limit, oldPage, newPage)
|
||||
|
@ -190,9 +170,9 @@ func (ms *MockSession) FindVulnerabilityNotification(name string, limit int, old
|
|||
panic("required mock function not implemented")
|
||||
}
|
||||
|
||||
func (ms *MockSession) MarkNotificationNotified(name string) error {
|
||||
if ms.FctMarkNotificationNotified != nil {
|
||||
return ms.FctMarkNotificationNotified(name)
|
||||
func (ms *MockSession) MarkNotificationAsRead(name string) error {
|
||||
if ms.FctMarkNotificationAsRead != nil {
|
||||
return ms.FctMarkNotificationAsRead(name)
|
||||
}
|
||||
panic("required mock function not implemented")
|
||||
}
|
||||
|
|
46
vendor/github.com/coreos/clair/database/models.go
generated
vendored
46
vendor/github.com/coreos/clair/database/models.go
generated
vendored
|
@ -18,9 +18,11 @@ import (
|
|||
"database/sql/driver"
|
||||
"encoding/json"
|
||||
"time"
|
||||
|
||||
"github.com/coreos/clair/pkg/pagination"
|
||||
)
|
||||
|
||||
// Processors are extentions to scan layer's content.
|
||||
// Processors are extentions to scan a layer's content.
|
||||
type Processors struct {
|
||||
Listers []string
|
||||
Detectors []string
|
||||
|
@ -29,34 +31,38 @@ type Processors struct {
|
|||
// Ancestry is a manifest that keeps all layers in an image in order.
|
||||
type Ancestry struct {
|
||||
Name string
|
||||
// ProcessedBy contains the processors that are used when computing the
|
||||
// content of this ancestry.
|
||||
ProcessedBy Processors
|
||||
// Layers should be ordered and i_th layer is the parent of i+1_th layer in
|
||||
// the slice.
|
||||
Layers []Layer
|
||||
Layers []AncestryLayer
|
||||
}
|
||||
|
||||
// AncestryWithFeatures is an ancestry with namespaced features detected in the
|
||||
// ancestry, which is processed by `ProcessedBy`.
|
||||
type AncestryWithFeatures struct {
|
||||
Ancestry
|
||||
// AncestryLayer is a layer with all detected namespaced features.
|
||||
type AncestryLayer struct {
|
||||
LayerMetadata
|
||||
|
||||
ProcessedBy Processors
|
||||
Features []NamespacedFeature
|
||||
// DetectedFeatures are the features introduced by this layer when it was
|
||||
// processed.
|
||||
DetectedFeatures []NamespacedFeature
|
||||
}
|
||||
|
||||
// Layer corresponds to a layer in an image processed by `ProcessedBy`.
|
||||
type Layer struct {
|
||||
// LayerMetadata contains the metadata of a layer.
|
||||
type LayerMetadata struct {
|
||||
// Hash is content hash of the layer.
|
||||
Hash string
|
||||
// ProcessedBy contains the processors that processed this layer.
|
||||
ProcessedBy Processors
|
||||
}
|
||||
|
||||
// LayerWithContent is a layer with its detected namespaces and features by
|
||||
// Layer is a layer with its detected namespaces and features by
|
||||
// ProcessedBy.
|
||||
type LayerWithContent struct {
|
||||
Layer
|
||||
type Layer struct {
|
||||
LayerMetadata
|
||||
|
||||
ProcessedBy Processors
|
||||
Namespaces []Namespace
|
||||
Features []Feature
|
||||
Namespaces []Namespace
|
||||
Features []Feature
|
||||
}
|
||||
|
||||
// Namespace is the contextual information around features.
|
||||
|
@ -159,8 +165,8 @@ type PagedVulnerableAncestries struct {
|
|||
Affected map[int]string
|
||||
|
||||
Limit int
|
||||
Current PageNumber
|
||||
Next PageNumber
|
||||
Current pagination.Token
|
||||
Next pagination.Token
|
||||
|
||||
// End signals the end of the pages.
|
||||
End bool
|
||||
|
@ -195,9 +201,7 @@ type VulnerabilityNotificationWithVulnerable struct {
|
|||
New *PagedVulnerableAncestries
|
||||
}
|
||||
|
||||
// PageNumber is used to do pagination.
|
||||
type PageNumber string
|
||||
|
||||
// MetadataMap is for storing the metadata returned by vulnerability database.
|
||||
type MetadataMap map[string]interface{}
|
||||
|
||||
// NullableAffectedNamespacedFeature is an affectednamespacedfeature with
|
||||
|
|
102
vendor/github.com/coreos/clair/pkg/pagination/pagination.go
generated
vendored
Normal file
102
vendor/github.com/coreos/clair/pkg/pagination/pagination.go
generated
vendored
Normal file
|
@ -0,0 +1,102 @@
|
|||
// Copyright 2018 clair authors
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
// Package pagination implements a series of utilities for dealing with
|
||||
// paginating lists of objects for an API.
|
||||
package pagination
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"time"
|
||||
|
||||
"github.com/fernet/fernet-go"
|
||||
)
|
||||
|
||||
// ErrInvalidToken is returned when a token fails to Unmarshal because it was
|
||||
// invalid or expired.
|
||||
var ErrInvalidToken = errors.New("invalid or expired pagination token")
|
||||
|
||||
// ErrInvalidKeyString is returned when the string representing a key is malformed.
|
||||
var ErrInvalidKeyString = errors.New("invalid pagination key string: must be 32-byte URL-safe base64")
|
||||
|
||||
// Key represents the key used to cryptographically secure the token
|
||||
// being used to keep track of pages.
|
||||
type Key struct {
|
||||
fkey *fernet.Key
|
||||
}
|
||||
|
||||
// Token represents an opaque pagination token keeping track of a user's
|
||||
// progress iterating through a list of results.
|
||||
type Token string
|
||||
|
||||
// FirstPageToken is used to represent the first page of content.
|
||||
var FirstPageToken = Token("")
|
||||
|
||||
// NewKey generates a new random pagination key.
|
||||
func NewKey() (k Key, err error) {
|
||||
k.fkey = new(fernet.Key)
|
||||
err = k.fkey.Generate()
|
||||
return k, err
|
||||
}
|
||||
|
||||
// KeyFromString creates the key for a given string.
|
||||
//
|
||||
// Strings must be 32-byte URL-safe base64 representations of the key bytes.
|
||||
func KeyFromString(keyString string) (k Key, err error) {
|
||||
var fkey *fernet.Key
|
||||
fkey, err = fernet.DecodeKey(keyString)
|
||||
if err != nil {
|
||||
return Key{}, ErrInvalidKeyString
|
||||
}
|
||||
return Key{fkey}, err
|
||||
}
|
||||
|
||||
// Must is a helper that wraps calls returning a Key and and error and panics
|
||||
// if the error is non-nil.
|
||||
func Must(k Key, err error) Key {
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return k
|
||||
}
|
||||
|
||||
// String implements the fmt.Stringer interface for Key.
|
||||
func (k Key) String() string {
|
||||
return k.fkey.Encode()
|
||||
}
|
||||
|
||||
// MarshalToken encodes an interface into JSON bytes and produces a Token.
|
||||
func (k Key) MarshalToken(v interface{}) (Token, error) {
|
||||
var buf bytes.Buffer
|
||||
err := json.NewEncoder(&buf).Encode(v)
|
||||
if err != nil {
|
||||
return Token(""), err
|
||||
}
|
||||
|
||||
tokenBytes, err := fernet.EncryptAndSign(buf.Bytes(), k.fkey)
|
||||
return Token(tokenBytes), err
|
||||
}
|
||||
|
||||
// UnmarshalToken decrypts a Token using provided key and decodes the result
|
||||
// into the provided interface.
|
||||
func (k Key) UnmarshalToken(t Token, v interface{}) error {
|
||||
msg := fernet.VerifyAndDecrypt([]byte(t), time.Hour, []*fernet.Key{k.fkey})
|
||||
if msg == nil {
|
||||
return ErrInvalidToken
|
||||
}
|
||||
|
||||
return json.NewDecoder(bytes.NewBuffer(msg)).Decode(&v)
|
||||
}
|
BIN
vendor/github.com/docker/docker-ce/components/engine/docs/static_files/contributors.png
generated
vendored
BIN
vendor/github.com/docker/docker-ce/components/engine/docs/static_files/contributors.png
generated
vendored
Binary file not shown.
Before Width: | Height: | Size: 17 KiB After Width: | Height: | Size: 23 KiB |
BIN
vendor/github.com/docker/docker/docs/static_files/contributors.png
generated
vendored
BIN
vendor/github.com/docker/docker/docs/static_files/contributors.png
generated
vendored
Binary file not shown.
Before Width: | Height: | Size: 17 KiB After Width: | Height: | Size: 23 KiB |
20
vendor/github.com/fernet/fernet-go/License
generated
vendored
Normal file
20
vendor/github.com/fernet/fernet-go/License
generated
vendored
Normal file
|
@ -0,0 +1,20 @@
|
|||
Copyright © 2013 Keith Rarick
|
||||
|
||||
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.
|
168
vendor/github.com/fernet/fernet-go/fernet.go
generated
vendored
Normal file
168
vendor/github.com/fernet/fernet-go/fernet.go
generated
vendored
Normal file
|
@ -0,0 +1,168 @@
|
|||
// Package fernet takes a user-provided message (an arbitrary
|
||||
// sequence of bytes), a key (256 bits), and the current time,
|
||||
// and produces a token, which contains the message in a form
|
||||
// that can't be read or altered without the key.
|
||||
//
|
||||
// For more information and background, see the Fernet spec
|
||||
// at https://github.com/fernet/spec.
|
||||
//
|
||||
// Subdirectories in this package provide command-line tools
|
||||
// for working with Fernet keys and tokens.
|
||||
package fernet
|
||||
|
||||
import (
|
||||
"crypto/aes"
|
||||
"crypto/cipher"
|
||||
"crypto/hmac"
|
||||
"crypto/rand"
|
||||
"crypto/sha256"
|
||||
"crypto/subtle"
|
||||
"encoding/base64"
|
||||
"encoding/binary"
|
||||
"io"
|
||||
"time"
|
||||
)
|
||||
|
||||
const (
|
||||
version byte = 0x80
|
||||
tsOffset = 1
|
||||
ivOffset = tsOffset + 8
|
||||
payOffset = ivOffset + aes.BlockSize
|
||||
overhead = 1 + 8 + aes.BlockSize + sha256.Size // ver + ts + iv + hmac
|
||||
maxClockSkew = 60 * time.Second
|
||||
)
|
||||
|
||||
var encoding = base64.URLEncoding
|
||||
|
||||
// generates a token from msg, writes it into tok, and returns the
|
||||
// number of bytes generated, which is encodedLen(msg).
|
||||
// len(tok) must be >= encodedLen(len(msg))
|
||||
func gen(tok, msg, iv []byte, ts time.Time, k *Key) int {
|
||||
tok[0] = version
|
||||
binary.BigEndian.PutUint64(tok[tsOffset:], uint64(ts.Unix()))
|
||||
copy(tok[ivOffset:], iv)
|
||||
p := tok[payOffset:]
|
||||
n := pad(p, msg, aes.BlockSize)
|
||||
bc, _ := aes.NewCipher(k.cryptBytes())
|
||||
cipher.NewCBCEncrypter(bc, iv).CryptBlocks(p[:n], p[:n])
|
||||
genhmac(p[n:n], tok[:payOffset+n], k.signBytes())
|
||||
return payOffset + n + sha256.Size
|
||||
}
|
||||
|
||||
// token length for input msg of length n, not including base64
|
||||
func encodedLen(n int) int {
|
||||
const k = aes.BlockSize
|
||||
return n/k*k + k + overhead
|
||||
}
|
||||
|
||||
// max msg length for tok of length n, for binary token (no base64)
|
||||
// upper bound; not exact
|
||||
func decodedLen(n int) int {
|
||||
return n - overhead
|
||||
}
|
||||
|
||||
// if msg is nil, decrypts in place and returns a slice of tok.
|
||||
func verify(msg, tok []byte, ttl time.Duration, now time.Time, k *Key) []byte {
|
||||
if len(tok) < 1 || tok[0] != version {
|
||||
return nil
|
||||
}
|
||||
ts := time.Unix(int64(binary.BigEndian.Uint64(tok[1:])), 0)
|
||||
if ttl > 0 && (now.After(ts.Add(ttl)) || ts.After(now.Add(maxClockSkew))) {
|
||||
return nil
|
||||
}
|
||||
n := len(tok) - sha256.Size
|
||||
var hmac [sha256.Size]byte
|
||||
genhmac(hmac[:0], tok[:n], k.signBytes())
|
||||
if subtle.ConstantTimeCompare(tok[n:], hmac[:]) != 1 {
|
||||
return nil
|
||||
}
|
||||
pay := tok[payOffset : len(tok)-sha256.Size]
|
||||
if len(pay)%aes.BlockSize != 0 {
|
||||
return nil
|
||||
}
|
||||
if msg != nil {
|
||||
copy(msg, pay)
|
||||
pay = msg
|
||||
}
|
||||
bc, _ := aes.NewCipher(k.cryptBytes())
|
||||
iv := tok[9:][:aes.BlockSize]
|
||||
cipher.NewCBCDecrypter(bc, iv).CryptBlocks(pay, pay)
|
||||
return unpad(pay)
|
||||
}
|
||||
|
||||
// Pads p to a multiple of k using PKCS #7 standard block padding.
|
||||
// See http://tools.ietf.org/html/rfc5652#section-6.3.
|
||||
func pad(q, p []byte, k int) int {
|
||||
n := len(p)/k*k + k
|
||||
copy(q, p)
|
||||
c := byte(n - len(p))
|
||||
for i := len(p); i < n; i++ {
|
||||
q[i] = c
|
||||
}
|
||||
return n
|
||||
}
|
||||
|
||||
// Removes PKCS #7 standard block padding from p.
|
||||
// See http://tools.ietf.org/html/rfc5652#section-6.3.
|
||||
// This function is the inverse of pad.
|
||||
// If the padding is not well-formed, unpad returns nil.
|
||||
func unpad(p []byte) []byte {
|
||||
c := p[len(p)-1]
|
||||
for i := len(p) - int(c); i < len(p); i++ {
|
||||
if i < 0 || p[i] != c {
|
||||
return nil
|
||||
}
|
||||
}
|
||||
return p[:len(p)-int(c)]
|
||||
}
|
||||
|
||||
func b64enc(src []byte) []byte {
|
||||
dst := make([]byte, encoding.EncodedLen(len(src)))
|
||||
encoding.Encode(dst, src)
|
||||
return dst
|
||||
}
|
||||
|
||||
func b64dec(src []byte) []byte {
|
||||
dst := make([]byte, encoding.DecodedLen(len(src)))
|
||||
n, err := encoding.Decode(dst, src)
|
||||
if err != nil {
|
||||
return nil
|
||||
}
|
||||
return dst[:n]
|
||||
}
|
||||
|
||||
func genhmac(q, p, k []byte) {
|
||||
h := hmac.New(sha256.New, k)
|
||||
h.Write(p)
|
||||
h.Sum(q)
|
||||
}
|
||||
|
||||
// EncryptAndSign encrypts and signs msg with key k and returns the resulting
|
||||
// fernet token. If msg contains text, the text should be encoded
|
||||
// with UTF-8 to follow fernet convention.
|
||||
func EncryptAndSign(msg []byte, k *Key) (tok []byte, err error) {
|
||||
iv := make([]byte, aes.BlockSize)
|
||||
if _, err := io.ReadFull(rand.Reader, iv); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
b := make([]byte, encodedLen(len(msg)))
|
||||
n := gen(b, msg, iv, time.Now(), k)
|
||||
tok = make([]byte, encoding.EncodedLen(n))
|
||||
encoding.Encode(tok, b[:n])
|
||||
return tok, nil
|
||||
}
|
||||
|
||||
// VerifyAndDecrypt verifies that tok is a valid fernet token that was signed
|
||||
// with a key in k at most ttl time ago only if ttl is greater than zero.
|
||||
// Returns the message contained in tok if tok is valid, otherwise nil.
|
||||
func VerifyAndDecrypt(tok []byte, ttl time.Duration, k []*Key) (msg []byte) {
|
||||
b := make([]byte, encoding.DecodedLen(len(tok)))
|
||||
n, _ := encoding.Decode(b, tok)
|
||||
for _, k1 := range k {
|
||||
msg = verify(nil, b[:n], ttl, time.Now(), k1)
|
||||
if msg != nil {
|
||||
return msg
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
91
vendor/github.com/fernet/fernet-go/key.go
generated
vendored
Normal file
91
vendor/github.com/fernet/fernet-go/key.go
generated
vendored
Normal file
|
@ -0,0 +1,91 @@
|
|||
package fernet
|
||||
|
||||
import (
|
||||
"crypto/rand"
|
||||
"encoding/base64"
|
||||
"encoding/hex"
|
||||
"errors"
|
||||
"io"
|
||||
)
|
||||
|
||||
var (
|
||||
errKeyLen = errors.New("fernet: key decodes to wrong size")
|
||||
errNoKeys = errors.New("fernet: no keys provided")
|
||||
)
|
||||
|
||||
// Key represents a key.
|
||||
type Key [32]byte
|
||||
|
||||
func (k *Key) cryptBytes() []byte {
|
||||
return k[len(k)/2:]
|
||||
}
|
||||
|
||||
func (k *Key) signBytes() []byte {
|
||||
return k[:len(k)/2]
|
||||
}
|
||||
|
||||
// Generate initializes k with pseudorandom data from package crypto/rand.
|
||||
func (k *Key) Generate() error {
|
||||
_, err := io.ReadFull(rand.Reader, k[:])
|
||||
return err
|
||||
}
|
||||
|
||||
// Encode returns the URL-safe base64 encoding of k.
|
||||
func (k *Key) Encode() string {
|
||||
return encoding.EncodeToString(k[:])
|
||||
}
|
||||
|
||||
// DecodeKey decodes a key from s and returns it. The key can be in
|
||||
// hexadecimal, standard base64, or URL-safe base64.
|
||||
func DecodeKey(s string) (*Key, error) {
|
||||
var b []byte
|
||||
var err error
|
||||
if s == "" {
|
||||
return nil, errors.New("empty key")
|
||||
}
|
||||
if len(s) == hex.EncodedLen(len(Key{})) {
|
||||
b, err = hex.DecodeString(s)
|
||||
} else {
|
||||
b, err = base64.StdEncoding.DecodeString(s)
|
||||
if err != nil {
|
||||
b, err = base64.URLEncoding.DecodeString(s)
|
||||
}
|
||||
}
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if len(b) != len(Key{}) {
|
||||
return nil, errKeyLen
|
||||
}
|
||||
k := new(Key)
|
||||
copy(k[:], b)
|
||||
return k, nil
|
||||
}
|
||||
|
||||
// DecodeKeys decodes each element of a using DecodeKey and returns the
|
||||
// resulting keys. Requires at least one key.
|
||||
func DecodeKeys(a ...string) ([]*Key, error) {
|
||||
if len(a) == 0 {
|
||||
return nil, errNoKeys
|
||||
}
|
||||
var err error
|
||||
ks := make([]*Key, len(a))
|
||||
for i, s := range a {
|
||||
ks[i], err = DecodeKey(s)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
return ks, nil
|
||||
}
|
||||
|
||||
// MustDecodeKeys is like DecodeKeys, but panics if an error occurs.
|
||||
// It simplifies safe initialization of global variables holding
|
||||
// keys.
|
||||
func MustDecodeKeys(a ...string) []*Key {
|
||||
k, err := DecodeKeys(a...)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return k
|
||||
}
|
Loading…
Reference in a new issue