def __save_rules(self, rules): """ Save rules to db @param rules bytes """ SqlCursor.add(self) result = rules.decode('utf-8') count = 0 for line in result.split('\n'): SqlCursor.allow_thread_execution(self) if self.__cancellable.is_cancelled(): SqlCursor.remove(self) raise Exception("Cancelled") if line.startswith('#'): continue array = line.replace( ' ', '\t', 1).replace('\t', '@', 1).split('@') if len(array) <= 1: continue netloc = array[1].replace( ' ', '').replace('\r', '').split('#')[0] # Update entry if exists, create else if netloc != "localhost": Logger.debug("Add filter: %s", netloc) self.__add_netloc(netloc) count += 1 if count == 1000: SqlCursor.commit(self) # Do not flood sqlite, this allow webkit extension to run sleep(0.1) count = 0 SqlCursor.remove(self)
def __save_abp_rules(self, rules): """ Save rules to db @param rules as bytes """ SqlCursor.add(self) result = rules.decode("utf-8") count = 0 for line in result.split('\n'): SqlCursor.allow_thread_execution(self) if self.__cancellable.is_cancelled(): SqlCursor.remove(self) raise Exception("Cancelled") if "-abp-" in line or "$" in line or "!" in line or "[" in line: continue elif line.startswith("##"): self.__save_css_default_rule(line) elif "#@#" in line: self.__save_css_exception(line) elif "##" in line: self.__save_css_domain_rule(line) elif line.startswith("@@"): self.__save_abp_rule(line[2:], True) else: self.__save_abp_rule(line, False) Logger.debug("Add abp filter: %s", line) count += 1 if count == 1000: SqlCursor.commit(self) # Do not flood sqlite, this allow webkit extension to run sleep(0.1) count = 0 SqlCursor.remove(self)
def __save_rules(self, rules, uris): """ Save rules to db @param rules as bytes @param uris as [str] """ SqlCursor.add(self) result = rules.decode('utf-8') j = json.loads(result) with SqlCursor(self) as sql: count = 0 for item in j: if self.__cancellable.is_cancelled(): raise IOError("Cancelled") sql.execute( "INSERT INTO phishing\ (uri, mtime) VALUES (?, ?)", (item["url"].rstrip("/"), self.__mtime)) count += 1 if count == 1000: sql.commit() count = 0 sql.commit() # We are the last call to save_rules()? # Delete removed entries and commit if not uris: with SqlCursor(self) as sql: sql.execute( "DELETE FROM phishing\ WHERE mtime!=?", (self.__mtime, )) sql.commit() SqlCursor.remove(self)
def __save_css_rules(self, rules, uris): """ Save rules to db @param rules as bytes @param uris as [str] """ SqlCursor.add(self) result = rules.decode("utf-8") count = 0 for line in result.split('\n'): if self.__cancellable.is_cancelled(): raise IOError("Cancelled") if line.find("-abp-") != -1: continue elif line.startswith("##"): self.__save_css_default_rule(line) elif line.find("##") != -1: self.__save_css_domain_rule(line) count += 1 if count == 1000: with SqlCursor(self) as sql: sql.commit() count = 0 # We are the last rule # Delete old entries if not uris: with SqlCursor(self) as sql: sql.execute( "DELETE FROM adblock_css\ WHERE mtime!=?", (self.__adblock_mtime, )) sql.commit() SqlCursor.remove(self)
def import_chromium(self, chrome): """ Chromium/Chrome importer As Eolie doesn't sync with Chromium, we do not handle parent guid and just import parents as tags @param chrome as bool """ try: self.thread_lock.acquire() SqlCursor.add(self) import json homedir = GLib.get_home_dir() if chrome: path = homedir + "/.config/chrome/Default/Bookmarks" else: path = homedir + "/.config/chromium/Default/Bookmarks" f = Gio.File.new_for_path(path) if not f.query_exists(): return (status, content, tag) = f.load_contents(None) if status: data = content.decode("utf-8") j = json.loads(data) parents = [] # Setup initial parents for root in j["roots"]: parents.append(("", j["roots"][root]["children"])) # Walk parents and children while parents: (parent_name, children) = parents.pop(0) bookmarks = [] for child in children: if child["type"] == "folder": parents.append((child["name"], child["children"])) elif child["type"] == "url": bookmarks.append((child["name"], child["url"])) position = 0 for bookmark in bookmarks: tags = [parent_name] title = bookmark[0] uri = bookmark[1] if not uri.startswith('http') or not title: continue uri = uri.rstrip('/') rowid = self.get_id(uri) if rowid is None: # Add bookmark bookmark_id = self.add(title, uri, None, tags, 0, False) # Set position self.set_position(bookmark_id, position, False) position += 1 with SqlCursor(self) as sql: sql.commit() SqlCursor.remove(self) except Exception as e: print("DatabaseBookmarks::import_chromium:", e) finally: self.thread_lock.release()
def init(self): """ Init main application """ self.__is_fs = False if Gtk.get_minor_version() > 18: cssProviderFile = Gio.File.new_for_uri( 'resource:///org/gnome/Eolie/application.css') else: cssProviderFile = Gio.File.new_for_uri( 'resource:///org/gnome/Eolie/application-legacy.css') cssProvider = Gtk.CssProvider() cssProvider.load_from_file(cssProviderFile) screen = Gdk.Screen.get_default() styleContext = Gtk.StyleContext() styleContext.add_provider_for_screen(screen, cssProvider, Gtk.STYLE_PROVIDER_PRIORITY_USER) self.settings = Settings.new() self.history = DatabaseHistory() self.bookmarks = DatabaseBookmarks() # We store cursors for main thread SqlCursor.add(self.history) SqlCursor.add(self.bookmarks) self.bookmarks.import_firefox() adblock = DatabaseAdblock() adblock.update() self.art = Art() self.search = Search() self.downloads_manager = DownloadsManager() shortcut_action = Gio.SimpleAction.new('shortcut', GLib.VariantType.new('s')) shortcut_action.connect('activate', self.__on_shortcut_action) self.add_action(shortcut_action) self.set_accels_for_action("app.shortcut::uri", ["<Control>l"]) self.set_accels_for_action("app.shortcut::new_page", ["<Control>t"]) self.set_accels_for_action("app.shortcut::close_page", ["<Control>w"]) # Set some WebKit defaults context = WebKit2.WebContext.get_default() GLib.setenv('PYTHONPATH', self.__extension_dir, True) context.set_web_extensions_directory(self.__extension_dir) data_manager = WebKit2.WebsiteDataManager() context.new_with_website_data_manager(data_manager) context.set_process_model( WebKit2.ProcessModel.MULTIPLE_SECONDARY_PROCESSES) context.set_cache_model(WebKit2.CacheModel.WEB_BROWSER) d = Gio.File.new_for_path(self.__FAVICONS_PATH) if not d.query_exists(): d.make_directory_with_parents() context.set_favicon_database_directory(self.__FAVICONS_PATH) cookie_manager = context.get_cookie_manager() cookie_manager.set_accept_policy( WebKit2.CookieAcceptPolicy.NO_THIRD_PARTY) cookie_manager.set_persistent_storage( self.__COOKIES_PATH, WebKit2.CookiePersistentStorage.SQLITE)
def import_html(self, path): """ Import html bookmarks @param path as str """ try: self.thread_lock.acquire() from bs4 import BeautifulSoup SqlCursor.add(self) f = Gio.File.new_for_path(path) if not f.query_exists(): return (status, content, tag) = f.load_contents(None) if status: data = content.decode("utf-8") soup = BeautifulSoup(data, "html.parser") parent_name = "" position = 0 for dt in soup.findAll("dt"): h3 = dt.find("h3") if h3 is not None: parent_name = h3.contents[0] continue else: a = dt.find("a") uri = a.get("href") if a.get("tags") is None: tags = [parent_name] else: tags = [a.get("tags")] title = a.contents[0] if uri is None: parent_name = title continue elif not uri.startswith('http') or not title: continue uri = uri.rstrip('/') rowid = self.get_id(uri) if rowid is None: if not tags: tags = [parent_name] # Add bookmark bookmark_id = self.add(title, uri, None, tags, 0, False) # Set position self.set_position(bookmark_id, position, False) position += 1 with SqlCursor(self) as sql: sql.commit() SqlCursor.remove(self) except Exception as e: print("DatabaseBookmarks::import_html:", e) finally: self.thread_lock.release()
def __update(self): """ Update database """ self.__cancellable.reset() SqlCursor.add(self) result = "" try: for uri in self.__URIS: session = Soup.Session.new() request = session.request(uri) stream = request.send(self.__cancellable) bytes = bytearray(0) buf = stream.read_bytes(1024, self.__cancellable).get_data() while buf: bytes += buf buf = stream.read_bytes(1024, self.__cancellable).get_data() stream.close() result = bytes.decode('utf-8') count = 0 for line in result.split('\n'): if self.__cancellable.is_cancelled(): raise IOError("Cancelled") if line.startswith('#'): continue array = line.replace(' ', '\t', 1).replace('\t', '@', 1).split('@') if len(array) <= 1: continue dns = array[1].replace(' ', '').replace('\r', '').split('#')[0] # Update entry if exists, create else with SqlCursor(self) as sql: sql.execute( "INSERT INTO adblock\ (dns, mtime)\ VALUES (?, ?)", (dns, self.__mtime)) count += 1 if count == 1000: sql.commit() count = 0 # Delete removed entries with SqlCursor(self) as sql: sql.execute( "DELETE FROM adblock\ WHERE mtime!=?", (self.__mtime, )) except Exception as e: print("DatabaseAdlbock:__update():", e) with SqlCursor(self) as sql: sql.commit() SqlCursor.remove(self)
def __save_rules(self, rules, uris): """ Save rules to db @param rules as bytes @param uris as [str] """ SqlCursor.add(self) try: result = rules.decode('utf-8') j = json.loads(result) with SqlCursor(self) as sql: count = 0 for item in j: if self.__cancellable.is_cancelled(): raise IOError("Cancelled") uri = item["url"].rstrip("/") try: sql.execute( "INSERT INTO phishing\ (uri, mtime) VALUES (?, ?)", (uri, self.__phishing_mtime)) except: sql.execute( "UPDATE phishing set mtime=?\ WHERE uri=?", (self.__phishing_mtime, uri)) count += 1 if count == 1000: SqlCursor.commit(self) # Do not flood sqlite # this allow webkit extension to run sleep(0.1) count = 0 # We are the last call to save_rules()? # Delete removed entries and commit if not uris: with SqlCursor(self) as sql: sql.execute( "DELETE FROM phishing\ WHERE mtime!=?", (self.__phishing_mtime, )) try: dump(self.__phishing_mtime, open(EOLIE_DATA_PATH + "/phishing.bin", "wb")) except Exception as e: Logger.error("DatabasePhishing::__save_rules(): %s", e) except Exception as e: Logger.error("DatabasePhishing::__save_rules():%s -> %s", e, rules) SqlCursor.remove(self)
def __update(self): """ Update database """ self.__cancellable.reset() try: SqlCursor.add(self) session = Soup.Session.new() request = session.request(self.__URI) stream = request.send(self.__cancellable) bytes = bytearray(0) buf = stream.read_bytes(1024, self.__cancellable).get_data() while buf: bytes += buf buf = stream.read_bytes(1024, self.__cancellable).get_data() stream.close() data = bytes.decode('utf-8') j = json.loads(data) with SqlCursor(self) as sql: count = 0 for item in j: if self.__cancellable.is_cancelled(): raise IOError("Cancelled") sql.execute( "INSERT INTO phishing\ (uri, mtime) VALUES (?, ?)", (item["url"].rstrip("/"), self.__mtime)) count += 1 if count == 1000: sql.commit() count = 0 sql.commit() # Delete removed entries with SqlCursor(self) as sql: sql.execute( "DELETE FROM phishing\ WHERE mtime!=?", (self.__mtime, )) sql.commit() SqlCursor.remove(self) except Exception as e: print("DatabasePhishing::__update()", e)
def __save_rules(self, rules, uris): """ Save rules to db @param rules bytes @param uris as [str] """ SqlCursor.add(self) result = rules.decode('utf-8') count = 0 for line in result.split('\n'): if self.__cancellable.is_cancelled(): raise IOError("Cancelled") if line.startswith('#'): continue array = line.replace(' ', '\t', 1).replace('\t', '@', 1).split('@') if len(array) <= 1: continue dns = array[1].replace(' ', '').replace('\r', '').split('#')[0] # Update entry if exists, create else with SqlCursor(self) as sql: debug("Add filter: %s" % dns) sql.execute( "INSERT INTO adblock\ (dns, mtime) VALUES (?, ?)", (dns, self.__adblock_mtime)) count += 1 if count == 1000: sql.commit() count = 0 # We are the last call to save_rules()? # Delete removed entries and commit if not uris: with SqlCursor(self) as sql: sql.execute( "DELETE FROM adblock\ WHERE mtime!=?", (self.__adblock_mtime, )) sql.commit() SqlCursor.remove(self)
def __init(self): """ Init main application """ self.settings = Settings.new() # Init extensions GLib.setenv('PYTHONPATH', self.__extension_dir, True) # Create favicon path d = Gio.File.new_for_path(self.__FAVICONS_PATH) if not d.query_exists(): d.make_directory_with_parents() # Setup default context context = WebKit2.WebContext.get_default() Context(context) # Setup ephemeral context self.__ephemeral_context = WebKit2.WebContext.new_ephemeral() Context(self.__ephemeral_context) # Add a global DBus helper self.helper = DBusHelper() # First init sync worker try: from eolie.mozilla_sync import SyncWorker self.sync_worker = SyncWorker() # Run a first sync in 10 seconds, speed up app start GLib.timeout_add_seconds(10, self.sync_worker.sync, False) # Then run a sync every hour GLib.timeout_add_seconds(3600, self.sync_worker.sync, True) except Exception as e: print("Application::init():", e) self.sync_worker = None if self.prefers_app_menu(): menu = self.get_app_menu() self.set_app_menu(menu) cssProviderFile = Gio.File.new_for_uri( 'resource:///org/gnome/Eolie/application.css') cssProvider = Gtk.CssProvider() cssProvider.load_from_file(cssProviderFile) screen = Gdk.Screen.get_default() styleContext = Gtk.StyleContext() styleContext.add_provider_for_screen(screen, cssProvider, Gtk.STYLE_PROVIDER_PRIORITY_USER) self.history = DatabaseHistory() self.bookmarks = DatabaseBookmarks() # We store cursors for main thread SqlCursor.add(self.history) SqlCursor.add(self.bookmarks) self.websettings = DatabaseSettings() self.adblock = DatabaseAdblock() self.adblock.update() self.phishing = DatabasePhishing() self.adblock_exceptions = DatabaseExceptions("adblock") self.popup_exceptions = DatabaseExceptions("popup") self.image_exceptions = DatabaseExceptions("image") if self.settings.get_user_value("jsblock") is not None: self.js_exceptions = DatabaseExceptions("js") else: self.js_exceptions = None self.phishing.update() self.art = Art() self.search = Search() self.download_manager = DownloadManager() self.pages_menu = PagesMenu() shortcut_action = Gio.SimpleAction.new('shortcut', GLib.VariantType.new('s')) shortcut_action.connect('activate', self.__on_shortcut_action) self.add_action(shortcut_action) self.set_accels_for_action("win.shortcut::expose", ["<Alt>e"]) self.set_accels_for_action("win.exceptions::site", ["<Control>e"]) self.set_accels_for_action("win.shortcut::show_left_panel", ["F9"]) self.set_accels_for_action("win.shortcut::uri", ["<Control>l", "<Control>b"]) self.set_accels_for_action("win.shortcut::new_page", ["<Control>t"]) self.set_accels_for_action("win.shortcut::last_page", ["<Control><Shift>t"]) self.set_accels_for_action("app.shortcut::new_window", ["<Control>n"]) self.set_accels_for_action("win.shortcut::private", ["<Control><Shift>p"]) self.set_accels_for_action("win.shortcut::close_page", ["<Control>w"]) self.set_accels_for_action("win.shortcut::quit", ["<Control>q"]) self.set_accels_for_action("win.shortcut::save", ["<Control>s"]) self.set_accels_for_action("win.shortcut::filter", ["<Control>i"]) self.set_accels_for_action("win.shortcut::reload", ["<Control>r", "F5"]) self.set_accels_for_action("win.shortcut::find", ["<Control>f"]) self.set_accels_for_action("win.shortcut::print", ["<Control>p"]) self.set_accels_for_action("win.shortcut::source", ["<Control><Shift>c"]) self.set_accels_for_action("win.shortcut::history", ["<Control>h"]) self.set_accels_for_action("win.shortcut::search", ["<Control>k"]) self.set_accels_for_action("win.shortcut::fullscreen", ["F11"]) self.set_accels_for_action("app.settings", ["<Control><Shift>s"]) self.set_accels_for_action("win.shortcut::backward", ["<Alt>Left", "XF86Back"]) self.set_accels_for_action("win.shortcut::forward", ["<Alt>Right", "XF86Forward"]) self.set_accels_for_action("win.shortcut::next", ["<Control>Tab", "<Control>Page_Down"]) self.set_accels_for_action("win.shortcut::previous", ["<Control><Shift>Tab", "<Control>Page_Up"]) self.set_accels_for_action("win.shortcut::zoom_in", ["<Control>KP_Add", "<Control>plus", "<Control>equal"]) self.set_accels_for_action("win.shortcut::zoom_out", ["<Control>KP_Subtract", "<Control>minus"]) self.set_accels_for_action("win.shortcut::zoom_default", ["<Control>KP_0", "<Control>0"])
def import_firefox(self): """ Mozilla Firefox importer """ try: SqlCursor.add(self) firefox_path = GLib.get_home_dir() + "/.mozilla/firefox/" d = Gio.File.new_for_path(firefox_path) infos = d.enumerate_children( 'standard::name,standard::type', Gio.FileQueryInfoFlags.NOFOLLOW_SYMLINKS, None) sqlite_path = None for info in infos: if info.get_file_type() == Gio.FileType.DIRECTORY: f = Gio.File.new_for_path(firefox_path + info.get_name() + "/places.sqlite") if f.query_exists(): sqlite_path = f.get_path() break if sqlite_path is not None: c = sqlite3.connect(sqlite_path, 600.0) # Add bookmarks bookmarks = self.__get_firefox_bookmarks(c) for (title, uri, parent_name, bookmark_guid, parent_guid, position) in bookmarks: tags = self.__get_tags_for_firefox_bookmark( c, bookmark_guid) bookmark_guid = self.__clean_guid(bookmark_guid) parent_guid = self.__clean_guid(parent_guid) if not uri.startswith('http') or not title: continue uri = uri.rstrip('/') rowid = self.get_id(uri) if rowid is None: # If bookmark is not tagged, we use parent name if not tags: tags = [parent_name] # Bookmarks and folder bookmark_id = self.add(title, uri, bookmark_guid, tags, 0) self.set_parent(bookmark_id, parent_guid, parent_name) self.set_position(bookmark_id, position) # Add folders, we need to get them # as Firefox needs children order parents = self.__get_firefox_parents(c) for (title, parent_name, bookmark_guid, parent_guid, position) in parents: bookmark_guid = self.__clean_guid(bookmark_guid) parent_guid = self.__clean_guid(parent_guid) if not title or bookmark_guid == "root": continue uri = bookmark_guid rowid = self.get_id(uri) if rowid is None: # Bookmarks and folder bookmark_id = self.add(title, uri, bookmark_guid, [], 0) self.set_parent(bookmark_id, parent_guid, parent_name) self.set_position(bookmark_id, position) SqlCursor.remove(self) except Exception as e: Logger.error("DatabaseBookmarks::import_firefox(): %s", e)
def __pull_bookmarks(self, bulk_keys, first_sync): """ Pull from bookmarks @param bulk_keys as KeyBundle @param first_sync as bool @raise StopIteration """ debug("pull bookmarks") SqlCursor.add(El().bookmarks) records = self.__mozilla_sync.get_records("bookmarks", bulk_keys) children_array = [] for record in records: self.__check_worker() if record["modified"] < self.__mtimes["bookmarks"]: continue sleep(0.01) bookmark = record["payload"] bookmark_id = El().bookmarks.get_id_by_guid(bookmark["id"]) # Nothing to apply, continue if El().bookmarks.get_mtime(bookmark_id) >= record["modified"]: continue debug("pulling %s" % record) # Deleted bookmark if "deleted" in bookmark.keys(): El().bookmarks.remove(bookmark_id) # Keep folder only for firefox compatiblity elif "type" in bookmark.keys() and bookmark["type"] == "folder"\ and bookmark["id"] is not None\ and bookmark["title"]: if bookmark_id is None: bookmark_id = El().bookmarks.add(bookmark["title"], bookmark["id"], bookmark["id"], [], 0, False) # Will calculate position later if "children" in bookmark.keys(): children_array.append(bookmark["children"]) # We have a bookmark, add it elif "type" in bookmark.keys() and bookmark["type"] == "bookmark"\ and bookmark["id"] is not None\ and bookmark["title"]: # Add a new bookmark if bookmark_id is None: # Use parent name if no bookmarks tags if "tags" not in bookmark.keys() or\ not bookmark["tags"]: if "parentName" in bookmark.keys() and\ bookmark["parentName"]: bookmark["tags"] = [bookmark["parentName"]] else: bookmark["tags"] = [] bookmark_id = El().bookmarks.add(bookmark["title"], bookmark["bmkUri"], bookmark["id"], bookmark["tags"], 0, False) # Update bookmark else: El().bookmarks.set_title(bookmark_id, bookmark["title"], False) El().bookmarks.set_uri(bookmark_id, bookmark["bmkUri"], False) # Update tags current_tags = El().bookmarks.get_tags(bookmark_id) for tag in El().bookmarks.get_tags(bookmark_id): if "tags" in bookmark.keys() and\ tag not in bookmark["tags"]: tag_id = El().bookmarks.get_tag_id(tag) current_tags.remove(tag) El().bookmarks.del_tag_from(tag_id, bookmark_id, False) if "tags" in bookmark.keys(): for tag in bookmark["tags"]: # Tag already associated if tag in current_tags: continue tag_id = El().bookmarks.get_tag_id(tag) if tag_id is None: tag_id = El().bookmarks.add_tag(tag, False) El().bookmarks.add_tag_to(tag_id, bookmark_id, False) # Update parent name if available if bookmark_id is not None and "parentName" in bookmark.keys(): El().bookmarks.set_parent(bookmark_id, bookmark["parentid"], bookmark["parentName"], False) El().bookmarks.set_mtime(bookmark_id, record["modified"], False) # Update bookmark position for children in children_array: position = 0 for child in children: bid = El().bookmarks.get_id_by_guid(child) El().bookmarks.set_position(bid, position, False) position += 1 El().bookmarks.clean_tags() # Will commit SqlCursor.remove(El().bookmarks)
def __init(self): """ Init main application """ self.settings = Settings.new() # Init extensions GLib.setenv("PYTHONPATH", self.__extension_dir, True) # Create favicon path if not GLib.file_test(self.__FAVICONS_PATH, GLib.FileTest.IS_DIR): GLib.mkdir_with_parents(self.__FAVICONS_PATH, 0o0750) # Add a global DBus helper self.helper = DBusHelper() # First init sync worker from eolie.mozilla_sync import SyncWorker if SyncWorker.check_modules(): self.sync_worker = SyncWorker() # Run a first sync in 10 seconds, speed up app start GLib.timeout_add_seconds(10, self.sync_worker.sync, False) # Then run a sync every hour GLib.timeout_add_seconds(3600, self.sync_worker.sync, True) else: self.sync_worker = None if self.prefers_app_menu(): menu = self.get_app_menu() self.set_app_menu(menu) cssProviderFile = Gio.File.new_for_uri( 'resource:///org/gnome/Eolie/application.css') cssProvider = Gtk.CssProvider() cssProvider.load_from_file(cssProviderFile) screen = Gdk.Screen.get_default() styleContext = Gtk.StyleContext() styleContext.add_provider_for_screen(screen, cssProvider, Gtk.STYLE_PROVIDER_PRIORITY_USER) self.history = DatabaseHistory() self.bookmarks = DatabaseBookmarks() # We store cursors for main thread SqlCursor.add(self.history) SqlCursor.add(self.bookmarks) self.websettings = DatabaseSettings() self.adblock = DatabaseAdblock() self.adblock.update() self.phishing = DatabasePhishing() self.adblock_exceptions = DatabaseExceptions("adblock") # Do not remove this! self.update_default_style_sheet() self.popup_exceptions = DatabaseExceptions("popups") self.image_exceptions = DatabaseExceptions("images") if self.settings.get_user_value("jsblock") is not None: self.js_exceptions = DatabaseExceptions("js") else: self.js_exceptions = None self.phishing.update() self.art = Art() self.search = Search() self.download_manager = DownloadManager() self.pages_menu = PagesMenu() # Check MOZ_PLUGIN_PATH if self.settings.get_value('enable-plugins') and\ not GLib.getenv("MOZ_PLUGIN_PATH"): print("You need to set MOZ_PLUGIN_PATH to use plugins") # https://wiki.ubuntu.com/Unity/LauncherAPI self.__unity = None if is_unity(): try: gi.require_version('Unity', '7.0') from gi.repository import Unity self.__unity = Unity.LauncherEntry.get_for_desktop_id( "org.gnome.Eolie.desktop") except: pass # Init profiles self.set_profiles() shortcut_action = Gio.SimpleAction.new('shortcut', GLib.VariantType.new('s')) shortcut_action.connect('activate', self.__on_shortcut_action) self.add_action(shortcut_action) self.set_accels_for_action("win.shortcut::expose", ["<Alt>e"]) self.set_accels_for_action("win.exceptions::site", ["<Control>e"]) self.set_accels_for_action("win.shortcut::show_left_panel", ["F9"]) self.set_accels_for_action("win.shortcut::uri", ["<Control>l", "<Control>b"]) self.set_accels_for_action("win.shortcut::new_page", ["<Control>t"]) self.set_accels_for_action("win.shortcut::last_page", ["<Control><Shift>t"]) self.set_accels_for_action("app.shortcut::new_window", ["<Control>n"]) self.set_accels_for_action("win.shortcut::private", ["<Control><Shift>p"]) self.set_accels_for_action("win.shortcut::close_page", ["<Control>w"]) self.set_accels_for_action("win.shortcut::quit", ["<Control>q"]) self.set_accels_for_action("win.shortcut::save", ["<Control><Shift>s"]) self.set_accels_for_action("win.shortcut::filter", ["<Control>i"]) self.set_accels_for_action("win.shortcut::reload", ["<Control>r", "F5"]) self.set_accels_for_action("win.shortcut::home", ["<Control>Home"]) self.set_accels_for_action("win.shortcut::find", ["<Control>f"]) self.set_accels_for_action("win.shortcut::print", ["<Control>p"]) self.set_accels_for_action("win.shortcut::source", ["<Control><Shift>c"]) self.set_accels_for_action("win.shortcut::history", ["<Control>h"]) self.set_accels_for_action("win.shortcut::search", ["<Control>k"]) self.set_accels_for_action("win.shortcut::fullscreen", ["F11"]) self.set_accels_for_action("app.settings", ["<Control>s"]) self.set_accels_for_action("win.shortcut::backward", ["<Alt>Left", "XF86Back"]) self.set_accels_for_action("win.shortcut::forward", ["<Alt>Right", "XF86Forward"]) self.set_accels_for_action("win.shortcut::next", ["<Control>Tab", "<Control>Page_Down"]) self.set_accels_for_action("win.shortcut::previous", ["<Control><Shift>Tab", "<Control>Page_Up"]) self.set_accels_for_action("win.shortcut::next_site", ["<Control>twosuperior"]) self.set_accels_for_action("win.shortcut::previous_site", ["<Control><Shift>twosuperior"]) self.set_accels_for_action( "win.shortcut::zoom_in", ["<Control>KP_Add", "<Control>plus", "<Control>equal"]) self.set_accels_for_action("win.shortcut::zoom_out", ["<Control>KP_Subtract", "<Control>minus"]) self.set_accels_for_action("win.shortcut::zoom_default", ["<Control>KP_0", "<Control>0"])
def __init(self): """ Init main application """ # First init sync worker try: from eolie.mozilla_sync import SyncWorker self.sync_worker = SyncWorker() self.sync_worker.sync() GLib.timeout_add_seconds(3600, self.sync_worker.sync) except Exception as e: print("Application::init():", e) self.sync_worker = None if self.prefers_app_menu(): menu = self.get_app_menu() self.set_app_menu(menu) cssProviderFile = Gio.File.new_for_uri( 'resource:///org/gnome/Eolie/application.css') cssProvider = Gtk.CssProvider() cssProvider.load_from_file(cssProviderFile) screen = Gdk.Screen.get_default() styleContext = Gtk.StyleContext() styleContext.add_provider_for_screen(screen, cssProvider, Gtk.STYLE_PROVIDER_PRIORITY_USER) self.settings = Settings.new() self.history = DatabaseHistory() self.bookmarks = DatabaseBookmarks() # We store cursors for main thread SqlCursor.add(self.history) SqlCursor.add(self.bookmarks) self.adblock = DatabaseAdblock() self.adblock.update() self.phishing = DatabasePhishing() self.adblock_exceptions = DatabaseExceptions("adblock") self.popup_exceptions = DatabaseExceptions("popup") self.image_exceptions = DatabaseExceptions("image") self.phishing.update() self.art = Art() self.search = Search() self.download_manager = DownloadManager() self.pages_menu = PagesMenu(self) # Db upgrade db_version = self.settings.get_value("db-version").get_int32() upgrade = DatabaseUpgrade(db_version) db_version = upgrade.do_db_upgrade() self.settings.set_value("db-version", GLib.Variant("i", db_version)) shortcut_action = Gio.SimpleAction.new('shortcut', GLib.VariantType.new('s')) shortcut_action.connect('activate', self.__on_shortcut_action) self.add_action(shortcut_action) self.set_accels_for_action("win.exceptions::site", ["<Control>e"]) self.set_accels_for_action("win.shortcut::uri", ["<Control>l"]) self.set_accels_for_action("win.shortcut::new_page", ["<Control>t"]) self.set_accels_for_action("win.shortcut::last_page", ["<Control><Shift>t"]) self.set_accels_for_action("app.shortcut::new_window", ["<Control>n"]) self.set_accels_for_action("win.shortcut::private", ["<Control><Shift>p"]) self.set_accels_for_action("win.shortcut::close_page", ["<Control>w"]) self.set_accels_for_action("win.shortcut::quit", ["<Control>q"]) self.set_accels_for_action("win.shortcut::save", ["<Control>s"]) self.set_accels_for_action("win.shortcut::filter", ["<Control>i"]) self.set_accels_for_action("win.shortcut::reload", ["<Control>r"]) self.set_accels_for_action("win.shortcut::find", ["<Control>f"]) self.set_accels_for_action("win.shortcut::print", ["<Control>p"]) self.set_accels_for_action("win.shortcut::source", ["<Control><Shift>c"]) self.set_accels_for_action("win.shortcut::fullscreen", ["F11"]) self.set_accels_for_action("app.settings", ["<Control><Shift>s"]) self.set_accels_for_action("win.shortcut::backward", ["<Alt>Left", "XF86Back"]) self.set_accels_for_action("win.shortcut::forward", ["<Alt>Right", "XF86Forward"]) self.set_accels_for_action("win.shortcut::next", ["<Control>Tab"]) self.set_accels_for_action("win.shortcut::previous", ["<Control><Shift>Tab"]) self.set_accels_for_action("win.shortcut::zoom_in", ["<Control>KP_Add", "<Control>plus"]) self.set_accels_for_action("win.shortcut::zoom_out", ["<Control>KP_Subtract", "<Control>minus"]) self.set_accels_for_action("win.panel_mode(0)", ["<Control><Alt>0", "<Control><Alt>KP_0"]) self.set_accels_for_action("win.panel_mode(1)", ["<Control><Alt>1", "<Control><Alt>KP_1"]) self.set_accels_for_action("win.panel_mode(2)", ["<Control><Alt>2", "<Control><Alt>KP_2"]) # Set some WebKit defaults context = WebKit2.WebContext.get_default() Context(context) GLib.setenv('PYTHONPATH', self.__extension_dir, True) context.set_web_extensions_directory(self.__extension_dir) data_manager = WebKit2.WebsiteDataManager() context.new_with_website_data_manager(data_manager) context.set_process_model( WebKit2.ProcessModel.MULTIPLE_SECONDARY_PROCESSES) context.set_cache_model(WebKit2.CacheModel.WEB_BROWSER) d = Gio.File.new_for_path(self.__FAVICONS_PATH) if not d.query_exists(): d.make_directory_with_parents() context.set_favicon_database_directory(self.__FAVICONS_PATH) cookie_manager = context.get_cookie_manager() cookie_manager.set_accept_policy( self.settings.get_enum("cookie-storage")) cookie_manager.set_persistent_storage( self.__COOKIES_PATH, WebKit2.CookiePersistentStorage.SQLITE) helper = DBusHelper() helper.connect("UnsecureFormFocused", self.__on_extension_signal)
def __pull_bookmarks(self, bulk_keys, first_sync): """ Pull from bookmarks @param bulk_keys as KeyBundle @param first_sync as bool @raise StopIteration """ debug("pull bookmarks") SqlCursor.add(El().bookmarks) records = self.__mozilla_sync.get_records("bookmarks", bulk_keys) # We get all guids here and remove them while sync # At the end, we have deleted records # On fist sync, keep all if first_sync: to_delete = [] else: to_delete = El().bookmarks.get_guids() for record in records: if self.__stop: raise StopIteration("Cancelled") sleep(0.01) bookmark = record["payload"] if "type" not in bookmark.keys() or\ bookmark["type"] not in ["folder", "bookmark"]: continue bookmark_id = El().bookmarks.get_id_by_guid(bookmark["id"]) # This bookmark exists, remove from to delete if bookmark["id"] in to_delete: to_delete.remove(bookmark["id"]) # Nothing to apply, continue if El().bookmarks.get_mtime(bookmark_id) >= record["modified"]: continue debug("pulling %s" % record) if bookmark_id is None: if "bmkUri" in bookmark.keys(): # Use parent name if no bookmarks tags if "tags" not in bookmark.keys() or\ not bookmark["tags"]: if "parentName" in bookmark.keys() and\ bookmark["parentName"]: bookmark["tags"] = [bookmark["parentName"]] else: bookmark["tags"] = [] bookmark_id = El().bookmarks.add(bookmark["title"], bookmark["bmkUri"], bookmark["id"], bookmark["tags"], False) else: bookmark["tags"] = [] bookmark_id = El().bookmarks.add(bookmark["title"], bookmark["id"], bookmark["id"], bookmark["tags"], False) else: El().bookmarks.set_title(bookmark_id, bookmark["title"], False) if "bmkUri" in bookmark.keys(): El().bookmarks.set_uri(bookmark_id, bookmark["bmkUri"], False) elif "children" in bookmark.keys(): position = 0 for child in bookmark["children"]: bid = El().bookmarks.get_id_by_guid(child) El().bookmarks.set_position(bid, position, False) position += 1 # Remove previous tags current_tags = El().bookmarks.get_tags(bookmark_id) for tag in El().bookmarks.get_tags(bookmark_id): if "tags" in bookmark.keys() and\ tag not in bookmark["tags"]: tag_id = El().bookmarks.get_tag_id(tag) current_tags.remove(tag) El().bookmarks.del_tag_from(tag_id, bookmark_id, False) if "tags" in bookmark.keys(): for tag in bookmark["tags"]: # Tag already associated if tag in current_tags: continue tag_id = El().bookmarks.get_tag_id(tag) if tag_id is None: tag_id = El().bookmarks.add_tag(tag, False) El().bookmarks.add_tag_to(tag_id, bookmark_id, False) El().bookmarks.set_mtime(bookmark_id, record["modified"], False) if "parentName" in bookmark.keys(): El().bookmarks.set_parent(bookmark_id, bookmark["parentid"], bookmark["parentName"], False) for guid in to_delete: if self.__stop: raise StopIteration("Cancelled") debug("deleting: %s" % guid) bookmark_id = El().bookmarks.get_id_by_guid(guid) if bookmark_id is not None: El().bookmarks.remove(bookmark_id, False) El().bookmarks.clean_tags() # Will commit SqlCursor.remove(El().bookmarks)
def init(self): """ Init main application """ self.__is_fs = False self.__setup_app_menu() self.set_app_menu(self.__menu) cssProviderFile = Gio.File.new_for_uri( 'resource:///org/gnome/Eolie/application.css') cssProvider = Gtk.CssProvider() cssProvider.load_from_file(cssProviderFile) screen = Gdk.Screen.get_default() styleContext = Gtk.StyleContext() styleContext.add_provider_for_screen(screen, cssProvider, Gtk.STYLE_PROVIDER_PRIORITY_USER) self.settings = Settings.new() self.history = DatabaseHistory() self.bookmarks = DatabaseBookmarks() # We store cursors for main thread SqlCursor.add(self.history) SqlCursor.add(self.bookmarks) try: from eolie.mozilla_sync import SyncWorker self.sync_worker = SyncWorker() self.sync_worker.sync() GLib.timeout_add_seconds(3600, self.sync_worker.sync) except Exception as e: print("Application::init():", e) self.sync_worker = None self.adblock = DatabaseAdblock() self.adblock.update() self.art = Art() self.search = Search() self.download_manager = DownloadManager() shortcut_action = Gio.SimpleAction.new('shortcut', GLib.VariantType.new('s')) shortcut_action.connect('activate', self.__on_shortcut_action) self.add_action(shortcut_action) self.set_accels_for_action("win.shortcut::uri", ["<Control>l"]) self.set_accels_for_action("win.shortcut::new_page", ["<Control>t"]) self.set_accels_for_action("app.shortcut::new_window", ["<Control>n"]) self.set_accels_for_action("win.shortcut::private", ["<Control><Shift>p"]) self.set_accels_for_action("win.shortcut::close_page", ["<Control>w"]) self.set_accels_for_action("win.shortcut::save", ["<Control>s"]) self.set_accels_for_action("win.shortcut::filter", ["<Control>i"]) self.set_accels_for_action("win.shortcut::reload", ["<Control>r"]) self.set_accels_for_action("win.shortcut::find", ["<Control>f"]) self.set_accels_for_action("win.shortcut::print", ["<Control>p"]) self.set_accels_for_action("win.shortcut::settings", ["<Control>e"]) self.set_accels_for_action("win.shortcut::backward", ["<Alt>Left"]) self.set_accels_for_action("win.shortcut::forward", ["<Alt>Right"]) self.set_accels_for_action("win.shortcut::next", ["<Control>Tab"]) self.set_accels_for_action("win.shortcut::previous", ["<Control><Shift>Tab"]) # Set some WebKit defaults context = WebKit2.WebContext.get_default() GLib.setenv('PYTHONPATH', self.__extension_dir, True) context.set_web_extensions_directory(self.__extension_dir) data_manager = WebKit2.WebsiteDataManager() context.new_with_website_data_manager(data_manager) context.set_process_model( WebKit2.ProcessModel.MULTIPLE_SECONDARY_PROCESSES) context.set_cache_model(WebKit2.CacheModel.WEB_BROWSER) d = Gio.File.new_for_path(self.__FAVICONS_PATH) if not d.query_exists(): d.make_directory_with_parents() context.set_favicon_database_directory(self.__FAVICONS_PATH) cookie_manager = context.get_cookie_manager() cookie_manager.set_accept_policy( self.settings.get_enum("cookie-storage")) cookie_manager.set_persistent_storage( self.__COOKIES_PATH, WebKit2.CookiePersistentStorage.SQLITE) helper = DBusHelper() helper.connect(self.__on_extension_signal, None)