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

1# Copyright (c) 2010-2022 openpyxl 

2 

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 

22 

23 

24class WorkbookProtection(Serialisable): 

25 

26 _workbook_password, _revisions_password = None, None 

27 

28 tagname = "workbookPr" 

29 

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) 

48 

49 __attrs__ = ('workbookPassword', 'workbookPasswordCharacterSet', 'revisionsPassword', 

50 'revisionsPasswordCharacterSet', 'lockStructure', 'lockWindows', 'lockRevision', 

51 'revisionsAlgorithmName', 'revisionsHashValue', 'revisionsSaltValue', 

52 'revisionsSpinCount', 'workbookAlgorithmName', 'workbookHashValue', 

53 'workbookSaltValue', 'workbookSpinCount') 

54 

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 

89 

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 

95 

96 @property 

97 def workbookPassword(self): 

98 """Return the workbook password value, regardless of hash.""" 

99 return self._workbook_password 

100 

101 @workbookPassword.setter 

102 def workbookPassword(self, value): 

103 """Set a workbook password directly, forcing a hash step.""" 

104 self.set_workbook_password(value) 

105 

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 

111 

112 @property 

113 def revisionsPassword(self): 

114 """Return the revisions password value, regardless of hash.""" 

115 return self._revisions_password 

116 

117 @revisionsPassword.setter 

118 def revisionsPassword(self, value): 

119 """Set a revisions password directly, forcing a hash step.""" 

120 self.set_revisions_password(value) 

121 

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 

131 

132# Backwards compatibility 

133DocumentSecurity = WorkbookProtection 

134 

135 

136class FileSharing(Serialisable): 

137 

138 tagname = "fileSharing" 

139 

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) 

147 

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