@ -34,6 +34,7 @@ class bc(object):
"""
"""
self . browser = " " # "F" Firefox / "C" Chrome
self . browser = " " # "F" Firefox / "C" Chrome
self . browser_path = " "
self . browser_path = " "
self . browser_history_path = " "
self . browser_version = " "
self . browser_version = " "
self . url = " "
self . url = " "
self . old_url = " "
self . old_url = " "
@ -80,38 +81,48 @@ class bc(object):
Check browsers used by system
Check browsers used by system
"""
"""
if sys . platform == ' darwin ' :
if sys . platform == ' darwin ' :
f_osx = os . path . join ( os . path . expanduser ( ' ~ ' ) , ' Library/Application Support/Firefox/Profiles ' )
# paths to the browsing history db's
c_osx = os . path . join ( os . path . expanduser ( ' ~ ' ) , ' Library/Application Support/Google/Chrome/Default/History ' )
f_his_osx = os . path . join ( os . path . expanduser ( ' ~ ' ) , ' Library/Application Support/Firefox/Profiles ' )
chromium_osx = os . path . join ( os . path . expanduser ( ' ~ ' ) , ' Library/Application Support/Chromium/Default/History ' )
c_his_osx = os . path . join ( os . path . expanduser ( ' ~ ' ) , ' Library/Application Support/Google/Chrome/Default/History ' )
s_osx = os . path . join ( os . path . expanduser ( ' ~ ' ) , ' Library/Safari/History.plist ' )
chromium_his_osx = os . path . join ( os . path . expanduser ( ' ~ ' ) , ' Library/Application Support/Chromium/Default/History ' )
s_his_osx = os . path . join ( os . path . expanduser ( ' ~ ' ) , ' Library/Safari/History.plist ' )
# path to the browser executables
f_osx = ' /Applications/Firefox.app/Contents/MacOS/firefox '
c_osx = ' /Applications/Google Chrome.app/Contents/MacOS/Google Chrome '
chromium_osx = ' /Applications/Chromium.app/Contents/MacOS/Chromium '
s_osx = ' /Applications/Safari.app/Contents/MacOS/Safari '
try :
try :
if os . path . exists ( f_osx ) :
if os . path . exists ( f_his_ osx ) :
if len ( os . listdir ( f_osx ) ) > 2 :
if len ( os . listdir ( f_his_ osx ) ) > 2 :
print ' You have multiple profiles, choosing the last one used '
print ' You have multiple profiles, choosing the last one used '
#filtering the directory that was last modified
#filtering the directory that was last modified
all_subdirs = [ os . path . join ( f_osx , d ) for d in os . listdir ( f_osx ) ]
all_subdirs = [ os . path . join ( f_his_ osx , d ) for d in os . listdir ( f_his _osx ) ]
try :
try :
all_subdirs . remove ( os . path . join ( f_osx , ' .DS_Store ' ) ) #throwing out .DS_store
all_subdirs . remove ( os . path . join ( f_his_ osx , ' .DS_Store ' ) ) #throwing out .DS_store
except :
except :
pass
pass
latest_subdir = max ( all_subdirs , key = os . path . getmtime )
latest_subdir = max ( all_subdirs , key = os . path . getmtime )
osx_profile = os . path . join ( f_osx , latest_subdir )
osx_profile = os . path . join ( f_his_ osx , latest_subdir )
self . browser_path = os . path . join ( osx_profile , ' places.sqlite ' )
self . browser_history_ path = os . path . join ( osx_profile , ' places.sqlite ' )
else :
else :
for folder in os . listdir ( f_osx ) :
for folder in os . listdir ( f_his_ osx ) :
if folder . endswith ( ' .default ' ) :
if folder . endswith ( ' .default ' ) :
osx_default = os . path . join ( f_osx , folder )
osx_default = os . path . join ( f_his_ osx , folder )
self . browser_path = os . path . join ( osx_default , ' places.sqlite ' )
self . browser_history_ path = os . path . join ( osx_default , ' places.sqlite ' )
#print "Setting:", self.browser_path, "as history file"
#print "Setting:", self.browser_history_ path, "as history file"
self . browser = " F "
self . browser = " F "
elif os . path . exists ( c_osx ) :
self . browser_path = f_osx
elif os . path . exists ( c_his_osx ) :
self . browser = " C "
self . browser = " C "
self . browser_history_path = c_his_osx
self . browser_path = c_osx
self . browser_path = c_osx
elif os . path . exists ( chromium_osx ) :
elif os . path . exists ( chromium_his_ osx ) :
self . browser = " CHROMIUM "
self . browser = " CHROMIUM "
self . browser_history_path = chromium_his_osx
self . browser_path = chromium_osx
self . browser_path = chromium_osx
elif os . path . exists ( s_osx ) :
elif os . path . exists ( s_his_ osx ) :
self . browser = " S "
self . browser = " S "
self . browser_history_path = s_his_osx
self . browser_path = s_osx
self . browser_path = s_osx
except :
except :
print " Warning: None of the currently supported browsers (Firefox, Chrome, Chromium, Safari) are installed. "
print " Warning: None of the currently supported browsers (Firefox, Chrome, Chromium, Safari) are installed. "
@ -125,14 +136,14 @@ class bc(object):
for folder in os . listdir ( f_lin ) :
for folder in os . listdir ( f_lin ) :
if folder . endswith ( ' .default ' ) :
if folder . endswith ( ' .default ' ) :
lin_default = os . path . join ( f_lin , folder )
lin_default = os . path . join ( f_lin , folder )
self . browser_path = os . path . join ( lin_default , ' places.sqlite ' )
self . browser_history_ path = os . path . join ( lin_default , ' places.sqlite ' )
self . browser = " F "
self . browser = " F "
elif os . path . exists ( c_lin ) :
elif os . path . exists ( c_lin ) :
self . browser = " C "
self . browser = " C "
self . browser_path = c_lin
self . browser_history_ path = c_lin
elif os . path . exists ( chromium_lin ) :
elif os . path . exists ( chromium_lin ) :
self . browser = " CHROMIUM "
self . browser = " CHROMIUM "
self . browser_path = chromium_lin
self . browser_history_ path = chromium_lin
print " Browser Options: \n " + ' = ' * 45 + " \n "
print " Browser Options: \n " + ' = ' * 45 + " \n "
if self . browser == " F " :
if self . browser == " F " :
@ -146,16 +157,16 @@ class bc(object):
if self . options . debug == True :
if self . options . debug == True :
if self . browser == " F " and sys . platform == ' darwin ' :
if self . browser == " F " and sys . platform == ' darwin ' :
self . browser_version = subprocess . check_output ( [ ' /Applications/Firefox.app/Contents/MacOS/firefox ' , ' --version ' ] ) . strip ( ' \n ' )
self . browser_version = subprocess . check_output ( [ self . browser_path , ' --version ' ] ) . strip ( ' \n ' )
elif self . browser == " F " and sys . platform . startswith ( ' linux ' ) :
elif self . browser == " F " and sys . platform . startswith ( ' linux ' ) :
self . browser_version = subprocess . check_output ( [ ' firefox ' , ' --version ' ] ) . strip ( ' \n ' )
self . browser_version = subprocess . check_output ( [ ' firefox ' , ' --version ' ] ) . strip ( ' \n ' )
elif self . browser == " C " and sys . platform == ' darwin ' : :
elif self . browser == " C " and sys . platform == ' darwin ' :
self . browser_version = subprocess . check_output ( [ ' /Applications/Google Chrome.app/Contents/MacOS/Google Chrome ' , ' --version ' ] ) . strip ( ' \n ' )
self . browser_version = subprocess . check_output ( [ self . browser_path , ' --version ' ] ) . strip ( ' \n ' )
elif self . browser == " CHROMIUM " and sys . platform == ' darwin ' : :
elif self . browser == " CHROMIUM " and sys . platform == ' darwin ' :
self . browser_version = subprocess . check_output ( [ ' /Applications/Chromium.app/Contents/MacOS/Chromium ' , ' --version ' ] ) . strip ( ' \n ' )
self . browser_version = subprocess . check_output ( [ self . browser_path , ' --version ' ] ) . strip ( ' \n ' )
print " Version: " , self . browser_version , " \n "
print " Version: " , self . browser_version , " \n "
print " History: " , self . browser_path , " \n "
print " History: " , self . browser_history_ path , " \n "
#move the subprocesses to debug mode
#move the subprocesses to debug mode
@ -164,7 +175,7 @@ class bc(object):
Set urls to visit
Set urls to visit
"""
"""
if self . browser == " F " : #Firefox history database
if self . browser == " F " : #Firefox history database
conn = sqlite3 . connect ( self . browser_path )
conn = sqlite3 . connect ( self . browser_history_ path )
c = conn . cursor ( )
c = conn . cursor ( )
c . execute ( ' select url, last_visit_date from moz_places ORDER BY last_visit_date DESC ' )
c . execute ( ' select url, last_visit_date from moz_places ORDER BY last_visit_date DESC ' )
url = c . fetchone ( )
url = c . fetchone ( )
@ -173,13 +184,13 @@ class bc(object):
#Hack that makes a copy of the locked database to access it while Chrome is running.
#Hack that makes a copy of the locked database to access it while Chrome is running.
#Removes the copied database afterwards
#Removes the copied database afterwards
import filecmp
import filecmp
a = self . browser_path + ' Copy '
a = self . browser_history_ path + ' Copy '
if os . path . exists ( a ) :
if os . path . exists ( a ) :
if filecmp . cmp ( self . browser_path , a ) == False :
if filecmp . cmp ( self . browser_history_ path , a ) == False :
os . system ( ' rm " ' + a + ' " ' )
os . system ( ' rm " ' + a + ' " ' )
os . system ( ' cp " ' + self . browser_path + ' " " ' + a + ' " ' )
os . system ( ' cp " ' + self . browser_history_ path + ' " " ' + a + ' " ' )
else :
else :
os . system ( ' cp " ' + self . browser_path + ' " " ' + a + ' " ' )
os . system ( ' cp " ' + self . browser_history_ path + ' " " ' + a + ' " ' )
conn = sqlite3 . connect ( a )
conn = sqlite3 . connect ( a )
c = conn . cursor ( )
c = conn . cursor ( )
@ -193,7 +204,7 @@ class bc(object):
except :
except :
print " \n Error importing: biplist lib. \n \n To run BC with Safari you need the biplist Python Library: \n \n $ pip install biplist \n "
print " \n Error importing: biplist lib. \n \n To run BC with Safari you need the biplist Python Library: \n \n $ pip install biplist \n "
plist = readPlist ( self . browser_path )
plist = readPlist ( self . browser_history_ path )
url = [ plist [ ' WebHistoryDates ' ] [ 0 ] [ ' ' ] , ' ' ]
url = [ plist [ ' WebHistoryDates ' ] [ 0 ] [ ' ' ] , ' ' ]
else : # Browser not allowed
else : # Browser not allowed
@ -272,6 +283,8 @@ class bc(object):
"""
"""
Get Geolocation database ( http : / / dev . maxmind . com / geoip / legacy / geolite / )
Get Geolocation database ( http : / / dev . maxmind . com / geoip / legacy / geolite / )
"""
"""
maxmind = ' http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz '
geo_db_mirror1 = ' http://xsser.sf.net/map/GeoLiteCity.dat.gz '
print " = " * 45 + " \n " , " GeoIP Options: \n " + ' = ' * 45 + " \n "
print " = " * 45 + " \n " , " GeoIP Options: \n " + ' = ' * 45 + " \n "
# Download, extract and set geoipdatabase
# Download, extract and set geoipdatabase
if not os . path . exists ( ' GeoLiteCity.dat ' ) :
if not os . path . exists ( ' GeoLiteCity.dat ' ) :
@ -279,11 +292,15 @@ class bc(object):
geo_db_path = ' / '
geo_db_path = ' / '
try :
try :
print " Downloading GeoIP database... \n "
print " Downloading GeoIP database... \n "
urllib . urlretrieve ( ' http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz ' ,
if self . options . debug == True :
print " Fetching from: " , maxmind
urllib . urlretrieve ( maxmind ,
' GeoLiteCity.gz ' )
' GeoLiteCity.gz ' )
except :
except :
try :
try :
urllib . urlretrieve ( ' http://xsser.sf.net/map/GeoLiteCity.dat.gz ' ,
if self . options . debug == True :
print " Fetching from: " , geo_db_mirror1
urllib . urlretrieve ( geo_db_mirror1 ,
' GeoLiteCity.gz ' )
' GeoLiteCity.gz ' )
except :
except :
print ( " [Error] - Something wrong fetching GeoIP maps from the Internet. Aborting... " ) , " \n "
print ( " [Error] - Something wrong fetching GeoIP maps from the Internet. Aborting... " ) , " \n "