[packages/caja-dropbox] fixing download

glen glen at pld-linux.org
Sun Apr 6 14:30:41 CEST 2014


commit 55fa2408cf6dc8a78807147accb753063cd96a4f
Author: Elan Ruusamäe <glen at delfi.ee>
Date:   Sun Apr 6 12:29:45 2014 +0000

    fixing download

 caja-dropbox.spec |   4 +-
 dl-fixes.patch    | 415 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 418 insertions(+), 1 deletion(-)
---
diff --git a/caja-dropbox.spec b/caja-dropbox.spec
index 30ed062..a4bddf4 100644
--- a/caja-dropbox.spec
+++ b/caja-dropbox.spec
@@ -2,7 +2,7 @@ Summary:	Dropbox extension for Caja
 Summary(pl.UTF-8):	Rozszerzenie Dropbox dla Caja
 Name:		caja-dropbox
 Version:	1.7.90
-Release:	2.1
+Release:	2.3
 License:	GPL v2 with exceptions
 Group:		X11/Applications
 Source0:	http://pub.mate-desktop.org/releases/1.7/%{name}-%{version}.tar.xz
@@ -10,6 +10,7 @@ Source0:	http://pub.mate-desktop.org/releases/1.7/%{name}-%{version}.tar.xz
 Patch0:		dropboxd-path.patch
 Patch1:		desktop.patch
 Patch2:		caja-versions.patch
+Patch3:		https://github.com/glensc/caja-dropbox/compare/dl-fixes.patch
 URL:		http://getdropbox.com/
 BuildRequires:	caja-devel >= 1.1.0
 BuildRequires:	glib2-devel >= 1:2.14.0
@@ -45,6 +46,7 @@ pomiędzy określonymi maszynami.
 %patch0 -p1
 %patch1 -p1
 %patch2 -p1
+%patch3 -p1
 
 %build
 %configure \
