def __on_handle_local_options(self, app, options): """ Handle local options @param app as Gio.Application @param options as GLib.VariantDict """ if options.contains("version"): Logger.info("Eolie %s", self.__version) return 0 return -1
def __on_get_plugins(self, source, result, data): """ Print plugins on command line @param source as GObject.Object @param result as Gio.AsyncResult @param data as None """ plugins = source.get_plugins_finish(result) for plugin in plugins: Logger.info("%s, %s, %s", plugin.get_name(), plugin.get_description(), plugin.get_path())
def check_modules(): """ True if deps are installed @return bool """ from importlib import util fxa = util.find_spec("fxa") crypto = util.find_spec("Crypto") if fxa is None: Logger.info("PyFxA missing: pip3 install --user pyfxa") if crypto is None: Logger.info("Cyrpto missing: pip3 install --user pycrypto") return fxa is not None and crypto is not None
def __update_state(self): """ Update state file """ try: f = open(EOLIE_DATA_PATH + "/firefox_sync.bin", "wb") # Lock file flock(f, LOCK_EX | LOCK_NB) self.__mtimes = self.__firefox_sync.client.info_collections() dump(self.__mtimes, f) # Unlock file flock(f, LOCK_UN) except Exception as e: # Not an error, just the lock exception Logger.info("SyncWorker::__update_state(): %s", e)
def update(self): """ Update database """ if not Gio.NetworkMonitor.get_default().get_network_available(): return # Update adblock_js repo git = GLib.find_program_in_path("git") if git is None: Logger.info(_("For stronger ad blocking, install git command")) else: if GLib.file_test(ADBLOCK_JS, GLib.FileTest.IS_DIR): argv = [git, "-C", ADBLOCK_JS, "pull", "https://gitlab.gnome.org/gnumdk/eolie-adblock.git"] else: argv = [git, "clone", "https://gitlab.gnome.org/gnumdk/eolie-adblock.git", ADBLOCK_JS] (pid, a1, a2, a3) = GLib.spawn_async( argv, flags=GLib.SpawnFlags.STDOUT_TO_DEV_NULL) GLib.spawn_close_pid(pid) # DB version is last successful sync mtime try: version = load(open(EOLIE_DATA_PATH + "/adblock.bin", "rb")) except: version = 0 self.__cancellable.reset() if self.__adblock_mtime - version > self.__UPDATE: # Update host rules uris = list(self.__URIS) locales = GLib.get_language_names() user_locale = locales[0].split("_")[0] try: uris += self.__CSS_URIS +\ [self.__CSS_LOCALIZED_URIS[user_locale]] except: uris += self.__CSS_URIS uri = uris.pop(0) self.__task_helper.load_uri_content(uri, self.__cancellable, self.__on_load_uri_content, uris)
def __on_run_as_modal(self, webview): Logger.info("WebView::__on_run_as_modal(): TODO")
def _on_load_changed(self, webview, event): """ Update internals @param webview as WebView @param event as WebKit2.LoadEvent """ parsed = urlparse(self.uri) if event == WebKit2.LoadEvent.STARTED: self.emit("uri-changed", self.uri) elif event == WebKit2.LoadEvent.REDIRECTED: # Block ads if App().settings.get_value("adblock") and\ webview.__related_view is not None and\ parsed.scheme in ["http", "https"] and\ not App().adblock_exceptions.find_parsed(parsed): if App().adblock.is_netloc_blocked(parsed.netloc) or\ App().adblock.is_uri_blocked(self.uri, parsed.netloc): Logger.debug("WebView::__wait_for_uri(): blocking %s", self.uri) webview.stop_loading() self._window.container.close_view(self.view) return elif event == WebKit2.LoadEvent.COMMITTED: self.emit("uri-changed", self.uri) http_scheme = parsed.scheme in ["http", "https"] self.update_zoom_level() # Setup eolie internal adblocker if App().settings.get_value("adblock") and\ http_scheme: exception = App().adblock_exceptions.find_parsed(parsed) if not exception: noext = ".".join(parsed.netloc.split(".")[:-1]) javascripts = [ "adblock_%s.js" % parsed.netloc, "adblock_%s.js" % noext ] for javascript in javascripts: f = Gio.File.new_for_path("%s/%s" % (ADBLOCK_JS, javascript)) if f.query_exists(): (status, content, tag) = f.load_contents(None) js = content.decode("utf-8") self.run_javascript(js, None, None) break elif event == WebKit2.LoadEvent.FINISHED: self.update_spell_checking(self.uri) self.run_javascript_from_gresource( "/org/gnome/Eolie/Extensions.js", None, None) if App().show_tls: try: from OpenSSL import crypto from datetime import datetime (valid, tls, errors) = webview.get_tls_info() if tls is not None: Logger.info("***************************************" "***************************************") cert_pem = tls.get_property("certificate-pem") cert = crypto.load_certificate(crypto.FILETYPE_PEM, cert_pem) subject = cert.get_subject() Logger.info("CN: %s", subject.CN) start_bytes = cert.get_notBefore() end_bytes = cert.get_notAfter() start = datetime.strptime(start_bytes.decode("utf-8"), "%Y%m%d%H%M%SZ") end = datetime.strptime(end_bytes.decode("utf-8"), "%Y%m%d%H%M%SZ") Logger.info("Valid from %s to %s", (start, end)) Logger.info("Serial number: %s", cert.get_serial_number()) Logger.info(cert_pem) Logger.info("***************************************" "***************************************") except Exception as e: Logger.info("Please install OpenSSL python support: %s", e)
def __init(self): """ Init main application """ self.settings = Settings.new() # Init extensions current_path = GLib.getenv("PYTHONPATH") new_path = self.__extension_dir if current_path: new_path = new_path + ':' + current_path GLib.setenv("PYTHONPATH", new_path, 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.firefox_sync import SyncWorker if SyncWorker.check_modules(): self.sync_worker = SyncWorker() self.sync_worker.sync_loop() 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() self.websettings = DatabaseSettings() self.adblock = DatabaseAdblock() self.adblock.create_db() self.adblock.update() self.phishing = DatabasePhishing() self.phishing.create_db() 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() # Get a default user agent for search settings = WebKit2.Settings.new() self.search = Search(settings.get_user_agent()) 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"): Logger.info("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::jsblock", ["<Control>j"]) self.set_accels_for_action("win.shortcut::show_sidebar", ["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", "Back"]) self.set_accels_for_action("win.shortcut::forward", ["<Alt>Right", "Forward"]) 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"]) self.set_accels_for_action("win.shortcut::mse_enabled", ["<Control>m"]) self.set_accels_for_action("win.shortcut::add_dot_com", ["<Control>Return"])