forked from sheetjs/sheetjs
		
	feat: Add Sheet Protection for XLS (BIFF8) (#3202)
Fixes #3201 Reviewed-on: sheetjs/sheetjs#3202 Co-authored-by: Lucas Picchi <lucas.picchi@exeo.com.ar> Co-committed-by: Lucas Picchi <lucas.picchi@exeo.com.ar>
This commit is contained in:
		
							parent
							
								
									235ed7ccfb
								
							
						
					
					
						commit
						6c0f950f83
					
				| @ -431,8 +431,56 @@ function write_FMTS_biff8(ba, NF/*:?SSFTable*/, opts) { | ||||
| 	}); | ||||
| } | ||||
| 
 | ||||
| function write_ws_protect_biff8(sp) { | ||||
| 	/* SheetProtection */ | ||||
| 	let flags = 0x0000; | ||||
| 	[ | ||||
| 		["objects",             false, 0x0001], // fObjects - Bit 0 (Edit objects)
 | ||||
| 		["scenarios",           false, 0x0002], // fScenarios - Bit 1 (Edit scenarios)
 | ||||
| 		["formatCells",          true, 0x0004], // fFormatCells - Bit 2 (Change cell formatting)
 | ||||
| 		["formatColumns",        true, 0x0008], // fFormatColumns - Bit 3 (Change column formatting)
 | ||||
| 		["formatRows",           true, 0x0010], // fFormatRows - Bit 4 (Change row formatting)
 | ||||
| 		["insertColumns",        true, 0x0020], // fInsertColumns - Bit 5 (Insert columns)
 | ||||
| 		["insertRows",           true, 0x0040], // fInsertRows - Bit 6 (Insert rows)
 | ||||
| 		["insertHyperlinks",     true, 0x0080], // fInsertHyperlinks - Bit Bit 7 (Insert hyperlinks)
 | ||||
| 		["deleteColumns",        true, 0x0100], // fDeleteColumns - Bit 8 (Delete columns)
 | ||||
| 		["deleteRows",           true, 0x0200], // fDeleteRows - Bit 9 (Delete rows)
 | ||||
| 		["selectLockedCells",   false, 0x0400], // fSelLockedCells - Bit 10 (Select locked cells)
 | ||||
| 		["sort",                 true, 0x0800], // fSort - Bit 11 (Sort a cell range)
 | ||||
| 		["autoFilter",           true, 0x1000], // fAutoFilter - Bit 12 (Edit auto filters)
 | ||||
| 		["pivotTables",          true, 0x2000], // fPivotTables - Bit 13 (Edit PivotTables)
 | ||||
| 		["selectUnlockedCells", false, 0x4000]  // fSelUnlockedCells - Bit 14 (Select unlocked cells)
 | ||||
| 	].forEach(function(n) { | ||||
| 		if(n[1]) flags |= sp[n[0]] != null && !sp[n[0]] ? n[2] : 0x0000 | ||||
| 		else     flags |= sp[n[0]] != null && sp[n[0]] ? 0x0000 : n[2]; | ||||
| 	}); | ||||
| 
 | ||||
| 	/* [MS-XLS] 2.4.112 */ | ||||
| 	const featHdr = new_buf(23); | ||||
| 	/* [MS-XLS] 2.5.135 */ | ||||
| 	featHdr.write_shift(2, 0x0867) | ||||
| 	featHdr.write_shift(2, 0x0000); | ||||
| 	featHdr.write_shift(4, 0x00000000) | ||||
| 	featHdr.write_shift(4, 0x00000000) | ||||
| 	/* [MS-XLS] 2.5.237 */ | ||||
| 	featHdr.write_shift(2, 0x0002); // SharedFeatureType ISFPROTECTION
 | ||||
| 	/* Reserved byte */ | ||||
| 	featHdr.write_shift(1, 0x01); | ||||
| 	/* cbHdrData */ | ||||
| 	featHdr.write_shift(4, 0xffffffff); | ||||
| 	/* [MS-XLS] 2.5.104 */ | ||||
| 	featHdr.write_shift(4, flags) | ||||
| 
 | ||||
| 	return featHdr | ||||
| } | ||||
| 
 | ||||
| function write_FEAT(ba, ws) { | ||||
| 	/* [MS-XLS] 2.4.112 */ | ||||
| 	/* ISFPROTECTION */ | ||||
| 	if(ws['!protect']){ | ||||
| 		write_biff_rec(ba, 0x0867 /* FeatHdr */, write_ws_protect_biff8(ws['!protect'])) | ||||
| 	} | ||||
| 	/* ISFFEC2 */ | ||||
| 	var o = new_buf(19); | ||||
| 	o.write_shift(4, 0x867); o.write_shift(4, 0); o.write_shift(4, 0); | ||||
| 	o.write_shift(2, 3); o.write_shift(1, 1); o.write_shift(4, 0); | ||||
| @ -537,6 +585,14 @@ function write_ws_biff8(idx/*:number*/, opts, wb/*:Workbook*/) { | ||||
| 	/* Footer (string) */ | ||||
| 	write_biff_rec(ba, 0x0083 /* HCenter */, writebool(false)); | ||||
| 	write_biff_rec(ba, 0x0084 /* VCenter */, writebool(false)); | ||||
| 	/* PROTECTION */ | ||||
| 	if(ws['!protect']){ | ||||
| 		const sp = ws['!protect'] | ||||
| 		/* [MS-XLS] 2.4.207 */ | ||||
| 		write_biff_rec(ba, 0x0012 /* Protect */, writeuint16(1)); | ||||
| 		/* [MS-XLS] 2.4.191 */ | ||||
| 		if(sp.password) write_biff_rec(ba, 0x0013 /* Password */, writeuint16(crypto_CreatePasswordVerifier_Method1(sp.password))); | ||||
| 	} | ||||
| 	/* ... */ | ||||
| 	if(b8) write_ws_cols_biff8(ba, ws["!cols"]); | ||||
| 	/* ... */ | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user