From ec39d3f360cf48ac4f29f39025190fa7d88ab600 Mon Sep 17 00:00:00 2001 From: Randy Morgan Date: Tue, 22 May 2012 11:15:48 +0900 Subject: keep working on a spec compliant method --- examples/sheet_protection.rb | 2 +- lib/axlsx/workbook/worksheet/sheet_protection.rb | 24 +++++++++++++++++++++++- 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/examples/sheet_protection.rb b/examples/sheet_protection.rb index be6cf677..f76f5909 100644 --- a/examples/sheet_protection.rb +++ b/examples/sheet_protection.rb @@ -4,5 +4,5 @@ $LOAD_PATH.unshift "#{File.dirname(__FILE__)}/../lib" require 'axlsx' p = Axlsx::Package.new -p.workbook.add_worksheet { |ws| ws.sheet_protection.password = 'fish' } +p.workbook.add_worksheet { |ws| ws.sheet_protection.propper_password = 'fish' } p.serialize 'sheet_protection.xlsx' diff --git a/lib/axlsx/workbook/worksheet/sheet_protection.rb b/lib/axlsx/workbook/worksheet/sheet_protection.rb index 187d2165..87d6186f 100644 --- a/lib/axlsx/workbook/worksheet/sheet_protection.rb +++ b/lib/axlsx/workbook/worksheet/sheet_protection.rb @@ -139,7 +139,10 @@ module Axlsx end end - [:sheet, :objects, :scenarios, :select_locked_cells, :sort, + + # create validating setters for boolean values + # @return [Boolean] + [:sheet, :objects, :scenarios, :select_locked_cells, :sort, :select_unlocked_cells, :format_cells, :format_rows, :format_columns, :insert_columns, :insert_rows, :insert_hyperlinks, :delete_columns, :delete_rows, :auto_filter, :pivot_tables].each do |f_name| @@ -149,11 +152,30 @@ module Axlsx end end + def propper_password=(v) + @algorithm_name = v == nil ? nil : 'SHA-1' + @salt_value = @spin_count = @hash_value = v if v == nil + return if v == nil + require 'digest/sha1' + @spin_count = 10000 + @salt_value = Digest::SHA1.hexdigest(rand(36**8).to_s(36)) + @hash_value = nil + @spin_count.times do |count| + @hash_value = Digest::SHA1.hexdigest((@hash_value || (@salt_value + v.to_s)) + Array(count).pack('V')) + end + end + + + + # encodes password for protection locking def password=(v) return if v == nil @password = create_password_hash(v) end + # Serialize the object + # @param [String] str + # @return [String] def to_xml_string(str = '') str << '