-
Notifications
You must be signed in to change notification settings - Fork 12
/
Copy pathlookup_github_users_aws_keys.go
139 lines (108 loc) · 3.65 KB
/
lookup_github_users_aws_keys.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
// Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements;
// and to You under the Apache License, Version 2.0. See LICENSE in project root for full license + copyright.
package keynuker
import (
"context"
"encoding/json"
"fmt"
_ "github.com/tleyden/couchdb" // The CouchDB driver
"github.com/go-kivik/kivik"
"github.com/pkg/errors"
"github.com/tleyden/keynuker/keynuker-go-common"
)
// For a given KeyNuker org (or default org), look up:
// - All known github users produced by github-user-aggregator
// - All known aws keys produced by fetch-aws-keys
// And combine them in a single document and emit the document
func LookupGithubUsersAwsKeys(params ParamsLookupGithubUsersAwsKeys) (docWrapper DocumentWrapperLookupGithubUsersAwsKeys, err error) {
ctx := context.Background()
if err := params.Validate(); err != nil {
return docWrapper, err
}
dataSourceName := fmt.Sprintf(
"https://%s:%s@%s",
params.Username,
params.Password,
params.Host,
)
client, err := kivik.New(ctx, "couch", dataSourceName)
if err != nil {
return docWrapper, err
}
db, err := client.DB(ctx, params.DbName)
if err != nil {
return docWrapper, err
}
// Get doc id for github users doc in a keynuker org
docIdGithubUsers := keynuker_go_common.GenerateDocId(
keynuker_go_common.DocIdPrefixGithubUsers,
params.KeyNukerOrg,
)
options := kivik.Options{}
rowGithubUsers := db.Get(ctx, docIdGithubUsers, options)
docGithubUsers := DocumentWithGithubUsers{}
if err := rowGithubUsers.ScanDoc(&docGithubUsers); err != nil {
return docWrapper, err
}
docWrapper.GithubUsers = docGithubUsers.GithubUsers
// Get doc with aws keys
docIdAwsKeys := keynuker_go_common.GenerateDocId(
keynuker_go_common.DocIdPrefixAwsKeys,
params.KeyNukerOrg,
)
rowAwsKeys := db.Get(ctx, docIdAwsKeys, options)
docAwsKeys := DocumentWithAwsKeys{}
if err := rowAwsKeys.ScanDoc(&docAwsKeys); err != nil {
return docWrapper, err
}
docWrapper.AccessKeyMetadata = docAwsKeys.AccessKeyMetadata
// Lookup github checkpoints doc
docIdGithubEventCheckpoints := keynuker_go_common.GenerateDocId(
keynuker_go_common.DocIdPrefixGithubEventCheckpoints,
params.KeyNukerOrg,
)
rowGithubEventCheckpoints := db.Get(ctx, docIdGithubEventCheckpoints, options)
docGithubEventCheckpoints := DocumentWithGithubEventCheckpoints{}
if rowGithubEventCheckpoints.Err == nil {
if err := rowGithubEventCheckpoints.ScanDoc(&docGithubEventCheckpoints); err != nil {
return docWrapper, err
}
}
docWrapper.GithubEventCheckpoints = docGithubEventCheckpoints.GithubEventCheckpoints
return docWrapper, nil
}
type ParamsLookupGithubUsersAwsKeys struct {
// This is the name of the KeyNuker "org/tenant". Defaults to "default", but allows to be extended multi-tenant.
KeyNukerOrg string
// DB connection params
Username string
Password string
Host string
DbName string
}
func (p ParamsLookupGithubUsersAwsKeys) Validate() error {
if p.Host == "" {
return errors.Errorf("No DB Host specified in params")
}
if p.DbName == "" {
return errors.Errorf("No DB name specified in params")
}
return nil
}
type DocumentWrapperLookupGithubUsersAwsKeys struct {
// A list of github users
GithubUsers *json.RawMessage
// AWS access keys to scan for
AccessKeyMetadata *json.RawMessage
// Github event checkpoint which represent the last scanned github event for each known github user
GithubEventCheckpoints *json.RawMessage
}
type DocumentWithGithubUsers struct {
GithubUsers *json.RawMessage
}
type DocumentWithAwsKeys struct {
AccessKeyMetadata *json.RawMessage
}
type DocumentWithGithubEventCheckpoints struct {
GithubEventCheckpoints *json.RawMessage
}