Skip to content
Clone

feat(authz): phase3a real permission wiring + default member perms + dir visibility into issues

ZhenYi committed
parent f0baf26 commit 339b7ad Browse files

28 files changed

+227 −142

File tree 28
Modified lib/issues/src/services/boards.rs View lib/issues/src/services/boards.rs
@@ -319,7 +319,7 @@
319319 ) -> Result<BoardDto, IssueError> {
320320 let space = lookup_space_by_name(self, space_name).await?;
321321 require_member(self, &space, caller).await?;
322 let board = lookup_board(self, &space, board_id).await?;
322 let board = lookup_board(self, &space, board_id, caller).await?;
323323 self.build_board_dto(board).await
324324 }
325325
@@ -333,7 +333,7 @@
333333 let space = lookup_space_by_name(self, space_name).await?;
334334 require_member(self, &space, caller).await?;
335335 require_board_manage(self, &space, caller).await?;
336 let board = lookup_board(self, &space, board_id).await?;
336 let board = lookup_board(self, &space, board_id, caller).await?;
337337
338338 let now = OffsetDateTime::now_utc();
339339 let mut am: issues::ActiveModel = board.clone().into();
@@ -390,7 +390,7 @@
390390 let space = lookup_space_by_name(self, space_name).await?;
391391 require_member(self, &space, caller).await?;
392392 require_board_manage(self, &space, caller).await?;
393 let board = lookup_board(self, &space, board_id).await?;
393 let board = lookup_board(self, &space, board_id, caller).await?;
394394
395395 self.db()
396396 .primary()
Modified lib/issues/src/services/comments.rs View lib/issues/src/services/comments.rs
@@ -88,7 +88,7 @@
8888 }
8989 let space = lookup_space_by_name(self, space_name).await?;
9090 require_member(self, &space, caller).await?;
91 let board = lookup_board(self, &space, board_id).await?;
91 let board = lookup_board(self, &space, board_id, caller).await?;
9292 let item = lookup_issue(self, &board, issue_id).await?;
9393
9494 let content = cmd.content.trim();
@@ -296,7 +296,7 @@
296296 ) -> Result<CommentPage, IssueError> {
297297 let space = lookup_space_by_name(self, space_name).await?;
298298 require_member(self, &space, caller).await?;
299 let board = lookup_board(self, &space, board_id).await?;
299 let board = lookup_board(self, &space, board_id, caller).await?;
300300 let _ = lookup_issue(self, &board, issue_id).await?;
301301
302302 let max_pagination = self.config().issues.max_pagination;
@@ -355,7 +355,7 @@
355355 ) -> Result<CommentDto, IssueError> {
356356 let space = lookup_space_by_name(self, space_name).await?;
357357 require_member(self, &space, caller).await?;
358 let board = lookup_board(self, &space, board_id).await?;
358 let board = lookup_board(self, &space, board_id, caller).await?;
359359 let _ = lookup_issue(self, &board, issue_id).await?;
360360
361361 let c = comment::Entity::find_by_id(comment_id)
@@ -389,7 +389,7 @@
389389 ) -> Result<CommentDto, IssueError> {
390390 let space = lookup_space_by_name(self, space_name).await?;
391391 require_member(self, &space, caller).await?;
392 let board = lookup_board(self, &space, board_id).await?;
392 let board = lookup_board(self, &space, board_id, caller).await?;
393393 let _ = lookup_issue(self, &board, issue_id).await?;
394394
395395 let c = comment::Entity::find_by_id(comment_id)
@@ -478,7 +478,7 @@
478478 ) -> Result<(), IssueError> {
479479 let space = lookup_space_by_name(self, space_name).await?;
480480 require_member(self, &space, caller).await?;
481 let board = lookup_board(self, &space, board_id).await?;
481 let board = lookup_board(self, &space, board_id, caller).await?;
482482 let _ = lookup_issue(self, &board, issue_id).await?;
483483
484484 let c = comment::Entity::find_by_id(comment_id)
Modified lib/issues/src/services/content_history.rs View lib/issues/src/services/content_history.rs
@@ -53,7 +53,7 @@
5353 ) -> Result<ContentHistoryPage, IssueError> {
5454 let space = lookup_space_by_name(self, space_name).await?;
5555 require_member(self, &space, caller).await?;
56 let board = lookup_board(self, &space, board_id).await?;
56 let board = lookup_board(self, &space, board_id, caller).await?;
5757 let _ = lookup_issue(self, &board, issue_id).await?;
5858
5959 let max_pagination = self.config().issues.max_pagination;
Modified lib/issues/src/services/dependencies.rs View lib/issues/src/services/dependencies.rs
@@ -57,7 +57,7 @@
5757 let space = lookup_space_by_name(self, space_name).await?;
5858 require_member(self, &space, caller).await?;
5959 require_board_manage(self, &space, caller).await?;
60 let board = lookup_board(self, &space, board_id).await?;
60 let board = lookup_board(self, &space, board_id, caller).await?;
6161 let _ = lookup_issue(self, &board, issue_id).await?;
6262
6363 if cmd.dependency_id == issue_id {
@@ -127,7 +127,7 @@
127127 ) -> Result<Vec<DependencyDto>, IssueError> {
128128 let space = lookup_space_by_name(self, space_name).await?;
129129 require_member(self, &space, caller).await?;
130 let board = lookup_board(self, &space, board_id).await?;
130 let board = lookup_board(self, &space, board_id, caller).await?;
131131 let _ = lookup_issue(self, &board, issue_id).await?;
132132
133133 let rows = issue_dependency::Entity::find()
@@ -150,7 +150,7 @@
150150 let space = lookup_space_by_name(self, space_name).await?;
151151 require_member(self, &space, caller).await?;
152152 require_board_manage(self, &space, caller).await?;
153 let board = lookup_board(self, &space, board_id).await?;
153 let board = lookup_board(self, &space, board_id, caller).await?;
154154 let _ = lookup_issue(self, &board, issue_id).await?;
155155
156156 let dep = issue_dependency::Entity::find_by_id(dep_id)
Modified lib/issues/src/services/events.rs View lib/issues/src/services/events.rs
@@ -56,7 +56,7 @@
5656 ) -> Result<EventPage, IssueError> {
5757 let space = lookup_space_by_name(self, space_name).await?;
5858 require_member(self, &space, caller).await?;
59 let board = lookup_board(self, &space, board_id).await?;
59 let board = lookup_board(self, &space, board_id, caller).await?;
6060 let _ = lookup_issue(self, &board, issue_id).await?;
6161
6262 let max_pagination = self.config().issues.max_pagination;
Modified lib/issues/src/services/issue_users.rs View lib/issues/src/services/issue_users.rs
@@ -60,7 +60,7 @@
6060 ) -> Result<IssueUserPage, IssueError> {
6161 let space = lookup_space_by_name(self, space_name).await?;
6262 require_member(self, &space, caller).await?;
63 let board = lookup_board(self, &space, board_id).await?;
63 let board = lookup_board(self, &space, board_id, caller).await?;
6464 let _ = lookup_issue(self, &board, issue_id).await?;
6565
6666 let max_pagination = self.config().issues.max_pagination;
@@ -114,7 +114,7 @@
114114 ) -> Result<IssueUserDto, IssueError> {
115115 let space = lookup_space_by_name(self, space_name).await?;
116116 require_member(self, &space, caller).await?;
117 let board = lookup_board(self, &space, board_id).await?;
117 let board = lookup_board(self, &space, board_id, caller).await?;
118118 let _ = lookup_issue(self, &board, issue_id).await?;
119119
120120 if caller != uid {
Modified lib/issues/src/services/issues.rs View lib/issues/src/services/issues.rs
@@ -318,7 +318,7 @@
318318 }
319319 let space = lookup_space_by_name(self, space_name).await?;
320320 require_member(self, &space, caller).await?;
321 let board = lookup_board(self, &space, board_id).await?;
321 let board = lookup_board(self, &space, board_id, caller).await?;
322322
323323 let title = cmd.title.trim();
324324 if title.is_empty() || title.chars().count() > self.config().issues.max_title_len {
@@ -539,7 +539,7 @@
539539 ) -> Result<IssuePage, IssueError> {
540540 let space = lookup_space_by_name(self, space_name).await?;
541541 require_member(self, &space, caller).await?;
542 let board = lookup_board(self, &space, board_id).await?;
542 let board = lookup_board(self, &space, board_id, caller).await?;
543543
544544 let max_pagination = self.config().issues.max_pagination;
545545 let default_pagination = self.config().issues.default_pagination;
@@ -668,7 +668,7 @@
668668 ) -> Result<IssueDto, IssueError> {
669669 let space = lookup_space_by_name(self, space_name).await?;
670670 require_member(self, &space, caller).await?;
671 let board = lookup_board(self, &space, board_id).await?;
671 let board = lookup_board(self, &space, board_id, caller).await?;
672672 let item = lookup_issue(self, &board, issue_id).await?;
673673
674674 self.build_issue_dto(item).await
@@ -684,7 +684,7 @@
684684 ) -> Result<IssueDto, IssueError> {
685685 let space = lookup_space_by_name(self, space_name).await?;
686686 require_member(self, &space, caller).await?;
687 let board = lookup_board(self, &space, board_id).await?;
687 let board = lookup_board(self, &space, board_id, caller).await?;
688688 let item = lookup_issue(self, &board, issue_id).await?;
689689
690690 if item.author_id != caller && !is_board_manager(self, &space, caller).await? {
@@ -962,7 +962,7 @@
962962 ) -> Result<(), IssueError> {
963963 let space = lookup_space_by_name(self, space_name).await?;
964964 require_member(self, &space, caller).await?;
965 let board = lookup_board(self, &space, board_id).await?;
965 let board = lookup_board(self, &space, board_id, caller).await?;
966966 let item = lookup_issue(self, &board, issue_id).await?;
967967
968968 if item.author_id != caller && !is_board_manager(self, &space, caller).await? {
@@ -992,7 +992,7 @@
992992 ) -> Result<IssueDto, IssueError> {
993993 let space = lookup_space_by_name(self, space_name).await?;
994994 require_member(self, &space, caller).await?;
995 let board = lookup_board(self, &space, board_id).await?;
995 let board = lookup_board(self, &space, board_id, caller).await?;
996996 let item = lookup_issue(self, &board, issue_id).await?;
997997
998998 if item.author_id != caller && !is_board_manager(self, &space, caller).await? {
Modified lib/issues/src/services/labels.rs View lib/issues/src/services/labels.rs
@@ -122,7 +122,7 @@
122122 let space = lookup_space_by_name(self, space_name).await?;
123123 require_member(self, &space, caller).await?;
124124 require_board_manage(self, &space, caller).await?;
125 let board = lookup_board(self, &space, board_id).await?;
125 let board = lookup_board(self, &space, board_id, caller).await?;
126126
127127 let name = cmd.name.trim();
128128 if name.is_empty() || name.chars().count() > self.config().issues.max_label_name_len {
@@ -173,7 +173,7 @@
173173 ) -> Result<LabelPage, IssueError> {
174174 let space = lookup_space_by_name(self, space_name).await?;
175175 require_member(self, &space, caller).await?;
176 let board = lookup_board(self, &space, board_id).await?;
176 let board = lookup_board(self, &space, board_id, caller).await?;
177177
178178 let max_pagination = self.config().issues.max_pagination;
179179 let default_pagination = self.config().issues.default_pagination;
@@ -219,7 +219,7 @@
219219 ) -> Result<LabelDto, IssueError> {
220220 let space = lookup_space_by_name(self, space_name).await?;
221221 require_member(self, &space, caller).await?;
222 let board = lookup_board(self, &space, board_id).await?;
222 let board = lookup_board(self, &space, board_id, caller).await?;
223223
224224 let l = issue_label::Entity::find_by_id(label_id)
225225 .filter(issue_label::Column::DirId.eq(board.dir_id))
@@ -240,7 +240,7 @@
240240 ) -> Result<LabelDto, IssueError> {
241241 let space = lookup_space_by_name(self, space_name).await?;
242242 require_member(self, &space, caller).await?;
243 let board = lookup_board(self, &space, board_id).await?;
243 let board = lookup_board(self, &space, board_id, caller).await?;
244244
245245 let l = issue_label::Entity::find_by_id(label_id)
246246 .filter(issue_label::Column::DirId.eq(board.dir_id))
@@ -304,7 +304,7 @@
304304 ) -> Result<(), IssueError> {
305305 let space = lookup_space_by_name(self, space_name).await?;
306306 require_member(self, &space, caller).await?;
307 let board = lookup_board(self, &space, board_id).await?;
307 let board = lookup_board(self, &space, board_id, caller).await?;
308308
309309 let _ = issue_label::Entity::find_by_id(label_id)
310310 .filter(issue_label::Column::DirId.eq(board.dir_id))
@@ -340,7 +340,7 @@
340340 ) -> Result<Vec<LabelDto>, IssueError> {
341341 let space = lookup_space_by_name(self, space_name).await?;
342342 require_member(self, &space, caller).await?;
343 let board = lookup_board(self, &space, board_id).await?;
343 let board = lookup_board(self, &space, board_id, caller).await?;
344344 let _ = lookup_issue(self, &board, issue_id).await?;
345345
346346 let rels = issue_relation_label::Entity::find()
@@ -372,7 +372,7 @@
372372 let space = lookup_space_by_name(self, space_name).await?;
373373 require_member(self, &space, caller).await?;
374374 require_board_manage(self, &space, caller).await?;
375 let board = lookup_board(self, &space, board_id).await?;
375 let board = lookup_board(self, &space, board_id, caller).await?;
376376 let _ = lookup_issue(self, &board, issue_id).await?;
377377
378378 let label = issue_label::Entity::find_by_id(label_id)
@@ -441,7 +441,7 @@
441441 let space = lookup_space_by_name(self, space_name).await?;
442442 require_member(self, &space, caller).await?;
443443 require_board_manage(self, &space, caller).await?;
444 let board = lookup_board(self, &space, board_id).await?;
444 let board = lookup_board(self, &space, board_id, caller).await?;
445445 let _ = lookup_issue(self, &board, issue_id).await?;
446446
447447 let label = issue_label::Entity::find_by_id(label_id)
Modified lib/issues/src/services/members.rs View lib/issues/src/services/members.rs
@@ -66,7 +66,7 @@
6666 let space = lookup_space_by_name(self, space_name).await?;
6767 require_member(self, &space, caller).await?;
6868 require_board_manage(self, &space, caller).await?;
69 let board = lookup_board(self, &space, board_id).await?;
69 let board = lookup_board(self, &space, board_id, caller).await?;
7070 let item = lookup_issue(self, &board, issue_id).await?;
7171
7272 let target_is_member = if cmd.user_id == space.owner_id {
@@ -204,7 +204,7 @@
204204 ) -> Result<IssueMemberPage, IssueError> {
205205 let space = lookup_space_by_name(self, space_name).await?;
206206 require_member(self, &space, caller).await?;
207 let board = lookup_board(self, &space, board_id).await?;
207 let board = lookup_board(self, &space, board_id, caller).await?;
208208 let _ = lookup_issue(self, &board, issue_id).await?;
209209
210210 let max_pagination = self.config().issues.max_pagination;
@@ -263,7 +263,7 @@
263263 let space = lookup_space_by_name(self, space_name).await?;
264264 require_member(self, &space, caller).await?;
265265 require_board_manage(self, &space, caller).await?;
266 let board = lookup_board(self, &space, board_id).await?;
266 let board = lookup_board(self, &space, board_id, caller).await?;
267267 let _ = lookup_issue(self, &board, issue_id).await?;
268268
269269 let m = issue_member::Entity::find_by_id(member_id)
Modified lib/issues/src/services/milestones.rs View lib/issues/src/services/milestones.rs
@@ -155,7 +155,7 @@
155155 let space = lookup_space_by_name(self, space_name).await?;
156156 require_member(self, &space, caller).await?;
157157 require_board_manage(self, &space, caller).await?;
158 let board = lookup_board(self, &space, board_id).await?;
158 let board = lookup_board(self, &space, board_id, caller).await?;
159159
160160 let name = cmd.name.trim();
161161 if name.is_empty() || name.chars().count() > self.config().issues.max_milestone_title_len {
@@ -212,7 +212,7 @@
212212 ) -> Result<MilestonePage, IssueError> {
213213 let space = lookup_space_by_name(self, space_name).await?;
214214 require_member(self, &space, caller).await?;
215 let board = lookup_board(self, &space, board_id).await?;
215 let board = lookup_board(self, &space, board_id, caller).await?;
216216
217217 let max_pagination = self.config().issues.max_pagination;
218218 let default_pagination = self.config().issues.default_pagination;
@@ -269,7 +269,7 @@
269269 ) -> Result<MilestoneDto, IssueError> {
270270 let space = lookup_space_by_name(self, space_name).await?;
271271 require_member(self, &space, caller).await?;
272 let board = lookup_board(self, &space, board_id).await?;
272 let board = lookup_board(self, &space, board_id, caller).await?;
273273
274274 let m = milestone::Entity::find_by_id(milestone_id)
275275 .filter(milestone::Column::CollectionId.eq(board.id))
@@ -291,7 +291,7 @@
291291 let space = lookup_space_by_name(self, space_name).await?;
292292 require_member(self, &space, caller).await?;
293293 require_board_manage(self, &space, caller).await?;
294 let board = lookup_board(self, &space, board_id).await?;
294 let board = lookup_board(self, &space, board_id, caller).await?;
295295
296296 let m = milestone::Entity::find_by_id(milestone_id)
297297 .filter(milestone::Column::CollectionId.eq(board.id))
@@ -348,7 +348,7 @@
348348 let space = lookup_space_by_name(self, space_name).await?;
349349 require_member(self, &space, caller).await?;
350350 require_board_manage(self, &space, caller).await?;
351 let board = lookup_board(self, &space, board_id).await?;
351 let board = lookup_board(self, &space, board_id, caller).await?;
352352
353353 let _ = milestone::Entity::find_by_id(milestone_id)
354354 .filter(milestone::Column::CollectionId.eq(board.id))
Modified lib/issues/src/services/pins.rs View lib/issues/src/services/pins.rs
@@ -55,7 +55,7 @@
5555 let space = lookup_space_by_name(self, space_name).await?;
5656 require_member(self, &space, caller).await?;
5757 require_board_manage(self, &space, caller).await?;
58 let board = lookup_board(self, &space, board_id).await?;
58 let board = lookup_board(self, &space, board_id, caller).await?;
5959 let _ = lookup_issue(self, &board, cmd.issue_id).await?;
6060
6161 if cmd.pin_order < 0 {
@@ -96,7 +96,7 @@
9696 ) -> Result<Vec<PinDto>, IssueError> {
9797 let space = lookup_space_by_name(self, space_name).await?;
9898 require_member(self, &space, caller).await?;
99 let board = lookup_board(self, &space, board_id).await?;
99 let board = lookup_board(self, &space, board_id, caller).await?;
100100
101101 let rows = issue_pin::Entity::find()
102102 .filter(issue_pin::Column::CollectionId.eq(board.id))
@@ -118,7 +118,7 @@
118118 let space = lookup_space_by_name(self, space_name).await?;
119119 require_member(self, &space, caller).await?;
120120 require_board_manage(self, &space, caller).await?;
121 let board = lookup_board(self, &space, board_id).await?;
121 let board = lookup_board(self, &space, board_id, caller).await?;
122122
123123 let p = issue_pin::Entity::find_by_id(pin_id)
124124 .filter(issue_pin::Column::CollectionId.eq(board.id))
Modified lib/issues/src/services/reactions.rs View lib/issues/src/services/reactions.rs
@@ -86,7 +86,7 @@
8686 ) -> Result<ReactionDto, IssueError> {
8787 let space = lookup_space_by_name(self, space_name).await?;
8888 require_member(self, &space, caller).await?;
89 let board = lookup_board(self, &space, board_id).await?;
89 let board = lookup_board(self, &space, board_id, caller).await?;
9090 let _ = lookup_issue(self, &board, issue_id).await?;
9191
9292 let emoji = self.validate_emoji(&cmd.emoji)?;
@@ -149,7 +149,7 @@
149149 ) -> Result<ReactionDto, IssueError> {
150150 let space = lookup_space_by_name(self, space_name).await?;
151151 require_member(self, &space, caller).await?;
152 let board = lookup_board(self, &space, board_id).await?;
152 let board = lookup_board(self, &space, board_id, caller).await?;
153153 let _ = lookup_issue(self, &board, issue_id).await?;
154154
155155 let c = comment::Entity::find_by_id(comment_id)
@@ -216,7 +216,7 @@
216216 ) -> Result<Vec<ReactionAggDto>, IssueError> {
217217 let space = lookup_space_by_name(self, space_name).await?;
218218 require_member(self, &space, caller).await?;
219 let board = lookup_board(self, &space, board_id).await?;
219 let board = lookup_board(self, &space, board_id, caller).await?;
220220 let _ = lookup_issue(self, &board, issue_id).await?;
221221
222222 let rows = issue_reactions::Entity::find()
@@ -254,7 +254,7 @@
254254 ) -> Result<Vec<ReactionAggDto>, IssueError> {
255255 let space = lookup_space_by_name(self, space_name).await?;
256256 require_member(self, &space, caller).await?;
257 let board = lookup_board(self, &space, board_id).await?;
257 let board = lookup_board(self, &space, board_id, caller).await?;
258258 let _ = lookup_issue(self, &board, issue_id).await?;
259259
260260 let _ = comment::Entity::find_by_id(comment_id)
@@ -298,7 +298,7 @@
298298 ) -> Result<(), IssueError> {
299299 let space = lookup_space_by_name(self, space_name).await?;
300300 require_member(self, &space, caller).await?;
301 let board = lookup_board(self, &space, board_id).await?;
301 let board = lookup_board(self, &space, board_id, caller).await?;
302302 let _ = lookup_issue(self, &board, issue_id).await?;
303303
304304 let emoji = self.validate_emoji(emoji)?;
@@ -327,7 +327,7 @@
327327 ) -> Result<(), IssueError> {
328328 let space = lookup_space_by_name(self, space_name).await?;
329329 require_member(self, &space, caller).await?;
330 let board = lookup_board(self, &space, board_id).await?;
330 let board = lookup_board(self, &space, board_id, caller).await?;
331331 let _ = lookup_issue(self, &board, issue_id).await?;
332332 let _ = comment::Entity::find_by_id(comment_id)
333333 .filter(comment::Column::IssueId.eq(Some(issue_id)))
@@ -359,7 +359,7 @@
359359 ) -> Result<(), IssueError> {
360360 let space = lookup_space_by_name(self, space_name).await?;
361361 require_member(self, &space, caller).await?;
362 let board = lookup_board(self, &space, board_id).await?;
362 let board = lookup_board(self, &space, board_id, caller).await?;
363363 let _ = lookup_issue(self, &board, issue_id).await?;
364364
365365 let r = issue_reactions::Entity::find_by_id(reaction_id)
Modified lib/issues/src/services/repo_relations.rs View lib/issues/src/services/repo_relations.rs
@@ -55,7 +55,7 @@
5555 let space = lookup_space_by_name(self, space_name).await?;
5656 require_member(self, &space, caller).await?;
5757 require_board_manage(self, &space, caller).await?;
58 let board = lookup_board(self, &space, board_id).await?;
58 let board = lookup_board(self, &space, board_id, caller).await?;
5959 let _ = lookup_issue(self, &board, issue_id).await?;
6060
6161 let _ = repos::Entity::find_by_id(cmd.repo_id)
@@ -96,7 +96,7 @@
9696 ) -> Result<Vec<RepoRelDto>, IssueError> {
9797 let space = lookup_space_by_name(self, space_name).await?;
9898 require_member(self, &space, caller).await?;
99 let board = lookup_board(self, &space, board_id).await?;
99 let board = lookup_board(self, &space, board_id, caller).await?;
100100 let _ = lookup_issue(self, &board, issue_id).await?;
101101
102102 let rows = issue_relation_repo::Entity::find()
@@ -119,7 +119,7 @@
119119 let space = lookup_space_by_name(self, space_name).await?;
120120 require_member(self, &space, caller).await?;
121121 require_board_manage(self, &space, caller).await?;
122 let board = lookup_board(self, &space, board_id).await?;
122 let board = lookup_board(self, &space, board_id, caller).await?;
123123 let _ = lookup_issue(self, &board, issue_id).await?;
124124
125125 let r = issue_relation_repo::Entity::find_by_id(rel_id)
Modified lib/issues/src/services/stopwatch.rs View lib/issues/src/services/stopwatch.rs
@@ -37,7 +37,7 @@
3737 ) -> Result<StopwatchDto, IssueError> {
3838 let space = lookup_space_by_name(self, space_name).await?;
3939 require_member(self, &space, caller).await?;
40 let board = lookup_board(self, &space, board_id).await?;
40 let board = lookup_board(self, &space, board_id, caller).await?;
4141 let _ = lookup_issue(self, &board, issue_id).await?;
4242
4343 let sw = stopwatch::Entity::find()
@@ -68,7 +68,7 @@
6868 ) -> Result<StopwatchDto, IssueError> {
6969 let space = lookup_space_by_name(self, space_name).await?;
7070 require_member(self, &space, caller).await?;
71 let board = lookup_board(self, &space, board_id).await?;
71 let board = lookup_board(self, &space, board_id, caller).await?;
7272 let _ = lookup_issue(self, &board, issue_id).await?;
7373
7474 let existing = stopwatch::Entity::find()
@@ -114,7 +114,7 @@
114114 ) -> Result<(), IssueError> {
115115 let space = lookup_space_by_name(self, space_name).await?;
116116 require_member(self, &space, caller).await?;
117 let board = lookup_board(self, &space, board_id).await?;
117 let board = lookup_board(self, &space, board_id, caller).await?;
118118 let _ = lookup_issue(self, &board, issue_id).await?;
119119
120120 let sw = stopwatch::Entity::find()
Modified lib/issues/src/services/tracked_time.rs View lib/issues/src/services/tracked_time.rs
@@ -50,7 +50,7 @@
5050 ) -> Result<TrackedTimePage, IssueError> {
5151 let space = lookup_space_by_name(self, space_name).await?;
5252 require_member(self, &space, caller).await?;
53 let board = lookup_board(self, &space, board_id).await?;
53 let board = lookup_board(self, &space, board_id, caller).await?;
5454 let _ = lookup_issue(self, &board, issue_id).await?;
5555
5656 let max_pagination = self.config().issues.max_pagination;
Modified lib/issues/src/services/watches.rs View lib/issues/src/services/watches.rs
@@ -43,7 +43,7 @@
4343 ) -> Result<WatchDto, IssueError> {
4444 let space = lookup_space_by_name(self, space_name).await?;
4545 require_member(self, &space, caller).await?;
46 let board = lookup_board(self, &space, board_id).await?;
46 let board = lookup_board(self, &space, board_id, caller).await?;
4747 let _ = lookup_issue(self, &board, issue_id).await?;
4848
4949 let w = issue_watch::Entity::find()
@@ -76,7 +76,7 @@
7676 ) -> Result<WatchDto, IssueError> {
7777 let space = lookup_space_by_name(self, space_name).await?;
7878 require_member(self, &space, caller).await?;
79 let board = lookup_board(self, &space, board_id).await?;
79 let board = lookup_board(self, &space, board_id, caller).await?;
8080 let _ = lookup_issue(self, &board, issue_id).await?;
8181
8282 let existing = issue_watch::Entity::find()
@@ -128,7 +128,7 @@
128128 ) -> Result<(), IssueError> {
129129 let space = lookup_space_by_name(self, space_name).await?;
130130 require_member(self, &space, caller).await?;
131 let board = lookup_board(self, &space, board_id).await?;
131 let board = lookup_board(self, &space, board_id, caller).await?;
132132 let _ = lookup_issue(self, &board, issue_id).await?;
133133
134134 let res = issue_watch::Entity::delete_many()
Modified lib/issues/src/share/lookup.rs View lib/issues/src/share/lookup.rs
@@ -29,6 +29,7 @@
2929 service: &IssueService,
3030 space: &spaces::Model,
3131 board_id: Uuid,
32 caller: Uuid,
3233) -> Result<issues::Model, IssueError> {
3334 let board = issues::Entity::find_by_id(board_id)
3435 .one(service.db().read())
@@ -45,6 +46,17 @@
4546 return Err(IssueError::NotFound);
4647 }
4748
49 if !space::share::dir_visibility::is_dir_visible(
50 service.db().read(),
51 space,
52 board.dir_id,
53 caller,
54 )
55 .await?
56 {
57 return Err(IssueError::NotFound);
58 }
59
4860 Ok(board)
4961}
5062
Modified lib/space/src/services/avatar.rs View lib/space/src/services/avatar.rs
@@ -9,7 +9,7 @@
99
1010use crate::errors::SpaceError;
1111use crate::services::service::SpaceService;
12use crate::share::authz::effective_permissions;
12use crate::share::authz::{MANAGE_CHANNELS, effective_permissions, require_perm};
1313use crate::share::lookup::lookup_space_by_name;
1414
1515pub const MAX_SPACE_AVATAR_BYTES: usize = 5 * 1024 * 1024;
@@ -89,9 +89,7 @@
8989 cmd: UploadSpaceAvatarCmd,
9090 ) -> Result<SpaceAvatarDto, SpaceError> {
9191 let space = lookup_space_by_name(self, space_name).await?;
92 if space.owner_id != caller {
93 return Err(SpaceError::Forbidden);
94 }
92 require_perm(self, &space, caller, MANAGE_CHANNELS).await?;
9593
9694 let fmt = AvatarFormat::from_content_type(&cmd.content_type).ok_or_else(|| {
9795 SpaceError::BadRequest(format!("unsupported content-type: {}", cmd.content_type))
@@ -153,9 +151,7 @@
153151 space_name: &str,
154152 ) -> Result<(), SpaceError> {
155153 let space = lookup_space_by_name(self, space_name).await?;
156 if space.owner_id != caller {
157 return Err(SpaceError::Forbidden);
158 }
154 require_perm(self, &space, caller, MANAGE_CHANNELS).await?;
159155
160156 let space_id = space.id;
161157 let old_url = space.avatar_url.clone();
Modified lib/space/src/services/bans.rs View lib/space/src/services/bans.rs
@@ -15,6 +15,7 @@
1515use crate::errors::SpaceError;
1616use crate::services::service::SpaceService;
1717use crate::services::spaces::{PageQuery, UserBriefDto};
18use crate::share::authz::{MANAGE_BANS, require_perm};
1819use crate::share::lookup::lookup_space_by_name;
1920
2021#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
@@ -79,9 +80,7 @@
7980 cmd: BanUserCmd,
8081 ) -> Result<BanDto, SpaceError> {
8182 let space = lookup_space_by_name(self, space_name).await?;
82 if space.owner_id != caller {
83 return Err(SpaceError::Forbidden);
84 }
83 require_perm(self, &space, caller, MANAGE_BANS).await?;
8584
8685 user::Entity::find_by_id(cmd.user_id)
8786 .one(self.db().read())
@@ -181,9 +180,7 @@
181180 uid: Uuid,
182181 ) -> Result<BanDto, SpaceError> {
183182 let space = lookup_space_by_name(self, space_name).await?;
184 if space.owner_id != caller {
185 return Err(SpaceError::Forbidden);
186 }
183 require_perm(self, &space, caller, MANAGE_BANS).await?;
187184
188185 let ban = space_bans::Entity::find_by_id((space.id, uid))
189186 .one(self.db().read())
@@ -217,9 +214,7 @@
217214 cmd: UpdateBanCmd,
218215 ) -> Result<BanDto, SpaceError> {
219216 let space = lookup_space_by_name(self, space_name).await?;
220 if space.owner_id != caller {
221 return Err(SpaceError::Forbidden);
222 }
217 require_perm(self, &space, caller, MANAGE_BANS).await?;
223218
224219 let ban = space_bans::Entity::find_by_id((space.id, uid))
225220 .one(self.db().read())
@@ -280,9 +275,7 @@
280275 uid: Uuid,
281276 ) -> Result<(), SpaceError> {
282277 let space = lookup_space_by_name(self, space_name).await?;
283 if space.owner_id != caller {
284 return Err(SpaceError::Forbidden);
285 }
278 require_perm(self, &space, caller, MANAGE_BANS).await?;
286279
287280 let res = space_bans::Entity::delete_by_id((space.id, uid))
288281 .exec(self.db().write())
@@ -300,9 +293,7 @@
300293 q: PageQuery,
301294 ) -> Result<BanPage, SpaceError> {
302295 let space = lookup_space_by_name(self, space_name).await?;
303 if space.owner_id != caller {
304 return Err(SpaceError::Forbidden);
305 }
296 require_perm(self, &space, caller, MANAGE_BANS).await?;
306297
307298 let max_pagination = self.config().space.max_pagination;
308299 let default_pagination = self.config().space.default_pagination;
Modified lib/space/src/services/dir.rs View lib/space/src/services/dir.rs
@@ -18,7 +18,7 @@
1818use crate::errors::SpaceError;
1919use crate::services::service::SpaceService;
2020use crate::services::spaces::UserBriefDto;
21use crate::share::authz::{MANAGE_OVERWRITES, effective_permissions, require_perm};
21use crate::share::authz::{MANAGE_CHANNELS, MANAGE_OVERWRITES, effective_permissions, require_perm};
2222use crate::share::lookup::lookup_space_by_name;
2323
2424pub const MAX_DIR_NODE_NAME: usize = 255;
@@ -177,9 +177,7 @@
177177 cmd: CreateDirCmd,
178178 ) -> Result<DirNodeDto, SpaceError> {
179179 let space = lookup_space_by_name(self, space_name).await?;
180 if space.owner_id != caller {
181 return Err(SpaceError::Forbidden);
182 }
180 require_perm(self, &space, caller, MANAGE_CHANNELS).await?;
183181
184182 let name = cmd.name.trim();
185183 if name.is_empty() || name.chars().count() > MAX_DIR_NODE_NAME {
@@ -247,9 +245,9 @@
247245 space_name: &str,
248246 ) -> Result<Vec<DirNodeDto>, SpaceError> {
249247 let space = lookup_space_by_name(self, space_name).await?;
250 effective_permissions(self.db().read(), &space, caller).await?;
248 let perms = effective_permissions(self.db().read(), &space, caller).await?;
251249
252 let is_owner = space.owner_id == caller;
250 let can_manage = perms.has(MANAGE_CHANNELS);
253251
254252 let total_nodes = dirs::Entity::find()
255253 .filter(dirs::Column::SpaceId.eq(space.id))
@@ -310,7 +308,7 @@
310308 parent_map.insert(n.id, n.parent_dir_id);
311309 node_map.insert(n.id, n.clone());
312310
313 if is_owner {
311 if can_manage {
314312 direct_visible.insert(n.id, true);
315313 continue;
316314 }
@@ -405,9 +403,7 @@
405403 cmd: UpdateDirCmd,
406404 ) -> Result<DirNodeDto, SpaceError> {
407405 let space = lookup_space_by_name(self, space_name).await?;
408 if space.owner_id != caller {
409 return Err(SpaceError::Forbidden);
410 }
406 require_perm(self, &space, caller, MANAGE_CHANNELS).await?;
411407
412408 let node = self.dir_in_space(space.id, dir_id).await?;
413409
@@ -435,9 +431,7 @@
435431 cmd: MoveDirCmd,
436432 ) -> Result<DirNodeDto, SpaceError> {
437433 let space = lookup_space_by_name(self, space_name).await?;
438 if space.owner_id != caller {
439 return Err(SpaceError::Forbidden);
440 }
434 require_perm(self, &space, caller, MANAGE_CHANNELS).await?;
441435
442436 let node = self.dir_in_space(space.id, dir_id).await?;
443437
Modified lib/space/src/services/groups.rs View lib/space/src/services/groups.rs
@@ -119,9 +119,7 @@
119119 cmd: CreateGroupCmd,
120120 ) -> Result<GroupDto, SpaceError> {
121121 let space = lookup_space_by_name(self, space_name).await?;
122 if space.owner_id != caller {
123 return Err(SpaceError::Forbidden);
124 }
122 require_perm(self, &space, caller, MANAGE_ROLES).await?;
125123
126124 let name = cmd.name.trim();
127125 if name.is_empty() || name.chars().count() > self.config().space.max_group_name_len {
@@ -251,9 +249,7 @@
251249 cmd: UpdateGroupCmd,
252250 ) -> Result<GroupDto, SpaceError> {
253251 let space = lookup_space_by_name(self, space_name).await?;
254 if space.owner_id != caller {
255 return Err(SpaceError::Forbidden);
256 }
252 require_perm(self, &space, caller, MANAGE_ROLES).await?;
257253
258254 let group = space_groups::Entity::find_by_id(group_id)
259255 .filter(space_groups::Column::SpaceId.eq(space.id))
@@ -350,9 +346,7 @@
350346 group_id: Uuid,
351347 ) -> Result<(), SpaceError> {
352348 let space = lookup_space_by_name(self, space_name).await?;
353 if space.owner_id != caller {
354 return Err(SpaceError::Forbidden);
355 }
349 require_perm(self, &space, caller, MANAGE_ROLES).await?;
356350
357351 let group = space_groups::Entity::find_by_id(group_id)
358352 .filter(space_groups::Column::SpaceId.eq(space.id))
@@ -465,9 +459,7 @@
465459 cmd: AssignGroupCmd,
466460 ) -> Result<(), SpaceError> {
467461 let space = lookup_space_by_name(self, space_name).await?;
468 if space.owner_id != caller {
469 return Err(SpaceError::Forbidden);
470 }
462 require_perm(self, &space, caller, MANAGE_ROLES).await?;
471463
472464 space_groups::Entity::find_by_id(cmd.group_id)
473465 .filter(space_groups::Column::SpaceId.eq(space.id))
@@ -499,9 +491,7 @@
499491 group_id: Uuid,
500492 ) -> Result<(), SpaceError> {
501493 let space = lookup_space_by_name(self, space_name).await?;
502 if space.owner_id != caller {
503 return Err(SpaceError::Forbidden);
504 }
494 require_perm(self, &space, caller, MANAGE_ROLES).await?;
505495
506496 space_member_groups::Entity::delete_many()
507497 .filter(space_member_groups::Column::SpaceId.eq(space.id))
Modified lib/space/src/services/images.rs View lib/space/src/services/images.rs
@@ -10,7 +10,7 @@
1010use crate::errors::SpaceError;
1111use crate::services::avatar::AvatarFormat;
1212use crate::services::service::SpaceService;
13use crate::share::authz::effective_permissions;
13use crate::share::authz::{MANAGE_CHANNELS, effective_permissions, require_perm};
1414use crate::share::lookup::lookup_space_by_name;
1515
1616pub const MAX_SPACE_IMAGE_BYTES: usize = 5 * 1024 * 1024;
@@ -71,9 +71,7 @@
7171 cmd: UploadSpaceImageCmd,
7272 ) -> Result<SpaceImageDto, SpaceError> {
7373 let space = lookup_space_by_name(self, space_name).await?;
74 if space.owner_id != caller {
75 return Err(SpaceError::Forbidden);
76 }
74 require_perm(self, &space, caller, MANAGE_CHANNELS).await?;
7775
7876 let fmt = AvatarFormat::from_content_type(&cmd.content_type).ok_or_else(|| {
7977 SpaceError::BadRequest(format!("unsupported content-type: {}", cmd.content_type))
@@ -182,9 +180,7 @@
182180 kind: SpaceImageKind,
183181 ) -> Result<(), SpaceError> {
184182 let space = lookup_space_by_name(self, space_name).await?;
185 if space.owner_id != caller {
186 return Err(SpaceError::Forbidden);
187 }
183 require_perm(self, &space, caller, MANAGE_CHANNELS).await?;
188184
189185 let space_id = space.id;
190186 let old_url = match kind {
Modified lib/space/src/services/join_rules.rs View lib/space/src/services/join_rules.rs
@@ -14,7 +14,7 @@
1414
1515use crate::errors::{SpaceError, is_unique_violation};
1616use crate::services::service::SpaceService;
17use crate::share::authz::effective_permissions;
17use crate::share::authz::{MANAGE_ROLES, effective_permissions, require_perm};
1818use crate::share::lookup::lookup_space_by_name;
1919
2020pub const MAX_JOIN_RULE_MATCHER_LEN: usize = 64;
@@ -159,9 +159,7 @@
159159 cmd: CreateJoinRuleCmd,
160160 ) -> Result<JoinRuleDto, SpaceError> {
161161 let space = lookup_space_by_name(self, space_name).await?;
162 if space.owner_id != caller {
163 return Err(SpaceError::Forbidden);
164 }
162 require_perm(self, &space, caller, MANAGE_ROLES).await?;
165163 let matcher = normalize_matcher(&cmd.matcher)?;
166164
167165 space_groups::Entity::find_by_id(cmd.group_id)
@@ -193,9 +191,7 @@
193191 cmd: UpdateJoinRuleCmd,
194192 ) -> Result<JoinRuleDto, SpaceError> {
195193 let space = lookup_space_by_name(self, space_name).await?;
196 if space.owner_id != caller {
197 return Err(SpaceError::Forbidden);
198 }
194 require_perm(self, &space, caller, MANAGE_ROLES).await?;
199195 let Some(row) = space_join_rule::Entity::find_by_id(rule_id)
200196 .filter(space_join_rule::Column::SpaceId.eq(space.id))
201197 .one(self.db().read())
@@ -228,9 +224,7 @@
228224 rule_id: Uuid,
229225 ) -> Result<(), SpaceError> {
230226 let space = lookup_space_by_name(self, space_name).await?;
231 if space.owner_id != caller {
232 return Err(SpaceError::Forbidden);
233 }
227 require_perm(self, &space, caller, MANAGE_ROLES).await?;
234228 let res = space_join_rule::Entity::delete_many()
235229 .filter(space_join_rule::Column::Id.eq(rule_id))
236230 .filter(space_join_rule::Column::SpaceId.eq(space.id))
Modified lib/space/src/services/members.rs View lib/space/src/services/members.rs
@@ -100,9 +100,7 @@
100100 cmd: AddMemberCmd,
101101 ) -> Result<MemberDto, SpaceError> {
102102 let space = lookup_space_by_name(self, space_name).await?;
103 if space.owner_id != caller {
104 return Err(SpaceError::Forbidden);
105 }
103 require_perm(self, &space, caller, MANAGE_MEMBERS).await?;
106104
107105 let target_user = user::Entity::find_by_id(cmd.user_id)
108106 .one(self.db().read())
@@ -251,8 +249,8 @@
251249 uid: Uuid,
252250 ) -> Result<MemberDto, SpaceError> {
253251 let space = lookup_space_by_name(self, space_name).await?;
254 if space.owner_id != caller {
255 return Err(SpaceError::Forbidden);
252 if caller != uid {
253 require_perm(self, &space, caller, MANAGE_MEMBERS).await?;
256254 }
257255
258256 let member = space_members::Entity::find_by_id((space.id, uid))
@@ -299,8 +297,8 @@
299297 cmd: UpdateMemberCmd,
300298 ) -> Result<MemberDto, SpaceError> {
301299 let space = lookup_space_by_name(self, space_name).await?;
302 if space.owner_id != caller {
303 return Err(SpaceError::Forbidden);
300 if caller != uid {
301 require_perm(self, &space, caller, MANAGE_MEMBERS).await?;
304302 }
305303
306304 let member = space_members::Entity::find_by_id((space.id, uid))
@@ -386,9 +384,7 @@
386384 uid: Uuid,
387385 ) -> Result<(), SpaceError> {
388386 let space = lookup_space_by_name(self, space_name).await?;
389 if space.owner_id != caller {
390 return Err(SpaceError::Forbidden);
391 }
387 require_perm(self, &space, caller, MANAGE_MEMBERS).await?;
392388 if caller == uid {
393389 return Err(SpaceError::BadRequest(
394390 "owner cannot remove themselves".to_string(),
Modified lib/space/src/services/rooms.rs View lib/space/src/services/rooms.rs
@@ -13,6 +13,7 @@
1313
1414use crate::errors::SpaceError;
1515use crate::services::service::SpaceService;
16use crate::share::authz::{MANAGE_CHANNELS, require_perm};
1617use crate::share::lookup::lookup_space_by_name;
1718
1819#[derive(Debug, Clone, Serialize, Deserialize, ToSchema)]
@@ -104,9 +105,7 @@
104105 ));
105106 }
106107 let space = lookup_space_by_name(self, space_name).await?;
107 if space.owner_id != caller {
108 return Err(SpaceError::Forbidden);
109 }
108 require_perm(self, &space, caller, MANAGE_CHANNELS).await?;
110109 if !space.is_active {
111110 return Err(SpaceError::NotFound);
112111 }
@@ -232,9 +231,7 @@
232231 .one(self.db().read())
233232 .await?
234233 .ok_or(SpaceError::NotFound)?;
235 if space.owner_id != caller {
236 return Err(SpaceError::Forbidden);
237 }
234 require_perm(self, &space, caller, MANAGE_CHANNELS).await?;
238235 if !space.is_active {
239236 return Err(SpaceError::NotFound);
240237 }
Modified lib/space/src/share/authz.rs View lib/space/src/share/authz.rs
@@ -108,8 +108,13 @@
108108 .all(db)
109109 .await?;
110110
111 let mut granted: HashSet<String> = [VIEW_SPACE, READ, MESSAGE]
112 .into_iter()
113 .map(String::from)
114 .collect();
115
111116 if member_groups.is_empty() {
112 return Ok(Permissions::default());
117 return Ok(Permissions { granted });
113118 }
114119
115120 let group_ids: Vec<Uuid> = member_groups.into_iter().map(|mg| mg.group_id).collect();
@@ -118,7 +123,6 @@
118123 .all(db)
119124 .await?;
120125
121 let mut granted = HashSet::new();
122126 for gp in group_perms {
123127 granted.insert(gp.permission);
124128 }
Added lib/space/src/share/dir_visibility.rs View lib/space/src/share/dir_visibility.rs
@@ -0,0 +1,114 @@
1use std::collections::HashMap;
2use std::collections::HashSet;
3
4use models::dir::dir_overwrite_group;
5use models::dir::dir_overwrite_users;
6use models::dir::dirs;
7use models::space::space_member_groups;
8use models::space::spaces;
9use sea_orm::{ColumnTrait, ConnectionTrait, EntityTrait, QueryFilter};
10use uuid::Uuid;
11
12use crate::errors::SpaceError;
13
14pub const PERM_DIR_VISIBLE: i64 = 1 << 0;
15
16fn node_visible(
17 caller: Uuid,
18 my_groups: &HashSet<Uuid>,
19 group_ows: &[dir_overwrite_group::Model],
20 user_ows: &[dir_overwrite_users::Model],
21) -> bool {
22 if group_ows.is_empty() && user_ows.is_empty() {
23 return true;
24 }
25 if let Some(uo) = user_ows.iter().find(|u| u.user_id == caller) {
26 if (uo.deny_mask & PERM_DIR_VISIBLE) != 0 {
27 return false;
28 }
29 if (uo.allow_mask & PERM_DIR_VISIBLE) != 0 {
30 return true;
31 }
32 }
33 let matching: Vec<&dir_overwrite_group::Model> = group_ows
34 .iter()
35 .filter(|g| my_groups.contains(&g.group_id))
36 .collect();
37 if matching.iter().any(|g| (g.deny_mask & PERM_DIR_VISIBLE) != 0) {
38 return false;
39 }
40 matching.iter().any(|g| (g.allow_mask & PERM_DIR_VISIBLE) != 0)
41}
42
43pub async fn is_dir_visible(
44 db: &impl ConnectionTrait,
45 space: &spaces::Model,
46 dir_id: Uuid,
47 caller: Uuid,
48) -> Result<bool, SpaceError> {
49 if space.owner_id == caller {
50 return Ok(true);
51 }
52 let target = dirs::Entity::find_by_id(dir_id).one(db).await?;
53 let Some(target) = target else {
54 return Ok(false);
55 };
56
57 let my_groups: HashSet<Uuid> = space_member_groups::Entity::find()
58 .filter(space_member_groups::Column::SpaceId.eq(space.id))
59 .filter(space_member_groups::Column::UserId.eq(caller))
60 .all(db)
61 .await?
62 .into_iter()
63 .map(|mg| mg.group_id)
64 .collect();
65
66 let nodes = dirs::Entity::find()
67 .filter(dirs::Column::SpaceId.eq(space.id))
68 .all(db)
69 .await?;
70 let group_ows = dir_overwrite_group::Entity::find()
71 .filter(dir_overwrite_group::Column::DirId.is_in(nodes.iter().map(|n| n.id)))
72 .all(db)
73 .await?;
74 let user_ows = dir_overwrite_users::Entity::find()
75 .filter(dir_overwrite_users::Column::DirId.is_in(nodes.iter().map(|n| n.id)))
76 .all(db)
77 .await?;
78
79 let mut gmap: HashMap<Uuid, Vec<dir_overwrite_group::Model>> = HashMap::new();
80 for g in group_ows {
81 gmap.entry(g.dir_id).or_default().push(g);
82 }
83 let mut umap: HashMap<Uuid, Vec<dir_overwrite_users::Model>> = HashMap::new();
84 for u in user_ows {
85 umap.entry(u.dir_id).or_default().push(u);
86 }
87
88 let mut parent_map: HashMap<Uuid, Option<Uuid>> = HashMap::new();
89 for n in &nodes {
90 parent_map.insert(n.id, n.parent_dir_id);
91 }
92
93 let direct = |id: Uuid| -> bool {
94 node_visible(
95 caller,
96 &my_groups,
97 gmap.get(&id).map(Vec::as_slice).unwrap_or(&[]),
98 umap.get(&id).map(Vec::as_slice).unwrap_or(&[]),
99 )
100 };
101
102 let mut current: Option<Uuid> = Some(target.id);
103 let mut visited = HashSet::new();
104 while let Some(id) = current {
105 if !visited.insert(id) {
106 return Ok(false);
107 }
108 if !direct(id) {
109 return Ok(false);
110 }
111 current = parent_map.get(&id).copied().flatten();
112 }
113 Ok(true)
114}
Modified lib/space/src/share/mod.rs View lib/space/src/share/mod.rs
@@ -1,3 +1,4 @@
11pub mod authz;
2pub mod dir_visibility;
23pub mod guard;
34pub mod lookup;