Skip to content

Commit 40122a1

Browse files
committed
updates for the new org support package
1 parent 8c5c9c0 commit 40122a1

File tree

11 files changed

+71
-460
lines changed

11 files changed

+71
-460
lines changed

engine/plugins/api/aviato/company_rounds.go

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,15 @@ import (
1616

1717
"github.com/google/uuid"
1818
"github.com/owasp-amass/amass/v5/engine/plugins/support"
19+
"github.com/owasp-amass/amass/v5/engine/plugins/support/org"
1920
et "github.com/owasp-amass/amass/v5/engine/types"
2021
"github.com/owasp-amass/amass/v5/internal/net/http"
2122
dbt "github.com/owasp-amass/asset-db/types"
2223
oam "github.com/owasp-amass/open-asset-model"
2324
"github.com/owasp-amass/open-asset-model/account"
2425
"github.com/owasp-amass/open-asset-model/financial"
2526
"github.com/owasp-amass/open-asset-model/general"
26-
"github.com/owasp-amass/open-asset-model/org"
27+
oamorg "github.com/owasp-amass/open-asset-model/org"
2728
"github.com/owasp-amass/open-asset-model/people"
2829
)
2930

@@ -83,7 +84,7 @@ func (cr *companyRounds) lookup(e *et.Event, ident *dbt.Entity, since time.Time)
8384
continue
8485
}
8586
if a, err := e.Session.Cache().FindEntityById(edge.FromEntity.ID); err == nil && a != nil {
86-
if _, ok := a.Asset.(*org.Organization); ok {
87+
if _, ok := a.Asset.(*oamorg.Organization); ok {
8788
orgent = a
8889
break
8990
}
@@ -203,7 +204,7 @@ func (cr *companyRounds) getAssociatedOrg(e *et.Event, ident *dbt.Entity) *dbt.E
203204
if edges, err := e.Session.Cache().IncomingEdges(ident, time.Time{}, "id"); err == nil {
204205
for _, edge := range edges {
205206
if a, err := e.Session.Cache().FindEntityById(edge.FromEntity.ID); err == nil && a != nil {
206-
if _, ok := a.Asset.(*org.Organization); ok {
207+
if _, ok := a.Asset.(*oamorg.Organization); ok {
207208
orgent = a
208209
break
209210
}
@@ -220,7 +221,7 @@ func (cr *companyRounds) store(e *et.Event, ident, orgent *dbt.Entity, funds *co
220221
if orgent == nil {
221222
return fundents
222223
}
223-
o := orgent.Asset.(*org.Organization)
224+
o := orgent.Asset.(*oamorg.Organization)
224225

225226
for _, round := range funds.FundingRounds {
226227
orgacc := cr.orgCheckingAccount(e, orgent)
@@ -283,7 +284,7 @@ func (cr *companyRounds) store(e *et.Event, ident, orgent *dbt.Entity, funds *co
283284

284285
func (cr *companyRounds) orgCheckingAccount(e *et.Event, orgent *dbt.Entity) *dbt.Entity {
285286
var accountent *dbt.Entity
286-
o := orgent.Asset.(*org.Organization)
287+
o := orgent.Asset.(*oamorg.Organization)
287288

288289
if edges, err := e.Session.Cache().OutgoingEdges(orgent, time.Time{}, "account"); err == nil {
289290
for _, edge := range edges {
@@ -402,7 +403,7 @@ func (cr *companyRounds) createOrgInvestors(e *et.Event, round *companyFundingRo
402403
continue
403404
}
404405
if a, err := e.Session.Cache().FindEntityById(edge.FromEntity.ID); err == nil && a != nil {
405-
if _, ok := a.Asset.(*org.Organization); ok {
406+
if _, ok := a.Asset.(*oamorg.Organization); ok {
406407
orgent = a
407408
break
408409
}
@@ -415,8 +416,8 @@ func (cr *companyRounds) createOrgInvestors(e *et.Event, round *companyFundingRo
415416
}
416417

417418
// create the Organization asset
418-
o := &org.Organization{Name: investor.Name}
419-
orgent, err = support.CreateOrgAsset(e.Session, nil, nil, o, cr.plugin.source)
419+
o := &oamorg.Organization{Name: investor.Name}
420+
orgent, err = org.CreateOrgAsset(e.Session, nil, nil, o, cr.plugin.source)
420421
if err != nil {
421422
msg := fmt.Sprintf("failed to create the Organization asset for %s: %s", o.Name, err)
422423
e.Session.Log().Error(msg, slog.Group("plugin", "name", cr.plugin.name, "handler", cr.name))

engine/plugins/api/aviato/company_search.go

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,16 +13,17 @@ import (
1313
"time"
1414

1515
"github.com/owasp-amass/amass/v5/engine/plugins/support"
16+
"github.com/owasp-amass/amass/v5/engine/plugins/support/org"
1617
et "github.com/owasp-amass/amass/v5/engine/types"
1718
"github.com/owasp-amass/amass/v5/internal/net/http"
1819
dbt "github.com/owasp-amass/asset-db/types"
1920
oam "github.com/owasp-amass/open-asset-model"
2021
"github.com/owasp-amass/open-asset-model/general"
21-
"github.com/owasp-amass/open-asset-model/org"
22+
oamorg "github.com/owasp-amass/open-asset-model/org"
2223
)
2324

2425
func (cs *companySearch) check(e *et.Event) error {
25-
_, ok := e.Entity.Asset.(*org.Organization)
26+
_, ok := e.Entity.Asset.(*oamorg.Organization)
2627
if !ok {
2728
return errors.New("failed to extract the Organization asset")
2829
}
@@ -84,8 +85,8 @@ func (cs *companySearch) lookup(e *et.Event, orgent *dbt.Entity, since time.Time
8485
}
8586

8687
func (cs *companySearch) query(e *et.Event, orgent *dbt.Entity, apikey []string) *dbt.Entity {
87-
o := orgent.Asset.(*org.Organization)
88-
brand := support.ExtractBrandName(o.Name)
88+
o := orgent.Asset.(*oamorg.Organization)
89+
brand := org.ExtractBrandName(o.Name)
8990

9091
var body string
9192
success := false
@@ -196,7 +197,7 @@ func (cs *companySearch) process(e *et.Event, orgent, ident *dbt.Entity) {
196197
Session: e.Session,
197198
})
198199

199-
o := orgent.Asset.(*org.Organization)
200+
o := orgent.Asset.(*oamorg.Organization)
200201
e.Session.Log().Info("relationship discovered", "from", o.Name, "relation", "id",
201202
"to", id.UniqueID, slog.Group("plugin", "name", cs.plugin.name, "handler", cs.name))
202203
}

engine/plugins/api/gleif/fuzzy.go

Lines changed: 15 additions & 174 deletions
Original file line numberDiff line numberDiff line change
@@ -6,29 +6,21 @@ package gleif
66

77
import (
88
"context"
9-
"encoding/json"
109
"errors"
11-
"fmt"
1210
"log/slog"
13-
"math"
14-
"net/url"
15-
"strings"
1611
"time"
1712

18-
"github.com/adrg/strutil"
19-
"github.com/adrg/strutil/metrics"
2013
"github.com/owasp-amass/amass/v5/engine/plugins/support"
14+
"github.com/owasp-amass/amass/v5/engine/plugins/support/org"
2115
et "github.com/owasp-amass/amass/v5/engine/types"
22-
"github.com/owasp-amass/amass/v5/internal/net/http"
2316
dbt "github.com/owasp-amass/asset-db/types"
2417
oam "github.com/owasp-amass/open-asset-model"
25-
"github.com/owasp-amass/open-asset-model/contact"
2618
"github.com/owasp-amass/open-asset-model/general"
27-
"github.com/owasp-amass/open-asset-model/org"
19+
oamorg "github.com/owasp-amass/open-asset-model/org"
2820
)
2921

3022
func (fc *fuzzyCompletions) check(e *et.Event) error {
31-
_, ok := e.Entity.Asset.(*org.Organization)
23+
_, ok := e.Entity.Asset.(*oamorg.Organization)
3224
if !ok {
3325
return errors.New("failed to extract the Organization asset")
3426
}
@@ -72,190 +64,39 @@ func (fc *fuzzyCompletions) lookup(e *et.Event, orgent *dbt.Entity, since time.T
7264

7365
func (fc *fuzzyCompletions) query(e *et.Event, orgent *dbt.Entity) *dbt.Entity {
7466
var conf int
75-
var rec *leiRecord
67+
var rec *org.LEIRecord
7668

7769
if leient := fc.plugin.orgEntityToLEI(e, orgent); leient != nil {
7870
lei := leient.Asset.(*general.Identifier)
7971

80-
if r, err := fc.plugin.getLEIRecord(lei); err == nil {
72+
if r, err := org.GLEIFGetLEIRecord(lei.ID); err == nil {
8173
rec = r
8274
conf = 100
8375
}
8476
}
8577

8678
if rec == nil {
87-
o := orgent.Asset.(*org.Organization)
88-
brand := support.ExtractBrandName(o.Name)
89-
u := "https://api.gleif.org/api/v1/fuzzycompletions?field=entity.legalName&q=" + url.QueryEscape(brand)
90-
79+
o := orgent.Asset.(*oamorg.Organization)
80+
brand := org.ExtractBrandName(o.Name)
9181
_ = fc.plugin.rlimit.Wait(context.TODO())
92-
resp, err := http.RequestWebPage(context.TODO(), &http.Request{URL: u})
93-
if err != nil || resp.Body == "" {
94-
msg := fmt.Sprintf("Failed to obtain the LEI record for %s: %s", o.Name, err)
95-
e.Session.Log().Error(msg, slog.Group("plugin", "name", fc.plugin.name, "handler", fc.name))
96-
return nil
97-
}
9882

99-
var result struct {
100-
Data []struct {
101-
Type string `json:"type"`
102-
Attributes struct {
103-
Value string `json:"value"`
104-
} `json:"attributes"`
105-
Relationships struct {
106-
LEIRecords struct {
107-
Data struct {
108-
Type string `json:"type"`
109-
ID string `json:"id"`
110-
} `json:"data"`
111-
Links struct {
112-
Related string `json:"related"`
113-
} `json:"links"`
114-
} `json:"lei-records"`
115-
} `json:"relationships"`
116-
} `json:"data"`
117-
}
118-
if err := json.Unmarshal([]byte(resp.Body), &result); err != nil {
119-
msg := fmt.Sprintf("Failed to unmarshal the LEI record for %s: %s", o.Name, err)
120-
e.Session.Log().Error(msg, slog.Group("plugin", "name", fc.plugin.name, "handler", fc.name))
121-
return nil
122-
} else if len(result.Data) == 0 {
83+
var err error
84+
rec, err = org.GLEIFSearchFuzzyCompletions(e, orgent, brand)
85+
if err != nil {
86+
e.Session.Log().Error(err.Error(), slog.Group("plugin", "name", fc.plugin.name, "handler", fc.name))
12387
return nil
12488
}
125-
126-
var names []string
127-
m := make(map[string]string)
128-
for _, d := range result.Data {
129-
if d.Type == "fuzzycompletions" && d.Relationships.LEIRecords.Data.Type == "lei-records" {
130-
names = append(names, d.Attributes.Value)
131-
m[d.Attributes.Value] = d.Relationships.LEIRecords.Data.ID
132-
}
133-
}
134-
135-
if exact, partial, found := support.OrganizationNameMatch(e.Session, orgent, names); found {
136-
for _, match := range exact {
137-
score := 30
138-
139-
if len(exact) == 1 {
140-
score += 30
141-
}
142-
143-
lei := m[match]
144-
id := &general.Identifier{
145-
UniqueID: fmt.Sprintf("%s:%s", general.LEICode, lei),
146-
ID: lei,
147-
Type: general.LEICode,
148-
}
149-
150-
if r, err := fc.plugin.getLEIRecord(id); err == nil {
151-
if fc.locMatch(e, orgent, r) {
152-
score += 40
153-
}
154-
if score > conf {
155-
rec = r
156-
conf = score
157-
}
158-
}
159-
}
160-
161-
swg := metrics.NewSmithWatermanGotoh()
162-
swg.CaseSensitive = false
163-
swg.GapPenalty = -0.1
164-
swg.Substitution = metrics.MatchMismatch{
165-
Match: 1,
166-
Mismatch: -0.5,
167-
}
168-
169-
for _, match := range partial {
170-
if !strings.Contains(strings.ToLower(match), strings.ToLower(brand)) {
171-
continue
172-
}
173-
174-
sim := strutil.Similarity(o.Name, match, swg)
175-
score := int(math.Round(sim * 30))
176-
177-
if len(partial) == 1 {
178-
score += 30
179-
}
180-
181-
lei := m[match]
182-
id := &general.Identifier{
183-
UniqueID: fmt.Sprintf("%s:%s", general.LEICode, lei),
184-
ID: lei,
185-
Type: general.LEICode,
186-
}
187-
188-
if r, err := fc.plugin.getLEIRecord(id); err == nil {
189-
if fc.locMatch(e, orgent, r) {
190-
score += 40
191-
}
192-
if score > conf {
193-
rec = r
194-
conf = score
195-
}
196-
}
197-
}
198-
}
19989
}
20090

20191
if rec == nil {
92+
e.Session.Log().Info("no LEI record found for organization",
93+
"org", orgent.ID, slog.Group("plugin", "name", fc.plugin.name, "handler", fc.name))
20294
return nil
20395
}
20496
return fc.store(e, orgent, rec, conf)
20597
}
20698

207-
func (fc *fuzzyCompletions) locMatch(e *et.Event, orgent *dbt.Entity, rec *leiRecord) bool {
208-
if rec == nil {
209-
return false
210-
}
211-
212-
legal_addr := rec.Attributes.Entity.LegalAddress
213-
hq_addr := rec.Attributes.Entity.HeadquartersAddress
214-
if edges, err := e.Session.Cache().OutgoingEdges(orgent,
215-
time.Time{}, "legal_address", "hq_address", "location"); err == nil {
216-
for _, edge := range edges {
217-
if a, err := e.Session.Cache().FindEntityById(edge.ToEntity.ID); err == nil && a != nil {
218-
if loc, ok := a.Asset.(*contact.Location); ok {
219-
for _, p := range append([]leiAddress{legal_addr, hq_addr}, rec.Attributes.Entity.OtherAddresses...) {
220-
if loc.PostalCode == p.PostalCode {
221-
return true
222-
}
223-
}
224-
}
225-
}
226-
}
227-
}
228-
229-
var crs []*dbt.Entity
230-
if edges, err := e.Session.Cache().IncomingEdges(orgent, time.Time{}, "organization"); err == nil {
231-
for _, edge := range edges {
232-
if a, err := e.Session.Cache().FindEntityById(edge.FromEntity.ID); err == nil && a != nil {
233-
if _, ok := a.Asset.(*contact.ContactRecord); ok {
234-
crs = append(crs, a)
235-
}
236-
}
237-
}
238-
}
239-
240-
for _, cr := range crs {
241-
if edges, err := e.Session.Cache().OutgoingEdges(cr, time.Time{}, "location"); err == nil {
242-
for _, edge := range edges {
243-
if a, err := e.Session.Cache().FindEntityById(edge.ToEntity.ID); err == nil && a != nil {
244-
if loc, ok := a.Asset.(*contact.Location); ok {
245-
for _, p := range append([]leiAddress{legal_addr, hq_addr}, rec.Attributes.Entity.OtherAddresses...) {
246-
if loc.PostalCode == p.PostalCode {
247-
return true
248-
}
249-
}
250-
}
251-
}
252-
}
253-
}
254-
}
255-
return false
256-
}
257-
258-
func (fc *fuzzyCompletions) store(e *et.Event, orgent *dbt.Entity, rec *leiRecord, conf int) *dbt.Entity {
99+
func (fc *fuzzyCompletions) store(e *et.Event, orgent *dbt.Entity, rec *org.LEIRecord, conf int) *dbt.Entity {
259100
fc.plugin.updateOrgFromLEIRecord(e, orgent, rec, conf)
260101

261102
ident, err := fc.plugin.createLEIFromRecord(e, orgent, rec, conf)
@@ -276,7 +117,7 @@ func (fc *fuzzyCompletions) process(e *et.Event, orgent, ident *dbt.Entity) {
276117
Session: e.Session,
277118
})
278119

279-
o := orgent.Asset.(*org.Organization)
120+
o := orgent.Asset.(*oamorg.Organization)
280121
e.Session.Log().Info("relationship discovered", "from", o.Name, "relation", "id",
281122
"to", id.UniqueID, slog.Group("plugin", "name", fc.plugin.name, "handler", fc.name))
282123
}

0 commit comments

Comments
 (0)