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("\t") + m_Normal
[i
]);
109 for (i
= 0; i
< m_Negative
.GetSize(); i
+= 2)
110 m_NegativeRights
.AddString(m_Negative
[i
+ 1] + _T("\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("\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("\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(_T("r")) == -1) ? UNCHECKED
: CHECKED
);
200 m_WritePerm
.SetCheck((strRights
.Find(_T("w")) == -1) ? UNCHECKED
: CHECKED
);
201 m_LookupPerm
.SetCheck((strRights
.Find(_T("l")) == -1) ? UNCHECKED
: CHECKED
);
202 m_DeletePerm
.SetCheck((strRights
.Find(_T("d")) == -1) ? UNCHECKED
: CHECKED
);
203 m_InsertPerm
.SetCheck((strRights
.Find(_T("i")) == -1) ? UNCHECKED
: CHECKED
);
204 m_LockPerm
.SetCheck((strRights
.Find(_T("k")) == -1) ? UNCHECKED
: CHECKED
);
205 m_AdminPerm
.SetCheck((strRights
.Find(_T("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("\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(_T("")); // 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
);