Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion browser/archive.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import (

"github.com/moond4rk/hackbrowserdata/browser/chromium"
"github.com/moond4rk/hackbrowserdata/filemanager"
"github.com/moond4rk/hackbrowserdata/log"
"github.com/moond4rk/hackbrowserdata/internal/log"
"github.com/moond4rk/hackbrowserdata/types"
"github.com/moond4rk/hackbrowserdata/utils/fileutil"
)
Expand Down
2 changes: 1 addition & 1 deletion browser/browser.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import (
"github.com/moond4rk/hackbrowserdata/browser/chromium"
"github.com/moond4rk/hackbrowserdata/browser/firefox"
"github.com/moond4rk/hackbrowserdata/browser/safari"
"github.com/moond4rk/hackbrowserdata/log"
"github.com/moond4rk/hackbrowserdata/internal/log"
"github.com/moond4rk/hackbrowserdata/masterkey"
"github.com/moond4rk/hackbrowserdata/types"
)
Expand Down
2 changes: 1 addition & 1 deletion browser/browser_darwin.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import (
"github.com/moond4rk/keychainbreaker"
"golang.org/x/term"

"github.com/moond4rk/hackbrowserdata/log"
"github.com/moond4rk/hackbrowserdata/internal/log"
"github.com/moond4rk/hackbrowserdata/masterkey"
"github.com/moond4rk/hackbrowserdata/types"
)
Expand Down
20 changes: 1 addition & 19 deletions browser/chromium/chromium.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,9 @@ import (
"os"
"path/filepath"
"sync"
"time"

"github.com/moond4rk/hackbrowserdata/filemanager"
"github.com/moond4rk/hackbrowserdata/log"
"github.com/moond4rk/hackbrowserdata/internal/log"
"github.com/moond4rk/hackbrowserdata/masterkey"
"github.com/moond4rk/hackbrowserdata/types"
"github.com/moond4rk/hackbrowserdata/utils/fileutil"
Expand Down Expand Up @@ -256,20 +255,3 @@ func isSkippedDir(name string) bool {
}
return false
}

// Offset from the Chromium epoch (1601-01-01 UTC) to the Unix epoch,
// matching base::Time::kTimeTToMicrosecondsOffset in Chromium.
const chromiumEpochOffsetMicros int64 = 11644473600000000

// timeEpoch converts a Chromium base::Time (μs since 1601 UTC) to UTC.
// Returns zero for non-positive input or out-of-JSON-range values.
func timeEpoch(epoch int64) time.Time {
if epoch <= 0 {
return time.Time{}
}
t := time.UnixMicro(epoch - chromiumEpochOffsetMicros).UTC()
if t.Year() < 1 || t.Year() > 9999 {
return time.Time{}
}
return t
}
45 changes: 0 additions & 45 deletions browser/chromium/chromium_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ import (
"os"
"path/filepath"
"testing"
"time"

"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
Expand Down Expand Up @@ -682,47 +681,3 @@ func TestSetRetrievers_SatisfiesInterface(t *testing.T) {
SetRetrievers(masterkey.Retrievers)
} = (*Browser)(nil)
}

// Anchor: 2024-01-15T10:30:00Z as Chromium microseconds since 1601 UTC.
const anchorUnixSeconds = int64(1705314600)

var anchorChromiumMicros = (anchorUnixSeconds + 11644473600) * 1_000_000

func TestTimeEpoch_AnchorDate(t *testing.T) {
got := timeEpoch(anchorChromiumMicros)
want := time.Date(2024, 1, 15, 10, 30, 0, 0, time.UTC)
assert.Equal(t, want, got)
assert.Equal(t, anchorUnixSeconds, got.Unix())
}

func TestTimeEpoch_ZeroReturnsZeroTime(t *testing.T) {
assert.True(t, timeEpoch(0).IsZero())
}

func TestTimeEpoch_NegativeReturnsZeroTime(t *testing.T) {
assert.True(t, timeEpoch(-1).IsZero())
}

func TestTimeEpoch_AlwaysUTC(t *testing.T) {
// assert.Same checks pointer equality: time.UTC and time.Local are
// distinct *Location globals, so this catches any regression that
// drops .UTC() even when the runner's TZ happens to be UTC.
got := timeEpoch(anchorChromiumMicros)
assert.Same(t, time.UTC, got.Location())
}

