Ejemplo n.º 1
0
 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
Ejemplo n.º 2
0
 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())
Ejemplo n.º 3
0
 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
Ejemplo n.º 4
0
 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)
Ejemplo n.º 5
0
    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)
Ejemplo n.º 6
0
 def __on_run_as_modal(self, webview):
     Logger.info("WebView::__on_run_as_modal(): TODO")
Ejemplo n.º 7
0
 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)
Ejemplo n.º 8
0
    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"])