handle sha*sum's leading \ in checksum with certian unsual filenames
* Bugfix: Remove leading \ from checksums output by sha*sum commands, when the filename contains \ or a newline. Closes: #696384 * fsck: Still accept checksums with a leading \ as valid, now that above bug is fixed. * migrate: Remove leading \ in checksums
This commit is contained in:
parent
071adb0709
commit
e71f85645e
6 changed files with 36 additions and 6 deletions
|
@ -34,6 +34,7 @@ genBackend size = Just $ Backend
|
||||||
{ name = shaName size
|
{ name = shaName size
|
||||||
, getKey = keyValue size
|
, getKey = keyValue size
|
||||||
, fsckKey = Just $ checkKeyChecksum size
|
, fsckKey = Just $ checkKeyChecksum size
|
||||||
|
, canUpgradeKey = Just $ needsUpgrade
|
||||||
}
|
}
|
||||||
|
|
||||||
genBackendE :: SHASize -> Maybe Backend
|
genBackendE :: SHASize -> Maybe Backend
|
||||||
|
@ -61,6 +62,8 @@ shaN shasize file filesize = do
|
||||||
parse command [] = bad command
|
parse command [] = bad command
|
||||||
parse command (l:_)
|
parse command (l:_)
|
||||||
| null sha = bad command
|
| null sha = bad command
|
||||||
|
-- sha is prefixed with \ when filename contains certian chars
|
||||||
|
| "\\" `isPrefixOf` sha = drop 1 sha
|
||||||
| otherwise = sha
|
| otherwise = sha
|
||||||
where
|
where
|
||||||
sha = fst $ separate (== ' ') l
|
sha = fst $ separate (== ' ') l
|
||||||
|
@ -137,6 +140,17 @@ checkKeyChecksum size key file = do
|
||||||
check <$> shaN size file filesize
|
check <$> shaN size file filesize
|
||||||
_ -> return True
|
_ -> return True
|
||||||
where
|
where
|
||||||
|
sha = keySha key
|
||||||
check s
|
check s
|
||||||
| s == dropExtensions (keyName key) = True
|
| s == sha = True
|
||||||
|
{- A bug caused checksums to be prefixed with \ in some
|
||||||
|
- cases; still accept these as legal now that the bug has been
|
||||||
|
- fixed. -}
|
||||||
|
| '\\' : s == sha = True
|
||||||
| otherwise = False
|
| otherwise = False
|
||||||
|
|
||||||
|
keySha :: Key -> String
|
||||||
|
keySha key = dropExtensions (keyName key)
|
||||||
|
|
||||||
|
needsUpgrade :: Key -> Bool
|
||||||
|
needsUpgrade key = "\\" `isPrefixOf` keySha key
|
||||||
|
|
|
@ -24,6 +24,7 @@ backend = Backend
|
||||||
{ name = "URL"
|
{ name = "URL"
|
||||||
, getKey = const $ return Nothing
|
, getKey = const $ return Nothing
|
||||||
, fsckKey = Nothing
|
, fsckKey = Nothing
|
||||||
|
, canUpgradeKey = Nothing
|
||||||
}
|
}
|
||||||
|
|
||||||
fromUrl :: String -> Maybe Integer -> Key
|
fromUrl :: String -> Maybe Integer -> Key
|
||||||
|
|
|
@ -20,6 +20,7 @@ backend = Backend
|
||||||
{ name = "WORM"
|
{ name = "WORM"
|
||||||
, getKey = keyValue
|
, getKey = keyValue
|
||||||
, fsckKey = Nothing
|
, fsckKey = Nothing
|
||||||
|
, canUpgradeKey = Nothing
|
||||||
}
|
}
|
||||||
|
|
||||||
{- The key includes the file size, modification time, and the
|
{- The key includes the file size, modification time, and the
|
||||||
|
|
|
@ -11,6 +11,7 @@ import Common.Annex
|
||||||
import Command
|
import Command
|
||||||
import Backend
|
import Backend
|
||||||
import qualified Types.Key
|
import qualified Types.Key
|
||||||
|
import qualified Types.Backend
|
||||||
import Types.KeySource
|
import Types.KeySource
|
||||||
import Annex.Content
|
import Annex.Content
|
||||||
import qualified Command.ReKey
|
import qualified Command.ReKey
|
||||||
|
@ -26,7 +27,7 @@ start :: FilePath -> (Key, Backend) -> CommandStart
|
||||||
start file (key, oldbackend) = do
|
start file (key, oldbackend) = do
|
||||||
exists <- inAnnex key
|
exists <- inAnnex key
|
||||||
newbackend <- choosebackend =<< chooseBackend file
|
newbackend <- choosebackend =<< chooseBackend file
|
||||||
if (newbackend /= oldbackend || upgradableKey key) && exists
|
if (newbackend /= oldbackend || upgradableKey oldbackend key) && exists
|
||||||
then do
|
then do
|
||||||
showStart "migrate" file
|
showStart "migrate" file
|
||||||
next $ perform file key oldbackend newbackend
|
next $ perform file key oldbackend newbackend
|
||||||
|
@ -35,10 +36,17 @@ start file (key, oldbackend) = do
|
||||||
choosebackend Nothing = Prelude.head <$> orderedList
|
choosebackend Nothing = Prelude.head <$> orderedList
|
||||||
choosebackend (Just backend) = return backend
|
choosebackend (Just backend) = return backend
|
||||||
|
|
||||||
{- Checks if a key is upgradable to a newer representation. -}
|
{- Checks if a key is upgradable to a newer representation.
|
||||||
{- Ideally, all keys have file size metadata. Old keys may not. -}
|
-
|
||||||
upgradableKey :: Key -> Bool
|
- Reasons for migration:
|
||||||
upgradableKey key = isNothing $ Types.Key.keySize key
|
- - Ideally, all keys have file size metadata. Old keys may not.
|
||||||
|
- - Something has changed in the backend, such as a bug fix.
|
||||||
|
-}
|
||||||
|
upgradableKey :: Backend -> Key -> Bool
|
||||||
|
upgradableKey backend key = isNothing (Types.Key.keySize key) || backendupgradable
|
||||||
|
where
|
||||||
|
backendupgradable = maybe False (\a -> a key)
|
||||||
|
(Types.Backend.canUpgradeKey backend)
|
||||||
|
|
||||||
{- Store the old backend's key in the new backend
|
{- Store the old backend's key in the new backend
|
||||||
- The old backend's key is not dropped from it, because there may
|
- The old backend's key is not dropped from it, because there may
|
||||||
|
|
|
@ -16,6 +16,7 @@ data BackendA a = Backend
|
||||||
{ name :: String
|
{ name :: String
|
||||||
, getKey :: KeySource -> a (Maybe Key)
|
, getKey :: KeySource -> a (Maybe Key)
|
||||||
, fsckKey :: Maybe (Key -> FilePath -> a Bool)
|
, fsckKey :: Maybe (Key -> FilePath -> a Bool)
|
||||||
|
, canUpgradeKey :: Maybe (Key -> Bool)
|
||||||
}
|
}
|
||||||
|
|
||||||
instance Show (BackendA a) where
|
instance Show (BackendA a) where
|
||||||
|
|
5
debian/changelog
vendored
5
debian/changelog
vendored
|
@ -10,6 +10,11 @@ git-annex (3.20121212) UNRELEASED; urgency=low
|
||||||
* Bugfix: Fixed bug parsing transfer info files, where the newline after
|
* Bugfix: Fixed bug parsing transfer info files, where the newline after
|
||||||
the filename was included in it. This was generally benign, but in
|
the filename was included in it. This was generally benign, but in
|
||||||
the assistant, it caused unexpected dropping of preferred content.
|
the assistant, it caused unexpected dropping of preferred content.
|
||||||
|
* Bugfix: Remove leading \ from checksums output by sha*sum commands,
|
||||||
|
when the filename contains \ or a newline. Closes: #696384
|
||||||
|
* fsck: Still accept checksums with a leading \ as valid, now that
|
||||||
|
above bug is fixed.
|
||||||
|
* migrate: Remove leading \ in checksums.
|
||||||
|
|
||||||
-- Joey Hess <joeyh@debian.org> Thu, 13 Dec 2012 14:06:43 -0400
|
-- Joey Hess <joeyh@debian.org> Thu, 13 Dec 2012 14:06:43 -0400
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue