v6: digests sha512 option implemented
authorRalph Amissah <ralph@amissah.com>
Tue, 13 May 2014 01:22:19 +0000 (21:22 -0400)
committerRalph Amissah <ralph@amissah.com>
Tue, 13 May 2014 01:22:19 +0000 (21:22 -0400)
* options sha512 sha256 md5
* command line --sha512
* rcconf.yml ['defsault']['digest'] = sha512
* (Closes: #744402)

19 files changed:
README
data/doc/sisu/CHANGELOG_v5
data/doc/sisu/CHANGELOG_v6
data/doc/sisu/markup-samples/manual/en/sisu_commands.sst
lib/sisu/v5/constants.rb
lib/sisu/v6/ao_doc_objects.rb
lib/sisu/v6/ao_hash_digest.rb
lib/sisu/v6/constants.rb
lib/sisu/v6/db_columns.rb
lib/sisu/v6/digests.rb
lib/sisu/v6/manifest.rb
lib/sisu/v6/options.rb
lib/sisu/v6/param.rb
lib/sisu/v6/qrcode.rb
lib/sisu/v6/shared_markup_alt.rb
lib/sisu/v6/sysenv.rb
lib/sisu/v6/urls.rb
man/man1/sisu.1
sisu.org

diff --git a/README b/README
index 2fbe3bf8a078ab2c4da29cda505b55c59f30f001..303784c8d25ff9e3a88a0488237818036b3ad5df 100644 (file)
--- a/README
+++ b/README
@@ -628,6 +628,12 @@ copies sisu output files to remote host using scp. This requires that
 sisurc.yml has been provided with information on hostname and username, and
 that you have your "keys" and ssh agent in place. Also see --rsync. Alias -r
 
+*--sha256*
+set hash digest where used to sha256
+
+*--sha512*
+set hash digest where used to sha512
+
 *--sqlite --[instruction] [filename]*
 database type set to /SQLite/, this produces one of two possible databases,
 without additional database related instructions it produces a discreet
index 417715853288e2a39bfcb98a4a97b3ff7f3a242c..7c079186e7fdce460e8752b8aa9a9f89a8eb1d5b 100644 (file)
@@ -49,6 +49,9 @@ http://www.jus.uio.no/sisu/pkg/src/sisu_5.3.5.orig.tar.xz
 * metadata, pdf, remove link to manifest page where --no-manifest is used
   (Closes: #744378)
 
+* constants, db table sizes synced with v6, not needed by v5 but keeps tables
+  compatible
+
 * digests, cleaning
 
 * added sisu.org emacs:evil:org mode notes related to sisu development
index 8eea049cbcee5baa7929a9a90f8e867907fc2da0..4c2bf375cb185caefd1448b054ace82d4bcf3302 100644 (file)
@@ -39,6 +39,12 @@ http://www.jus.uio.no/sisu/pkg/src/sisu_6.0.5.orig.tar.xz
 * metadata, pdf, remove link to manifest page where --no-manifest is used
   (Closes: #744378)
 
+* digests, digests sha512 option implemented
+  * options sha512 sha256 md5
+  * command line --sha512
+  * rcconf.yml ['defsault']['digest'] = sha512
+  (Closes: #744402)
+
 * added sisu.org emacs:evil:org mode notes related to sisu development
 
 %% 6.0.4.orig.tar.xz (2014-02-14:06/5)
index c1a0788a5023dc21e62a1a411d2a1b8bacebf9ac..19ce3db5619bb599ed15ff12d0c6a056149127a6 100644 (file)
@@ -321,6 +321,12 @@ generate examples of (naive) cgi search form for SQLite or PgSQL depends on your
 !_ --scp [filename/wildcard] \\
 copies sisu output files to remote host using scp. This requires that sisurc.yml has been provided with information on hostname and username, and that you have your "keys" and ssh agent in place. Also see --rsync. Alias -r
 
+!_ --sha256 \\
+set hash digest where used to sha256
+
+!_ --sha512 \\
+set hash digest where used to sha512
+
 !_ --sqlite --[instruction] [filename] \\
 database type set to SQLite, this produces one of two possible databases, without additional database related instructions it produces a discreet SQLite file for the document processed; with additional instructions it produces a common SQLite database of all processed documents that (come from the same document preparation directory and as a result) share the same output directory base path (possible instructions include: --createdb; --create; --dropall; --import [filename]; --update [filename]; --remove [filename]); see database section below. Alias -d
 
index d47d9a7ea90849b953e743fcba956a3c90a11c46..748051b626bf872b74ac6b0c347499db550531fb 100644 (file)
@@ -260,8 +260,8 @@ else
   }
 end
 Db={
-  name_prefix:               "SiSU#{SiSU_is[:version_dir]}a_",
-  name_prefix_db:            "sisu_#{SiSU_is[:version_dir]}a_",
+  name_prefix:               "SiSU#{SiSU_is[:version_dir]}b_",
+  name_prefix_db:            "sisu_#{SiSU_is[:version_dir]}b_",
   col_title:                  800,
   col_title_part:             400,
   col_title_edition:           10,
@@ -276,7 +276,7 @@ Db={
   col_library:                 30,
   col_small:                   16,
   col_filename:               256,
-  col_digest:                  64,
+  col_digest:                 128,
   col_filesize:                10,
   col_info_note:             2500,
 }
index 15e949c4fdd80bb7d4e80399364bd6191409d937..8dbdedc30508d115a3f2630a67ac74d84187a8ad 100644 (file)
@@ -94,7 +94,7 @@ module SiSU_AO_DocumentStructure
       tag=    h[:tag]     || ((defined? o.tag)       ? o.tag     : nil)        #String, metadata type/tag
       obj=    h[:obj]     || ((defined? o.obj)       ? o.obj     : nil)        #String, text content
       tmp=    h[:tmp]     || ((defined? o.tmp)       ? o.tmp     : nil)        #available for processing, empty after use
-      digest= h[:digest]  || ((defined? o.digest)    ? o.digest  : nil)        #hash digests, either sha256 or md5
+      digest= h[:digest]  || ((defined? o.digest)    ? o.digest  : nil)        #hash digests, sha512, sha256 or md5
       @of,@is,@tag,@obj,@digest,@tmp=of,is,tag,obj,digest,tmp
       self
     end
@@ -164,7 +164,7 @@ module SiSU_AO_DocumentStructure
       else  h[:autonum_]
       end
       note_=  h[:note_]   || ((defined? o.note_)     ? o.note_   : false)      #Bool, endnotes/footnotes? (processing optimization)
-      digest= h[:digest]  || ((defined? o.digest)    ? o.digest  : nil)        #hash digests, either sha256 or md5
+      digest= h[:digest]  || ((defined? o.digest)    ? o.digest  : nil)        #hash digests, sha512, sha256 or md5
       tmp=    h[:tmp]     || ((defined? o.tmp)       ? o.tmp     : nil)        #available for processing, empty after use
       @of,@is,@lv,@ln,@lc,@name,@tags,@obj,@idx,@ocn,@odv,@osp,@node,@parent,@toc_,@ocn_,@note_,@autonum_,@digest,@tmp=of,is,lv,ln,lc,name,tags,obj,idx,ocn,odv,osp,node,parent,toc_,ocn_,note_,autonum_,digest,tmp
       self
@@ -201,7 +201,7 @@ module SiSU_AO_DocumentStructure
       ocn_=if h[:ocn_].nil? then ((defined? o.ocn_)  ? o.ocn_    : true)       #Bool? no ocn, non-substantive content, do not include in toc #consider
       else  h[:ocn_]
       end
-      digest= h[:digest]  || ((defined? o.digest)    ? o.digest  : nil)        #hash digests, either sha256 or md5
+      digest= h[:digest]  || ((defined? o.digest)    ? o.digest  : nil)        #hash digests, sha512, sha256 or md5
       tmp=    h[:tmp]     || ((defined? o.tmp)       ? o.tmp     : nil)        #available for processing, empty after use
       @of,@is,@name,@tags,@obj,@indent,@hang,@bullet_,@idx,@ocn,@odv,@osp,@parent,@image_,@note_,@ocn_,@digest,@tmp=of,is,name,tags,obj,indent,hang,bullet_,idx,ocn,odv,osp,parent,image_,note_,ocn_,digest,tmp
       self
@@ -225,7 +225,7 @@ module SiSU_AO_DocumentStructure
       ocn_=if h[:ocn_].nil? then ((defined? o.ocn_)  ? o.ocn_    : true)       #Bool? no ocn, non-substantive content, do not include in toc #consider
       else  h[:ocn_]
       end
-      digest= h[:digest]  || ((defined? o.digest)    ? o.digest  : nil)        #hash digests, either sha256 or md5
+      digest= h[:digest]  || ((defined? o.digest)    ? o.digest  : nil)        #hash digests, sha512, sha256 or md5
       tmp=    h[:tmp]     || ((defined? o.tmp)       ? o.tmp     : nil)        #available for processing, empty after use
       @of,@is,@name,@tags,@obj,@indent,@hang,@bullet_,@idx,@ocn,@odv,@osp,@parent,@image_,@note_,@ocn_,@digest,@tmp=of,is,name,tags,obj,indent,hang,bullet_,idx,ocn,odv,osp,parent,image_,note_,ocn_,digest,tmp
       self
@@ -254,7 +254,7 @@ module SiSU_AO_DocumentStructure
       else     h[:ocn_]
       end
       num=     h[:num]     || ((defined? o.num)      ? o.num     : nil)
-      digest=  h[:digest]  || ((defined? o.digest)   ? o.digest  : nil)        #hash digests, either sha256 or md5
+      digest=  h[:digest]  || ((defined? o.digest)   ? o.digest  : nil)        #hash digests, sha512, sha256 or md5
       tmp=     h[:tmp]     || ((defined? o.tmp)      ? o.tmp     : nil)        #available for processing, empty after use
       @of,@is,@tags,@obj,@idx,@ocn,@odv,@osp,@parent,@number_,@note_,@ocn_,@num,@digest,@tmp=of,is,tags,obj,idx,ocn,odv,osp,parent,number_,note_,ocn_,num,digest,tmp
       self
@@ -274,7 +274,7 @@ module SiSU_AO_DocumentStructure
       else     h[:ocn_]
       end
       num=     h[:num]     || ((defined? o.num)      ? o.num     : nil)
-      digest=  h[:digest]  || ((defined? o.digest)   ? o.digest  : nil)        #hash digests, either sha256 or md5
+      digest=  h[:digest]  || ((defined? o.digest)   ? o.digest  : nil)        #hash digests, sha512, sha256 or md5
       tmp=     h[:tmp]     || ((defined? o.tmp)      ? o.tmp     : nil)        #available for processing, empty after use
       @of,@is,@tags,@obj,@idx,@ocn,@odv,@osp,@parent,@note_,@ocn_,@num,@digest,@tmp=of,is,tags,obj,idx,ocn,odv,osp,parent,note_,ocn_,num,digest,tmp
       self
@@ -294,7 +294,7 @@ module SiSU_AO_DocumentStructure
       else     h[:ocn_]
       end
       num=     h[:num]     || ((defined? o.num)      ? o.num     : nil)
-      digest=  h[:digest]  || ((defined? o.digest)   ? o.digest  : nil)        #hash digests, either sha256 or md5
+      digest=  h[:digest]  || ((defined? o.digest)   ? o.digest  : nil)        #hash digests, sha512, sha256 or md5
       tmp=     h[:tmp]     || ((defined? o.tmp)      ? o.tmp     : nil)        #available for processing, empty after use
       @of,@is,@tags,@obj,@idx,@ocn,@odv,@osp,@parent,@note_,@ocn_,@num,@digest,@tmp=of,is,tags,obj,idx,ocn,odv,osp,parent,note_,ocn_,num,digest,tmp
       self
@@ -314,7 +314,7 @@ module SiSU_AO_DocumentStructure
       else     h[:ocn_]
       end
       num=     h[:num]     || ((defined? o.num)      ? o.num     : nil)
-      digest=  h[:digest]  || ((defined? o.digest)   ? o.digest  : nil)        #hash digests, either sha256 or md5
+      digest=  h[:digest]  || ((defined? o.digest)   ? o.digest  : nil)        #hash digests, sha512, sha256 or md5
       tmp=     h[:tmp]     || ((defined? o.tmp)      ? o.tmp     : nil)        #available for processing, empty after use
       @of,@is,@tags,@obj,@idx,@ocn,@odv,@osp,@parent,@note_,@ocn_,@num,@digest,@tmp=of,is,tags,obj,idx,ocn,odv,osp,parent,note_,ocn_,num,digest,tmp
       self
@@ -333,7 +333,7 @@ module SiSU_AO_DocumentStructure
       else     h[:ocn_]
       end
       num=     h[:num]     || ((defined? o.num)      ? o.num     : nil)
-      digest=  h[:digest]  || ((defined? o.digest)   ? o.digest  : nil)        #hash digests, either sha256 or md5
+      digest=  h[:digest]  || ((defined? o.digest)   ? o.digest  : nil)        #hash digests, sha512, sha256 or md5
       tmp=     h[:tmp]     || ((defined? o.tmp)      ? o.tmp     : nil)        #available for processing, empty after use
       @of,@is,@tags,@obj,@idx,@ocn,@odv,@osp,@parent,@note_,@ocn_,@num,@digest,@tmp=of,is,tags,obj,idx,ocn,odv,osp,parent,note_,ocn_,num,digest,tmp
       @h=nil
@@ -365,7 +365,7 @@ module SiSU_AO_DocumentStructure
       else  h[:ocn_]
       end
       num=     h[:num]     || ((defined? o.num)      ? o.num     : nil)
-      digest= h[:digest]  || ((defined? o.digest)    ? o.digest  : nil)        #hash digests, either sha256 or md5
+      digest= h[:digest]  || ((defined? o.digest)    ? o.digest  : nil)        #hash digests, sha512, sha256 or md5
       tmp=    h[:tmp]     || ((defined? o.tmp)       ? o.tmp     : nil)        #available for processing, empty after use
       @of,@is,@tags,@cols,@widths,@obj,@idx,@ocn,@odv,@osp,@parent,@head_,@note_,@ocn_,@num,@digest,@tmp=of,is,tags,cols,widths,obj,idx,ocn,odv,osp,parent,head_,note_,ocn_,num,digest,tmp
       self
@@ -393,7 +393,7 @@ module SiSU_AO_DocumentStructure
       ocn_=if h[:ocn_].nil? then ((defined? o.ocn_)  ? o.ocn_    : true)       #Bool? no ocn, non-substantive content, do not include in toc #consider
       else  h[:ocn_]
       end
-      digest= h[:digest]  || ((defined? o.digest)    ? o.digest  : nil)        #hash digests, either sha256 or md5
+      digest= h[:digest]  || ((defined? o.digest)    ? o.digest  : nil)        #hash digests, sha512, sha256 or md5
       tmp=    h[:tmp]     || ((defined? o.tmp)       ? o.tmp     : nil)        #available for processing, empty after use
       @of,@is,@tags,@obj,@size,@idx,@ocn,@odv,@osp,@parent,@note_,@ocn_,@digest,@tmp=of,is,tags,obj,size,idx,ocn,odv,osp,parent,note_,ocn_,digest,tmp
       self
index ce45b9e4449a90920cf97bfa1afe182e3565e36d..257902f453207c0a2b831b46a3fc2dd914be3d8a 100644 (file)
@@ -65,7 +65,7 @@ module SiSU_AO_Hash
   class ObjectDigest
     def initialize(md,data,env=nil)
       @md,@data,@env=md,data,env
-      @env ||=SiSU_Env::InfoEnv.new(@md.fns)
+      @env ||=SiSU_Env::InfoEnv.new(@md.fns,@md)
     end
     def object_digest
     # 1. clean/stripped text without any markup, paragraph, headings etc. without endnotes
@@ -74,11 +74,11 @@ module SiSU_AO_Hash
     # [digests should not include other digests]
       data=@data.compact
       @tuned_file=[]
-      sha_ =(@env.digest.type=='sha256' ? true : false)
+      sha_ =@env.digest(@md.opt).type
       begin
         sha_ ? (require 'digest/sha2') : (require 'digest/md5')
       rescue LoadError
-        SiSU_Utils::CodeMarker.new(__LINE__,__FILE__,:fuchsia).error((sha_ ? 'digest/sha2' : 'digest/md5') + ' NOT FOUND')
+        SiSU_Utils::CodeMarker.new(__LINE__,__FILE__,:fuchsia).error(sha_ + ' NOT FOUND')
       end
       data.each do |t_o|
         unless t_o.obj.is_a?(Array)
@@ -88,11 +88,16 @@ module SiSU_AO_Hash
         && t_o.of !=:comment \
         && t_o.of !=:layout) \
         && t_o.ocn.is_a?(Fixnum)
-          if sha_
+          case sha_
+          when :sha512
+            for hash_class in [ Digest::SHA512 ]
+              @tuned_file << stamped(t_o,hash_class)
+            end
+          when :sha256
             for hash_class in [ Digest::SHA256 ]
               @tuned_file << stamped(t_o,hash_class)
             end
-          else
+          when :md5
             for hash_class in [ Digest::MD5 ]
               @tuned_file << stamped(t_o,hash_class)
             end
@@ -111,10 +116,15 @@ module SiSU_AO_Hash
           if en_plus =~/#{Mx[:en_a_o]}.+?#{Mx[:en_a_c]}|#{Mx[:en_b_o]}.+?#{Mx[:en_b_c]}/
             t_o_txt,en_open,en_txt,en_close=/(.*?)(#{Mx[:en_a_o]}|#{Mx[:en_b_o]})(.+?)(#{Mx[:en_a_c]}|#{Mx[:en_b_c]})/m.match(en_plus)[1..4]
             stripped_en=SiSU_TextRepresentation::Alter.new(en_txt).strip_clean_of_markup
-            digest_en_strip=if @env.digest.type =~/sha256/
+            digest_en_strip=case @env.digest(@md.opt).type
+            when :sha512
+              Digest::SHA512.hexdigest(stripped_en)
+            when :sha256
               Digest::SHA256.hexdigest(stripped_en)
-            else
+            when :md5
               Digest::MD5.hexdigest(stripped_en)
+            else
+              Digest::SHA256.hexdigest(stripped_en)
             end
             t_o_txt + en_open + en_txt + Mx[:id_o] + digest_en_strip + Mx[:id_c] + en_close
           else STDERR.puts "Error Exception - problem encountered with:\n#{en_plus}" #arbitrary exception, tidy up
index 0f76ed596c2b64ba71121be61a49e862e5deb579..be60431e9c1cfc35a17b97622601d232dbe356d5 100644 (file)
@@ -260,8 +260,8 @@ else
   }
 end
 Db={
-  name_prefix:               "SiSU#{SiSU_is[:version_dir]}a_",
-  name_prefix_db:            "sisu_#{SiSU_is[:version_dir]}a_",
+  name_prefix:               "SiSU#{SiSU_is[:version_dir]}b_",
+  name_prefix_db:            "sisu_#{SiSU_is[:version_dir]}b_",
   col_title:                  800,
   col_title_part:             400,
   col_title_edition:           10,
@@ -276,7 +276,7 @@ Db={
   col_library:                 30,
   col_small:                   16,
   col_filename:               256,
-  col_digest:                  64,
+  col_digest:                 128,
   col_filesize:                10,
   col_info_note:             2500,
 }
index 1b21cf96d06dffc351f8ec67eb107c5b27370913..8dd14ddbbb5e5a6768a257760312a72a9f090121 100644 (file)
@@ -1843,7 +1843,7 @@ module SiSU_DbColumns
       end
       def src_fingerprint
         def name
-          'src_fingerprint' #hash/digest, sha256 or md5
+          'src_fingerprint' #hash/digest, sha512, sha256 or md5
         end
         def create_column
           "#{name}                VARCHAR(#{Db[:col_digest]}) NULL,"
@@ -1851,7 +1851,7 @@ module SiSU_DbColumns
         end
         def column_comment
           %{COMMENT ON COLUMN metadata_and_text.#{name}
-            IS 'sisu markup source text fingerprint, hash digest sha256 (or md5)';}
+            IS 'sisu markup source text fingerprint, hash digest sha512, sha256 or md5';}
         end
         def tuple
           if defined? @md.dgst \
index 1fa2c80fab7940284d43eecc82d23d6bfdf8ae6d..24ddc32e8c72ab94480a0a672e97d807fb04a6dc 100644 (file)
@@ -71,7 +71,7 @@ module SiSU_DigestView
       @fnb=@opt.fnb
       @@endnotes_para=[]
       @@dg=nil
-      @dg=@@dg ||=SiSU_Env::InfoEnv.new.digest.type
+      @dg=@@dg ||=SiSU_Env::InfoEnv.new.digest(opt).type
       @particulars=SiSU_Particulars::CombinedSingleton.instance.get_all(opt)
     end
     def read
@@ -108,14 +108,19 @@ module SiSU_DigestView
     private
     class Scroll <Source
       @@dl=nil
-      @@ds={}
-      @@description,@@ds[:digests],@@ds[:tree],@@ds[:summary],@@sc_info=[],[],[],[],[]
-      def initialize(particulars) #data='',md='')
+      @@ds={
+        digests_clean: [],
+        digests_with_markup: [],
+        tree: [],
+        summary: [],
+      }
+      @@description,@@sc_info=[],[]
+      def initialize(particulars)
         @particulars=particulars
         @data,@env,@md=@particulars.ao_array,@particulars.env,@particulars.md
         SiSU_Env::FileOp.new(@md).mkdir
-        @@dg ||=@env.digest.type
-        @@dl ||=@env.digest.length
+        @@dg ||=@env.digest(@md.opt).type
+        @@dl ||=@env.digest(@md.opt).length
         @dg,@dl=@@dg,@@dl
         l=SiSU_Env::StandardiseLanguage.new(@md.opt.lng).language
         @language=l[:n]
@@ -123,7 +128,7 @@ module SiSU_DigestView
         @sp=' '
       end
       def songsheet
-        @@description,@@ds[:digests],@@ds[:tree],@@ds[:summary],@@sc_info=[],[],[],[],[]
+        @@description,@@ds[:digests_clean],@@ds[:digests_with_markup],@@ds[:tree],@@ds[:summary],@@sc_info=[],[],[],[],[],[]
         message_digest
         ao_structure
         supplementary
@@ -133,9 +138,13 @@ module SiSU_DigestView
         puts f + e.to_s if @md.opt.act[:verbose_plus][:set]==:on
         @@description << f << e
       end
-      def digests(f,e='')
+      def digests_clean(f,e='')
         puts f if @md.opt.act[:verbose_plus][:set]==:on
-        @@ds[:digests] << f + "\n"
+        @@ds[:digests_clean] << f + "\n"
+      end
+      def digests_with_markup(f)
+        puts f if @md.opt.act[:verbose_plus][:set]==:on
+        @@ds[:digests_with_markup] << f + "\n"
       end
       def ao_structure_tree(f,e='')
         puts f + e.to_s if @md.opt.act[:verbose_plus][:set]==:on
@@ -152,143 +161,15 @@ module SiSU_DigestView
       def output
         file=SiSU_Env::FileOp.new(@md)
         filename_digest=file.write_file.hash_digest
-        filename_digest << @@description.join << @@ds[:digests].join << @@ds[:tree].join << @@ds[:summary].join << @@sc_info.join
+        filename_digest << @@description.join << @@ds[:digests_clean].join << @@ds[:digests_with_markup].join << @@ds[:tree].join << @@ds[:summary].join << @@sc_info.join
       end
       def rgx_txt(txt)
         txt=txt.gsub(/([()])/,"\\\\\\1")
       end
       def message_digest
-        data=@data
-        sys=SiSU_Env::SystemCall.new
         @p=[]
         @g,@v,@r='','',''
-        data.each do |para|
-          x=nil
-          y,para_endnotes=[],[]
-          if para =~/#{Mx[:id_o]}~(\d+);(?:(?:\w|[0-6]:)\d+);(?:\w\d+)#{Mx[:id_c]}#{Mx[:id_o]}([0-9a-f]{#{@dl}}):([0-9a-f]{#{@dl}})#{Mx[:id_c]}/
-            ocn,d_clean,d_all=$1,$2,$3
-            @ocn=ocn unless ocn.to_i==0
-            para=para.gsub(/#{Mx[:fa_bold_o]}(.+?)#{Mx[:fa_bold_c]}/,'<b>\1</b>').
-              gsub(/#{Mx[:fa_italics_o]}(.+?)#{Mx[:fa_italics_c]}/,'<i>\1</i>').
-              gsub(/#{Mx[:fa_underscore_o]}(.+?)#{Mx[:fa_underscore_c]}/,'<u>\1</u>')
-            if para=~/#{Mx[:en_a_o]}[\d*+]+.+?#{Mx[:id_o]}[0-9a-f]{#{@dl}}#{Mx[:id_c]}#{Mx[:en_a_c]}/
-              para_endnotes << para.scan(/(?:#{Mx[:en_a_o]}|#{Mx[:en_b_o]})([\d*+]+).+?#{Mx[:id_o]}([0-9a-f]{#{@dl}})#{Mx[:id_c]}(?:#{Mx[:en_a_c]}|#{Mx[:en_b_c]})/)
-            end
-            images=[]
-            if para !~/^%+\s/ \
-            and para =~/(?:^|[^_\\])#{Mx[:lnk_o]}(\S+\.(png|jpg|gif))\s.+?#{Mx[:lnk_c]}(?:#{Mx[:url_o]}\S+?#{Mx[:url_c]}|image)/
-              images=para.scan(/(?:^|[^_\\])#{Mx[:lnk_o]}(\S+\.(?:png|jpg|gif))\s.+?#{Mx[:lnk_c]}(?:#{Mx[:url_o]}\S+?#{Mx[:url_c]}|image)/).flatten
-            else nil
-            end
-            x=case para
-            when /^#{Mx[:meta_o]}title#{Mx[:meta_c]}/
-              "\n" << '  '*0 << '@' << '  '*9
-            when /^#{Mx[:meta_o]}subtitle#{Mx[:meta_c]}/
-              "\n" << '  '*1 << '@' << '  '*8
-            when /^#{Mx[:lv_o]}1:/ #fix Mx[:lv_o]
-              "\n" << '  '*2 << ':A ' << '  '*6 << '- ' << ocn << ' '*(10-ocn.length) << d_clean << ' ' << d_all
-            when /^#{Mx[:lv_o]}2:/ #fix Mx[:lv_o]
-              "\n" << '  '*3 << ':B ' << '  '*5 << '- ' << ocn << ' '*(10-ocn.length) << d_clean << ' ' << d_all
-            when /^#{Mx[:lv_o]}3:/ #fix Mx[:lv_o]
-              "\n" << '  '*4 << ':C ' << '  '*4 << '- ' << ocn << ' '*(10-ocn.length) << d_clean << ' ' << d_all
-            when /^#{Mx[:lv_o]}4:/ #fix Mx[:lv_o]
-              "\n" << '  '*5 << '1' << '  '*4 << '- ' << ocn << ' '*(10-ocn.length) << d_clean << ' ' << d_all
-            when /^#{Mx[:lv_o]}5:/ #fix Mx[:lv_o]
-              "\n" << '  '*6 << '2' << '  '*3 << '- ' << ocn << ' '*(10-ocn.length) << d_clean << ' ' << d_all
-            when /^#{Mx[:lv_o]}6:/ #fix Mx[:lv_o]
-              "\n" << '  '*7 << '3' << '  '*2 << '- ' << ocn << ' '*(10-ocn.length) << d_clean << ' ' << d_all
-            else
-              if para =~/MD5\(\S+?\.sst\)=\s*<u>([0-9a-f]{#{@dl}})<\/u>/                                        #watch
-                @n,@s=/MD5\((\S+?\.sst)\)=\s*<u>([0-9a-f]{#{@dl}})<\/u>/.match(para)[1,2]
-              end
-              x=unless ocn =~ /^0$/
-                if images \
-                and images.length > 0 # then get path of image & produce digest
-                  @image_name,@image_dgst,@img=[],[],[]
-                  images.each do |i|
-                    image_source=if FileTest.file?("#{@env.path.image_source_include_local}/#{i}")
-                      @env.path.image_source_include_local
-                    elsif FileTest.file?("#{@env.path.image_source_include_remote}/#{i}")
-                      @env.path.image_source_include_remote
-                    elsif FileTest.file?("#{@env.path.image_source_include}/#{i}")
-                      @env.path.image_source_include
-                    else
-                      SiSU_Screen::Ansi.new(@md.opt.act[:color_state][:set],"ERROR - image:", %{"#{i}" missing}, "search locations: #{@env.path.image_source_include_local}, #{@env.path.image_source_include_remote} and #{@env.path.image_source_include}").error2 unless @md.opt.act[:quiet][:set]==:on
-                      nil
-                    end
-                    @img << /\S+\.(png|jpg|gif)/.match(i)[1]
-                    not_found_msg='image not found'
-                    if image_source
-                      para_image = image_source + '/' + i
-                      @image_name << i
-                      @image_dgst << (@dg =~/^sha(?:2|256)$/) \
-                      ? sys.sha256(para_image)
-                      : sys.md5(para_image)
-                    else
-                      @image_name << '  '*16 + i + ' [image missing]'
-                      @image_dgst << ''
-                      @image_dgst[1]=not_found_msg + ' '*(32-not_found_msg.length)
-                    end
-                  end
-                  line= "\n" + '  '*9 + ' - ' + ocn + ' '*(10-ocn.length) + d_clean + ' ' + d_all + "\n"
-                  line_image=[]
-                  c=0
-                  @image_name.each do |ok|
-                    line_image << %{                     #{@img[c]}       #{@image_dgst[c][1]}                                  #{@image_name[c]}}
-                    c +=1
-                  end
-                  line=line + line_image.join("\n")
-                else "\n" + '  '*9 + ' - ' + ocn + ' '*(10-ocn.length) + d_clean + ' ' + d_all
-                end
-              else
-                prefix=''
-                metad=[@tr.full_title,@tr.author,@tr.translator,@tr.illustrator,@tr.prepared_by,@tr.digitized_by,@tr.description,@tr.subject,@tr.abstract,@tr.publisher,@tr.contributor,@tr.date_created,@tr.date_issued,@tr.date_available,@tr.date_modified,@tr.date_valid,@tr.date,@tr.type,@tr.format,@tr.rights,@tr.identifier,@tr.source,@tr.language,@tr.language_original,@tr.relation,@tr.coverage,@tr.keywords,@tr.comments,@tr.cls_loc,@tr.cls_dewey,@tr.cls_gutenberg,@tr.cls_isbn,@tr.prefix_a,@tr.prefix_b,@tr.sourcefile,@tr.sourcefile_digest,@tr.last_generated,@tr.sisu_version,@tr.ruby_version,@tr.sc_number,@tr.sc_date,'Generated by: ','Ruby version: ']
-                metad.each do |n|
-                  m=rgx_txt(n)
-                  if m=~/\S+/ \
-                  and para=~/^#{m}:/
-                    x,o=0,18
-                    while x < 2; o = o + 2
-                      x=o - n.length
-                    end
-                    space=' '*x
-                    prefix="#{n.downcase}#{space}"
-                    break
-                  else prefix='  '*9
-                  end
-                end
-                m_title=rgx_txt(@tr.full_title)
-                m_author=rgx_txt(@tr.author)
-                m_sourcefile_digest=rgx_txt(@tr.sourcefile_digest)
-                m_sisu_version=rgx_txt(@tr.sisu_version)
-                m_last_generated=rgx_txt(@tr.last_generated)
-                m_ruby_version=rgx_txt(@tr.ruby_version)
-                case para
-                when /#{m_title}: /
-                  @t=/#{m_title}: (.+?)#{Mx[:id_o]}~\d;(?:\w|[0-6]:)\d+;\w\d+#{Mx[:id_c]}#{Mx[:id_o]}[0-9a-f]{#{@dl}}:[0-9a-f]{#{@dl}}#{Mx[:id_c]}/.match(para)[1].gsub(/<\/?u>/,'').strip
-                when /#{m_author}: /
-                  @c=/#{m_author}: (.+?)#{Mx[:id_o]}~\d;(?:\w|[0-6]:)\d+;\w\d+#{Mx[:id_c]}#{Mx[:id_o]}[0-9a-f]{#{@dl}}:[0-9a-f]{#{@dl}}#{Mx[:id_c]}/.match(para)[1].gsub(/<\/?u>/,'').strip
-                when /#{m_sourcefile_digest}.+?<u>/                                        #watch
-                  dgst_extra="\n" << ' '*21 << 'source' << ' '*4 << @md.dgst[1] << ' '*34 << @md.fns
-                when /#{m_sisu_version}: /
-                  @v=/#{m_sisu_version}: (.+?)#{Mx[:id_o]}~\d;(?:\w|[0-6]:)\d+;\w\d+#{Mx[:id_c]}#{Mx[:id_o]}[0-9a-f]{#{@dl}}:[0-9a-f]{#{@dl}}#{Mx[:id_c]}/.match(para)[1].gsub(/<\/?u>/,'').strip
-                when /#{m_last_generated}: /
-                  @g=/#{m_last_generated}: (.+?)#{Mx[:id_o]}~\d;(?:\w|[0-6]:)\d+;\w\d+#{Mx[:id_c]}#{Mx[:id_o]}[0-9a-f]{#{@dl}}:[0-9a-f]{#{@dl}}#{Mx[:id_c]}/.match(para)[1].gsub(/<\/?u>/,'').strip
-                when /#{m_ruby_version}: /
-                  @r=/#{m_ruby_version}: (.+?)#{Mx[:id_o]}~\d;(?:\w|[0-6]:)\d+;\w\d+#{Mx[:id_c]}#{Mx[:id_o]}[0-9a-f]{#{@dl}}:[0-9a-f]{#{@dl}}#{Mx[:id_c]}/.match(para)[1].gsub(/<\/?u>/,'').strip
-                end
-                dgst_extra ||=''
-                "\n" << prefix << ' - ' << ocn << ' '*(10-ocn.length) << d_clean << ' ' << d_all << dgst_extra << "\n"
-              end
-            end
-            para_endnotes[0].each { |e| y << "\n" + ' '*(28-e[0].length) + "[#{e[0].to_s}] #{e[1].to_s}" } if para_endnotes[0]
-            if y; digests(x,y)
-            else  digests(x)
-            end
-          end
-        end
         manifest="#{@env.url.root}/#{@md.fnb}/sisu_manifest.html"
-        a=%{ocn      digest clean (no markup/notes),#{@sp*33}digest all (includes markup & endnotes)\n}
         description("#{@md.title.full}\n")
         description("#{@md.author}\n")
         description("#{@md.fns}\n")
@@ -300,39 +181,51 @@ module SiSU_DigestView
         description("Sourcefile digest:             #{@md.dgst[1]}\n")
         description("  source filename:             #{@md.fns}\n")
         description("available outputs:             #{manifest}\n")
-       #description("  time generated:                #{@g}\n")
-       #description("  SiSU version used:             #{@v}\n")
-       #description("  Ruby version used:             #{@r}\n")
         description("------------\n")
         description("Document Digests\n")
-        description(a)
       end
       def ao_structure
+        a=%{\nocn     digests (#{@dg}) clean text (stripped markup)}
+        digests_clean(a)
         data=@data
         endnotes=nil
         data.each do |t_o|
           dgst=SiSU_TextRepresentation::ModifiedTextPlusHashDigest.new(@md,t_o).composite.dgst
           if dgst
             if t_o.is==:heading
-              digests("#{@sp*0}#{dgst[:ocn]}#{@sp*(8-dgst[:ocn].to_s.length)}#{dgst[:dgst_stripped_txt]} #{dgst[:dgst_markedup_txt]} #{dgst[:is]} #{t_o.lv}")
+              digests_clean("#{@sp*0}#{dgst[:ocn]}#{@sp*(8-dgst[:ocn].to_s.length)}#{dgst[:dgst_stripped_txt]} #{dgst[:is]} #{t_o.lv}")
             elsif t_o.is==:heading_insert
-              digests("#{@sp*0}[#{dgst[:ocn]}]#{@sp*(6-dgst[:ocn].to_s.length)}#{dgst[:dgst_stripped_txt]} #{dgst[:dgst_markedup_txt]} #{dgst[:is]} #{t_o.lv}")
+              digests_clean("#{@sp*0}[#{dgst[:ocn]}]#{@sp*(6-dgst[:ocn].to_s.length)}#{dgst[:dgst_stripped_txt]} #{dgst[:is]} #{t_o.lv}")
             else
-              digests("#{@sp*0}#{dgst[:ocn]}#{@sp*(8-dgst[:ocn].to_s.length)}#{dgst[:dgst_stripped_txt]} #{dgst[:dgst_markedup_txt]} #{dgst[:is]}")
+              digests_clean("#{@sp*0}#{dgst[:ocn]}#{@sp*(8-dgst[:ocn].to_s.length)}#{dgst[:dgst_stripped_txt]} #{dgst[:is]}")
               if dgst[:images]
                 dgst[:images].each do |img|
-                  digests("#{@sp*8}#{img[:img_dgst]}#{@sp*66}#{img[:img_type]} #{img[:img_name]}")
+                  digests_clean("#{@sp*8}#{img[:img_dgst]}#{@sp*66}#{img[:img_type]} #{img[:img_name]}")
                 end
               end
             end
             if dgst[:endnotes]
               dgst[:endnotes].each do |en|
-                digests("#{@sp*8}#{en[:note_dgst]}#{@sp*66}note [#{en[:note_number]}]")
+                digests_clean("#{@sp*8}#{en[:note_dgst]} note [#{en[:note_number]}]")
                 endnotes=en[:note_number]
               end
             end
           end
         end
+        b=%{\nocn     object (#{@dg}) digests (object includes its markup & endnotes (if any))}
+        digests_with_markup(b)
+        data.each do |t_o|
+          dgst=SiSU_TextRepresentation::ModifiedTextPlusHashDigest.new(@md,t_o).composite.dgst
+          if dgst
+            if t_o.is==:heading
+              digests_with_markup("#{@sp*0}#{dgst[:ocn]}#{@sp*(8-dgst[:ocn].to_s.length)}#{dgst[:dgst_markedup_txt]} #{dgst[:is]} #{t_o.lv}")
+            elsif t_o.is==:heading_insert
+              digests_with_markup("#{@sp*0}[#{dgst[:ocn]}]#{@sp*(6-dgst[:ocn].to_s.length)}#{dgst[:dgst_markedup_txt]} #{dgst[:is]} #{t_o.lv}")
+            else
+              digests_with_markup("#{@sp*0}#{dgst[:ocn]}#{@sp*(8-dgst[:ocn].to_s.length)}#{dgst[:dgst_markedup_txt]} #{dgst[:is]}")
+            end
+          end
+        end
         l=Hash.new(0)
         ocn=nil
         ao_structure_tree("------------\n")
@@ -340,18 +233,20 @@ module SiSU_DigestView
         data.each do |t_o|
           if t_o.is==:heading
             x=case t_o.ln
-            when 1 then l[1] +=1 #fix Mx[:lv_o]
+            when 0 then l[0] +=1
               '  '*0 << ':A'
-            when 2 then l[2] +=1 #fix Mx[:lv_o]
+            when 1 then l[1] +=1
               '  '*1 << ':B'
-            when 3 then l[3] +=1 #fix Mx[:lv_o]
+            when 2 then l[2] +=1
               '  '*2 << ':C'
-            when 4 then l[4] +=1 #fix Mx[:lv_o]
-              '  '*3 << '1'
-            when 5 then l[5] +=1 #fix Mx[:lv_o]
-              '  '*4 << '2'
-            when 6 then l[6] +=1 #fix Mx[:lv_o]
-              '  '*5 << '3'
+            when 3 then l[3] +=1
+              '  '*3 << ':D'
+            when 4 then l[4] +=1
+              '  '*4 << '1'
+            when 5 then l[5] +=1
+              '  '*5 << '2'
+            when 6 then l[6] +=1
+              '  '*6 << '3'
             else nil
             end
           end
@@ -363,9 +258,10 @@ module SiSU_DigestView
         ao_structure_summary("document structure[*]\n")
         [0,1,2,3,4,5,6].each do |y|
           v=case y
-          when 1 then ':A'
-          when 2 then ':B'
-          when 3 then ':C'
+          when 0 then ':A'
+          when 1 then ':B'
+          when 2 then ':C'
+          when 3 then ':D'
           when 4 then '1 '
           when 5 then '2 '
           when 6 then '3 '
@@ -374,7 +270,7 @@ module SiSU_DigestView
         end
         ao_structure_summary("objects (ocn) = #{ocn}\n")
         ao_structure_summary("endnotes      = #{endnotes}\n")
-        ao_structure_summary("  [*] number of headers (@) and of each heading level (:A to :C and 1 to 3)\n")
+        ao_structure_summary("  [*] number of headers (@) and of each heading level (:A to :D and 1 to 3)\n")
       end
       def supplementary
         if defined? @md.sc_number \
index 1d6bc6a9370444052d3a3dc53613db3940b9e7ba..27b90eda9dcd4d43e2176900f05ec2245eacf572 100644 (file)
@@ -123,7 +123,7 @@ module SiSU_Manifest
         ? './image'
         : %{#{@f.path_rel_links.html_scroll_2}_sisu/image_sys}
         @base_path=@f.output_path.manifest.dir
-        @@dg ||=SiSU_Env::InfoEnv.new.digest.type
+        @@dg ||=SiSU_Env::InfoEnv.new(md.fns,md).digest(md.opt).type
         @dg=@@dg
         l=SiSU_Env::StandardiseLanguage.new(md.opt.lng).language
         @language=l[:n]
@@ -165,9 +165,15 @@ module SiSU_Manifest
       end
       def summarize_sources(id,file,pth,rel,url)
         sys=SiSU_Env::SystemCall.new
-        dgst=(@dg =~/^sha(?:2|256)$/) \
-        ? sys.sha256("#{pth}/#{file}")
-        : sys.md5("#{pth}/#{file}")
+        dgst=case @dg
+        when :sha512
+          sys.sha512("#{pth}/#{file}")
+        when :sha256
+          sys.sha256("#{pth}/#{file}")
+        when :md5
+          sys.md5("#{pth}/#{file}")
+        else
+        end
         if (@md.opt.act[:verbose][:set]==:on \
         || @md.opt.act[:verbose_plus][:set]==:on \
         || @md.opt.act[:maintenance][:set]==:on)
index aacfcbe61737acd34c023227a28b1f6bd20c5316..115281c76130cdf86e97d8bc04f9851d0815dc25 100644 (file)
@@ -968,6 +968,14 @@ module SiSU_Commandline
         || mod.inspect =~/"--hash-digests"/) \
         ? { bool: true, set: :on }
         : { bool: false, set: :na }
+        act[:hash_digest_algo]=if mod.inspect =~/"--hash-(?:sha)?512"/
+          :sha512
+        elsif mod.inspect =~/"--hash-(?:sha)?256"/
+          :sha256
+        elsif mod.inspect =~/"--hash-md5"/
+          :md5
+        else :na
+        end
         act[:sample_search_form]=(cmd =~/F/ \
         || mod.inspect =~/"--sample-search-form"/) \
         ? { bool: true, set: :on }
index e3eaebaee95cf95495a6069bb49bbd18405f4332..9d310f7ca31e5f9e69df6fe5ff388b7885dca701 100644 (file)
@@ -1281,14 +1281,23 @@ module SiSU_Param
         if @sys.openssl !=false \
         and FileTest.file?(@env.source_file_with_path)
           @dgst=[]
-          if @env.digest.type =~/sha256/
+          case @env.digest(@opt).type
+          when :sha512
+            dgst=@sys.sha512(@env.source_file_with_path)
+            @dgst=dgst[1].length==128 ? dgst : nil
+            puts 'check document (sha512) digest' if not @dgst
+          when :sha256
             dgst=@sys.sha256(@env.source_file_with_path)
             @dgst=dgst[1].length==64 ? dgst : nil
             puts 'check document (sha256) digest' if not @dgst
-          else
+          when :md5
             dgst=@sys.md5(@env.source_file_with_path)
             @dgst=dgst[1].length==32 ? dgst : nil
             puts 'check document (md5) digest' if not @dgst
+          else
+            dgst=@sys.sha256(@env.source_file_with_path)
+            @dgst=dgst[1].length==64 ? dgst : nil
+            puts 'check document (sha256) digest' if not @dgst
           end
         elsif not FileTest.file?(@env.source_file_with_path)
           #puts SiSU_Utils::CodeMarker.new(__LINE__,__FILE__).set(:fuchsia)
index 067d3d6464a82d6fffd0acf1a2a4278e61b35dd4..73feaf3f5a5faa18b36e133cfea95ae4e6a2d5c9 100644 (file)
@@ -80,7 +80,7 @@ module SiSU_QRcode
     end
     def read
       begin
-        @env=SiSU_Env::InfoEnv.new(@opt.fns)
+        @env=SiSU_Env::InfoEnv.new(@opt.fns,@opt)
         @md=SiSU_Param::Parameters.new(@opt).get
         xbrowser=@env.program.web_browser
         browser=@env.program.console_web_browser
@@ -111,12 +111,12 @@ module SiSU_QRcode
       def initialize(md)
         @manifest={ txt: [], txt_title: [] }
         @md,@fns=md,md.fns
-        @env=SiSU_Env::InfoEnv.new(@md.fns)
+        @env=SiSU_Env::InfoEnv.new(@md.fns,@md.opt)
         @fnb=@md.fnb
         @base_url="#{@env.url.root}/#{@fnb}"
         @f=SiSU_Env::FileOp.new(@md)
         @base_path=@f.output_path.manifest.dir
-        @@dg ||=SiSU_Env::InfoEnv.new.digest.type
+        @@dg ||=SiSU_Env::InfoEnv.new.digest(@md.opt).type
         @dg=@@dg
         l=SiSU_Env::StandardiseLanguage.new(@md.opt.lng).language
         @language=l[:n]
@@ -167,9 +167,14 @@ WOK
       end
       def summarize_sources(id,file,pth,rel,url)
         sys=SiSU_Env::SystemCall.new
-        dgst=(@dg =~/^sha(?:2|256)$/) \
-        ? (sys.sha256("#{pth}/#{file}"))
-        : (sys.md5("#{pth}/#{file}"))
+        dgst=case @dg
+        when :sha512
+          (sys.sha516("#{pth}/#{file}")) #check
+        when :md5
+          (sys.md5("#{pth}/#{file}"))
+        else
+          (sys.sha256("#{pth}/#{file}"))
+        end
         if (@md.opt.act[:verbose][:set]==:on \
         || @md.opt.act[:verbose_plus][:set]==:on \
         || @md.opt.act[:maintenance][:set]==:on)
index 4971dde095cbad33975baa3792e262df81e80db0..3bf3c7e4080f8c9490471abd890ee54ab86f5aed 100644 (file)
@@ -207,20 +207,32 @@ module SiSU_TextRepresentation
         @t_o,@s=x,x.obj.dup
       end
       @env ||=SiSU_Env::InfoEnv.new(@md.fns)
-      @sha_ =((@env.digest.type =='sha256') ? true : false)
+      @sha_ = @env.digest(@md.opt).type
       begin
-        @sha_ ? (require 'digest/sha2') : (require 'digest/md5')
+        case @sha_
+        when :sha512
+          require 'digest/sha2'
+        when :sha256
+          require 'digest/sha2'
+        when :md5
+          require 'digest/md5'
+        end
       rescue LoadError
         SiSU_Utils::CodeMarker.new(__LINE__,__FILE__,:fuchsia).error((@sha_ ? 'digest/sha2' : 'digest/md5') + ' NOT FOUND')
       end
     end
     def digest(txt)
       d=nil
-      if @sha_
+      case @sha_
+      when :sha512
+        for hash_class in [ Digest::SHA512 ]
+          d=hash_class.hexdigest(txt)
+        end
+      when :sha256
         for hash_class in [ Digest::SHA256 ]
           d=hash_class.hexdigest(txt)
         end
-      else
+      when :md5
         for hash_class in [ Digest::MD5 ]
           d=hash_class.hexdigest(txt)
         end
index ece3ca790363e1d0fa20bd1ea32d0e079b969222..bc3f1a749fa534360c4ad97c4c75f089ee825558 100644 (file)
@@ -214,7 +214,7 @@ module SiSU_Env
       MULTILINGUAL =>             false,
       BUNDLE =>                   false,
       CONCORD_MAX =>              260000,
-      DIGEST =>                   'sha256',
+      DIGEST =>                   :sha256,
       WEBSERV_HOST_CGI =>         'http://localhost',
       WEBSERV_PORT_CGI =>         8081, #8111,8123,8081
       POSTGRESQL_USER =>          @@user, #'ralph', # change user !!!
@@ -806,6 +806,19 @@ module SiSU_Env
         false
       end
     end
+    def sha512(filename)                                                       #sha dgst
+      program='openssl'
+      program_ref="\n\t\tsha digest requested"
+      if program_found?(program)
+        pwd=Dir.pwd
+        Dir.chdir(File.dirname(filename))
+        dgst=%x{openssl dgst -sha512 #{File.basename(filename)}}.strip #use file name without file path
+        Dir.chdir(pwd)
+        dgst.scan(/\S+/)
+      else SiSU_Utils::CodeMarker.new(__LINE__,__FILE__,:fuchsia).warn("#{program} is not installed #{program_ref}")
+        false
+      end
+    end
     def psql                                                                   #psql
       program='psql'
       program_ref="\n\t\tpsql requested"
@@ -2715,27 +2728,41 @@ WOK
       end
       self
     end
-    def digest
+    def digest_conf?
+      if defined? @rc['default']['digest'] \
+      and @rc['default']['digest'] != nil
+        case @rc['default']['digest']
+        when /^sha(?:5|512)?$/ then :sha512
+        when /^sha(?:2|256)?$/ then :sha256
+        when /^md5$/           then :md5
+        else                        :sha256
+        end
+      else                          :sha256
+      end
+    end
+    def digest(opt=nil)
+      @opt=opt
       def type
-        if defined? @rc['default']['digest'] \
-        and @rc['default']['digest'] != nil
-          case @rc['default']['digest']
-          when /^sha(?:2|256)?$/ then 'sha256'
-          when /^md5$/           then 'md5'
-          else                        'sha256'
+        if @opt
+          case @opt.act[:hash_digest_algo]
+          when :sha512 then :sha512
+          when :sha256 then :sha256
+          when :md5    then :md5
+          else digest_conf?
           end
-        else                          'sha256'
+        else digest_conf?
         end
       end
       def length
-        case digest.type
-        when /sha256/ then 64
-        when /md5/    then 32
+        case digest(@opt).type
+        when :sha512 then 128
+        when :sha256 then  64
+        when :md5    then  32
         else               64
         end
       end
       def pattern
-        "[0-9a-f]{#{digest.length}}" #/[0-9a-f]{#{digest.length}}/
+        "[0-9a-f]{#{digest(@opt).length}}" #/[0-9a-f]{#{digest.length}}/
       end
       self
     end
index 5327a9bb490ec5e1cd13b1f13831a35393c84a4b..29671dca43e8b58843756aee2b235f5218261ef7 100644 (file)
@@ -107,7 +107,7 @@ module SiSU_Urls
         'I --texinfo (Info file)'=>'info',
         'i --manpage (manpage)'=>'manpage',
         'm --ao (Document Abstraction)'=>'ao',
-        'N --hash-digests (Digests md5/sha256)'=>@fn[:digest],
+        'N --hash-digests (Digests sha512/sha256/md5)'=>@fn[:digest],
         'o --odt (ODF:ODT - Open Document)'=>@fn[:odf],
         'p --pdf (PDF landscape)'=>@fn[:pdf_l],
         'p --pdf (PDF portrait)'=>@fn[:pdf_p],
index c3229e00aadd12013db26240445cfc33dfcc2736..17a79977d92ced0a61c3a311fa6415f7ced632bf 100644 (file)
@@ -534,6 +534,12 @@ copies sisu output files to remote host using scp. This requires that
 sisurc.yml has been provided with information on hostname and username, and
 that you have your "keys" and ssh agent in place. Also see --rsync. Alias -r
 .TP
+.B --sha256
+set hash digest where used to sha256
+.TP
+.B --sha512
+set hash digest where used to sha512
+.TP
 .B --sqlite --[instruction] [filename]
 database type set to
 .I SQLite,
index 5563b713ebecc07689fa6e317f0870810064b5d3..63b82949cf2bec378a8adc1abaa83b8f62e2fde4 100644 (file)
--- a/sisu.org
+++ b/sisu.org
@@ -1627,7 +1627,7 @@ page after TOC).
 Regards,
 Daniel
 
-**** TODO [#C] #744402 [w|u] sisu: support sha512
+**** DONE (6.0.5) [#C] #744402 [w|u] sisu: support sha512 :implement:
       <https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=744402>
 
 From: Daniel Baumann <daniel.baumann@progress-technologies.net>
@@ -1647,6 +1647,11 @@ it would be even nicer if you could specify the actual digest like
 Regards,
 Daniel
 
+***** NOTES/COMMENTS
+
+implemented
+document command line option --sha512
+
 **** TODO [#C] #744405 [w|u] sisu: set default font size
       <https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=744405>