home *** CD-ROM | disk | FTP | other *** search
/ Computer Shopper 217 / DPCS0306DVD.ISO / Toolkit / Internet / FileZilla / Server / FileZilla_Server-0.9.11.exe / source / interface / UsersDlg.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  2005-08-29  |  12.9 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. // UsersDlg.cpp: Implementierungsdatei
  20. //
  21.  
  22. #include "stdafx.h"
  23. #include "FileZilla server.h"
  24. #include "UsersDlg.h"
  25. #include "misc\md5.h"
  26. #include "misc\sbdestination.h"
  27. #include "entersomething.h"
  28. #include "NewUserDlg.h"
  29. #include "UsersDlgGeneral.h"
  30. #include "UsersDlgSpeedLimit.h"
  31. #include "UsersDlgSharedFolders.h"
  32. #include "UsersDlgIpFilter.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 CUsersDlg 
  42.  
  43. CUsersDlg::CUsersDlg(CWnd* pParent, bool localConnection)
  44.     : CSAPrefsDialog(IDD, pParent)
  45. {
  46.     m_localConnection = localConnection;
  47.  
  48.     m_pGeneralPage = new CUsersDlgGeneral(this);
  49.     m_pSpeedLimitPage = new CUsersDlgSpeedLimit(this);
  50.     m_pSharedFoldersPage = new CUsersDlgSharedFolders(this);
  51.     m_pIpFilterPage = new CUsersDlgIpFilter(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. CUsersDlg::~CUsersDlg()
  60. {
  61.     delete m_pGeneralPage;
  62.     delete m_pSpeedLimitPage;
  63.     delete m_pSharedFoldersPage;
  64.     delete m_pIpFilterPage;
  65. }
  66.  
  67.  
  68. void CUsersDlg::DoDataExchange(CDataExchange* pDX)
  69. {
  70.     CSAPrefsDialog::DoDataExchange(pDX);
  71.     //{{AFX_DATA_MAP(CUsersDlg)
  72.     DDX_Control(pDX, IDC_USERLIST, m_cUserlist);
  73.     //}}AFX_DATA_MAP
  74. }
  75.  
  76.  
  77. BEGIN_MESSAGE_MAP(CUsersDlg, CSAPrefsDialog)
  78.     //{{AFX_MSG_MAP(CUsersDlg)
  79.     ON_LBN_SELCHANGE(IDC_USERLIST, OnSelchangeUserlist)
  80.     ON_WM_CONTEXTMENU()
  81.     ON_COMMAND(ID_USERMENU_ADD, OnUsermenuAdd)
  82.     ON_COMMAND(ID_USERMENU_COPY, OnUsermenuCopy)
  83.     ON_COMMAND(ID_USERMENU_REMOVE, OnUsermenuRemove)
  84.     ON_COMMAND(ID_USERMENU_RENAME, OnUsermenuRename)
  85.     ON_BN_CLICKED(IDC_USERADD, OnUseradd)
  86.     ON_BN_CLICKED(IDC_USERCOPY, OnUsercopy)
  87.     ON_BN_CLICKED(IDC_USERREMOVE, OnUserremove)
  88.     ON_BN_CLICKED(IDC_USERRENAME, OnUserrename)
  89.     //}}AFX_MSG_MAP
  90. END_MESSAGE_MAP()
  91.  
  92. /////////////////////////////////////////////////////////////////////////////
  93. // Behandlungsroutinen fⁿr Nachrichten CUsersDlg 
  94.  
  95. BOOL CUsersDlg::OnInitDialog() 
  96. {
  97.     CSAPrefsDialog::OnInitDialog();
  98.  
  99.     m_olduser = LB_ERR;
  100.     
  101.     m_cUserlist.ResetContent();    
  102.  
  103.     for (unsigned int i=0;i<m_UsersList.size();i++)
  104.     {
  105.         int index=m_cUserlist.AddString(m_UsersList[i].user);
  106.         m_cUserlist.SetItemData(index, i);
  107.     }
  108.  
  109.     if (m_UsersList.size())
  110.     {
  111.         m_cUserlist.SetCurSel(0);
  112.         OnSelchangeUserlist();
  113.     }
  114.     
  115.     SetCtrlState();
  116.  
  117.     return TRUE;  // return TRUE unless you set the focus to a control
  118.                   // EXCEPTION: OCX-Eigenschaftenseiten sollten FALSE zurⁿckgeben
  119. }
  120.  
  121. BOOL CUsersDlg::Validate()
  122. {
  123.     CString res = m_pGeneralPage->Validate();
  124.     if (res != _T(""))
  125.     {
  126.         ShowPage(m_pGeneralPage);
  127.         m_cUserlist.SetCurSel(m_olduser);
  128.         MessageBox(res);
  129.         return FALSE;
  130.     }
  131.     res = m_pSpeedLimitPage->Validate();
  132.     if (res != _T(""))
  133.     {
  134.         ShowPage(m_pSpeedLimitPage);
  135.         m_cUserlist.SetCurSel(m_olduser);
  136.         MessageBox(res);
  137.         return FALSE;
  138.     }
  139.     res = m_pSharedFoldersPage->Validate();
  140.     if (res != _T(""))
  141.     {
  142.         ShowPage(m_pSharedFoldersPage);
  143.         m_cUserlist.SetCurSel(m_olduser);
  144.         MessageBox(res);
  145.         return FALSE;
  146.     }
  147.     res = m_pIpFilterPage->Validate();
  148.     if (res != _T(""))
  149.     {
  150.         ShowPage(m_pIpFilterPage);
  151.         m_cUserlist.SetCurSel(m_olduser);
  152.         MessageBox(res);
  153.         return FALSE;
  154.     }
  155.     return TRUE;
  156. }
  157.  
  158. void CUsersDlg::OnSelchangeUserlist() 
  159. {
  160.     if (!Validate())
  161.         return;
  162.     if (m_olduser!=LB_ERR)
  163.     {
  164.         int oldindex = m_cUserlist.GetItemData(m_olduser);
  165.         VERIFY(m_pGeneralPage->SaveUser(&m_UsersList[oldindex]));
  166.         VERIFY(m_pSpeedLimitPage->SaveUser(&m_UsersList[oldindex]));
  167.         VERIFY(m_pSharedFoldersPage->SaveUser(&m_UsersList[oldindex]));
  168.         VERIFY(m_pIpFilterPage->SaveUser(&m_UsersList[oldindex]));
  169.     }
  170.     int nItem = m_cUserlist.GetCurSel();
  171.     if (nItem!=LB_ERR)
  172.     {
  173.         m_olduser = nItem;
  174.         int index = m_cUserlist.GetItemData(nItem);
  175.         VERIFY(m_pGeneralPage->DisplayUser(&m_UsersList[index]));
  176.         VERIFY(m_pSpeedLimitPage->DisplayUser(&m_UsersList[index]));
  177.         VERIFY(m_pSharedFoldersPage->DisplayUser(&m_UsersList[index]));
  178.         VERIFY(m_pIpFilterPage->DisplayUser(&m_UsersList[index]));
  179.     }
  180.     else
  181.     {
  182.         VERIFY(m_pGeneralPage->DisplayUser(NULL));
  183.         VERIFY(m_pSpeedLimitPage->DisplayUser(NULL));
  184.         VERIFY(m_pSharedFoldersPage->DisplayUser(0));
  185.         VERIFY(m_pIpFilterPage->DisplayUser(0));
  186.     }
  187.     m_pGeneralPage->UpdateData(FALSE);
  188.  
  189.     SetCtrlState();
  190. }
  191.  
  192. void CUsersDlg::OnOK() 
  193. {
  194.     if (!Validate())
  195.         return;
  196.     m_cUserlist.SetCurSel(-1);
  197.     OnSelchangeUserlist();
  198.     
  199.     CSAPrefsDialog::OnOK();
  200. }
  201.  
  202. void CUsersDlg::OnContextMenu(CWnd* pWnd, CPoint point) 
  203. {
  204.     if (pWnd == &m_cUserlist)
  205.     {
  206.         CMenu menu;
  207.         menu.LoadMenu(IDR_USERCONTEXT);
  208.  
  209.         CMenu* pPopup = menu.GetSubMenu(0);
  210.         ASSERT(pPopup != NULL);
  211.         CWnd* pWndPopupOwner = this;
  212.         while (pWndPopupOwner->GetStyle() & WS_CHILD)
  213.             pWndPopupOwner = pWndPopupOwner->GetParent();
  214.         
  215.         if (m_cUserlist.GetCurSel() == LB_ERR)
  216.         {
  217.             pPopup->EnableMenuItem(ID_USERMENU_COPY, MF_GRAYED);
  218.             pPopup->EnableMenuItem(ID_USERMENU_REMOVE, MF_GRAYED);
  219.             pPopup->EnableMenuItem(ID_USERMENU_RENAME, MF_GRAYED);
  220.         }
  221.         if (point.x == -1)
  222.             GetCursorPos(&point);
  223.         pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y,
  224.             pWndPopupOwner);
  225.     }
  226. }
  227.  
  228. void CUsersDlg::OnUsermenuAdd() 
  229. {
  230.     if (!Validate())
  231.         return;
  232.  
  233.     CNewUserDlg dlg;
  234.     for (t_GroupsList::iterator iter=m_GroupsList.begin(); iter!=m_GroupsList.end(); iter++)
  235.         dlg.m_GroupList.push_back(iter->group);
  236.     if (dlg.DoModal()==IDOK)
  237.     {
  238.         CString newname = dlg.m_Name;
  239.         newname.MakeLower();
  240.         for (int i=0; i<m_cUserlist.GetCount(); i++)
  241.         {
  242.             CString str;
  243.             m_cUserlist.GetText(i,str);
  244.             str.MakeLower();
  245.             if (str==newname)
  246.             {
  247.                 AfxMessageBox(IDS_ERRORMSG_USERALREADYEXISTS);
  248.                 return;
  249.             }
  250.         }
  251.  
  252.         t_user user;
  253.         user.user = dlg.m_Name;
  254.         if (dlg.m_Group != "")
  255.         {
  256.             user.group = dlg.m_Group;
  257.             user.nBypassUserLimit = 2;
  258.             user.nBypassServerSpeedLimit[download] = 2;
  259.             user.nBypassServerSpeedLimit[upload] = 2;
  260.             user.nEnabled = 2;
  261.             user.forceSsl = 2;
  262.         }
  263.         else
  264.         {
  265.             user.nBypassUserLimit = 0;
  266.             user.nBypassServerSpeedLimit[download] = 0;
  267.             user.nBypassServerSpeedLimit[upload] = 0;
  268.             user.forceSsl = 0;
  269.         }
  270.         user.nIpLimit = 0;
  271.         user.nUserLimit = 0;
  272.         user.password = "";
  273.         int nItem = m_cUserlist.AddString(user.user);
  274.         if (nItem <= m_olduser)
  275.             m_olduser++;
  276.         m_UsersList.push_back(user);
  277.         m_cUserlist.SetItemData(nItem, m_UsersList.size()-1);
  278.         m_cUserlist.SetCurSel(nItem);    
  279.         OnSelchangeUserlist();
  280.     }
  281. }
  282.  
  283. void CUsersDlg::OnUsermenuCopy() 
  284. {
  285.     if (!Validate())
  286.         return;
  287.  
  288.     int pos=m_cUserlist.GetCurSel();
  289.     if (pos==LB_ERR)
  290.         return;
  291.     int index=m_cUserlist.GetItemData(pos);
  292.  
  293.     CEnterSomething dlg(IDS_COPYUSERDIALOG);
  294.     if (dlg.DoModal()==IDOK)
  295.     {
  296.         int i;
  297.         CString newname=dlg.m_String;
  298.         newname.MakeLower();
  299.         for (i=0;i<m_cUserlist.GetCount();i++)
  300.         {
  301.             CString str;
  302.             m_cUserlist.GetText(i,str);
  303.             str.MakeLower();
  304.             if (str==newname)
  305.             {
  306.                 AfxMessageBox(IDS_ERRORMSG_USERALREADYEXISTS);
  307.                 return;
  308.             }
  309.         }
  310.         
  311.         t_user user;
  312.         user.user=dlg.m_String;
  313.         user.nBypassUserLimit = m_UsersList[index].nBypassUserLimit;
  314.         user.nIpLimit = m_UsersList[index].nIpLimit;
  315.         user.nUserLimit = m_UsersList[index].nUserLimit;
  316.         user.password = m_UsersList[index].password;
  317.         for (std::vector<t_directory>::const_iterator iter=m_UsersList[index].permissions.begin(); iter!=m_UsersList[index].permissions.end(); iter++)
  318.             user.permissions.push_back(*iter);
  319.         
  320.         int nItem=m_cUserlist.AddString(user.user);
  321.         if (nItem<=m_olduser)
  322.             m_olduser++;
  323.         m_UsersList.push_back(user);
  324.         m_cUserlist.SetItemData(nItem, m_UsersList.size()-1);
  325.         m_cUserlist.SetCurSel(nItem);    
  326.  
  327.         OnSelchangeUserlist();
  328.     }    
  329. }
  330.  
  331.  
  332. void CUsersDlg::OnUsermenuRemove() 
  333. {
  334.     int pos=m_cUserlist.GetCurSel();
  335.     if (pos==LB_ERR)
  336.         return;
  337.     int index=m_cUserlist.GetItemData(pos);
  338.     m_olduser=LB_ERR;
  339.     int i=0;
  340.     for (t_UsersList::iterator iter=m_UsersList.begin(); iter!=m_UsersList.end(); iter++, i++)
  341.         if (i==index)
  342.         {
  343.             m_UsersList.erase(iter);
  344.             break;
  345.         }
  346.     for (i=0;i<m_cUserlist.GetCount();i++)
  347.     {
  348.         int data=m_cUserlist.GetItemData(i);
  349.         if (data>index)
  350.             m_cUserlist.SetItemData(i, data-1);
  351.     }
  352.     m_cUserlist.DeleteString(pos);
  353.     OnSelchangeUserlist();
  354. }
  355.  
  356. void CUsersDlg::OnUsermenuRename() 
  357. {
  358.     if (!Validate())
  359.         return;
  360.  
  361.     int pos = m_cUserlist.GetCurSel();
  362.     if (pos == LB_ERR)
  363.         return;
  364.     int index=m_cUserlist.GetItemData(pos);
  365.  
  366.     CEnterSomething dlg(IDS_INPUTDIALOGTEXT_RENAME);
  367.     if (dlg.DoModal()==IDOK)
  368.     {
  369.         CString newname=dlg.m_String;
  370.         newname.MakeLower();
  371.         for (int i=0; i < m_cUserlist.GetCount(); i++)
  372.         {
  373.             if (i == pos)
  374.                 continue;
  375.             CString str;
  376.             m_cUserlist.GetText(i,str);
  377.             str.MakeLower();
  378.             if (str == newname)
  379.             {
  380.                 AfxMessageBox(IDS_ERRORMSG_USERALREADYEXISTS);
  381.                 return;
  382.             }
  383.         }
  384.         
  385.         m_cUserlist.DeleteString(pos);
  386.         pos = m_cUserlist.AddString(dlg.m_String);
  387.         m_cUserlist.SetItemData(pos, index);
  388.         m_cUserlist.SetCurSel(pos);    
  389.         m_olduser = pos;
  390.         m_UsersList[index].user = dlg.m_String;
  391.         OnSelchangeUserlist();
  392.     }
  393. }
  394.  
  395. void CUsersDlg::SetCtrlState()
  396. {
  397.     if (m_cUserlist.GetCurSel()==LB_ERR)
  398.     {
  399.         GetDlgItem(IDC_USERREMOVE)->EnableWindow(FALSE);
  400.         GetDlgItem(IDC_USERRENAME)->EnableWindow(FALSE);
  401.         GetDlgItem(IDC_USERCOPY)->EnableWindow(FALSE);
  402.     }
  403.     else
  404.     {
  405.         GetDlgItem(IDC_USERREMOVE)->EnableWindow(TRUE);
  406.         GetDlgItem(IDC_USERRENAME)->EnableWindow(TRUE);
  407.         GetDlgItem(IDC_USERCOPY)->EnableWindow(TRUE);    
  408.     }
  409.     m_pGeneralPage->SetCtrlState();
  410.     m_pSpeedLimitPage->SetCtrlState();
  411.     m_pSharedFoldersPage->SetCtrlState();
  412.     m_pIpFilterPage->SetCtrlState();
  413. }
  414.  
  415. void CUsersDlg::OnUseradd() 
  416. {
  417.     OnUsermenuAdd();
  418. }
  419.  
  420. void CUsersDlg::OnUsercopy() 
  421. {
  422.     OnUsermenuCopy();
  423. }
  424.  
  425. void CUsersDlg::OnUserremove() 
  426. {
  427.     OnUsermenuRemove();
  428. }
  429.  
  430. void CUsersDlg::OnUserrename() 
  431. {
  432.     OnUsermenuRename();
  433. }
  434.  
  435. BOOL CUsersDlg::GetAsCommand(char **pBuffer, DWORD *nBufferLength)
  436. {
  437.     if (!pBuffer)
  438.         return FALSE;
  439.  
  440.     DWORD len = 4;
  441.  
  442.     t_GroupsList::iterator groupiter;
  443.     for (groupiter=m_GroupsList.begin(); groupiter!=m_GroupsList.end(); groupiter++)
  444.         len += groupiter->GetRequiredBufferLen();
  445.  
  446.     t_UsersList::iterator iter;
  447.     for (iter=m_UsersList.begin(); iter!=m_UsersList.end(); iter++)
  448.         len += iter->GetRequiredBufferLen();
  449.  
  450.     *pBuffer=new char[len];
  451.     char *p=*pBuffer;
  452.  
  453.     *p++ = m_GroupsList.size()/256;
  454.     *p++ = m_GroupsList.size()%256;
  455.     for (groupiter=m_GroupsList.begin(); groupiter!=m_GroupsList.end(); groupiter++)
  456.     {
  457.         p = groupiter->FillBuffer(p);
  458.         if (!p)
  459.         {
  460.             delete [] *pBuffer;
  461.             *pBuffer = NULL;
  462.             return FALSE;
  463.         }        
  464.     }
  465.  
  466.     *p++ = m_UsersList.size()/256;
  467.     *p++ = m_UsersList.size()%256;
  468.     for (iter=m_UsersList.begin(); iter!=m_UsersList.end(); iter++)
  469.     {
  470.         p = iter->FillBuffer(p);
  471.         if (!p)
  472.         {
  473.             delete [] *pBuffer;
  474.             *pBuffer = NULL;
  475.             return FALSE;
  476.         }
  477.     }
  478.  
  479.     *nBufferLength = len;
  480.  
  481.     return TRUE;
  482. }
  483.  
  484. BOOL CUsersDlg::Init(unsigned char *pData, DWORD dwDataLength)
  485. {
  486.     unsigned char *p=pData;
  487.     unsigned int i;
  488.  
  489.     if (dwDataLength < 2)
  490.         return FALSE;
  491.     unsigned int num = *p * 256 + p[1];
  492.     p+=2;
  493.     for (i=0; i<num; i++)
  494.     {
  495.         t_group group;
  496.         
  497.         p = group.ParseBuffer(p, dwDataLength-(p-pData));
  498.         if (!p)
  499.             return FALSE;
  500.         m_GroupsList.push_back(group);
  501.     }
  502.  
  503.     if ((UINT)(p-pData+2)>dwDataLength)
  504.         return FALSE;
  505.     num = *p * 256 + p[1];
  506.     p+=2;
  507.     for (i=0; i<num; i++)
  508.     {
  509.         t_user user;
  510.         
  511.         p = user.ParseBuffer(p, dwDataLength-(p-pData));
  512.         if (!p)
  513.             return FALSE;
  514.         m_UsersList.push_back(user);
  515.     }
  516.     return TRUE;
  517. }
  518.  
  519. BOOL CUsersDlg::PreTranslateMessage(MSG* pMsg) 
  520. {
  521.     if (pMsg->message==WM_KEYDOWN)
  522.     {
  523.         if (pMsg->wParam==VK_F2)
  524.         {
  525.             if (GetFocus() == &m_cUserlist)
  526.             {
  527.                 if (m_cUserlist.GetCurSel() == LB_ERR)
  528.                     return TRUE;
  529.                 OnUsermenuRename();
  530.             }
  531.             return TRUE;
  532.         }
  533.     }
  534.     return CSAPrefsDialog::PreTranslateMessage(pMsg);
  535. }
  536.  
  537. t_user* CUsersDlg::GetCurrentUser()
  538. {
  539.     if (m_cUserlist.GetCurSel() == LB_ERR)
  540.         return NULL;
  541.     else
  542.         return &m_UsersList[m_cUserlist.GetItemData(m_cUserlist.GetCurSel())];
  543. }
  544.  
  545.