2021-10-16 16:19:51 +01:00
# include "stdafx.h"
# include "OptionsWindow.h"
# include "SandMan.h"
# include "SettingsWindow.h"
# include "../MiscHelpers/Common/Settings.h"
# include "../MiscHelpers/Common/Common.h"
# include "../MiscHelpers/Common/ComboInputDialog.h"
# include "../MiscHelpers/Common/SettingsWidgets.h"
# include "Helpers/WinAdmin.h"
void COptionsWindow : : LoadForced ( )
{
ui . treeForced - > clear ( ) ;
foreach ( const QString & Value , m_pBox - > GetTextList ( " ForceProcess " , m_Template ) )
2021-12-03 19:26:09 +00:00
AddForcedEntry ( Value , ( int ) eProcess ) ;
foreach ( const QString & Value , m_pBox - > GetTextList ( " ForceProcessDisabled " , m_Template ) )
AddForcedEntry ( Value , ( int ) eProcess , true ) ;
2021-10-16 16:19:51 +01:00
foreach ( const QString & Value , m_pBox - > GetTextList ( " ForceFolder " , m_Template ) )
2021-12-03 19:26:09 +00:00
AddForcedEntry ( Value , ( int ) ePath ) ;
foreach ( const QString & Value , m_pBox - > GetTextList ( " ForceFolderDisabled " , m_Template ) )
AddForcedEntry ( Value , ( int ) ePath , true ) ;
2021-10-16 16:19:51 +01:00
2023-04-23 19:08:25 +01:00
ui . chkDisableForced - > setChecked ( m_pBox - > GetBool ( " DisableForceRules " , false ) ) ;
2022-09-29 17:28:48 +01:00
ui . treeBreakout - > clear ( ) ;
foreach ( const QString & Value , m_pBox - > GetTextList ( " BreakoutProcess " , m_Template ) )
AddBreakoutEntry ( Value , ( int ) eProcess ) ;
foreach ( const QString & Value , m_pBox - > GetTextList ( " BreakoutProcessDisabled " , m_Template ) )
AddBreakoutEntry ( Value , ( int ) eProcess , true ) ;
foreach ( const QString & Value , m_pBox - > GetTextList ( " BreakoutFolder " , m_Template ) )
AddBreakoutEntry ( Value , ( int ) ePath ) ;
foreach ( const QString & Value , m_pBox - > GetTextList ( " BreakoutFolderDisabled " , m_Template ) )
AddBreakoutEntry ( Value , ( int ) ePath , true ) ;
2021-10-16 16:19:51 +01:00
LoadForcedTmpl ( ) ;
2022-10-28 18:30:18 +01:00
LoadBreakoutTmpl ( ) ;
2021-10-16 16:19:51 +01:00
m_ForcedChanged = false ;
}
void COptionsWindow : : LoadForcedTmpl ( bool bUpdate )
{
if ( ui . chkShowForceTmpl - > isChecked ( ) )
{
foreach ( const QString & Template , m_pBox - > GetTemplates ( ) )
{
foreach ( const QString & Value , m_pBox - > GetTextListTmpl ( " ForceProcess " , Template ) )
2021-12-03 19:26:09 +00:00
AddForcedEntry ( Value , ( int ) eProcess , false , Template ) ;
2021-10-16 16:19:51 +01:00
foreach ( const QString & Value , m_pBox - > GetTextListTmpl ( " ForceFolder " , Template ) )
2021-12-03 19:26:09 +00:00
AddForcedEntry ( Value , ( int ) ePath , false , Template ) ;
2021-10-16 16:19:51 +01:00
}
}
else if ( bUpdate )
{
for ( int i = 0 ; i < ui . treeForced - > topLevelItemCount ( ) ; )
{
QTreeWidgetItem * pItem = ui . treeForced - > topLevelItem ( i ) ;
int Type = pItem - > data ( 0 , Qt : : UserRole ) . toInt ( ) ;
2021-12-21 13:57:27 +00:00
if ( Type = = ( int ) eTemplate ) {
2021-10-16 16:19:51 +01:00
delete pItem ;
continue ; // entry from template
}
i + + ;
}
2022-10-28 18:30:18 +01:00
}
}
void COptionsWindow : : LoadBreakoutTmpl ( bool bUpdate )
{
if ( ui . chkShowBreakoutTmpl - > isChecked ( ) )
{
foreach ( const QString & Template , m_pBox - > GetTemplates ( ) )
{
foreach ( const QString & Value , m_pBox - > GetTextListTmpl ( " BreakoutProcess " , Template ) )
AddBreakoutEntry ( Value , ( int ) eProcess , false , Template ) ;
2022-09-29 17:28:48 +01:00
2022-10-28 18:30:18 +01:00
foreach ( const QString & Value , m_pBox - > GetTextListTmpl ( " BreakoutFolder " , Template ) )
AddBreakoutEntry ( Value , ( int ) ePath , false , Template ) ;
}
}
else if ( bUpdate )
{
2022-09-29 17:28:48 +01:00
for ( int i = 0 ; i < ui . treeBreakout - > topLevelItemCount ( ) ; )
{
QTreeWidgetItem * pItem = ui . treeBreakout - > topLevelItem ( i ) ;
int Type = pItem - > data ( 0 , Qt : : UserRole ) . toInt ( ) ;
if ( Type = = ( int ) eTemplate ) {
delete pItem ;
continue ; // entry from template
}
i + + ;
}
2021-10-16 16:19:51 +01:00
}
}
2021-12-03 19:26:09 +00:00
void COptionsWindow : : AddForcedEntry ( const QString & Name , int type , bool disabled , const QString & Template )
2021-10-16 16:19:51 +01:00
{
QTreeWidgetItem * pItem = new QTreeWidgetItem ( ) ;
2021-12-03 19:26:09 +00:00
pItem - > setCheckState ( 0 , disabled ? Qt : : Unchecked : Qt : : Checked ) ;
pItem - > setText ( 0 , ( type = = ( int ) eProcess ? tr ( " Process " ) : tr ( " Folder " ) ) + ( Template . isEmpty ( ) ? " " : ( " ( " + Template + " ) " ) ) ) ;
pItem - > setData ( 0 , Qt : : UserRole , Template . isEmpty ( ) ? type : ( int ) eTemplate ) ;
SetProgramItem ( Name , pItem , ( int ) eProcess ) ;
pItem - > setFlags ( pItem - > flags ( ) | Qt : : ItemIsEditable ) ;
2021-10-16 16:19:51 +01:00
ui . treeForced - > addTopLevelItem ( pItem ) ;
}
2022-09-29 17:28:48 +01:00
void COptionsWindow : : AddBreakoutEntry ( const QString & Name , int type , bool disabled , const QString & Template )
{
QTreeWidgetItem * pItem = new QTreeWidgetItem ( ) ;
pItem - > setCheckState ( 0 , disabled ? Qt : : Unchecked : Qt : : Checked ) ;
pItem - > setText ( 0 , ( type = = ( int ) eProcess ? tr ( " Process " ) : tr ( " Folder " ) ) + ( Template . isEmpty ( ) ? " " : ( " ( " + Template + " ) " ) ) ) ;
pItem - > setData ( 0 , Qt : : UserRole , Template . isEmpty ( ) ? type : ( int ) eTemplate ) ;
SetProgramItem ( Name , pItem , ( int ) eProcess ) ;
pItem - > setFlags ( pItem - > flags ( ) | Qt : : ItemIsEditable ) ;
ui . treeBreakout - > addTopLevelItem ( pItem ) ;
}
2021-10-16 16:19:51 +01:00
void COptionsWindow : : SaveForced ( )
{
QStringList ForceProcess ;
2021-12-03 19:26:09 +00:00
QStringList ForceProcessDisabled ;
2021-10-16 16:19:51 +01:00
QStringList ForceFolder ;
2021-12-03 19:26:09 +00:00
QStringList ForceFolderDisabled ;
2021-10-16 16:19:51 +01:00
for ( int i = 0 ; i < ui . treeForced - > topLevelItemCount ( ) ; i + + )
{
QTreeWidgetItem * pItem = ui . treeForced - > topLevelItem ( i ) ;
int Type = pItem - > data ( 0 , Qt : : UserRole ) . toInt ( ) ;
2021-12-03 19:26:09 +00:00
if ( Type = = ( int ) eTemplate )
2021-10-16 16:19:51 +01:00
continue ; // entry from template
2021-12-03 19:26:09 +00:00
if ( pItem - > checkState ( 0 ) = = Qt : : Checked ) {
switch ( Type ) {
case eProcess : ForceProcess . append ( pItem - > data ( 1 , Qt : : UserRole ) . toString ( ) ) ; break ;
case ePath : ForceFolder . append ( pItem - > data ( 1 , Qt : : UserRole ) . toString ( ) ) ; break ;
}
}
else {
switch ( Type ) {
case eProcess : ForceProcessDisabled . append ( pItem - > data ( 1 , Qt : : UserRole ) . toString ( ) ) ; break ;
case ePath : ForceFolderDisabled . append ( pItem - > data ( 1 , Qt : : UserRole ) . toString ( ) ) ; break ;
}
2021-10-16 16:19:51 +01:00
}
}
WriteTextList ( " ForceProcess " , ForceProcess ) ;
2021-12-03 19:26:09 +00:00
WriteTextList ( " ForceProcessDisabled " , ForceProcessDisabled ) ;
2021-10-16 16:19:51 +01:00
WriteTextList ( " ForceFolder " , ForceFolder ) ;
2021-12-03 19:26:09 +00:00
WriteTextList ( " ForceFolderDisabled " , ForceFolderDisabled ) ;
2021-10-16 16:19:51 +01:00
2023-04-23 19:08:25 +01:00
WriteAdvancedCheck ( ui . chkDisableForced , " DisableForceRules " , " y " , " " ) ;
2022-09-29 17:28:48 +01:00
QStringList BreakoutProcess ;
QStringList BreakoutProcessDisabled ;
QStringList BreakoutFolder ;
QStringList BreakoutFolderDisabled ;
for ( int i = 0 ; i < ui . treeBreakout - > topLevelItemCount ( ) ; i + + )
{
QTreeWidgetItem * pItem = ui . treeBreakout - > topLevelItem ( i ) ;
int Type = pItem - > data ( 0 , Qt : : UserRole ) . toInt ( ) ;
if ( Type = = ( int ) eTemplate )
continue ; // entry from template
if ( pItem - > checkState ( 0 ) = = Qt : : Checked ) {
switch ( Type ) {
case eProcess : BreakoutProcess . append ( pItem - > data ( 1 , Qt : : UserRole ) . toString ( ) ) ; break ;
case ePath : BreakoutFolder . append ( pItem - > data ( 1 , Qt : : UserRole ) . toString ( ) ) ; break ;
}
}
else {
switch ( Type ) {
case eProcess : BreakoutProcessDisabled . append ( pItem - > data ( 1 , Qt : : UserRole ) . toString ( ) ) ; break ;
case ePath : BreakoutFolderDisabled . append ( pItem - > data ( 1 , Qt : : UserRole ) . toString ( ) ) ; break ;
}
}
}
WriteTextList ( " BreakoutProcess " , BreakoutProcess ) ;
WriteTextList ( " BreakoutProcessDisabled " , BreakoutProcessDisabled ) ;
WriteTextList ( " BreakoutFolder " , BreakoutFolder ) ;
WriteTextList ( " BreakoutFolderDisabled " , BreakoutFolderDisabled ) ;
2021-10-16 16:19:51 +01:00
m_ForcedChanged = false ;
}
void COptionsWindow : : OnForceProg ( )
{
QString Value = SelectProgram ( ) ;
if ( Value . isEmpty ( ) )
return ;
2021-12-03 19:26:09 +00:00
AddForcedEntry ( Value , ( int ) eProcess ) ;
2023-10-22 13:49:41 +01:00
OnForcedChanged ( ) ;
2021-10-16 16:19:51 +01:00
}
2022-09-29 17:28:48 +01:00
void COptionsWindow : : OnBreakoutProg ( )
{
QString Value = SelectProgram ( ) ;
if ( Value . isEmpty ( ) )
return ;
2023-10-22 13:49:41 +01:00
if ( ! CheckForcedItem ( Value , ( int ) eProcess ) )
return ;
2022-09-29 17:28:48 +01:00
AddBreakoutEntry ( Value , ( int ) eProcess ) ;
2023-10-22 13:49:41 +01:00
OnForcedChanged ( ) ;
2022-09-29 17:28:48 +01:00
}
void COptionsWindow : : OnForceBrowse ( )
{
QString Value = QFileDialog : : getOpenFileName ( this , tr ( " Select Executable File " ) , " " , tr ( " Executable Files (*.exe) " ) ) ;
if ( Value . isEmpty ( ) )
return ;
2023-10-22 13:49:41 +01:00
if ( ! CheckForcedItem ( Value , ( int ) eProcess ) )
return ;
2022-09-29 17:28:48 +01:00
AddForcedEntry ( Split2 ( Value , " / " , true ) . second , ( int ) eProcess ) ;
2023-10-22 13:49:41 +01:00
OnForcedChanged ( ) ;
2022-09-29 17:28:48 +01:00
}
void COptionsWindow : : OnBreakoutBrowse ( )
{
QString Value = QFileDialog : : getOpenFileName ( this , tr ( " Select Executable File " ) , " " , tr ( " Executable Files (*.exe) " ) ) ;
if ( Value . isEmpty ( ) )
return ;
AddBreakoutEntry ( Split2 ( Value , " / " , true ) . second , ( int ) eProcess ) ;
2023-10-22 13:49:41 +01:00
OnForcedChanged ( ) ;
2022-09-29 17:28:48 +01:00
}
2021-10-16 16:19:51 +01:00
void COptionsWindow : : OnForceDir ( )
{
QString Value = QFileDialog : : getExistingDirectory ( this , tr ( " Select Directory " ) ) . replace ( " / " , " \\ " ) ;
if ( Value . isEmpty ( ) )
return ;
2023-10-22 13:49:41 +01:00
if ( ! CheckForcedItem ( Value , ( int ) ePath ) )
return ;
2021-12-03 19:26:09 +00:00
AddForcedEntry ( Value , ( int ) ePath ) ;
2023-10-22 13:49:41 +01:00
OnForcedChanged ( ) ;
2021-10-16 16:19:51 +01:00
}
2022-09-29 17:28:48 +01:00
void COptionsWindow : : OnBreakoutDir ( )
{
QString Value = QFileDialog : : getExistingDirectory ( this , tr ( " Select Directory " ) ) . replace ( " / " , " \\ " ) ;
if ( Value . isEmpty ( ) )
return ;
AddBreakoutEntry ( Value , ( int ) ePath ) ;
2023-10-22 13:49:41 +01:00
OnForcedChanged ( ) ;
2022-09-29 17:28:48 +01:00
}
2021-10-16 16:19:51 +01:00
void COptionsWindow : : OnDelForce ( )
{
DeleteAccessEntry ( ui . treeForced - > currentItem ( ) ) ;
2023-10-22 13:49:41 +01:00
OnForcedChanged ( ) ;
2021-10-16 16:19:51 +01:00
}
2021-12-03 19:26:09 +00:00
2022-09-29 17:28:48 +01:00
void COptionsWindow : : OnDelBreakout ( )
{
DeleteAccessEntry ( ui . treeBreakout - > currentItem ( ) ) ;
2023-10-22 13:49:41 +01:00
OnForcedChanged ( ) ;
2022-09-29 17:28:48 +01:00
}
2023-10-22 13:49:41 +01:00
void COptionsWindow : : OnForcedChanged ( )
2021-12-03 19:26:09 +00:00
{
m_ForcedChanged = true ;
OnOptChanged ( ) ;
2022-09-29 17:28:48 +01:00
}
2023-10-22 13:49:41 +01:00
bool COptionsWindow : : CheckForcedItem ( const QString & Value , int type )
{
bool bDangerous = false ;
QString winPath = QString : : fromUtf8 ( qgetenv ( " SystemRoot " ) ) ;
if ( type = = eProcess )
{
if ( Value . compare ( " explorer.exe " , Qt : : CaseInsensitive ) = = 0 | | Value . compare ( winPath + " \\ explorer.exe " , Qt : : CaseInsensitive ) = = 0 )
bDangerous = true ;
else if ( Value . compare ( " taskmgr.exe " , Qt : : CaseInsensitive ) = = 0 | | Value . compare ( winPath + " \\ system32 \\ taskmgr.exe " , Qt : : CaseInsensitive ) = = 0 )
bDangerous = true ;
else if ( Value . contains ( " sbiesvc.exe " , Qt : : CaseInsensitive ) = = 0 )
bDangerous = true ;
else if ( Value . contains ( " sandman.exe " , Qt : : CaseInsensitive ) = = 0 )
bDangerous = true ;
}
else
{
if ( Value . left ( 3 ) . compare ( winPath . left ( 3 ) , Qt : : CaseInsensitive ) = = 0 )
bDangerous = true ; // SystemDrive (C:\)
else if ( Value . compare ( winPath , Qt : : CaseInsensitive ) = = 0 )
bDangerous = true ; // SystemRoot (C:\Windows)
else if ( Value . left ( winPath . length ( ) + 1 ) . compare ( winPath + " \\ " , Qt : : CaseInsensitive ) = = 0 )
bDangerous = true ; // sub path of C:\Windows
}
if ( bDangerous & & QMessageBox : : warning ( this , " Sandboxie-Plus " , tr ( " The forcing the specified folder will most likely break windows, are you sure you want to proceed? " )
, QDialogButtonBox : : Yes , QDialogButtonBox : : No ) ! = QDialogButtonBox : : Yes )
return false ;
return true ;
}
void COptionsWindow : : OnForcedChanged ( QTreeWidgetItem * pItem , int )
{
QString Value = pItem - > data ( 1 , Qt : : UserRole ) . toString ( ) ;
if ( pItem - > checkState ( 0 ) = = Qt : : Checked & & ! CheckForcedItem ( Value , pItem - > data ( 0 , Qt : : UserRole ) . toInt ( ) ) )
pItem - > setCheckState ( 0 , Qt : : Unchecked ) ;
//qDebug() << Test;
OnForcedChanged ( ) ;
}
2023-10-22 14:08:33 +01:00
void COptionsWindow : : OnBreakoutChanged ( QTreeWidgetItem * pItem , int )
{
OnForcedChanged ( ) ;
}