diff --git a/dl-fixes.patch b/dl-fixes.patch
new file mode 100644
index 0000000..57f4e70
--- /dev/null
+++ b/dl-fixes.patch
@@ -0,0 +1,415 @@
+From bc155a50edc5fa3023e2fceebf432403e903ce02 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Elan=20Ruusam=C3=A4e?= <glen at delfi.ee>
+Date: Sun, 6 Apr 2014 13:47:59 +0300
+Subject: [PATCH] merge download changes from nautilus-dropbox-1.6.1/dropbox.in
+
+http://linux.dropbox.com/packages/nautilus-dropbox-1.6.1.tar.bz2
+---
+ caja-dropbox.in | 229 +++++++++++++++++++++++++++++++-------------------------
+ 1 file changed, 128 insertions(+), 101 deletions(-)
+
+diff --git a/caja-dropbox.in b/caja-dropbox.in
+index abf7e82..8b063a4 100755
+--- a/caja-dropbox.in
++++ b/caja-dropbox.in
+@@ -1,6 +1,6 @@
+ #!/usr/bin/python
+ #
+-# Copyright 2008 Evenflow, Inc.
++# Copyright (c) Dropbox, Inc.
+ #
+ # dropbox
+ # Dropbox frontend script
+@@ -22,7 +22,6 @@
+ from __future__ import with_statement
+ 
+ import errno
+-import fcntl
+ import locale
+ import optparse
+ import os
+@@ -35,8 +34,10 @@ import sys
+ import tarfile
+ import tempfile
+ import threading
++import thread
+ import time
+-import urllib
++import traceback
++import urllib2
+ 
+ try:
+     import gpgme
+@@ -47,9 +48,14 @@ from contextlib import closing, contextmanager
+ from posixpath import curdir, sep, pardir, join, abspath, commonprefix
+ 
+ INFO = u"Dropbox is the easiest way to share and store your files online. Want to learn more? Head to"
+-LINK = u"http://www.dropbox.com/"
++LINK = u"https://www.dropbox.com/"
+ WARNING = u"In order to use Dropbox, you must download the proprietary daemon."
+ GPG_WARNING = u"Note: python-gpgme is not installed, we will not be able to verify binary signatures."
++ERROR_CONNECTING = u"Trouble connecting to Dropbox servers. Maybe your internet connection is down, or you need to set your http_proxy environment variable."
++ERROR_SIGNATURE = u"Downloaded binary does not match Dropbox signature, aborting install."
++
++DOWNLOAD_LOCATION_FMT = "https://www.dropbox.com/download?plat=%s"
++SIGNATURE_LOCATION_FMT = "https://www.dropbox.com/download?plat=%s&signature=1"
+ 
+ DOWNLOADING = u"Downloading Dropbox... %d%%"
+ UNPACKING = u"Unpacking Dropbox... %d%%"
+@@ -60,7 +66,7 @@ DESKTOP_FILE = u"@DESKTOP_FILE_DIR@/dropbox.desktop"
+ 
+ enc = locale.getpreferredencoding()
+ 
+-# Available from http://linux.dropbox.com/fedora/rpm-public-key.asc
++# Available from https://linux.dropbox.com/fedora/rpm-public-key.asc
+ DROPBOX_PUBLIC_KEY = """
+ -----BEGIN PGP PUBLIC KEY BLOCK-----
+ Version: SKS 1.1.0
+@@ -196,76 +202,58 @@ def gpgme_context(keys):
+         del os.environ['GNUPGHOME']
+         shutil.rmtree(_gpghome, ignore_errors=True)
+ 
++class SignatureVerifyError(Exception):
++    pass
++
+ def verify_signature(key_file, sig_file, plain_file):
+     with gpgme_context([key_file]) as ctx:
+         sigs = ctx.verify(sig_file, plain_file, None)
+         return sigs[0].status == None
+ 
+-def download_file_chunk(socket, buf, size):
++def download_file_chunk(url, buf):
++    opener = urllib2.build_opener()
++    opener.addheaders = [('User-Agent', "DropboxLinuxDownloader/@PACKAGE_VERSION@")]
++    sock = opener.open(url)
++
++    size = int(sock.info()['content-length'])
++    bufsize = max(size / 200, 4096)
+     progress = 0
+-    with closing(socket) as f:
++
++    with closing(sock) as f:
++        yield (0, True)
+         while True:
+             try:
+-                chunk = os.read(f.fileno(), 4096)
++                chunk = f.read(bufsize)
+                 progress += len(chunk)
+                 buf.write(chunk)
+-                yield (progress, True)
++                yield (float(progress)/size, True)
+                 if progress == size:
+                     break
+             except OSError, e:
+                 if hasattr(e, 'errno') and e.errno == errno.EAGAIN:
+                     # nothing left to read
+-                    yield (progress, False)
++                    yield (float(progress)/size, False)
+                 else:
+                     raise
+ 
+-def download_uri_to_buffer(uri):
+-    try:
+-        socket = urllib.urlopen(uri)
+-    except IOError:
+-        FatalVisibleError("Trouble connecting to Dropbox servers. Maybe your internet connection is down, or you need to set your http_proxy environment variable.")
+-
+-    fcntl.fcntl(socket, fcntl.F_SETFL, os.O_NONBLOCK)
+-    size = int(socket.info()['content-length'])
+-
+-    buf = StringIO.StringIO()
+-    download_chunk = download_file_chunk(socket, buf, size)
+-
+-    for _ in download_chunk:
+-        pass
+-
+-    buf.seek(0)
+-    return buf
+-
+-# This sets a custom User-Agent
+-class DropboxURLopener(urllib.FancyURLopener):
+-    version = "DropboxLinuxDownloader/@PACKAGE_VERSION@"
+-urllib._urlopener = DropboxURLopener()
+-
+ class DownloadState(object):
+     def __init__(self):
+-        try:
+-            self.socket = urllib.urlopen("http://www.dropbox.com/download?plat=%s" % plat())
+-        except IOError:
+-            FatalVisibleError("Trouble connecting to Dropbox servers. Maybe your internet connection is down, or you need to set your http_proxy environment variable")
+-
+-        fcntl.fcntl(self.socket, fcntl.F_SETFL, os.O_NONBLOCK)
+-        self.size = int(self.socket.info()['content-length'])
+-
+         self.local_file = StringIO.StringIO()
+-        self.download_chunk = download_file_chunk(self.socket, self.local_file, self.size)
+ 
+     def copy_data(self):
+-        return self.download_chunk
++        return download_file_chunk(DOWNLOAD_LOCATION_FMT % plat(), self.local_file)
+ 
+     def unpack(self):
+         # download signature
+-        signature = download_uri_to_buffer("http://www.dropbox.com/download?plat=%s&signature=1" % plat())
+-
++        signature = StringIO.StringIO()
++        for _ in download_file_chunk(SIGNATURE_LOCATION_FMT % plat(), signature):
++            pass
++        signature.seek(0)
+         self.local_file.seek(0)
++
+         if gpgme:
+             if not verify_signature(StringIO.StringIO(DROPBOX_PUBLIC_KEY), signature, self.local_file):
+-                FatalVisibleError("Downloaded binary does not match Dropbox signature, aborting install.")
++                raise SignatureVerifyError()
+ 
+         self.local_file.seek(0)
+         archive = tarfile.open(fileobj=self.local_file, mode='r:gz')
+@@ -296,6 +284,8 @@ if GUI_AVAILABLE:
+         import pango
+         import webbrowser
+ 
++        gtk.gdk.threads_init()
++
+         load_serialized_images()
+ 
+         global FatalVisibleError
+@@ -310,9 +300,40 @@ if GUI_AVAILABLE:
+             gtk.main_quit()
+             sys.exit(-1)
+ 
+-        def gtk_flush_events():
+-            while gtk.events_pending():
+-                gtk.main_iteration()
++        class GeneratorTask(object):
++            def __init__(self, generator, loop_callback, on_done=None, on_exception=None):
++                self.generator = generator
++                self.loop_callback = loop_callback
++                self.on_done = on_done
++                self.on_exception = on_exception
++
++            def _run(self, *args, **kwargs):
++                self._stopped = False
++                try:
++                    for ret in self.generator(*args, **kwargs):
++                        if ret is None:
++                            ret = ()
++                        if not isinstance(ret, tuple):
++                            ret = (ret,)
++                        gobject.idle_add(self.loop_callback, *ret)
++
++                        if self._stopped:
++                            thread.exit()
++                except Exception, ex:
++                    print ex
++                    if self.on_exception is not None:
++                        gobject.idle_add(self.on_exception, ex)
++                else:
++                    if self.on_done is not None:
++                        gobject.idle_add(self.on_done)
++
++            def start(self, *args, **kwargs):
++                t = threading.Thread(target=self._run, args=args, kwargs=kwargs)
++                t.setDaemon(True)
++                t.start()
++
++            def stop(self):
++                self._stopped = True
+ 
+         class DownloadDialog(gtk.Dialog):
+             def handle_delete_event(self, wid, ev, data=None):
+@@ -322,8 +343,8 @@ if GUI_AVAILABLE:
+                 reroll_autostart(not button.get_active())
+ 
+             def handle_cancel(self, button):
+-                if self.watch:
+-                    gobject.source_remove(self.watch)
++                if self.task:
++                    self.task.stop()
+                 if self.download:
+                     self.download.cancel()
+                 gtk.main_quit()
+@@ -333,51 +354,51 @@ if GUI_AVAILABLE:
+                 # begin download
+                 self.ok.hide()
+                 self.download = DownloadState()
+-                self.one_chunk = self.download.copy_data()
+-                self.watch = gobject.io_add_watch(self.download.socket,
+-                                                  gobject.IO_IN |
+-                                                  gobject.IO_PRI |
+-                                                  gobject.IO_ERR |
+-                                                  gobject.IO_HUP,
+-                                                  self.handle_data_waiting)
++
+                 self.label.hide()
+-                self.dont_show_again_align.hide()
++                if self.dont_show_again_align is not None:
++                    self.dont_show_again_align.hide()
+                 self.progress.show()
+ 
+-            def update_progress(self, text, fraction):
+-                self.progress.set_text(text % int(fraction*100))
+-                self.progress.set_fraction(fraction)
+-                gtk_flush_events()
++                def download_progress(progress, status):
++                    if not status:
++                        self.task.stop()
++                    self.update_progress(DOWNLOADING, progress)
+ 
+-            def handle_data_waiting(self, fd, condition):
+-                if condition == gobject.IO_HUP:
+-                    FatalVisibleError("Connection to server unexpectedly closed.")
+-                elif condition == gobject.IO_ERR:
+-                    FatalVisibleError("Unexpected error occurred with download.")
+-                try:
+-                    while True:
+-                        progress, status = self.one_chunk.next()
+-                        if not status:
+-                            break
+-                        self.update_progress(DOWNLOADING, float(progress)/self.download.size)
+-                except StopIteration:
++                def finished():
+                     self.update_progress(DOWNLOADING, 1.0)
+                     self.unpack_dropbox()
+-                    return False
+-                else:
+-                    self.update_progress(DOWNLOADING, float(progress)/self.download.size)
+-                    return True
++
++                def error(ex):
++                    FatalVisibleError(ERROR_CONNECTING)
++
++                self.update_progress(DOWNLOADING, 0)
++                self.task = GeneratorTask(self.download.copy_data,
++                                          download_progress,
++                                          finished, error).start()
++
++            def update_progress(self, text, fraction):
++                self.progress.set_text(text % int(fraction*100))
++                self.progress.set_fraction(fraction)
+ 
+             def unpack_dropbox(self):
+-                one_member = self.download.unpack()
+-                try:
+-                    while True:
+-                        name, i, total = one_member.next()
+-                        self.update_progress(UNPACKING, float(i)/total)
+-                except StopIteration:
++                def unpack_progress(name, i, total):
++                    self.update_progress(UNPACKING, float(i)/total)
++
++                def finished():
+                     self.update_progress(UNPACKING, 1.0)
+                     gtk.main_quit()
+ 
++                def error(ex):
++                    if isinstance(ex, SignatureVerifyError):
++                        FatalVisibleError(ERROR_SIGNATURE)
++                    else:
++                        FatalVisibleError(ERROR_CONNECTING)
++
++                self.task = GeneratorTask(self.download.unpack,
++                                          unpack_progress,
++                                          finished, error).start()
++
+             def mouse_down(self, widget, event):
+                 if self.hovering:
+                     self.clicked_link = True
+@@ -406,7 +427,6 @@ if GUI_AVAILABLE:
+                                                      title = "Dropbox Installation")
+ 
+                 self.download = None
+-                self.watch = None
+                 self.hovering = False
+                 self.clicked_link = False
+                 self.user_cancelled = False
+@@ -458,6 +478,8 @@ if GUI_AVAILABLE:
+ 
+                 self.vbox.add(self.hbox)
+ 
++                self.dont_show_again_align = None
++
+                 try:
+                     if can_reroll_autostart():
+                         dont_show_again = gtk.CheckButton("_Don't show this again")
+@@ -477,7 +499,6 @@ if GUI_AVAILABLE:
+ 
+                     self.set_resizable(False)
+                 except:
+-                    import traceback
+                     traceback.print_exc()
+ 
+                 self.ok.grab_focus()
+@@ -526,24 +547,27 @@ else:
+             return
+ 
+         download = DownloadState()
+-        one_chunk = download.copy_data()
+ 
+         try:
+-            while True:
+-                progress = one_chunk.next()[0]
+-                setprogress(DOWNLOADING, float(progress)/download.size)
+-        except StopIteration:
++            for progress, status in download.copy_data():
++                if not status:
++                    break
++                setprogress(DOWNLOADING, progress)
++        except Exception:
++            FatalVisibleError(ERROR_CONNECTING)
++        else:
+             setprogress(DOWNLOADING, 1.0)
+             console_print()
+             write(save)
+ 
+-        one_member = download.unpack()
+-
+         try:
+-            while True:
+-                name, i, total = one_member.next()
++            for name, i, total in download.unpack():
+                 setprogress(UNPACKING, float(i)/total)
+-        except StopIteration:
++        except SignatureVerifyError:
++            FatalVisibleError(ERROR_SIGNATURE)
++        except Exception:
++            FatalVisibleError(ERROR_CONNECTING)
++        else:
+             setprogress(UNPACKING, 1.0)
+ 
+         console_print()
+@@ -788,9 +812,8 @@ def columnize(list, display_list=None, display_width=None):
+         original_texts = texts[:]
+         for col in range(len(texts)):
+             texts[col] = texts[col].ljust(colwidths[col])
+-        line = u"%s" % "  ".join(texts)
+-        for i, text in enumerate(original_texts):
+-            line = line.replace(text, display_texts[i])
++            texts[col] = texts[col].replace(original_texts[col], display_texts[col])
++        line = u"  ".join(texts)
+         lines.append(line)
+     for line in lines:
+         console_print(line)
+@@ -932,6 +955,10 @@ options:
+             else:
+                 if len(args) == 0:
+                     args = [name for name in sorted(os.listdir(u"."), key=methodcaller('lower')) if type(name) == unicode]
++                if len(args) == 0:
++                    # Bail early if there's nothing to list to avoid crashing on indent below
++                    console_print(u"<empty>")
++                    return
+                 indent = max(len(st)+1 for st in args)
+                 for file in args:
+ 
+@@ -1228,7 +1255,7 @@ options:
+         try:
+             download()
+         except:
+-            pass
++            traceback.print_exc()
+         else:
+             if GUI_AVAILABLE:
+                 start_dropbox()
+-- 
+1.9.1
+
================================================================

---- gitweb:

http://git.pld-linux.org/gitweb.cgi/packages/caja-dropbox.git/commitdiff/632ba7f9b3f74d7b6e0f223c82d95acbff5d26d9



More information about the pld-cvs-commit mailing list