Coverage for /var/srv/projects/api.amasfac.comuna18.com/tmp/venv/lib/python3.9/site-packages/openpyxl/workbook/protection.py: 51%
90 statements
« prev ^ index » next coverage.py v6.4.4, created at 2023-07-17 14:22 -0600
« prev ^ index » next coverage.py v6.4.4, created at 2023-07-17 14:22 -0600
1# Copyright (c) 2010-2022 openpyxl
3from openpyxl.descriptors.serialisable import Serialisable
4from openpyxl.descriptors import (
5 Alias,
6 Typed,
7 String,
8 Float,
9 Integer,
10 Bool,
11 NoneSet,
12 Set,
13)
14from openpyxl.descriptors.excel import (
15 ExtensionList,
16 HexBinary,
17 Guid,
18 Relation,
19 Base64Binary,
20)
21from openpyxl.utils.protection import hash_password
24class WorkbookProtection(Serialisable):
26 _workbook_password, _revisions_password = None, None
28 tagname = "workbookPr"
30 workbook_password = Alias("workbookPassword")
31 workbookPasswordCharacterSet = String(allow_none=True)
32 revision_password = Alias("revisionsPassword")
33 revisionsPasswordCharacterSet = String(allow_none=True)
34 lockStructure = Bool(allow_none=True)
35 lock_structure = Alias("lockStructure")
36 lockWindows = Bool(allow_none=True)
37 lock_windows = Alias("lockWindows")
38 lockRevision = Bool(allow_none=True)
39 lock_revision = Alias("lockRevision")
40 revisionsAlgorithmName = String(allow_none=True)
41 revisionsHashValue = Base64Binary(allow_none=True)
42 revisionsSaltValue = Base64Binary(allow_none=True)
43 revisionsSpinCount = Integer(allow_none=True)
44 workbookAlgorithmName = String(allow_none=True)
45 workbookHashValue = Base64Binary(allow_none=True)
46 workbookSaltValue = Base64Binary(allow_none=True)
47 workbookSpinCount = Integer(allow_none=True)
49 __attrs__ = ('workbookPassword', 'workbookPasswordCharacterSet', 'revisionsPassword',
50 'revisionsPasswordCharacterSet', 'lockStructure', 'lockWindows', 'lockRevision',
51 'revisionsAlgorithmName', 'revisionsHashValue', 'revisionsSaltValue',
52 'revisionsSpinCount', 'workbookAlgorithmName', 'workbookHashValue',
53 'workbookSaltValue', 'workbookSpinCount')
55 def __init__(self,
56 workbookPassword=None,
57 workbookPasswordCharacterSet=None,
58 revisionsPassword=None,
59 revisionsPasswordCharacterSet=None,
60 lockStructure=None,
61 lockWindows=None,
62 lockRevision=None,
63 revisionsAlgorithmName=None,
64 revisionsHashValue=None,
65 revisionsSaltValue=None,
66 revisionsSpinCount=None,
67 workbookAlgorithmName=None,
68 workbookHashValue=None,
69 workbookSaltValue=None,
70 workbookSpinCount=None,
71 ):
72 if workbookPassword is not None:
73 self.workbookPassword = workbookPassword
74 self.workbookPasswordCharacterSet = workbookPasswordCharacterSet
75 if revisionsPassword is not None:
76 self.revisionsPassword = revisionsPassword
77 self.revisionsPasswordCharacterSet = revisionsPasswordCharacterSet
78 self.lockStructure = lockStructure
79 self.lockWindows = lockWindows
80 self.lockRevision = lockRevision
81 self.revisionsAlgorithmName = revisionsAlgorithmName
82 self.revisionsHashValue = revisionsHashValue
83 self.revisionsSaltValue = revisionsSaltValue
84 self.revisionsSpinCount = revisionsSpinCount
85 self.workbookAlgorithmName = workbookAlgorithmName
86 self.workbookHashValue = workbookHashValue
87 self.workbookSaltValue = workbookSaltValue
88 self.workbookSpinCount = workbookSpinCount
90 def set_workbook_password(self, value='', already_hashed=False):
91 """Set a password on this workbook."""
92 if not already_hashed:
93 value = hash_password(value)
94 self._workbook_password = value
96 @property
97 def workbookPassword(self):
98 """Return the workbook password value, regardless of hash."""
99 return self._workbook_password
101 @workbookPassword.setter
102 def workbookPassword(self, value):
103 """Set a workbook password directly, forcing a hash step."""
104 self.set_workbook_password(value)
106 def set_revisions_password(self, value='', already_hashed=False):
107 """Set a revision password on this workbook."""
108 if not already_hashed:
109 value = hash_password(value)
110 self._revisions_password = value
112 @property
113 def revisionsPassword(self):
114 """Return the revisions password value, regardless of hash."""
115 return self._revisions_password
117 @revisionsPassword.setter
118 def revisionsPassword(self, value):
119 """Set a revisions password directly, forcing a hash step."""
120 self.set_revisions_password(value)
122 @classmethod
123 def from_tree(cls, node):
124 """Don't hash passwords when deserialising from XML"""
125 self = super(WorkbookProtection, cls).from_tree(node)
126 if self.workbookPassword:
127 self.set_workbook_password(node.get('workbookPassword'), already_hashed=True)
128 if self.revisionsPassword:
129 self.set_revisions_password(node.get('revisionsPassword'), already_hashed=True)
130 return self
132# Backwards compatibility
133DocumentSecurity = WorkbookProtection
136class FileSharing(Serialisable):
138 tagname = "fileSharing"
140 readOnlyRecommended = Bool(allow_none=True)
141 userName = String(allow_none=True)
142 reservationPassword = HexBinary(allow_none=True)
143 algorithmName = String(allow_none=True)
144 hashValue = Base64Binary(allow_none=True)
145 saltValue = Base64Binary(allow_none=True)
146 spinCount = Integer(allow_none=True)
148 def __init__(self,
149 readOnlyRecommended=None,
150 userName=None,
151 reservationPassword=None,
152 algorithmName=None,
153 hashValue=None,
154 saltValue=None,
155 spinCount=None,
156 ):
157 self.readOnlyRecommended = readOnlyRecommended
158 self.userName = userName
159 self.reservationPassword = reservationPassword
160 self.algorithmName = algorithmName
161 self.hashValue = hashValue
162 self.saltValue = saltValue
163 self.spinCount = spinCount