From 5dfb5772641bff4de3e6ec2fc7ade78054830a4b Mon Sep 17 00:00:00 2001 From: Paul Schneider Date: Sat, 17 Oct 2020 11:35:15 +0100 Subject: [PATCH] implement predefined circles usage --- Makefile | 3 +- src/Yavsc/Makefile | 5 +++ src/Yavsc/Services/FileSystemAuthManager.cs | 44 +++++++++++++++++++-- 3 files changed, 47 insertions(+), 5 deletions(-) diff --git a/Makefile b/Makefile index 9cc8d449..8c977164 100644 --- a/Makefile +++ b/Makefile @@ -62,4 +62,5 @@ yavscd: src/Yavsc/bin/$(CONFIG)/dnx451/Yavsc.dll src/Yavsc.Server/bin/$(CONFIG)/ version-increment-patch: scripts/version.sh $$(cat version.txt) patch > version.txt -sPHONY: packages + +.PHONY: packages diff --git a/src/Yavsc/Makefile b/src/Yavsc/Makefile index 3b14806a..f7502c9b 100644 --- a/src/Yavsc/Makefile +++ b/src/Yavsc/Makefile @@ -23,6 +23,11 @@ MINCSS=wwwroot/css/coiffure.min.css wwwroot/css/dev.min.css wwwroot/c web: project.lock.json MCS_OPTIONS=$(MCS_OPTIONS) MONO_OPTIONS=$(MONO_OPTIONS) ASPNET_LOG_LEVEL=$(ASPNET_LOG_LEVEL) ASPNET_ENV=$(ASPNET_ENV) dnx web --configuration=$(CONFIGURATION) |tee web.log + +start_debug: + ASPNET_ENV=Development mono --debugger-agent=transport=dt_socket,server=y,address=127.0.0.1:4669 /home/paul/.dnx/runtimes/dnx-mono.1.0.0-rc1-update2/bin/Microsoft.Dnx.Host.Mono.dll web + + nweb: MONO_PATH=$(MONO_PATH):~/.dnx/runtimes/dnx-mono.1.0.0-rc1-update2/bin ~/.dnx/runtimes/dnx-mono.1.0.0-rc1-update2/bin/ndnx web diff --git a/src/Yavsc/Services/FileSystemAuthManager.cs b/src/Yavsc/Services/FileSystemAuthManager.cs index 5d808736..85c391b4 100644 --- a/src/Yavsc/Services/FileSystemAuthManager.cs +++ b/src/Yavsc/Services/FileSystemAuthManager.cs @@ -7,11 +7,29 @@ using Microsoft.Extensions.Logging; using Microsoft.Extensions.OptionsModel; using System.IO; using rules; +using Microsoft.Data.Entity; namespace Yavsc.Services { public class FileSystemAuthManager : IFileSystemAuthManager { + class BelongsToCircle : UserMatch + { + public override bool Match(string userId) + { + return true; + } + } + class OutOfCircle : UserMatch + { + public override bool Match(string userId) + { + return false; + } + } + UserMatch Out = new OutOfCircle(); + UserMatch In = new BelongsToCircle(); + readonly ApplicationDbContext _dbContext; readonly ILogger _logger; @@ -41,23 +59,41 @@ namespace Yavsc.Services if (parts.Length < 4) return FileAccessRight.None; var fileDir = string.Join("/", parts.Take(parts.Length - 1)); + var fileName = parts[parts.Length - 1]; + var firstFileNamePart = parts[3]; - if (firstFileNamePart == "pub") + if (firstFileNamePart == "pub" && aclfileName != fileName) { _logger.LogInformation("Serving public file."); return FileAccessRight.Read; } + if (user == null) return FileAccessRight.None; var funame = parts[2]; - _logger.LogInformation($"Accessing {normalizedFullPath} from {funame}"); - - if (funame == user?.GetUserName()) + var cusername = user.GetUserName(); + if (funame == cusername) { _logger.LogInformation("Serving file to owner."); return FileAccessRight.Read | FileAccessRight.Write; } + if (aclfileName == fileName) + return FileAccessRight.None; + + _logger.LogInformation($"Access to {normalizedFullPath} for {cusername}"); + ruleSetParser.Reset(); + var cuserid = user.GetUserId(); + var fuserid = _dbContext.Users.Single(u => u.UserName == funame).Id; + var circles = _dbContext.Circle.Include(mb => mb.Members).Where(c => c.OwnerId == fuserid).ToArray(); + foreach (var circle in circles) + { + if (circle.Members.Any(m => m.MemberId == cuserid)) + ruleSetParser.Definitions.Add(circle.Name, In); + else ruleSetParser.Definitions.Add(circle.Name, Out); + } + + // _dbContext.Circle.Select(c => c.OwnerId == ) for (int dirlevel = parts.Length - 1; dirlevel>0; dirlevel--) { var aclfi = new FileInfo(Path.Combine(Environment.CurrentDirectory, fileDir, aclfileName));