aboutsummaryrefslogtreecommitdiff
path: root/Utility/Base64.hs
diff options
context:
space:
mode:
authorGravatar Joey Hess <joeyh@joeyh.name>2015-08-11 18:40:59 -0400
committerGravatar Joey Hess <joeyh@joeyh.name>2015-08-11 18:40:59 -0400
commit88aeb849f620a13da47508045daae461a223c997 (patch)
treea93b1d67d5fe887c7e958d9cffbea3d7014e496a /Utility/Base64.hs
parent96705a943615528f79a121e6e94101d5852ba44f (diff)
Fix setting/setting/viewing metadata that contains unicode or other special characters, when in a non-unicode locale.
Oh boy, not again. So, another place that the filesystem encoding needs to be applied. Yay. In passing, I changed decodeBS so if a NUL is embedded in the input, the resulting FilePath doesn't get truncated at that NUL. This was needed to make prop_b64_roundtrips pass, and on reviewing the callers of decodeBS, I didn't see any where this wouldn't make sense. When a FilePath is used to operate on the filesystem, it'll get truncated at a NUL anyway, whereas if a String is being used for something else, it might conceivably have a NUL in it, and we wouldn't want it to get truncated when going through decodeBS. (NB: There may be a speed impact from this change.)
Diffstat (limited to 'Utility/Base64.hs')
-rw-r--r--Utility/Base64.hs9
1 files changed, 7 insertions, 2 deletions
diff --git a/Utility/Base64.hs b/Utility/Base64.hs
index 6ab3c984f..0e3087276 100644
--- a/Utility/Base64.hs
+++ b/Utility/Base64.hs
@@ -1,5 +1,8 @@
{- Simple Base64 encoding of Strings
-
+ - Note that this uses the FileSystemEncoding, so it can be used on Strings
+ - that repesent filepaths containing arbitrarily encoded characters.
+ -
- Copyright 2011, 2015 Joey Hess <id@joeyh.name>
-
- License: BSD-2-clause
@@ -9,13 +12,15 @@ module Utility.Base64 (toB64, fromB64Maybe, fromB64, prop_b64_roundtrips) where
import qualified "sandi" Codec.Binary.Base64 as B64
import Data.Maybe
+import qualified Data.ByteString.Lazy as L
import Data.ByteString.UTF8 (fromString, toString)
+import Utility.FileSystemEncoding
toB64 :: String -> String
-toB64 = toString . B64.encode . fromString
+toB64 = toString . B64.encode . L.toStrict . encodeBS
fromB64Maybe :: String -> Maybe String
-fromB64Maybe s = either (const Nothing) (Just . toString)
+fromB64Maybe s = either (const Nothing) (Just . decodeBS . L.fromStrict)
(B64.decode $ fromString s)
fromB64 :: String -> String