home *** CD-ROM | disk | FTP | other *** search
/ Computer Shopper 217 / DPCS0306DVD.ISO / Toolkit / Internet / FileZilla / Server / FileZilla_Server-0.9.11.exe / source / interface / GroupsDlg.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  2005-08-29  |  13.2 KB  |  545 lines

  1. // FileZilla Server - a Windows ftp server
  2.  
  3. // Copyright (C) 2002-2004 - Tim Kosse <tim.kosse@gmx.de>
  4.  
  5. // This program is free software; you can redistribute it and/or
  6. // modify it under the terms of the GNU General Public License
  7. // as published by the Free Software Foundation; either version 2
  8. // of the License, or (at your option) any later version.
  9.  
  10. // This program is distributed in the hope that it will be useful,
  11. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13. // GNU General Public License for more details.
  14.  
  15. // You should have received a copy of the GNU General Public License
  16. // along with this program; if not, write to the Free Software
  17. // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  18.  
  19. // GroupsDlg.cpp: Implementierungsdatei
  20. //
  21.  
  22. #include "stdafx.h"
  23. #include "FileZilla server.h"
  24. #include "GroupsDlg.h"
  25. #include "misc\md5.h"
  26. #include "misc\sbdestination.h"
  27. #include "entersomething.h"
  28. #include "GroupsDlgGeneral.h"
  29. #include "GroupsDlgSpeedLimit.h"
  30. #include "GroupsDlgSharedFolders.h"
  31. #include "GroupsDlgIpFilter.h"
  32. #include "DeleteGroupInUseDlg.h"
  33.  
  34. #if defined(_DEBUG) && !defined(MMGR)
  35. #define new DEBUG_NEW
  36. #undef THIS_FILE
  37. static char THIS_FILE[] = __FILE__;
  38. #endif
  39.  
  40. /////////////////////////////////////////////////////////////////////////////
  41. // Dialogfeld CGroupsDlg 
  42.  
  43. CGroupsDlg::CGroupsDlg(CWnd* pParent, bool localConnection)
  44.     : CSAPrefsDialog(CGroupsDlg::IDD, pParent)
  45. {
  46.     m_localConnection = localConnection;
  47.  
  48.     m_pGeneralPage = new CGroupsDlgGeneral(this);
  49.     m_pSpeedLimitPage = new CGroupsDlgSpeedLimit(this);
  50.     m_pSharedFoldersPage = new CGroupsDlgSharedFolders(this);
  51.     m_pIpFilterPage = new CGroupsDlgIpFilter(this);
  52.     
  53.     AddPage(*m_pGeneralPage, "General");
  54.     AddPage(*m_pSharedFoldersPage, "Shared folders");
  55.     AddPage(*m_pSpeedLimitPage, "Speed Limits");
  56.     AddPage(*m_pIpFilterPage, "IP Filter");
  57. }
  58.  
  59. CGroupsDlg::~CGroupsDlg()
  60. {
  61.     delete m_pGeneralPage;
  62.     delete m_pSpeedLimitPage;
  63.     delete m_pSharedFoldersPage;
  64.     delete m_pIpFilterPage;
  65. }
  66.  
  67. void CGroupsDlg::DoDataExchange(CDataExchange* pDX)
  68. {
  69.     CSAPrefsDialog::DoDataExchange(pDX);
  70.     //{{AFX_DATA_MAP(CGroupsDlg)
  71.     DDX_Control(pDX, IDC_GROUPS_GROUPLIST, m_cGrouplist);
  72.     //}}AFX_DATA_MAP
  73. }
  74.  
  75. BEGIN_MESSAGE_MAP(CGroupsDlg, CSAPrefsDialog)
  76.     //{{AFX_MSG_MAP(CGroupsDlg)
  77.     ON_LBN_SELCHANGE(IDC_GROUPS_GROUPLIST, OnSelchangeGrouplist)
  78.     ON_WM_CONTEXTMENU()
  79.     ON_COMMAND(ID_GROUPMENU_ADD, OnGroupAdd)
  80.     ON_COMMAND(ID_GROUPMENU_COPY, OnGroupCopy)
  81.     ON_COMMAND(ID_GROUPMENU_REMOVE, OnGroupRemove)
  82.     ON_COMMAND(ID_GROUPMENU_RENAME, OnGroupRename)
  83.     ON_BN_CLICKED(IDC_GROUPS_ADDGROUP, OnGroupAdd)
  84.     ON_BN_CLICKED(IDC_GROUPS_COPYGROUP, OnGroupCopy)
  85.     ON_BN_CLICKED(IDC_GROUPS_REMOVEGROUP, OnGroupRemove)
  86.     ON_BN_CLICKED(IDC_GROUPS_RENAMEGROUP, OnGroupRename)
  87.     //}}AFX_MSG_MAP
  88. END_MESSAGE_MAP()
  89.  
  90. /////////////////////////////////////////////////////////////////////////////
  91. // Behandlungsroutinen fⁿr Nachrichten CGroupsDlg 
  92.  
  93. BOOL CGroupsDlg::OnInitDialog() 
  94. {
  95.     CSAPrefsDialog::OnInitDialog();
  96.     
  97.     m_oldgroup = LB_ERR;
  98.     m_cGrouplist.ResetContent();    
  99.     UpdateData(FALSE);
  100.     for (unsigned int i = 0; i < m_GroupsList.size(); i++)
  101.     {
  102.         int index = m_cGrouplist.AddString(m_GroupsList[i].group);
  103.         m_cGrouplist.SetItemData(index, i);
  104.     }
  105.                 
  106.     if (m_GroupsList.size())
  107.     {
  108.         m_cGrouplist.SetCurSel(0);
  109.         OnSelchangeGrouplist();
  110.     }
  111.  
  112.     SetCtrlState();
  113.  
  114.     return TRUE;  // return TRUE unless you set the focus to a control
  115.                   // EXCEPTION: OCX-Propertypages should return FALSE
  116. }
  117.  
  118. BOOL CGroupsDlg::Validate()
  119. {
  120.     CString res = m_pGeneralPage->Validate();
  121.     if (res != _T(""))
  122.     {
  123.         ShowPage(m_pGeneralPage);
  124.         m_cGrouplist.SetCurSel(m_oldgroup);
  125.         MessageBox(res);
  126.         return FALSE;
  127.     }
  128.     res = m_pSpeedLimitPage->Validate();
  129.     if (res != _T(""))
  130.     {
  131.         ShowPage(m_pSpeedLimitPage);
  132.         m_cGrouplist.SetCurSel(m_oldgroup);
  133.         MessageBox(res);
  134.         return FALSE;
  135.     }
  136.     res = m_pSharedFoldersPage->Validate();
  137.     if (res != _T(""))
  138.     {
  139.         ShowPage(m_pSharedFoldersPage);
  140.         m_cGrouplist.SetCurSel(m_oldgroup);
  141.         MessageBox(res);
  142.         return FALSE;
  143.     }        
  144.     res = m_pIpFilterPage->Validate();
  145.     if (res != _T(""))
  146.     {
  147.         ShowPage(m_pIpFilterPage);
  148.         m_cGrouplist.SetCurSel(m_oldgroup);
  149.         MessageBox(res);
  150.         return FALSE;
  151.     }    
  152.     return TRUE;
  153. }
  154.  
  155. void CGroupsDlg::OnSelchangeGrouplist() 
  156. {
  157.     if (!Validate())
  158.         return;
  159.     if (m_oldgroup != LB_ERR)
  160.     {
  161.         int oldindex = m_cGrouplist.GetItemData(m_oldgroup);
  162.         VERIFY(m_pGeneralPage->SaveGroup(&m_GroupsList[oldindex]));
  163.         VERIFY(m_pSpeedLimitPage->SaveGroup(&m_GroupsList[oldindex]));
  164.         VERIFY(m_pSharedFoldersPage->SaveGroup(&m_GroupsList[oldindex]));
  165.         VERIFY(m_pIpFilterPage->SaveGroup(&m_GroupsList[oldindex]));
  166.     }
  167.     int nItem = m_cGrouplist.GetCurSel();
  168.     if (nItem != LB_ERR)
  169.     {
  170.         m_oldgroup = nItem;
  171.         int index = m_cGrouplist.GetItemData(nItem);
  172.         VERIFY(m_pGeneralPage->DisplayGroup(&m_GroupsList[index]));
  173.         VERIFY(m_pSpeedLimitPage->DisplayGroup(&m_GroupsList[index]));
  174.         VERIFY(m_pSharedFoldersPage->DisplayGroup(&m_GroupsList[index]));
  175.         VERIFY(m_pIpFilterPage->DisplayGroup(&m_GroupsList[index]));
  176.     }
  177.     else
  178.     {
  179.         VERIFY(m_pGeneralPage->DisplayGroup(NULL));
  180.         VERIFY(m_pSpeedLimitPage->DisplayGroup(NULL));
  181.         VERIFY(m_pSharedFoldersPage->DisplayGroup(NULL));
  182.         VERIFY(m_pIpFilterPage->DisplayGroup(NULL));
  183.     }
  184.  
  185.     SetCtrlState();
  186. }
  187.  
  188. void CGroupsDlg::OnOK() 
  189. {
  190.     if (!Validate())
  191.         return;
  192.     m_cGrouplist.SetCurSel(-1);
  193.     OnSelchangeGrouplist();
  194.     
  195.     CSAPrefsDialog::OnOK();
  196. }
  197.  
  198. void CGroupsDlg::OnContextMenu(CWnd* pWnd, CPoint point) 
  199. {
  200.     if (pWnd==&m_cGrouplist)
  201.     {
  202.         CMenu menu;
  203.         menu.LoadMenu(IDR_GROUPCONTEXT);
  204.  
  205.         CMenu* pPopup = menu.GetSubMenu(0);
  206.         ASSERT(pPopup != NULL);
  207.         CWnd* pWndPopupOwner = this;
  208.         while (pWndPopupOwner->GetStyle() & WS_CHILD)
  209.             pWndPopupOwner = pWndPopupOwner->GetParent();
  210.         
  211.         if (m_cGrouplist.GetCurSel()==LB_ERR)
  212.         {
  213.             pPopup->EnableMenuItem(ID_GROUPMENU_COPY, MF_GRAYED);
  214.             pPopup->EnableMenuItem(ID_GROUPMENU_REMOVE, MF_GRAYED);
  215.             pPopup->EnableMenuItem(ID_GROUPMENU_RENAME, MF_GRAYED);
  216.         }
  217.         if (point.x==-1)
  218.             GetCursorPos(&point);
  219.         pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y,
  220.             pWndPopupOwner);
  221.     }
  222. }
  223.  
  224. void CGroupsDlg::OnGroupAdd() 
  225. {
  226.     if (!Validate())
  227.         return;
  228.  
  229.     CEnterSomething dlg(IDS_ADDGROUPDIALOG);
  230.     if (dlg.DoModal()==IDOK)
  231.     {
  232.         CString newname=dlg.m_String;
  233.         newname.MakeLower();
  234.         for (int i=0; i<m_cGrouplist.GetCount(); i++)
  235.         {
  236.             CString str;
  237.             m_cGrouplist.GetText(i, str);
  238.             str.MakeLower();
  239.             if (str==newname)
  240.             {
  241.                 AfxMessageBox(IDS_ERRORMSG_GROUPALREADYEXISTS);
  242.                 return;
  243.             }
  244.         }
  245.  
  246.         t_group group;
  247.         group.group = dlg.m_String;
  248.         group.nBypassUserLimit = 0;
  249.         group.nIpLimit = 0;
  250.         group.nUserLimit = 0;
  251.         group.forceSsl = 0;
  252.         int nItem = m_cGrouplist.AddString(group.group);
  253.         if (nItem <= m_oldgroup)
  254.             m_oldgroup++;
  255.         m_GroupsList.push_back(group);
  256.         m_cGrouplist.SetItemData(nItem, m_GroupsList.size()-1);
  257.         m_cGrouplist.SetCurSel(nItem);    
  258.         OnSelchangeGrouplist();
  259.     }
  260. }
  261.  
  262. void CGroupsDlg::OnGroupCopy() 
  263. {
  264.     if (!Validate())
  265.         return;
  266.  
  267.     int pos = m_cGrouplist.GetCurSel();
  268.     if (pos==LB_ERR)
  269.         return;
  270.     int index = m_cGrouplist.GetItemData(pos);
  271.  
  272.     CEnterSomething dlg(IDS_COPYGROUPDIALOG);
  273.     if (dlg.DoModal()==IDOK)
  274.     {
  275.         int i;
  276.         CString newname = dlg.m_String;
  277.         newname.MakeLower();
  278.         for (i=0;i<m_cGrouplist.GetCount();i++)
  279.         {
  280.             CString str;
  281.             m_cGrouplist.GetText(i,str);
  282.             str.MakeLower();
  283.             if (str==newname)
  284.             {
  285.                 AfxMessageBox(IDS_ERRORMSG_GROUPALREADYEXISTS);
  286.                 return;
  287.             }
  288.         }
  289.         
  290.         t_group group = m_GroupsList[index];
  291.         group.group = dlg.m_String;
  292.         
  293.         int nItem = m_cGrouplist.AddString(group.group);
  294.         if (nItem <= m_oldgroup)
  295.             m_oldgroup++;
  296.         m_GroupsList.push_back(group);
  297.         m_cGrouplist.SetItemData(nItem, m_GroupsList.size()-1);
  298.         m_cGrouplist.SetCurSel(nItem);    
  299.  
  300.         OnSelchangeGrouplist();
  301.     }    
  302. }
  303.  
  304.  
  305. void CGroupsDlg::OnGroupRemove() 
  306. {
  307.     int pos = m_cGrouplist.GetCurSel();
  308.     if (pos == LB_ERR)
  309.         return;
  310.     int index = m_cGrouplist.GetItemData(pos);
  311.     m_oldgroup = LB_ERR;
  312.     
  313.     unsigned int i = 0;
  314.     CString oldName;
  315.     m_cGrouplist.GetText(pos, oldName);
  316.     for (i = 0; i < m_UsersList.size(); i++)
  317.     {
  318.         if (!m_UsersList[i].group.CompareNoCase(oldName))
  319.         {
  320.             CDeleteGroupInUseDlg dlg;
  321.             dlg.m_groupName = oldName;
  322.             dlg.m_GroupsList = &m_GroupsList;
  323.             if (dlg.DoModal() != IDOK)
  324.                 return;
  325.  
  326.             if (!dlg.m_action)
  327.             {
  328.                 for (unsigned int i = 0; i < m_UsersList.size(); i++)
  329.                 {
  330.                     t_user& user = m_UsersList[i];
  331.                     if (user.group.CompareNoCase(oldName))
  332.                         continue;
  333.                     user.group = dlg.m_groupName;
  334.                 }
  335.             }
  336.             else
  337.             {
  338.                 // Delete affected users
  339.                 t_UsersList newList;
  340.                 for (unsigned int i = 0; i < m_UsersList.size(); i++)
  341.                 {
  342.                     if (m_UsersList[i].group.CompareNoCase(oldName))
  343.                         newList.push_back(m_UsersList[i]);
  344.                 }
  345.                 m_UsersList = newList;
  346.             }
  347.         }
  348.     }
  349.     
  350.     i = 0;
  351.     for (t_GroupsList::iterator iter = m_GroupsList.begin(); iter != m_GroupsList.end(); iter++, i++)
  352.         if (i == index)
  353.         {
  354.             m_GroupsList.erase(iter);
  355.             break;
  356.         }
  357.     for (i = 0; i < (unsigned int)m_cGrouplist.GetCount(); i++)
  358.     {
  359.         int data = m_cGrouplist.GetItemData(i);
  360.         if (data > index)
  361.             m_cGrouplist.SetItemData(i, data-1);
  362.     }
  363.     m_cGrouplist.DeleteString(pos);
  364.     OnSelchangeGrouplist();
  365. }
  366.  
  367. void CGroupsDlg::OnGroupRename() 
  368. {
  369.     if (!Validate())
  370.         return;
  371.  
  372.     int pos=m_cGrouplist.GetCurSel();
  373.     if (pos==LB_ERR)
  374.         return;
  375.     int index=m_cGrouplist.GetItemData(pos);
  376.  
  377.     CEnterSomething dlg(IDS_INPUTDIALOGTEXT_RENAME);
  378.     if (dlg.DoModal()==IDOK)
  379.     {
  380.         CString newname=dlg.m_String;
  381.         newname.MakeLower();
  382.         for (int i = 0; i < m_cGrouplist.GetCount(); i++)
  383.         {
  384.             if (i == pos)
  385.                 continue;
  386.  
  387.             CString str;
  388.             m_cGrouplist.GetText(i, str);
  389.             str.MakeLower();
  390.             if (str == newname)
  391.             {
  392.                 AfxMessageBox(IDS_ERRORMSG_GROUPALREADYEXISTS);
  393.                 return;
  394.             }
  395.         }
  396.         
  397.         CString oldName;
  398.         m_cGrouplist.GetText(pos, oldName);
  399.         m_cGrouplist.DeleteString(pos);
  400.         pos = m_cGrouplist.AddString(dlg.m_String);
  401.         m_cGrouplist.SetItemData(pos,index);
  402.         m_cGrouplist.SetCurSel(pos);    
  403.         m_oldgroup = pos;
  404.         m_GroupsList[index].group = dlg.m_String;
  405.  
  406.         for (unsigned int i = 0; i < m_UsersList.size(); i++)
  407.         {
  408.             if (!m_UsersList[i].group.CompareNoCase(oldName))
  409.                 m_UsersList[i].group = dlg.m_String;
  410.         }
  411.  
  412.         OnSelchangeGrouplist();
  413.     }
  414. }
  415.  
  416. void CGroupsDlg::SetCtrlState()
  417. {
  418.     if (m_cGrouplist.GetCurSel() == LB_ERR)
  419.     {
  420.         GetDlgItem(IDC_GROUPS_REMOVEGROUP)->EnableWindow(FALSE);
  421.         GetDlgItem(IDC_GROUPS_RENAMEGROUP)->EnableWindow(FALSE);
  422.         GetDlgItem(IDC_GROUPS_COPYGROUP)->EnableWindow(FALSE);
  423.     }
  424.     else
  425.     {
  426.         GetDlgItem(IDC_GROUPS_REMOVEGROUP)->EnableWindow(TRUE);
  427.         GetDlgItem(IDC_GROUPS_RENAMEGROUP)->EnableWindow(TRUE);
  428.         GetDlgItem(IDC_GROUPS_COPYGROUP)->EnableWindow(TRUE);    
  429.     }
  430.     m_pGeneralPage->SetCtrlState();
  431.     m_pSpeedLimitPage->SetCtrlState();
  432.     m_pSharedFoldersPage->SetCtrlState();
  433.     m_pIpFilterPage->SetCtrlState();
  434. }
  435.  
  436. BOOL CGroupsDlg::GetAsCommand(char **pBuffer, DWORD *nBufferLength)
  437. {
  438.     if (!pBuffer)
  439.         return FALSE;
  440.  
  441.     DWORD len = 4;
  442.  
  443.     t_GroupsList::iterator groupiter;
  444.     for (groupiter=m_GroupsList.begin(); groupiter!=m_GroupsList.end(); groupiter++)
  445.         len += groupiter->GetRequiredBufferLen();
  446.  
  447.     t_UsersList::iterator iter;
  448.     for (iter=m_UsersList.begin(); iter!=m_UsersList.end(); iter++)
  449.         len += iter->GetRequiredBufferLen();
  450.  
  451.     *pBuffer=new char[len];
  452.     char *p=*pBuffer;
  453.  
  454.     *p++ = m_GroupsList.size()/256;
  455.     *p++ = m_GroupsList.size()%256;
  456.     for (groupiter=m_GroupsList.begin(); groupiter!=m_GroupsList.end(); groupiter++)
  457.     {
  458.         p = groupiter->FillBuffer(p);
  459.         if (!p)
  460.         {
  461.             delete [] *pBuffer;
  462.             *pBuffer = NULL;
  463.             return FALSE;
  464.         }        
  465.     }
  466.  
  467.     *p++ = m_UsersList.size()/256;
  468.     *p++ = m_UsersList.size()%256;
  469.     for (iter=m_UsersList.begin(); iter!=m_UsersList.end(); iter++)
  470.     {
  471.         p = iter->FillBuffer(p);
  472.         if (!p)
  473.         {
  474.             delete [] *pBuffer;
  475.             *pBuffer = NULL;
  476.             return FALSE;
  477.         }
  478.     }
  479.         
  480.     *nBufferLength = len;
  481.  
  482.     return TRUE;
  483. }
  484.  
  485. BOOL CGroupsDlg::Init(unsigned char *pData, DWORD dwDataLength)
  486. {
  487.     unsigned char *p=pData;
  488.     unsigned int i;
  489.  
  490.     if (dwDataLength < 2)
  491.         return FALSE;
  492.     unsigned int num = *p * 256 + p[1];
  493.     p+=2;
  494.     for (i=0; i<num; i++)
  495.     {
  496.         t_group group;
  497.         
  498.         p = group.ParseBuffer(p, dwDataLength-(p-pData));
  499.         if (!p)
  500.             return FALSE;
  501.         m_GroupsList.push_back(group);
  502.     }
  503.  
  504.     if ((UINT)(p-pData+2)>dwDataLength)
  505.         return FALSE;
  506.     num = *p * 256 + p[1];
  507.     p+=2;
  508.     for (i=0; i<num; i++)
  509.     {
  510.         t_user user;
  511.         
  512.         p = user.ParseBuffer(p, dwDataLength-(p-pData));
  513.         if (!p)
  514.             return FALSE;
  515.         m_UsersList.push_back(user);
  516.     }
  517.     return TRUE;
  518. }
  519.  
  520. BOOL CGroupsDlg::PreTranslateMessage(MSG* pMsg) 
  521. {
  522.     if (pMsg->message==WM_KEYDOWN)
  523.     {
  524.         if (pMsg->wParam==VK_F2)
  525.         {
  526.             if (GetFocus() == &m_cGrouplist)
  527.             {
  528.                 if (m_cGrouplist.GetCurSel() == LB_ERR)
  529.                     return TRUE;
  530.                 OnGroupRename();
  531.             }
  532.             return TRUE;
  533.         }
  534.     }
  535.     return CSAPrefsDialog::PreTranslateMessage(pMsg);
  536. }
  537.  
  538. t_group* CGroupsDlg::GetCurrentGroup()
  539. {
  540.     if (m_cGrouplist.GetCurSel() == LB_ERR)
  541.         return NULL;
  542.     else
  543.         return &m_GroupsList[m_cGrouplist.GetItemData(m_cGrouplist.GetCurSel())];
  544. }
  545.