<> <> <> <> <> <> <> DIRECTORY Buttons, Containers, Commander, Encrypt, FS, IO, Menus, MessageWindow, PutGet, Rope, TEditDocument, TiogaExtraOps, TiogaOps, ViewerClasses, ViewerOps, ViewerTools; EncryptTool: CEDAR PROGRAM IMPORTS Buttons, Commander, Containers, Encrypt, FS, IO, Menus, MessageWindow, PutGet, Rope, TiogaExtraOps, TiogaOps, ViewerOps, ViewerTools = BEGIN EncryptHandle: TYPE = REF EncryptToolRec; EncryptToolRec: TYPE = RECORD [ outer: Containers.Container _ NIL, key: Rope.ROPE _ NIL, keyViewer: ViewerClasses.Viewer _ NIL, files: ViewerClasses.Viewer _ NIL ]; EncryptedText: TYPE = Rope.ROPE; SelectKey: Buttons.ButtonProc = BEGIN handle: EncryptHandle = NARROW[clientData]; ViewerTools.SetContents[handle.keyViewer, handle.key]; ViewerTools.SetSelection[handle.keyViewer]; handle.keyViewer.newVersion _ TRUE; -- forces stars to return on button op END; SelectFiles: Buttons.ButtonProc = BEGIN handle: EncryptHandle = NARROW[clientData]; ViewerTools.SetSelection[handle.files]; END; GetKey: PROC [handle: EncryptHandle] RETURNS [Rope.ROPE] = BEGIN IF handle.keyViewer.newVersion THEN BEGIN handle.key _ ViewerTools.GetContents[handle.keyViewer]; ViewerTools.SetContents[handle.keyViewer, "*****"]; handle.keyViewer.newVersion _ FALSE; END; RETURN[handle.key]; END; EncryptFiles: Buttons.ButtonProc = BEGIN handle: EncryptHandle = NARROW[clientData]; key: Rope.ROPE = GetKey[handle]; inputs: IO.STREAM = IO.RIS[ViewerTools.GetContents[handle.files]]; sourceFile: Rope.ROPE; sourceFile _ inputs.GetTokenRope[IO.IDProc ! IO.EndOfStream => {sourceFile _ NIL; CONTINUE}].token; IF Rope.Length[key]=0 THEN BEGIN MessageWindow.Append["Please enter an encryption key", TRUE]; MessageWindow.Blink[]; END ELSE WHILE sourceFile#NIL DO destFile: Rope.ROPE = Rope.Concat[sourceFile, ".des"]; Encrypt.EncryptFile[plain: sourceFile, cipher: destFile, key: key ! FS.Error => BEGIN MessageWindow.Append[IO.PutFR["Trouble encrypting file ""%g"" because %g. Aborting encryption.", IO.rope[sourceFile], IO.rope[error.explanation]], TRUE]; MessageWindow.Blink[]; EXIT; END; ]; sourceFile _ inputs.GetTokenRope[IO.IDProc ! IO.EndOfStream => {sourceFile _ NIL; CONTINUE}].token; ENDLOOP; END; DecryptFiles: Buttons.ButtonProc = BEGIN handle: EncryptHandle = NARROW[clientData]; key: Rope.ROPE = GetKey[handle]; outputs: IO.STREAM = IO.RIS[ViewerTools.GetContents[handle.files]]; destFile: Rope.ROPE; destFile _ outputs.GetTokenRope[IO.IDProc ! IO.EndOfStream => {destFile _ NIL; CONTINUE}].token; IF Rope.Length[key]=0 THEN BEGIN MessageWindow.Append["Please enter an encryption key", TRUE]; MessageWindow.Blink[]; END ELSE WHILE destFile#NIL DO sourceFile: Rope.ROPE = Rope.Concat[destFile, ".des"]; Encrypt.DecryptFile[plain: destFile, cipher: sourceFile, key: key ! FS.Error => BEGIN MessageWindow.Append[IO.PutFR["Trouble encrypting file ""%g"" because %g. Aborting encryption.", IO.rope[sourceFile], IO.rope[error.explanation]], TRUE]; MessageWindow.Blink[]; EXIT; END; Encrypt.BadEncryption => BEGIN MessageWindow.Append[IO.PutFR["File ""%g"" isn't properly encrypted or you gave me the wrong key.", IO.rope[destFile]], TRUE]; MessageWindow.Blink[]; EXIT; END; ]; destFile _ outputs.GetTokenRope[IO.IDProc ! IO.EndOfStream => {destFile _ NIL; CONTINUE}].token; ENDLOOP; END; EncryptSelection: Buttons.ButtonProc = BEGIN OPEN TiogaOps; DoEncrypt: PROC [root: TiogaOps.Ref] = BEGIN [start: start, end: end, viewer: viewer] _ GetSelection[]; ProcessSelection[root, start.node, end.node, EncryptBranch, key, viewer]; END; EncryptBranch: PROC [node: TiogaOps.Ref, key: Rope.ROPE] = BEGIN IF GetProp[node, $EncryptedChars]=NIL THEN TRUSTED BEGIN doNext: BOOL; cipher: Rope.ROPE; TiogaOps.SetSelection[viewer, [node, 0], [node, 0], point, TRUE, TRUE]; <> doNext _ Rope.Size[TiogaOps.GetRope[TiogaOps.GetCaret[].node]] # 0; TiogaOps.Break[]; -- insert a fake root node in front of the branch node _ TiogaOps.GetCaret[].node; IF doNext THEN node _ TiogaOps.Next[node]; TiogaOps.SelectBranches[viewer, node, node, node, TRUE, TRUE]; -- select the branch TiogaOps.Nest[]; -- nest it under the extra node node _ TiogaOps.Parent[TiogaOps.GetCaret[].node]; -- get the extra node again cipher _ Encrypt.EncryptRope[plain: PutGet.ToRope[LOOPHOLE[node]].output, key: key]; TiogaOps.SelectBranches[viewer, node, node, node, TRUE, TRUE]; <