4
4
"database/sql"
5
5
"fmt"
6
6
7
- _ "github.com/lib/pq"
8
-
9
7
"github.com/cemulus/crt/result"
8
+
9
+ _ "github.com/lib/pq"
10
10
)
11
11
12
12
var (
18
18
login = fmt .Sprintf ("host=%s port=%d user=%s dbname=%s" , host , port , user , dbname )
19
19
)
20
20
21
- const (
22
- statement = `WITH ci AS (
23
- SELECT min(sub.CERTIFICATE_ID) ID,
24
- min(sub.ISSUER_CA_ID) ISSUER_CA_ID,
25
- array_agg(DISTINCT sub.NAME_VALUE) NAME_VALUES,
26
- x509_commonName(sub.CERTIFICATE) COMMON_NAME,
27
- x509_notBefore(sub.CERTIFICATE) NOT_BEFORE,
28
- x509_notAfter(sub.CERTIFICATE) NOT_AFTER,
29
- encode(x509_serialNumber(sub.CERTIFICATE), 'hex') SERIAL_NUMBER
30
- FROM (SELECT *
31
- FROM certificate_and_identities cai
32
- WHERE plainto_tsquery('certwatch', '%s') @@ identities(cai.CERTIFICATE)
33
- AND cai.NAME_VALUE ILIKE ('%%' || '%s' || '%%')
34
- %s --filter
35
- LIMIT 10000
36
- ) sub
37
- GROUP BY sub.CERTIFICATE
38
- )
39
- SELECT ci.ISSUER_CA_ID,
40
- ca.NAME ISSUER_NAME,
41
- ci.COMMON_NAME,
42
- array_to_string(ci.NAME_VALUES, chr(10)) NAME_VALUE,
43
- ci.ID ID,
44
- le.ENTRY_TIMESTAMP,
45
- ci.NOT_BEFORE,
46
- ci.NOT_AFTER,
47
- ci.SERIAL_NUMBER
48
- FROM ci
49
- LEFT JOIN LATERAL (
50
- SELECT min(ctle.ENTRY_TIMESTAMP) ENTRY_TIMESTAMP
51
- FROM ct_log_entry ctle
52
- WHERE ctle.CERTIFICATE_ID = ci.ID
53
- ) le ON TRUE,
54
- ca
55
- WHERE ci.ISSUER_CA_ID = ca.ID
56
- ORDER BY le.ENTRY_TIMESTAMP DESC NULLS LAST
57
- LIMIT %d`
58
-
59
- excludeExpired = `AND coalesce(x509_notAfter(cai.CERTIFICATE), 'infinity'::timestamp) >= date_trunc('year', now() AT TIME ZONE 'UTC')
60
- AND x509_notAfter(cai.CERTIFICATE) >= now() AT TIME ZONE 'UTC'`
61
- )
62
-
63
21
type Repository struct {
64
22
db * sql.DB
65
23
}
@@ -77,10 +35,10 @@ func (r *Repository) GetCertLogs(domain string, expired bool, limit int) (result
77
35
filter := ""
78
36
79
37
if expired {
80
- filter = excludeExpired
38
+ filter = excludeExpiredFilter
81
39
}
82
40
83
- stmt := fmt .Sprintf (statement , domain , domain , filter , limit )
41
+ stmt := fmt .Sprintf (certLogScript , domain , domain , filter , limit )
84
42
85
43
rows , err := r .db .Query (stmt )
86
44
if err != nil {
@@ -129,6 +87,35 @@ func (r *Repository) GetCertLogs(domain string, expired bool, limit int) (result
129
87
return res , nil
130
88
}
131
89
90
+ func (r * Repository ) GetSubdomains (domain string , expired bool , limit int ) (result.SubdomainResult , error ) {
91
+ filter := ""
92
+
93
+ if expired {
94
+ filter = excludeExpiredFilter
95
+ }
96
+
97
+ stmt := fmt .Sprintf (subdomainScript , domain , domain , filter , limit )
98
+
99
+ rows , err := r .db .Query (stmt )
100
+ if err != nil {
101
+ return nil , fmt .Errorf ("failed to query row: %s" , err )
102
+ }
103
+ defer rows .Close ()
104
+
105
+ var res result.SubdomainResult
106
+ var subdmn sql.NullString
107
+
108
+ for rows .Next () {
109
+ if err = rows .Scan (& subdmn ); err != nil {
110
+ return nil , fmt .Errorf ("failed to scan row: %s" , err )
111
+ }
112
+
113
+ res = append (res , result.Subdomain {Name : subdmn .String })
114
+ }
115
+
116
+ return res , nil
117
+ }
118
+
132
119
func (r * Repository ) Close () error {
133
120
return r .db .Close ()
134
121
}
0 commit comments