summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--examples/sheet_protection.rb2
-rw-r--r--lib/axlsx/workbook/worksheet/sheet_protection.rb24
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 << '<sheetProtection '
str << instance_values.map{ |k,v| k.gsub(/_(.)/){ $1.upcase } << %{="#{v.to_s}"} }.join(' ')