@@ -25,10 +25,12 @@ package main
25
25
import (
26
26
"bufio"
27
27
"bytes"
28
+ "embed"
28
29
"flag"
29
30
"fmt"
30
31
"io"
31
32
"log/slog"
33
+ "math/rand"
32
34
"net"
33
35
"net/netip"
34
36
"os"
@@ -39,14 +41,22 @@ import (
39
41
40
42
"github.com/caffix/stringset"
41
43
"github.com/fatih/color"
44
+ "github.com/glebarez/sqlite"
42
45
"github.com/owasp-amass/amass/v4/format"
46
+ assetdb "github.com/owasp-amass/asset-db"
47
+ db "github.com/owasp-amass/asset-db"
48
+ pgmigrations "github.com/owasp-amass/asset-db/migrations/postgres"
49
+ sqlitemigrations "github.com/owasp-amass/asset-db/migrations/sqlite3"
50
+ "github.com/owasp-amass/asset-db/repository"
43
51
"github.com/owasp-amass/config/config"
44
- "github.com/owasp-amass/engine/graph"
45
52
et "github.com/owasp-amass/engine/types"
46
53
"github.com/owasp-amass/open-asset-model/domain"
47
54
oamnet "github.com/owasp-amass/open-asset-model/network"
55
+ migrate "github.com/rubenv/sql-migrate"
48
56
slogcommon "github.com/samber/slog-common"
49
57
slogsyslog "github.com/samber/slog-syslog/v2"
58
+ "gorm.io/driver/postgres"
59
+ "gorm.io/gorm"
50
60
)
51
61
52
62
const (
@@ -153,29 +163,88 @@ func createOutputDirectory(cfg *config.Config) {
153
163
}
154
164
}
155
165
156
- func openGraphDatabase (cfg * config.Config ) * graph. Graph {
166
+ func openGraphDatabase (cfg * config.Config ) * assetdb. AssetDB {
157
167
// Add the local database settings to the configuration
158
168
cfg .GraphDBs = append (cfg .GraphDBs , cfg .LocalDatabaseSettings (cfg .GraphDBs ))
159
169
160
170
for _ , db := range cfg .GraphDBs {
161
171
if db .Primary {
162
- var g * graph. Graph
172
+ var dbase * assetdb. AssetDB
163
173
164
174
if db .System == "local" {
165
- g = graph . NewGraph (db .System , filepath .Join (config .OutputDirectory (cfg .Dir ), "amass.sqlite" ), db .Options )
175
+ dbase = NewGraph (db .System , filepath .Join (config .OutputDirectory (cfg .Dir ), "amass.sqlite" ), db .Options )
166
176
} else {
167
177
connStr := fmt .Sprintf ("host=%s port=%s user=%s password=%s dbname=%s" , db .Host , db .Port , db .Username , db .Password , db .DBName )
168
- g = graph . NewGraph (db .System , connStr , db .Options )
178
+ dbase = NewGraph (db .System , connStr , db .Options )
169
179
}
170
180
171
- if g != nil {
172
- return g
181
+ if dbase != nil {
182
+ return dbase
173
183
}
174
184
break
175
185
}
176
186
}
177
187
178
- return graph .NewGraph ("memory" , "" , "" )
188
+ return NewGraph ("memory" , "" , "" )
189
+ }
190
+
191
+ func NewGraph (system , path string , options string ) * assetdb.AssetDB {
192
+ var dsn string
193
+ var dbtype repository.DBType
194
+
195
+ switch system {
196
+ case "memory" :
197
+ dbtype = repository .SQLite
198
+ dsn = fmt .Sprintf ("file:sqlite%d?mode=memory&cache=shared" , rand .Int31n (100 ))
199
+ case "local" :
200
+ dbtype = repository .SQLite
201
+ dsn = path
202
+ case "postgres" :
203
+ dbtype = repository .Postgres
204
+ dsn = path
205
+ default :
206
+ return nil
207
+ }
208
+
209
+ store := db .New (dbtype , dsn )
210
+ if store == nil {
211
+ return nil
212
+ }
213
+
214
+ var name string
215
+ var fs embed.FS
216
+ var database gorm.Dialector
217
+ switch dbtype {
218
+ case repository .SQLite :
219
+ name = "sqlite3"
220
+ fs = sqlitemigrations .Migrations ()
221
+ database = sqlite .Open (dsn )
222
+ case repository .Postgres :
223
+ name = "postgres"
224
+ fs = pgmigrations .Migrations ()
225
+ database = postgres .Open (dsn )
226
+ }
227
+
228
+ sql , err := gorm .Open (database , & gorm.Config {})
229
+ if err != nil {
230
+ return nil
231
+ }
232
+
233
+ migrationsSource := migrate.EmbedFileSystemMigrationSource {
234
+ FileSystem : fs ,
235
+ Root : "/" ,
236
+ }
237
+
238
+ sqlDb , err := sql .DB ()
239
+ if err != nil {
240
+ panic (err )
241
+ }
242
+
243
+ _ , err = migrate .Exec (sqlDb , name , migrationsSource , migrate .Up )
244
+ if err != nil {
245
+ panic (err )
246
+ }
247
+ return store
179
248
}
180
249
181
250
func getWordList (reader io.Reader ) ([]string , error ) {
0 commit comments