Skip to content

Commit 3b53c44

Browse files
authored
Merge pull request abrignoni#957 from Johann-PLW/main
Update modules for lava output
2 parents 8e38a34 + 135ef16 commit 3b53c44

File tree

2 files changed

+126
-138
lines changed

2 files changed

+126
-138
lines changed

scripts/artifacts/allTrails.py

Lines changed: 64 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@
99
"category": "Health & Fitness",
1010
"notes": "",
1111
"paths": ('*/Documents/AllTrails.sqlite*'),
12-
"output_types": ["html", "tsv", "lava"]
12+
"output_types": ["html", "tsv", "lava"],
13+
"artifact_icon": "map"
1314
},
1415
"allTrailsUserInfo": {
1516
"name": "AllTrails - User Info",
@@ -21,61 +22,54 @@
2122
"category": "Health & Fitness",
2223
"notes": "",
2324
"paths": ('*/Documents/AllTrails.sqlite*'),
24-
"output_types": "all"
25+
"output_types": "all",
26+
"artifact_icon": "user"
2527
}
2628
}
2729

2830

29-
from scripts.ilapfuncs import artifact_processor, open_sqlite_db_readonly, convert_ts_human_to_timezone_offset
31+
from scripts.ilapfuncs import artifact_processor, get_sqlite_db_records, convert_cocoa_core_data_ts_to_utc
3032

3133
@artifact_processor
3234
def allTrailsTrailDetails(files_found, report_folder, seeker, wrap_text, timezone_offset):
3335
data_list = []
3436
db_file = ''
37+
db_records = []
38+
39+
query = '''
40+
SELECT
41+
ZTRAIL.ZNAME,
42+
ZTRAIL.ZROUTETYPENAME,
43+
CASE ZACTIVITYSTATS.ZDIFFICULTY
44+
WHEN 1 THEN 'Easy'
45+
WHEN 3 THEN 'Moderate'
46+
WHEN 5 THEN 'Hard'
47+
END,
48+
ZTRAIL.ZRATING,
49+
ZTRAIL.ZREVIEWCOUNT,
50+
ZTRAIL.ZLENGTH AS "Length (Meters)",
51+
ZTRAIL.ZELEVATIONGAIN AS "Elevation Gain (Meters)",
52+
ZLOCATION.ZLATITUDE,
53+
ZLOCATION.ZLONGITUDE,
54+
ZLOCATION.ZCITY,
55+
ZLOCATION.ZREGION,
56+
ZLOCATION.ZREGIONNAME,
57+
ZLOCATION.ZPOSTALCODE,
58+
ZLOCATION.ZCOUNTRY,
59+
ZLOCATION.ZCOUNTRYNAME,
60+
ZPARKAREA.ZNAME AS "Park Area Name"
61+
FROM ZLOCATION
62+
JOIN ZTRAIL ON ZLOCATION.Z_PK = ZTRAIL.ZLOCATION
63+
JOIN ZPARKAREA ON ZTRAIL.Z_PK = ZPARKAREA.ZTRAIL
64+
JOIN ZACTIVITYSTATS ON ZTRAIL.Z_PK = ZACTIVITYSTATS.ZTRAIL
65+
'''
3566

3667
for file_found in files_found:
3768
if file_found.endswith('AllTrails.sqlite'):
3869
db_file = file_found
70+
db_records = get_sqlite_db_records(db_file, query)
3971
break
4072

