2 * Copyright 2000, International Business Machines Corporation and others.
5 * This software has been released under the terms of the IBM Public
6 * License. For details, see the LICENSE file in the top-level source
7 * directory or online at http://www.openafs.org/dl/license10.html
15 #include <afs/param.h>
19 #include "afs_shl_ext.h"
20 #include "set_afs_acl.h"
21 #include "clear_acl_dlg.h"
22 #include "add_acl_entry_dlg.h"
23 #include "copy_acl_dlg.h"
29 static char THIS_FILE[] = __FILE__;
32 /////////////////////////////////////////////////////////////////////////////
36 CSetAfsAcl::CSetAfsAcl(CWnd* pParent /*=NULL*/)
39 InitModalIndirect (TaLocale_GetDialogResource (CSetAfsAcl::IDD), pParent);
41 //{{AFX_DATA_INIT(CSetAfsAcl)
48 void CSetAfsAcl::DoDataExchange(CDataExchange* pDX)
50 CDialog::DoDataExchange(pDX);
51 //{{AFX_DATA_MAP(CSetAfsAcl)
52 DDX_Control(pDX, IDC_REMOVE, m_Remove);
53 DDX_Control(pDX, IDC_ADMINISTER, m_AdminPerm);
54 DDX_Control(pDX, IDC_LOCK, m_LockPerm);
55 DDX_Control(pDX, IDC_INSERT, m_InsertPerm);
56 DDX_Control(pDX, IDC_DELETE, m_DeletePerm);
57 DDX_Control(pDX, IDC_LOOKUP, m_LookupPerm);
58 DDX_Control(pDX, IDC_WRITE, m_WritePerm);
59 DDX_Control(pDX, IDC_READ, m_ReadPerm);
60 DDX_Control(pDX, IDC_DIR_NAME, m_DirName);
61 DDX_Control(pDX, IDC_NEGATIVE_ENTRIES, m_NegativeRights);
62 DDX_Control(pDX, IDC_NORMAL_RIGHTS, m_NormalRights);
66 BEGIN_MESSAGE_MAP(CSetAfsAcl, CDialog)
67 //{{AFX_MSG_MAP(CSetAfsAcl)
68 ON_BN_CLICKED(IDC_CLEAR, OnClear)
69 ON_BN_CLICKED(IDC_ADD, OnAdd)
70 ON_BN_CLICKED(IDC_COPY, OnCopy)
71 ON_LBN_SELCHANGE(IDC_NORMAL_RIGHTS, OnSelChangeNormalRights)
72 ON_LBN_SELCHANGE(IDC_NEGATIVE_ENTRIES, OnSelChangeNegativeEntries)
73 ON_BN_CLICKED(IDC_ADMINISTER, OnPermChange)
74 ON_BN_CLICKED(IDC_REMOVE, OnRemove)
75 ON_BN_CLICKED(IDC_CLEAN, OnClean)
76 ON_BN_CLICKED(IDC_DELETE, OnPermChange)
77 ON_BN_CLICKED(IDC_INSERT, OnPermChange)
78 ON_BN_CLICKED(IDC_LOCK, OnPermChange)
79 ON_BN_CLICKED(IDC_LOOKUP, OnPermChange)
80 ON_BN_CLICKED(IDC_READ, OnPermChange)
81 ON_BN_CLICKED(IDC_WRITE, OnPermChange)
82 ON_BN_CLICKED(IDHELP, OnHelp)
86 /////////////////////////////////////////////////////////////////////////////
87 // CSetAfsAcl message handlers
89 BOOL CSetAfsAcl::OnInitDialog()
91 CDialog::OnInitDialog();
93 if (!GetRights(m_strDir, m_Normal, m_Negative)) {
98 m_DirName.SetWindowText(m_strDir);
100 EnablePermChanges(FALSE);
102 m_NormalRights.SetTabStops(58);
103 m_NegativeRights.SetTabStops(58);
106 for (i = 0; i < m_Normal.GetSize(); i += 2)
107 m_NormalRights.AddString(m_Normal[i + 1] + "\t" + m_Normal[i]);
109 for (i = 0; i < m_Negative.GetSize(); i += 2)
110 m_NegativeRights.AddString(m_Negative[i + 1] + "\t" + m_Negative[i]);
114 return TRUE; // return TRUE unless you set the focus to a control
115 // EXCEPTION: OCX Property Pages should return FALSE
118 void CSetAfsAcl::OnClear()
122 if (dlg.DoModal() == IDCANCEL)
125 BOOL bNormal, bNegative, bClearRights = FALSE;
127 dlg.GetSettings(bNormal, bNegative);
130 m_Normal.RemoveAll();
131 m_NormalRights.ResetContent();
132 if (m_bShowingNormal)
137 m_Negative.RemoveAll();
138 m_NegativeRights.ResetContent();
139 if (!m_bShowingNormal)
147 void CSetAfsAcl::OnAdd()
153 if (dlg.DoModal() == IDCANCEL)
158 CString name = dlg.GetName();
159 CString rights = dlg.GetRights();
160 BOOL bNormal = dlg.IsNormal();
164 m_Normal.Add(rights);
165 m_nCurSel = m_NormalRights.AddString(rights + "\t" + name);
166 m_NormalRights.SetSel(m_nCurSel);
167 m_bShowingNormal = TRUE;
169 m_Negative.Add(name);
170 m_Negative.Add(rights);
171 m_nCurSel = m_NegativeRights.AddString(rights + "\t" + name);
172 m_NegativeRights.SetSel(m_nCurSel);
173 m_bShowingNormal = FALSE;
177 EnablePermChanges(TRUE);
182 void CSetAfsAcl::OnCopy()
186 dlg.SetFromDir(m_strDir);
188 if (dlg.DoModal() == IDCANCEL)
191 CString strToDir = dlg.GetToDir();
192 BOOL bClear = dlg.GetClear();
194 CopyACL(strToDir, m_Normal, m_Negative, bClear);
197 void CSetAfsAcl::ShowRights(const CString& strRights)
199 m_ReadPerm.SetCheck((strRights.Find("r") == -1) ? UNCHECKED : CHECKED);
200 m_WritePerm.SetCheck((strRights.Find("w") == -1) ? UNCHECKED : CHECKED);
201 m_LookupPerm.SetCheck((strRights.Find("l") == -1) ? UNCHECKED : CHECKED);
202 m_DeletePerm.SetCheck((strRights.Find("d") == -1) ? UNCHECKED : CHECKED);
203 m_InsertPerm.SetCheck((strRights.Find("i") == -1) ? UNCHECKED : CHECKED);
204 m_LockPerm.SetCheck((strRights.Find("k") == -1) ? UNCHECKED : CHECKED);
205 m_AdminPerm.SetCheck((strRights.Find("a") == -1) ? UNCHECKED : CHECKED);
208 void CSetAfsAcl::OnSelChangeNormalRights()
210 m_NegativeRights.SetSel(-1, FALSE);
212 m_bShowingNormal = TRUE;
214 int nNum = m_NormalRights.GetSelCount();
217 EnablePermChanges(FALSE);
221 ASSERT(nNum == 1); // I'm paranoid
223 VERIFY(m_NormalRights.GetSelItems(1, &m_nCurSel) == 1);
225 CString strRights = m_Normal[(m_nCurSel * 2) + 1];
226 ShowRights(strRights);
231 void CSetAfsAcl::OnSelChangeNegativeEntries()
233 m_NormalRights.SetSel(-1, FALSE);
235 m_bShowingNormal = FALSE;
237 int nNum = m_NegativeRights.GetSelCount();
240 EnablePermChanges(FALSE);
244 ASSERT(nNum == 1); // I'm paranoid
246 VERIFY(m_NegativeRights.GetSelItems(1, &m_nCurSel) == 1);
248 CString strRights = m_Negative[(m_nCurSel * 2) + 1];
249 ShowRights(strRights);
254 CString CSetAfsAcl::MakeRightsString()
258 if (m_ReadPerm.GetCheck() == CHECKED)
260 if (m_LookupPerm.GetCheck() == CHECKED)
262 if (m_InsertPerm.GetCheck() == CHECKED)
264 if (m_DeletePerm.GetCheck() == CHECKED)
266 if (m_WritePerm.GetCheck() == CHECKED)
268 if (m_LockPerm.GetCheck() == CHECKED)
270 if (m_AdminPerm.GetCheck() == CHECKED)
276 void CSetAfsAcl::OnPermChange()
278 CListBox *pRightsList;
279 CStringArray *pRights;
281 if (m_bShowingNormal) {
282 pRightsList = &m_NormalRights;
285 pRightsList = &m_NegativeRights;
286 pRights = &m_Negative;
289 ASSERT(m_nCurSel >= 0);
291 CString str = MakeRightsString();
292 (*pRights)[(2 * m_nCurSel) + 1] = str;
293 str += "\t" + (*pRights)[(2 * m_nCurSel)];
295 pRightsList->DeleteString(m_nCurSel);
296 pRightsList->InsertString(m_nCurSel, str);
297 pRightsList->SetSel(m_nCurSel);
302 void CSetAfsAcl::OnRemove()
304 CListBox *pRightsList;
305 CStringArray *pRights;
307 if (m_bShowingNormal) {
308 pRightsList = &m_NormalRights;
311 pRightsList = &m_NegativeRights;
312 pRights = &m_Negative;
315 int nNum = pRightsList->GetSelCount();
322 ASSERT(FALSE); // How can this ever be 0?
323 ASSERT(m_nCurSel >= 0);
324 pRightsList->DeleteString(m_nCurSel);
325 pRights->RemoveAt(m_nCurSel * 2, 2);
327 int *pIndexes = new int[nNum];
328 VERIFY(pRightsList->GetSelItems(nNum, pIndexes) != LB_ERR);
330 for (int i = nNum - 1; i >= 0; i--) {
331 pRightsList->DeleteString(pIndexes[i]);
332 pRights->RemoveAt(pIndexes[i] * 2, 2);
343 void CSetAfsAcl::EnablePermChanges(BOOL bEnable)
345 m_ReadPerm.EnableWindow(bEnable);
346 m_WritePerm.EnableWindow(bEnable);
347 m_LookupPerm.EnableWindow(bEnable);
348 m_DeletePerm.EnableWindow(bEnable);
349 m_InsertPerm.EnableWindow(bEnable);
350 m_LockPerm.EnableWindow(bEnable);
351 m_AdminPerm.EnableWindow(bEnable);
354 void CSetAfsAcl::OnNothingSelected()
356 //m_NormalRights.SetSel(-1,FALSE); // Unselect any selected normal rights
357 //m_NegativeRights.SetSel(-1,FALSE); // Unselect any selected negative rights
359 for (int i=0;i < m_NormalRights.GetCount();i++)
361 m_NormalRights.SetSel(i, FALSE);
363 for (int i=0;i < m_NegativeRights.GetCount();i++)
365 m_NegativeRights.SetSel(i, FALSE);
367 ShowRights(""); // Show no rights
368 EnablePermChanges(FALSE); // Allow no rights changes
369 m_Remove.EnableWindow(FALSE); // Disable remove button
372 void CSetAfsAcl::OnSelection()
374 EnablePermChanges(TRUE);
375 m_Remove.EnableWindow(TRUE);
378 void CSetAfsAcl::OnOK()
380 if (m_bChanges && !SaveACL(m_strCellName, m_strDir, m_Normal, m_Negative))
386 void CSetAfsAcl::OnClean()
395 BOOL CSetAfsAcl::IsNameInUse(BOOL bNormal, const CString& strName)
398 for (int i = 0; i < m_Normal.GetSize(); i += 2)
399 if (m_Normal[i] == strName)
405 for (int i = 0; i < m_Negative.GetSize(); i += 2)
406 if (m_Negative[i] == strName)
412 void CSetAfsAcl::OnHelp()
414 ShowHelp(m_hWnd, SET_AFS_ACL_HELP_ID);