1 | /* |
2 | SPDX-FileCopyrightText: 2005 Sean Harmer <sh@rama.homelinux.org> |
3 | SPDX-FileCopyrightText: 2005-2007 Till Adam <adam@kde.org> |
4 | |
5 | SPDX-License-Identifier: LGPL-2.0-or-later |
6 | */ |
7 | |
8 | #ifndef KACLEDITWIDGET_P_H |
9 | #define KACLEDITWIDGET_P_H |
10 | |
11 | #include <config-kiowidgets.h> |
12 | |
13 | #if HAVE_POSIX_ACL || defined(Q_MOC_RUN) |
14 | #include <kacl.h> |
15 | #include <sys/acl.h> |
16 | |
17 | #include <QDialog> |
18 | #include <QHash> |
19 | #include <QTreeWidget> |
20 | |
21 | #include <QComboBox> |
22 | #include <kfileitem.h> |
23 | |
24 | class KACLListViewItem; |
25 | class QButtonGroup; |
26 | class KACLListView; |
27 | class QStackedWidget; |
28 | class QCheckBox; |
29 | class QAbstractButton; |
30 | class QColorGroup; |
31 | |
32 | /** |
33 | @author Sean Harmer |
34 | */ |
35 | class KACLListView : public QTreeWidget |
36 | { |
37 | Q_OBJECT |
38 | friend class KACLListViewItem; |
39 | |
40 | public: |
41 | enum Types { |
42 | OWNER_IDX = 0, |
43 | GROUP_IDX, |
44 | OTHERS_IDX, |
45 | MASK_IDX, |
46 | NAMED_USER_IDX, |
47 | NAMED_GROUP_IDX, |
48 | LAST_IDX, |
49 | }; |
50 | enum EntryType { |
51 | User = 1, |
52 | Group = 2, |
53 | Others = 4, |
54 | Mask = 8, |
55 | NamedUser = 16, |
56 | NamedGroup = 32, |
57 | AllTypes = 63, |
58 | }; |
59 | |
60 | explicit KACLListView(QWidget *parent = nullptr); |
61 | ~KACLListView() override; |
62 | |
63 | bool hasMaskEntry() const |
64 | { |
65 | return m_hasMask; |
66 | } |
67 | bool hasDefaultEntries() const; |
68 | bool allowDefaults() const |
69 | { |
70 | return m_allowDefaults; |
71 | } |
72 | void setAllowDefaults(bool v) |
73 | { |
74 | m_allowDefaults = v; |
75 | } |
76 | unsigned short maskPermissions() const; |
77 | void setMaskPermissions(unsigned short maskPerms); |
78 | acl_perm_t maskPartialPermissions() const; |
79 | void setMaskPartialPermissions(acl_perm_t maskPerms); |
80 | |
81 | bool maskCanBeDeleted() const; |
82 | bool defaultMaskCanBeDeleted() const; |
83 | |
84 | const KACLListViewItem *findDefaultItemByType(EntryType type) const; |
85 | const KACLListViewItem *findItemByType(EntryType type, bool defaults = false) const; |
86 | unsigned short calculateMaskValue(bool defaults) const; |
87 | void calculateEffectiveRights(); |
88 | |
89 | QStringList allowedUsers(bool defaults, KACLListViewItem *allowedItem = nullptr); |
90 | QStringList allowedGroups(bool defaults, KACLListViewItem *allowedItem = nullptr); |
91 | |
92 | KACL getACL(); |
93 | KACL getDefaultACL(); |
94 | |
95 | public Q_SLOTS: |
96 | void slotAddEntry(); |
97 | void slotEditEntry(); |
98 | void slotRemoveEntry(); |
99 | void setACL(const KACL &anACL); |
100 | void setDefaultACL(const KACL &anACL); |
101 | |
102 | QSize sizeHint() const override; |
103 | |
104 | protected Q_SLOTS: |
105 | void slotItemClicked(QTreeWidgetItem *pItem, int col); |
106 | void slotItemDoubleClicked(QTreeWidgetItem *item, int col); |
107 | |
108 | protected: |
109 | void contentsMousePressEvent(QMouseEvent *e); |
110 | |
111 | private: |
112 | void fillItemsFromACL(const KACL &pACL, bool defaults = false); |
113 | KACL itemsToACL(bool defaults) const; |
114 | |
115 | KACL m_ACL; |
116 | KACL m_defaultACL; |
117 | unsigned short m_mask; |
118 | bool m_hasMask; |
119 | bool m_allowDefaults; |
120 | QStringList m_allUsers; |
121 | QStringList m_allGroups; |
122 | }; |
123 | |
124 | class EditACLEntryDialog : public QDialog |
125 | { |
126 | Q_OBJECT |
127 | public: |
128 | EditACLEntryDialog(KACLListView *listView, |
129 | KACLListViewItem *item, |
130 | const QStringList &users, |
131 | const QStringList &groups, |
132 | const QStringList &defaultUsers, |
133 | const QStringList &defaultGroups, |
134 | int allowedTypes = KACLListView::AllTypes, |
135 | int allowedDefaultTypes = KACLListView::AllTypes, |
136 | bool allowDefault = false); |
137 | KACLListViewItem *item() const |
138 | { |
139 | return m_item; |
140 | } |
141 | public Q_SLOTS: |
142 | void slotOk(); |
143 | void slotSelectionChanged(QAbstractButton *); |
144 | private Q_SLOTS: |
145 | void slotUpdateAllowedUsersAndGroups(); |
146 | void slotUpdateAllowedTypes(); |
147 | |
148 | private: |
149 | KACLListView *m_listView; |
150 | KACLListViewItem *m_item; |
151 | QStringList m_users; |
152 | QStringList m_groups; |
153 | QStringList m_defaultUsers; |
154 | QStringList m_defaultGroups; |
155 | int m_allowedTypes; |
156 | int m_allowedDefaultTypes; |
157 | QButtonGroup *m_buttonGroup; |
158 | QComboBox *m_usersCombo; |
159 | QComboBox *m_groupsCombo; |
160 | QStackedWidget *m_widgetStack; |
161 | QCheckBox *m_defaultCB; |
162 | QHash<QAbstractButton *, int> m_buttonIds; |
163 | }; |
164 | |
165 | class KACLListViewItem : public QTreeWidgetItem |
166 | { |
167 | public: |
168 | KACLListViewItem(QTreeWidget *parent, KACLListView::EntryType type, unsigned short value, bool defaultEntry, const QString &qualifier = QString()); |
169 | ~KACLListViewItem() override; |
170 | QString key() const; |
171 | bool operator<(const QTreeWidgetItem &other) const override; |
172 | |
173 | void calcEffectiveRights(); |
174 | |
175 | bool isDeletable() const; |
176 | bool isAllowedToChangeType() const; |
177 | |
178 | void togglePerm(acl_perm_t perm); |
179 | |
180 | void updatePermissionIcons(); |
181 | void repaint(); |
182 | |
183 | KACLListView::EntryType type; |
184 | unsigned short value; |
185 | bool isDefault; |
186 | QString qualifier; |
187 | bool isPartial; |
188 | |
189 | private: |
190 | KACLListView *m_pACLListView; |
191 | }; |
192 | |
193 | #endif |
194 | #endif |
195 | |