func TestTimeEpoch_MicrosecondPrecisionPreserved(t *testing.T) {
got := timeEpoch(anchorChromiumMicros + 123456)
assert.Equal(t, 123456*int64(time.Microsecond), int64(got.Nanosecond()))
}

func TestTimeEpoch_UnixEpochBoundary(t *testing.T) {
got := timeEpoch(chromiumEpochOffsetMicros)
assert.Equal(t, time.Unix(0, 0).UTC(), got)
}

func TestTimeEpoch_OutOfJSONRangeReturnsZero(t *testing.T) {
jsonBytes, err := timeEpoch(1 << 62).MarshalJSON()
require.NoError(t, err)
assert.JSONEq(t, `"0001-01-01T00:00:00Z"`, string(jsonBytes))
}
3 changes: 2 additions & 1 deletion browser/chromium/extract_bookmark.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import (

"github.com/tidwall/gjson"

"github.com/moond4rk/hackbrowserdata/internal/timeconv"
"github.com/moond4rk/hackbrowserdata/types"
)

Expand Down Expand Up @@ -38,7 +39,7 @@ func walkBookmarks(node gjson.Result, folder string, out *[]types.BookmarkEntry)
Type: nodeType,
URL: node.Get("url").String(),
Folder: folder,
CreatedAt: timeEpoch(node.Get("date_added").Int()),
CreatedAt: timeconv.Chromium(node.Get("date_added").Int()),
})
}

Expand Down
11 changes: 6 additions & 5 deletions browser/chromium/extract_cookie.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,10 @@ import (
"database/sql"
"sort"

"github.com/moond4rk/hackbrowserdata/internal/sqlitex"
"github.com/moond4rk/hackbrowserdata/internal/timeconv"
"github.com/moond4rk/hackbrowserdata/masterkey"
"github.com/moond4rk/hackbrowserdata/types"
"github.com/moond4rk/hackbrowserdata/utils/sqliteutil"
)

