- if manifest_text_changed? or portable_data_hash_changed?
- computed_hash = "#{Digest::MD5.hexdigest(manifest_text)}+#{manifest_text.length}"
- unless computed_hash == portable_data_hash
- logger.debug "(computed) '#{computed_hash}' != '#{portable_data_hash}' (provided)"
- errors.add(:portable_data_hash, "does not match hash of manifest_text")
- return false
+ return true unless manifest_text_changed? or portable_data_hash_changed?
+ # No need verify it if :set_portable_data_hash just computed it!
+ return true if not @need_pdh_validation
+ expect_pdh = compute_pdh
+ if expect_pdh != portable_data_hash
+ errors.add(:portable_data_hash,
+ "does not match computed hash #{expect_pdh}")
+ return false
+ end
+ end
+
+ def check_encoding
+ if manifest_text.encoding.name == 'UTF-8' and manifest_text.valid_encoding?
+ true
+ else
+ begin
+ # If Ruby thinks the encoding is something else, like 7-bit
+ # ASCII, but its stored bytes are equal to the (valid) UTF-8
+ # encoding of the same string, we declare it to be a UTF-8
+ # string.
+ utf8 = manifest_text
+ utf8.force_encoding Encoding::UTF_8
+ if utf8.valid_encoding? and utf8 == manifest_text.encode(Encoding::UTF_8)
+ manifest_text = utf8
+ return true
+ end
+ rescue