[#5012] avoid mongo BSON encoding error, by ensuring attachment filenames are unicode
diff --git a/Allura/allura/model/attachments.py b/Allura/allura/model/attachments.py
index d0869c9..fcec088 100644
--- a/Allura/allura/model/attachments.py
+++ b/Allura/allura/model/attachments.py
@@ -42,6 +42,7 @@
 
     @classmethod
     def save_attachment(cls, filename, fp, content_type=None, **kwargs):
+        filename = h.really_unicode(filename)
         thumbnail_meta = dict(type="thumbnail", app_config_id=c.app.config._id)
         thumbnail_meta.update(kwargs)
         original_meta = dict(type="attachment", app_config_id=c.app.config._id)
diff --git a/Allura/allura/tests/model/test_filesystem.py b/Allura/allura/tests/model/test_filesystem.py
index 7ab99b5..f7d4007 100644
--- a/Allura/allura/tests/model/test_filesystem.py
+++ b/Allura/allura/tests/model/test_filesystem.py
@@ -162,6 +162,14 @@
         assert_equal(attachment.length, 500)
         assert_equal(attachment.filename, 'user.png')
 
+    def test_attachment_name_encoding(self):
+        path = os.path.join(os.path.dirname(__file__), '..', 'data', 'user.png')
+        fp = open(path, 'rb')
+        c.app.config._id = None
+        attachment = M.BaseAttachment.save_attachment(b'Strukturpr\xfcfung.dvi', fp,
+                                                      save_original=True)
+        assert type(attachment) != tuple   # tuple is for (img, thumb) pairs
+        assert_equal(attachment.filename, u'Strukturpr\xfcfung.dvi')
 
     def _assert_content(self, f, content):
         result = f.rfile().read()