const (
Expand All @@ -19,7 +20,7 @@ const (
)

func extractCookies(masterKeys masterkey.MasterKeys, path string) ([]types.CookieEntry, error) {
cookies, err := sqliteutil.QueryRows(path, false, defaultCookieQuery,
cookies, err := sqlitex.QueryRows(path, false, defaultCookieQuery,
func(rows *sql.Rows) (types.CookieEntry, error) {
var (
name, host, cookiePath string
Expand Down Expand Up @@ -57,8 +58,8 @@ func extractCookies(masterKeys masterkey.MasterKeys, path string) ([]types.Cooki
IsHTTPOnly: isHTTPOnly != 0,
HasExpire: hasExpire != 0,
IsPersistent: isPersistent != 0,
ExpireAt: timeEpoch(expireAt),
CreatedAt: timeEpoch(createdAt),
ExpireAt: timeconv.Chromium(expireAt),
CreatedAt: timeconv.Chromium(createdAt),
SameSite: sameSiteStr,
}, nil
})
Expand All @@ -73,7 +74,7 @@ func extractCookies(masterKeys masterkey.MasterKeys, path string) ([]types.Cooki
}

func countCookies(path string) (int, error) {
return sqliteutil.CountRows(path, false, countCookieQuery)
return sqlitex.CountRows(path, false, countCookieQuery)
}

// stripCookieHash removes the SHA256(host_key) prefix from a decrypted cookie value. Chrome 130+
Expand Down
12 changes: 6 additions & 6 deletions browser/chromium/extract_creditcard.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,10 @@ import (
"errors"

"github.com/moond4rk/hackbrowserdata/crypto"
"github.com/moond4rk/hackbrowserdata/log"
"github.com/moond4rk/hackbrowserdata/internal/log"
"github.com/moond4rk/hackbrowserdata/internal/sqlitex"
"github.com/moond4rk/hackbrowserdata/masterkey"
"github.com/moond4rk/hackbrowserdata/types"
"github.com/moond4rk/hackbrowserdata/utils/sqliteutil"
)

const (
Expand Down Expand Up @@ -37,7 +37,7 @@ type yandexPrivateData struct {
}

func extractCreditCards(masterKeys masterkey.MasterKeys, path string) ([]types.CreditCardEntry, error) {
cards, err := sqliteutil.QueryRows(path, false, defaultCreditCardQuery,
cards, err := sqlitex.QueryRows(path, false, defaultCreditCardQuery,
func(rows *sql.Rows) (types.CreditCardEntry, error) {
var guid, name, month, year, nickname, address string
var encNumber []byte
Expand Down Expand Up @@ -72,7 +72,7 @@ func extractYandexCreditCards(masterKeys masterkey.MasterKeys, path string) ([]t
return nil, err
}

return sqliteutil.QueryRows(path, false, yandexCreditCardQuery,
return sqlitex.QueryRows(path, false, yandexCreditCardQuery,
func(rows *sql.Rows) (types.CreditCardEntry, error) {
var guid, publicData string
var privateData []byte
Expand Down Expand Up @@ -113,9 +113,9 @@ func extractYandexCreditCards(masterKeys masterkey.MasterKeys, path string) ([]t
}

func countCreditCards(path string) (int, error) {
return sqliteutil.CountRows(path, false, countCreditCardQuery)
return sqlitex.CountRows(path, false, countCreditCardQuery)
}

func countYandexCreditCards(path string) (int, error) {
return sqliteutil.CountRows(path, false, yandexCreditCardCountQuery)
return sqlitex.CountRows(path, false, yandexCreditCardCountQuery)
}
11 changes: 6 additions & 5 deletions browser/chromium/extract_download.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,9 @@ import (
"database/sql"
"sort"

"github.com/moond4rk/hackbrowserdata/internal/sqlitex"
"github.com/moond4rk/hackbrowserdata/internal/timeconv"
"github.com/moond4rk/hackbrowserdata/types"
"github.com/moond4rk/hackbrowserdata/utils/sqliteutil"
)

const (
Expand All @@ -15,7 +16,7 @@ const (
)

func extractDownloads(path string) ([]types.DownloadEntry, error) {
downloads, err := sqliteutil.QueryRows(path, false, defaultDownloadQuery,
downloads, err := sqlitex.QueryRows(path, false, defaultDownloadQuery,
func(rows *sql.Rows) (types.DownloadEntry, error) {
var targetPath, url, mimeType string
var totalBytes, startTime, endTime int64
Expand All @@ -27,8 +28,8 @@ func extractDownloads(path string) ([]types.DownloadEntry, error) {
TargetPath: targetPath,
MimeType: mimeType,
TotalBytes: totalBytes,
StartTime: timeEpoch(startTime),
EndTime: timeEpoch(endTime),
StartTime: timeconv.Chromium(startTime),
EndTime: timeconv.Chromium(endTime),
}, nil
})
if err != nil {
Expand All @@ -42,5 +43,5 @@ func extractDownloads(path string) ([]types.DownloadEntry, error) {
}

func countDownloads(path string) (int, error) {
return sqliteutil.CountRows(path, false, countDownloadQuery)
return sqlitex.CountRows(path, false, countDownloadQuery)
}
9 changes: 5 additions & 4 deletions browser/chromium/extract_history.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,9 @@ import (
"database/sql"
"sort"

"github.com/moond4rk/hackbrowserdata/internal/sqlitex"
"github.com/moond4rk/hackbrowserdata/internal/timeconv"
"github.com/moond4rk/hackbrowserdata/types"
"github.com/moond4rk/hackbrowserdata/utils/sqliteutil"
)

const (
Expand All @@ -14,7 +15,7 @@ const (
)

func extractHistories(path string) ([]types.HistoryEntry, error) {
histories, err := sqliteutil.QueryRows(path, false, defaultHistoryQuery,
histories, err := sqlitex.QueryRows(path, false, defaultHistoryQuery,
func(rows *sql.Rows) (types.HistoryEntry, error) {
var url, title string
var visitCount int
Expand All @@ -26,7 +27,7 @@ func extractHistories(path string) ([]types.HistoryEntry, error) {
URL: url,
Title: title,
VisitCount: visitCount,
LastVisit: timeEpoch(lastVisit),
LastVisit: timeconv.Chromium(lastVisit),
}, nil
})
if err != nil {
Expand All @@ -40,5 +41,5 @@ func extractHistories(path string) ([]types.HistoryEntry, error) {
}

func countHistories(path string) (int, error) {
return sqliteutil.CountRows(path, false, countHistoryQuery)
return sqlitex.CountRows(path, false, countHistoryQuery)
}
15 changes: 8 additions & 7 deletions browser/chromium/extract_password.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,11 @@ import (
"sort"

"github.com/moond4rk/hackbrowserdata/crypto"
"github.com/moond4rk/hackbrowserdata/log"
"github.com/moond4rk/hackbrowserdata/internal/log"
"github.com/moond4rk/hackbrowserdata/internal/sqlitex"
"github.com/moond4rk/hackbrowserdata/internal/timeconv"
"github.com/moond4rk/hackbrowserdata/masterkey"
"github.com/moond4rk/hackbrowserdata/types"
"github.com/moond4rk/hackbrowserdata/utils/sqliteutil"
)

const (
Expand Down Expand Up @@ -40,7 +41,7 @@ func extractPasswords(masterKeys masterkey.MasterKeys, path, store string) ([]ty
}

func extractPasswordsWithQuery(masterKeys masterkey.MasterKeys, path, store, query string) ([]types.LoginEntry, error) {
logins, err := sqliteutil.QueryRows(path, false, query,
logins, err := sqlitex.QueryRows(path, false, query,
func(rows *sql.Rows) (types.LoginEntry, error) {
var url, username string
var pwd []byte
Expand All @@ -53,7 +54,7 @@ func extractPasswordsWithQuery(masterKeys masterkey.MasterKeys, path, store, que
URL: url,
Username: username,
Password: string(password),
CreatedAt: timeEpoch(created),
CreatedAt: timeconv.Chromium(created),
Store: store,
}, nil
})
Expand All @@ -79,7 +80,7 @@ func extractYandexPasswords(masterKeys masterkey.MasterKeys, path string) ([]typ
return nil, err
}

logins, err := sqliteutil.QueryRows(path, false, yandexLoginQuery,
logins, err := sqlitex.QueryRows(path, false, yandexLoginQuery,
func(rows *sql.Rows) (types.LoginEntry, error) {
var originURL, usernameElem, usernameVal, passwordElem, signonRealm string
var passwordValue []byte
Expand All @@ -90,7 +91,7 @@ func extractYandexPasswords(masterKeys masterkey.MasterKeys, path string) ([]typ
entry := types.LoginEntry{
URL: originURL,
Username: usernameVal,
CreatedAt: timeEpoch(created),
CreatedAt: timeconv.Chromium(created),
Store: types.PasswordStoreLocal,
}
aad := yandexLoginAAD(originURL, usernameElem, usernameVal, passwordElem, signonRealm, nil)
Expand All @@ -113,5 +114,5 @@ func extractYandexPasswords(masterKeys masterkey.MasterKeys, path string) ([]typ
}

func countPasswords(path string) (int, error) {
return sqliteutil.CountRows(path, false, countLoginQuery)
return sqlitex.CountRows(path, false, countLoginQuery)
}
2 changes: 1 addition & 1 deletion browser/chromium/profile.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import (
"path/filepath"

"github.com/moond4rk/hackbrowserdata/filemanager"
"github.com/moond4rk/hackbrowserdata/log"
"github.com/moond4rk/hackbrowserdata/internal/log"
"github.com/moond4rk/hackbrowserdata/masterkey"
"github.com/moond4rk/hackbrowserdata/types"
)
Expand Down
9 changes: 5 additions & 4 deletions browser/firefox/extract_bookmark.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,9 @@ import (
"database/sql"
"sort"

"github.com/moond4rk/hackbrowserdata/internal/sqlitex"
"github.com/moond4rk/hackbrowserdata/internal/timeconv"
"github.com/moond4rk/hackbrowserdata/types"
"github.com/moond4rk/hackbrowserdata/utils/sqliteutil"
)

const (
Expand All @@ -16,7 +17,7 @@ const (
)

func extractBookmarks(path string) ([]types.BookmarkEntry, error) {
bookmarks, err := sqliteutil.QueryRows(path, true, firefoxBookmarkQuery,
bookmarks, err := sqlitex.QueryRows(path, true, firefoxBookmarkQuery,
func(rows *sql.Rows) (types.BookmarkEntry, error) {
var id, dateAdded int64
var url, title string
Expand All @@ -28,7 +29,7 @@ func extractBookmarks(path string) ([]types.BookmarkEntry, error) {
Name: title,
URL: url,
Folder: bookmarkType(bt),
CreatedAt: firefoxMicros(dateAdded),
CreatedAt: timeconv.UnixMicro(dateAdded),
}, nil
})
if err != nil {
Expand All @@ -51,5 +52,5 @@ func bookmarkType(bt int64) string {
}

func countBookmarks(path string) (int, error) {
return sqliteutil.CountRows(path, true, firefoxCountBookmarkQuery)
return sqlitex.CountRows(path, true, firefoxCountBookmarkQuery)
}
Loading
Loading