41-
with open_sqlite_db_readonly(db_file) as db:
42-
cursor = db.cursor()
43-
cursor.execute('''
44-
SELECT
45-
ZTRAIL.ZNAME,
46-
ZTRAIL.ZROUTETYPENAME,
47-
CASE ZACTIVITYSTATS.ZDIFFICULTY
48-
WHEN 1 THEN 'Easy'
49-
WHEN 3 THEN 'Moderate'
50-
WHEN 5 THEN 'Hard'
51-
END,
52-
ZTRAIL.ZRATING,
53-
ZTRAIL.ZREVIEWCOUNT,
54-
ZTRAIL.ZLENGTH AS "Length (Meters)",
55-
ZTRAIL.ZELEVATIONGAIN AS "Elevation Gain (Meters)",
56-
ZLOCATION.ZLATITUDE,
57-
ZLOCATION.ZLONGITUDE,
58-
ZLOCATION.ZCITY,
59-
ZLOCATION.ZREGION,
60-
ZLOCATION.ZREGIONNAME,
61-
ZLOCATION.ZPOSTALCODE,
62-
ZLOCATION.ZCOUNTRY,
63-
ZLOCATION.ZCOUNTRYNAME,
64-
ZPARKAREA.ZNAME AS "Park Area Name"
65-
FROM ZLOCATION
66-
JOIN ZTRAIL ON ZLOCATION.Z_PK = ZTRAIL.ZLOCATION
67-
JOIN ZPARKAREA ON ZTRAIL.Z_PK = ZPARKAREA.ZTRAIL
68-
JOIN ZACTIVITYSTATS ON ZTRAIL.Z_PK = ZACTIVITYSTATS.ZTRAIL
69-
''')
70-
71-
all_rows = cursor.fetchall()
72-
73-
for row in all_rows:
74-
data_list.append(
75-
(row[0], row[1], row[2], row[3], row[4], row[5], row[6], row[7], row[8],
76-
row[9], row[10], row[11], row[12], row[13], row[14], row[15],)
77-
)
78-
7973
data_headers = (
8074
'Trail Name',
8175
'Route Type',
@@ -94,51 +88,48 @@ def allTrailsTrailDetails(files_found, report_folder, seeker, wrap_text, timezon
9488
'Country Name',
9589
'Parking Area Name'
9690
)
97-
return data_headers, data_list, db_file
91+
return data_headers, db_records, db_file
9892

9993

10094
@artifact_processor
10195
def allTrailsUserInfo(files_found, report_folder, seeker, wrap_text, timezone_offset):
10296
data_list = []
10397
db_file = ''
98+
db_records = []
99+
100+
query = '''
101+
SELECT
102+
ZUSER.ZCREATIONTIME,
103+
ZUSER.ZFIRSTNAME,
104+
ZUSER.ZLASTNAME,
105+
ZUSER.ZUSERNAME,
106+
ZPROFILE.ZEMAIL,
107+
ZUSER.ZREFERRALLINK,
108+
ZLOCATION.ZLATITUDE,
109+
ZLOCATION.ZLONGITUDE,
110+
ZLOCATION.ZCITY,
111+
ZLOCATION.ZREGION,
112+
ZLOCATION.ZREGIONNAME,
113+
ZLOCATION.ZCOUNTRY,
114+
ZLOCATION.ZCOUNTRYNAME,
115+
ZLOCATION.ZPOSTALCODE
116+
FROM ZUSER
117+
INNER JOIN ZPROFILE ON ZUSER.Z_PK = ZPROFILE.ZUSER
118+
INNER JOIN ZLOCATION ON ZUSER.ZLOCATION = ZLOCATION.Z_PK
119+
'''
104120

105121
for file_found in files_found:
106122
if file_found.endswith('AllTrails.sqlite'):
107123
db_file = file_found
124+
db_records = get_sqlite_db_records(db_file, query)
108125
break
109126

110-
with open_sqlite_db_readonly(db_file) as db:
111-
cursor = db.cursor()
112-
113-
cursor.execute('''
114-
SELECT
115-
datetime(ZUSER.ZCREATIONTIME + 978307200,'unixepoch') AS "Creation Timestamp",
116-
ZUSER.ZFIRSTNAME,
117-
ZUSER.ZLASTNAME,
118-
ZUSER.ZUSERNAME,
119-
ZPROFILE.ZEMAIL,
120-
ZUSER.ZREFERRALLINK,
121-
ZLOCATION.ZLATITUDE,
122-
ZLOCATION.ZLONGITUDE,
123-
ZLOCATION.ZCITY,
124-
ZLOCATION.ZREGION,
125-
ZLOCATION.ZREGIONNAME,
126-
ZLOCATION.ZCOUNTRY,
127-
ZLOCATION.ZCOUNTRYNAME,
128-
ZLOCATION.ZPOSTALCODE
129-
FROM ZUSER
130-
INNER JOIN ZPROFILE ON ZUSER.Z_PK = ZPROFILE.ZUSER
131-
INNER JOIN ZLOCATION ON ZUSER.ZLOCATION = ZLOCATION.Z_PK
132-
''')
133-
134-
all_rows = cursor.fetchall()
135127

136-
for row in all_rows:
137-
timestamp = convert_ts_human_to_timezone_offset(row[0], timezone_offset)
138-
data_list.append(
139-
(timestamp, row[1], row[2], row[3], row[4], row[5], row[6],
140-
row[7], row[8], row[9], row[10], row[11], row[12], row[13])
141-
)
128+
for record in db_records:
129+
creation_timestamp = convert_cocoa_core_data_ts_to_utc(record[0])
130+
data_list.append(
131+
(creation_timestamp, record[1], record[2], record[3], record[4], record[5], record[6],
132+
record[7], record[8], record[9], record[10], record[11], record[12], record[13]))
142133

143134
data_headers = (
144135
('Creation Timestamp', 'datetime'),

scripts/artifacts/twint.py

Lines changed: 62 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -1,81 +1,78 @@
1-
# Created by @KefreR (Frank Ressat)
2-
3-
from scripts.ilapfuncs import logfunc, logdevinfo, timeline, kmlgen, tsv, is_platform_windows, open_sqlite_db_readonly
4-
from scripts.artifact_report import ArtifactHtmlReport
5-
61
__artifacts_v2__ = {
7-
"Twint": {
8-
"name": "Twint Transaction Artifacts",
9-
"description": "Extract all the data available related to transactions made with the instant payment app Twint prepaid",
10-
"author": "@KefreR",
2+
"twintTransactions": {
3+
"name": "Twint - Transactions",
4+
"description": "Extract data related to transactions made with the instant payment app Twint prepaid",
5+
"author": "@KefreR (Frank Ressat)",
116
"version": "0.1",
127
"date": "2023-11-21",
138
"requirements": "none",
14-
"category": "Twint Prepaid",
9+
"category": "Finance",
1510
"notes": "",
1611
"paths": ('*/var/mobile/Containers/Data/Application/*/Library/Application Support/Twint.sqlite*'),
17-
"function": "get_twint"
12+
"output_types": "standard",
13+
"artifact_icon": "dollar-sign"
1814
}
1915
}
2016

2117

22-
def get_twint(files_found, report_folder, seeker, wrap_text, time_offset):
23-
for file_found in files_found:
24-
file_found = str(file_found)
25-
26-
if file_found.endswith('Twint.sqlite'):
27-
break
18+
from scripts.ilapfuncs import artifact_processor, get_sqlite_db_records, convert_cocoa_core_data_ts_to_utc
2819

29-
db = open_sqlite_db_readonly(file_found)
30-
cursor = db.cursor()
31-
32-
cursor.execute(f'''
20+
@artifact_processor
21+
def twintTransactions(files_found, report_folder, seeker, wrap_text, time_offset):
22+
data_list = []
23+
db_file = ''
24+
db_records = []
25+
26+
query = '''
3327
SELECT
34-
ZTRANSACTION.Z_PK,
35-
datetime(ZTRANSACTION.ZCREATIONDATE+978307200,'UNIXEPOCH'),
36-
datetime(ZTRANSACTION.ZMODIFIEDTIMESTAMP+978307200,'UNIXEPOCH'),
37-
datetime(ZTRANSACTION.ZSECONDPHASETIMESTAMP+978307200,'UNIXEPOCH'),
38-
datetime(ZTRANSACTION.ZSTATUSPENDINGUNTILDATE+978307200,'UNIXEPOCH'),
39-
ZTRANSACTION.ZMERCHANTBRANCHNAME,
40-
ZTRANSACTION.ZMERCHANTNAME,
41-
ZTRANSACTION.ZP2PSENDERMOBILENR,
42-
ZTRANSACTION.ZP2PINITIATEMESSAGE,
43-
ZTRANSACTION.ZP2PRECIPIENTMOBILENR,
44-
ZTRANSACTION.ZP2PRECIPIENTNAME ,
45-
ZTRANSACTION.ZP2PREPLYMESSAGE,
46-
ZTRANSACTION.ZAUTHORIZEDAMOUNT,
47-
ZTRANSACTION.ZPAIDAMOUNT,
48-
ZTRANSACTION.ZREQUESTEDAMOUNT,
49-
ZTRANSACTION.ZDISCOUNT,
50-
ZTRANSACTION.ZCURRENCY,
51-
ZTRANSACTION.ZCONTENTREFERENCE,
52-
ZTRANSACTION.ZORDERLINK,
53-
ZTRANSACTION.ZP2PHASPICTURE,
54-
ZTRANSACTION.ZORDERSTATEVALUE,
55-
ZTRANSACTION.ZORDERTYPEVALUE,
56-
ZTRANSACTION.ZTRANSACTIONSIDEVALUE,
57-
ZTRANSACTION.ZMERCHANTCONFIRMATION FROM ZTRANSACTION''')
28+
ZTRANSACTION.ZCREATIONDATE,
29+
ZTRANSACTION.ZMODIFIEDTIMESTAMP,
30+
ZTRANSACTION.ZSECONDPHASETIMESTAMP,
31+
ZTRANSACTION.ZSTATUSPENDINGUNTILDATE,
32+
ZTRANSACTION.ZMERCHANTBRANCHNAME,
33+
ZTRANSACTION.ZMERCHANTNAME,
34+
ZTRANSACTION.ZP2PSENDERMOBILENR,
35+
ZTRANSACTION.ZP2PINITIATEMESSAGE,
36+
ZTRANSACTION.ZP2PRECIPIENTMOBILENR,
37+
ZTRANSACTION.ZP2PRECIPIENTNAME,
38+
ZTRANSACTION.ZP2PREPLYMESSAGE,
39+
ZTRANSACTION.ZAUTHORIZEDAMOUNT,
40+
ZTRANSACTION.ZPAIDAMOUNT,
41+
ZTRANSACTION.ZREQUESTEDAMOUNT,
42+
ZTRANSACTION.ZDISCOUNT,
43+
ZTRANSACTION.ZCURRENCY,
44+
ZTRANSACTION.ZCONTENTREFERENCE,
45+
ZTRANSACTION.ZORDERLINK,
46+
ZTRANSACTION.ZP2PHASPICTURE,
47+
ZTRANSACTION.ZORDERSTATEVALUE,
48+
ZTRANSACTION.ZORDERTYPEVALUE,
49+
ZTRANSACTION.ZTRANSACTIONSIDEVALUE,
50+
ZTRANSACTION.ZMERCHANTCONFIRMATION
51+
FROM ZTRANSACTION'''
5852

59-
data_list = cursor.fetchall()
60-
usagentries = len(data_list)
53+
for file_found in files_found:
54+
if file_found.endswith('Twint.sqlite'):
55+
db_file = file_found
56+
db_records = get_sqlite_db_records(db_file, query)
57+
break
6158

62-
if usagentries > 0:
63-
descritpion ="Twint - Transaction"
64-
report = ArtifactHtmlReport(f'{descritpion}')
65-
report.start_artifact_report(report_folder, f'{descritpion}')
66-
report.add_script()
67-
data_headers = (
68-
'Index', 'Creation date', 'Sender confirmation date', 'Receiver validation date', 'Transaction expiry date',
69-
'Merchant branch name','Merchant name', 'Sender mobile number', 'Sender message', 'Receiver mobile number',
70-
'Receiver contact name', 'Response message', 'Amount authorized for the transaction', 'Paid amount',
71-
'Requested amount', 'Discount', 'Currency', 'Content reference', 'Order link', 'Presence of multimedia content',
72-
'Transaction status', 'Type of transaction', 'Direction of the transaction', 'Merchant confirmation')
73-
report.write_artifact_data_table(data_headers, data_list, file_found, html_escape=False)
74-
report.end_artifact_report()
59+
for record in db_records:
60+
creation_date = convert_cocoa_core_data_ts_to_utc(record[0])
61+
modified_ts = convert_cocoa_core_data_ts_to_utc(record[1])
62+
second_phase_ts = convert_cocoa_core_data_ts_to_utc(record[2])
63+
status_pending_until_date = convert_cocoa_core_data_ts_to_utc(record[3])
64+
data_list.append(
65+
(creation_date, modified_ts, second_phase_ts, status_pending_until_date, record[4], record[5],
66+
record[6], record[7], record[8], record[9], record[10], record[11], record[12],
67+
record[13], record[14], record[15], record[16], record[17], record[18], record[19],
68+
record[20], record[21], record[22]))
7569

76-
tsvname = f'{descritpion}'
77-
tsv(report_folder, data_headers, data_list, tsvname)
78-
else:
79-
logfunc('Twint - No data available')
70+
data_headers = (
71+
('Creation date', 'datetime'), ('Sender confirmation date', 'datetime'), ('Receiver validation date', 'datetime'),
72+
('Transaction expiry date', 'datetime'), 'Merchant branch name', 'Merchant name', 'Sender mobile number',
73+
'Sender message', 'Receiver mobile number', 'Receiver contact name', 'Response message',
74+
'Amount authorized for the transaction', 'Paid amount', 'Requested amount', 'Discount', 'Currency',
75+
'Content reference', 'Order link', 'Presence of multimedia content', 'Transaction status', 'Type of transaction',
76+
'Direction of the transaction', 'Merchant confirmation')
8077

81-
db.close()
78+
return data_headers, data_list, db_file

0 commit comments

Comments
 (0)