
Just a test with the outdated openssl on most Macs…
Hope I did not make too many mistakes…
Newer openssl will say that "you better use different parameters"…
Thanks Forum!
Dedicated to mksoft, because he made me less scared about callbacks, threads and cleaning pools in PB
Code: Select all
EnableExplicit
#default_pw = "by Piero 2025"
Procedure.s enc_dec(text.s, pass.s, de.s="e"); "d" = decrypt
Protected ssl,Output$
pass=URLEncoder(pass)+"'!!'\''!!&;:\/?><,~@#$%^&*)(}{_+-][~='"; beware of '\'' (if shell stdin)
ssl = RunProgram("/usr/bin/openssl","aes-256-cbc -"+de+" -A -a -k "+
pass,"",#PB_Program_Open|#PB_Program_Write|#PB_Program_Read)
If ssl
If de="d"
WriteProgramStringN(ssl,text)
Else
WriteProgramStringN(ssl,URLEncoder(text))
EndIf
WriteProgramData(ssl,#PB_Program_Eof,0)
While ProgramRunning(ssl)
If AvailableProgramOutput(ssl)
Output$ + ReadProgramString(ssl)
EndIf
Wend
CloseProgram(ssl)
If de="d":Output$=URLDecoder(Output$):EndIf
EndIf
ProcedureReturn Output$
EndProcedure
Procedure.s gzip(text.s,de.s=""); "d" = decompress
Protected gz,Output$
text.s="'" + ReplaceString(text, "'", "'\''") + "'"
gz = RunProgram("/bin/sh","","",#PB_Program_Open|#PB_Program_Write|#PB_Program_Read)
If gz
If de="d"
WriteProgramStringN(gz,"echo "+text+" | /usr/bin/base64 -d | /usr/bin/gzip -d")
Else
WriteProgramStringN(gz,"echo "+text+" | /usr/bin/gzip -9 | /usr/bin/base64")
EndIf
WriteProgramData(gz,#PB_Program_Eof,0)
While ProgramRunning(gz)
If AvailableProgramOutput(gz)
Output$ + ReadProgramString(gz)
EndIf
Wend
CloseProgram(gz)
EndIf
ProcedureReturn Output$
EndProcedure
Procedure.s enc_dec_gzip(text.s,pass.s,de.s=""); "d" = decode
If de="d"
ProcedureReturn URLDecoder(gzip(enc_dec(text,pass,de),de))
Else
ProcedureReturn enc_dec(gzip(URLEncoder(text)),pass)
EndIf
EndProcedure
Structure StringGadgetData
x.i : y.i : w.i : h.i : s.s
EndStructure
Define StringGadgetFlag.a = ~#PB_String_Password
#pwtooltip="Password Input Field"
Procedure ShowHidePass(StringGadget,tooltip.s=#pwtooltip)
Shared StringGadgetFlag
Protected StData.StringGadgetData
StData\x=GadgetX(StringGadget)
StData\y=GadgetY(StringGadget)
StData\w=GadgetWidth(StringGadget)
StData\h=GadgetHeight(StringGadget)
StData\s=GetGadgetText(StringGadget)
If IsGadget(StringGadget):FreeGadget(StringGadget):EndIf
StringGadget(StringGadget,StData\x,StData\y,StData\w,StData\h,StData\s,#PB_String_Password & StringGadgetFlag)
GadgetToolTip(StringGadget,tooltip)
StringGadgetFlag = ~StringGadgetFlag
EndProcedure
Procedure SelectAll(EditorGadgetID.I, SelectAll.I=#True)
CompilerSelect #PB_Compiler_OS
CompilerCase #PB_OS_Linux
Protected TextBuffer.I
Protected StartIter.GtkTextIter
Protected EndIter.GtkTextIter
TextBuffer = gtk_text_view_get_buffer_(GadgetID(EditorGadgetID))
gtk_text_buffer_get_start_iter_(TextBuffer, @StartIter)
gtk_text_buffer_get_end_iter_(TextBuffer, @EndIter)
If SelectAll
gtk_text_buffer_select_range_(TextBuffer, @StartIter, @EndIter)
Else
gtk_text_buffer_select_range_(TextBuffer, @StartIter, @StartIter)
EndIf
CompilerCase #PB_OS_MacOS
Protected Range.NSRange
If SelectAll
CocoaMessage(0, GadgetID(EditorGadgetID), "selectAll:", 0)
Else
Range\length = 0
CocoaMessage(0, GadgetID(EditorGadgetID), "setSelectedRange:@", @Range)
EndIf
CompilerCase #PB_OS_Windows
If SelectAll
SendMessage_(GadgetID(EditorGadgetID), #EM_SETSEL, 0, -1)
Else
SendMessage_(GadgetID(EditorGadgetID), #EM_SETSEL, 0, 0)
EndIf
CompilerEndSelect
EndProcedure
Procedure beep()
CompilerSelect #PB_Compiler_OS
CompilerCase #PB_OS_Linux
RunProgram("/usr/bin/aplay","/usr/share/sounds/sound-icons/prompt.wav 2>/dev/null &","")
CompilerCase #PB_OS_MacOS
NSBeep_()
;RunProgram("osascript","-e beep","")
CompilerCase #PB_OS_Windows
MessageBeep_(#MB_ICONERROR)
CompilerEndSelect
EndProcedure
Enumeration FormGadget
#Window_0
#passw = 0 ; gadgets
#VerifyPassword
#Text_1
#Process
#Paste
#CopyQuit
#input
#output
#Text_2
#HidePassword
EndEnumeration
Procedure OpenWindow_0(x = 0, y = 0, width = 510, height = 440)
OpenWindow(#Window_0, x, y, width, height, "PureMaCrypt0r", #PB_Window_SystemMenu|#PB_Window_Invisible)
StringGadget(#passw, 305, 315, 200, 25, #default_pw, #PB_String_Password)
GadgetToolTip(#passw, #pwtooltip)
TextGadget(#Text_1, 225, 320, 80, 20, "PASSWORD:", #PB_Text_Center)
ButtonGadget(#Process, 305, 365, 200, 30, "Process")
GadgetToolTip(#Process, "Process")
ButtonGadget(#Paste, 305, 280, 200, 30, "Paste")
GadgetToolTip(#Paste, "Paste")
ButtonGadget(#CopyQuit, 305, 400, 200, 30, "Copy Output and Quit")
GadgetToolTip(#CopyQuit, "Copy and Quit")
EditorGadget(#input, 5, 5, 500, 130, #PB_Editor_WordWrap)
GadgetToolTip(#input, "INPUT")
EditorGadget(#output, 5, 140, 500, 130, #PB_Editor_ReadOnly | #PB_Editor_WordWrap)
GadgetToolTip(#output, "OUTPUT")
TextGadget(#Text_2, 5, 415, 300, 20, "Use Mouse to Copy without Quitting")
GadgetToolTip(#Text_2, "By Piero 2025")
CheckBoxGadget(#VerifyPassword, 390, 340, 115, 25, "Verify Password")
GadgetToolTip(#VerifyPassword, "Verify Password")
SetGadgetState(#VerifyPassword, #PB_Checkbox_Checked)
CheckBoxGadget(#HidePassword, 305, 340, 115, 25, "Hide")
GadgetToolTip(#HidePassword, "Hide Password")
SetGadgetState(#HidePassword, #PB_Checkbox_Checked)
EndProcedure
OpenWindow_0()
AddGadgetItem(#input, 0, ~"INPUT\n\nLorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor"+
"incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris"+
"nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum"+
"dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt"+
~"mollit anim id est laborum.\nLorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt"+
"ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip"+
"ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla"+
"pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.")
AddGadgetItem(#output, 0, "OUTPUT")
SetActiveGadget(#passw)
HideWindow (#Window_0,#False)
Procedure Main()
Protected Event, Input$
Repeat
Event = WaitWindowEvent()
Select Event
Case #PB_Event_Gadget
Select EventGadget()
Case #Paste
ClearGadgetItems(#input)
AddGadgetItem(#input, 0, GetClipboardText())
Case #Process
Input$=""
if GetGadgetState(#VerifyPassword)
Input$ = InputRequester("Password Verification", ~"Close this dialog to skip verification\n\n"+
"Please verify your Password:", #default_pw,#PB_InputRequester_Password)
endif
If (Input$ and GetGadgetText(#passw) = Input$) or not (Input$ and GetGadgetState(#VerifyPassword))
ClearGadgetItems(#output)
AddGadgetItem(#output, 0, enc_dec_gzip(GetGadgetText(#input), GetGadgetText(#passw), "d"))
If GetGadgetText(#output) = ""
AddGadgetItem(#output, 0, enc_dec_gzip(GetGadgetText(#input), GetGadgetText(#passw)))
EndIf
SelectAll(#input)
SelectAll(#output)
Debug "Input: "+StringByteLength(GetGadgetText(#input),#PB_UTF8)
Debug "Output: "+StringByteLength(GetGadgetText(#output),#PB_UTF8)+~"\n"
Else
beep()
MessageRequester("", "Password verification failed!", #PB_MessageRequester_Error)
SetActiveGadget(#passw)
EndIf
Case #input
Select EventType()
Case #PB_EventType_Focus: SelectAll(#input)
EndSelect
Case #output
Select EventType()
Case #PB_EventType_Focus: SelectAll(#output)
EndSelect
Case #HidePassword
ShowHidePass(#passw)
SetActiveGadget(#passw)
Case #CopyQuit
SetClipboardText(GetGadgetText(#output))
Break
EndSelect
EndSelect
Until Event = #PB_Event_CloseWindow or EventMenu() = #PB_Menu_Quit
EndProcedure
Main()
Debug "End"