Esempio n. 1
0
 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)
Esempio n. 2
0
 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)
Esempio n. 3
0
 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)
Esempio n. 4
0
 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)
Esempio n. 5
0
 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()
Esempio n. 6
0
    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)
Esempio n. 7
0
 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()
Esempio n. 8
0
 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)
Esempio n. 9
0
 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)
Esempio n. 10
0
 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)
Esempio n. 11
0
 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)
Esempio n. 12
0
    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"])
Esempio n. 13
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)
Esempio n. 14
0
 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)
Esempio n. 15
0
    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"])
Esempio n. 16
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)
Esempio n. 17
0
 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)
Esempio n. 18
0
    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)