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