mirror of https://gitlab.com/bashrc2/epicyon
Add camera properties
parent
81df7cf699
commit
6929fb8c96
58
city.py
58
city.py
|
@ -21,6 +21,50 @@ PERSON_EVENING = 4
|
|||
PERSON_PARTY = 5
|
||||
|
||||
|
||||
def _getDecoyCamera(decoySeed: int) -> (str, str, int):
|
||||
"""Returns a decoy camera make and model which took the photo
|
||||
"""
|
||||
cameras = [
|
||||
["Apple", "iPhone SE"],
|
||||
["Apple", "iPhone XR"],
|
||||
["Apple", "iPhone 6"],
|
||||
["Apple", "iPhone 7"],
|
||||
["Apple", "iPhone 8"],
|
||||
["Apple", "iPhone 11"],
|
||||
["Apple", "iPhone 11 Pro"],
|
||||
["Apple", "iPhone 12"],
|
||||
["Apple", "iPhone 12 Mini"],
|
||||
["Apple", "iPhone 12 Pro Max"],
|
||||
["Samsung", "Galaxy Note 20 Ultra"],
|
||||
["Samsung", "Galaxy S20 Plus"],
|
||||
["Samsung", "Galaxy S20 FE 5G"],
|
||||
["Samsung", "Galaxy Z FOLD 2"],
|
||||
["Samsung", "Galaxy S10 Plus"],
|
||||
["Samsung", "Galaxy S10e"],
|
||||
["Samsung", "Galaxy Z Flip"],
|
||||
["Samsung", "Galaxy A51"],
|
||||
["Samsung", "Galaxy S10"],
|
||||
["Samsung", "Galaxy S10 Plus"],
|
||||
["Samsung", "Galaxy S10e"],
|
||||
["Samsung", "Galaxy S10 5G"],
|
||||
["Samsung", "Galaxy A60"],
|
||||
["Samsung", "Note 10"],
|
||||
["Samsung", "Note 10 Plus"],
|
||||
["Samsung", "Galaxy S21 Ultra"],
|
||||
["Samsung", "Galaxy Note 20 Ultra"],
|
||||
["Samsung", "Galaxy S21"],
|
||||
["Samsung", "Galaxy S21 Plus"],
|
||||
["Samsung", "Galaxy S20 FE"],
|
||||
["Samsung", "Galaxy Z Fold 2"],
|
||||
["Samsung", "Galaxy A52 5G"],
|
||||
["Samsung", "Galaxy A71 5G"]
|
||||
]
|
||||
randgen = random.Random(decoySeed)
|
||||
index = randgen.randint(0, len(cameras) - 1)
|
||||
serialNumber = randgen.randint(100000000000, 999999999999999999999999)
|
||||
return cameras[index][0], cameras[index][1], serialNumber
|
||||
|
||||
|
||||
def _getCityPulse(currTimeOfDay, decoySeed: int) -> (float, float):
|
||||
"""This simulates expected average patterns of movement in a city.
|
||||
Jane or Joe average lives and works in the city, commuting in
|
||||
|
@ -76,10 +120,12 @@ def _getCityPulse(currTimeOfDay, decoySeed: int) -> (float, float):
|
|||
|
||||
def spoofGeolocation(baseDir: str,
|
||||
city: str, currTime, decoySeed: int,
|
||||
citiesList: []) -> (float, float, str, str):
|
||||
citiesList: []) -> (float, float, str, str,
|
||||
str, str, int):
|
||||
"""Given a city and the current time spoofs the location
|
||||
for an image
|
||||
returns latitude, longitude, N/S, E/W
|
||||
returns latitude, longitude, N/S, E/W,
|
||||
camera make, camera model, camera serial number
|
||||
"""
|
||||
locationsFilename = baseDir + '/custom_locations.txt'
|
||||
if not os.path.isfile(locationsFilename):
|
||||
|
@ -122,6 +168,8 @@ def spoofGeolocation(baseDir: str,
|
|||
approxTimeZone = -approxTimeZone
|
||||
currTimeAdjusted = currTime - \
|
||||
datetime.timedelta(hours=approxTimeZone)
|
||||
camMake, camModel, camSerialNumber = \
|
||||
_getDecoyCamera(decoySeed)
|
||||
# patterns of activity change in the city over time
|
||||
(distanceFromCityCenter, angleRadians) = \
|
||||
_getCityPulse(currTimeAdjusted, decoySeed)
|
||||
|
@ -142,7 +190,9 @@ def spoofGeolocation(baseDir: str,
|
|||
# number of decimal places
|
||||
latitude = int(latitude * 100000) / 100000.0
|
||||
longitude = int(longitude * 100000) / 100000.0
|
||||
return latitude, longitude, latdirection, longdirection
|
||||
return (latitude, longitude, latdirection, longdirection,
|
||||
camMake, camModel, camSerialNumber)
|
||||
|
||||
return (default_latitude, default_longitude,
|
||||
default_latdirection, default_longdirection)
|
||||
default_latdirection, default_longdirection,
|
||||
"", "", 0)
|
||||
|
|
6
media.py
6
media.py
|
@ -84,10 +84,14 @@ def _spoofMetaData(baseDir: str, nickname: str, domain: str,
|
|||
datetime.datetime.utcnow() - \
|
||||
datetime.timedelta(minutes=randint(2, 120))
|
||||
published = currTimeAdjusted.strftime("%Y:%m:%d %H:%M:%S+00:00")
|
||||
(latitude, longitude, latitudeRef, longitudeRef) = \
|
||||
(latitude, longitude, latitudeRef, longitudeRef,
|
||||
camMake, camModel, camSerialNumber) = \
|
||||
spoofGeolocation(baseDir, spoofCity, currTimeAdjusted,
|
||||
decoySeed, None)
|
||||
os.system('exiftool -artist="' + nickname + '" ' +
|
||||
'-Make="' + camMake + '" ' +
|
||||
'-Model="' + camModel + '" ' +
|
||||
'-Comment="' + str(camSerialNumber) + '" ' +
|
||||
'-DateTimeOriginal="' + published + '" ' +
|
||||
'-FileModifyDate="' + published + '" ' +
|
||||
'-CreateDate="' + published + '" ' +
|
||||
|
|
6
tests.py
6
tests.py
|
@ -3688,6 +3688,9 @@ def testSpoofGeolocation() -> None:
|
|||
assert coords[1] <= 118.408 + cityRadius
|
||||
assert coords[2] == 'N'
|
||||
assert coords[3] == 'W'
|
||||
assert len(coords[4]) > 4
|
||||
assert len(coords[5]) > 4
|
||||
assert coords[6] > 0
|
||||
coords = spoofGeolocation('', 'unknown', currTime,
|
||||
decoySeed, citiesList)
|
||||
assert coords[0] >= 51.8744 - cityRadius
|
||||
|
@ -3696,6 +3699,9 @@ def testSpoofGeolocation() -> None:
|
|||
assert coords[1] <= 0.368333 + cityRadius
|
||||
assert coords[2] == 'N'
|
||||
assert coords[3] == 'W'
|
||||
assert len(coords[4]) == 0
|
||||
assert len(coords[5]) == 0
|
||||
assert coords[6] == 0
|
||||
kmlStr = '<?xml version="1.0" encoding="UTF-8"?>\n'
|
||||
kmlStr += '<kml xmlns="http://www.opengis.net/kml/2.2">\n'
|
||||
kmlStr += '<Document>\n'
|
||||
|
|
Loading…
Reference in New Issue