Skip to content

Commit f05d3b9

Browse files
committed
crlf, tabs to spaces
1 parent baf5b71 commit f05d3b9

File tree

6,119 files changed

+386838
-386838
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

6,119 files changed

+386838
-386838
lines changed

.nuget/NuGet.Config

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
<?xml version="1.0" encoding="utf-8"?>
1+
<?xml version="1.0" encoding="utf-8"?>
22
<configuration>
33
<solution>
44
<add key="disableSourceControlIntegration" value="true" />
55
</solution>
6-
</configuration>
6+
</configuration>

.nuget/NuGet.targets

+1-1
Original file line numberDiff line numberDiff line change
@@ -149,4 +149,4 @@
149149
</Code>
150150
</Task>
151151
</UsingTask>
152-
</Project>
152+
</Project>

.nuget/packages.config

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
1-
<?xml version="1.0" encoding="utf-8"?>
1+
<?xml version="1.0" encoding="utf-8"?>
22
<packages>
3-
<package id="MSBuild.Microsoft.VisualStudio.Web.targets" version="14.0.0" />
3+
<package id="MSBuild.Microsoft.VisualStudio.Web.targets" version="14.0.0" />
44
<package id="NuGet.Build" version="2.8.0" />
55
<package id="NuGet.CommandLine" version="2.8.0" />
66
<package id="psake" version="4.3.0.0" />
77
<package id="psake" version="4.3.1.0" />
88
<package id="StatLight" version="1.6.4375" />
9-
</packages>
9+
</packages>

Bundles/Raven.Bundles.Authorization/AuthorizationDecisions.cs

+177-177
Original file line numberDiff line numberDiff line change
@@ -14,181 +14,181 @@
1414

1515
namespace Raven.Bundles.Authorization
1616
{
17-
public class AuthorizationDecisions
18-
{
19-
public const string RavenDocumentAuthorization = "Raven-Document-Authorization";
20-
21-
private readonly DocumentDatabase database;
22-
23-
public AuthorizationDecisions(DocumentDatabase database)
24-
{
25-
this.database = database;
26-
}
27-
28-
public bool IsAllowed(
29-
string userId,
30-
string operation,
31-
string documentId,
32-
RavenJObject documentMetadata,
33-
Action<string> logger)
34-
{
35-
var authAsJson = documentMetadata[RavenDocumentAuthorization] as RavenJObject;
36-
if (authAsJson == null)
37-
{
38-
if (logger != null)
39-
logger("Document " + documentId + " is not secured and can be accessed by everyone.");
40-
return true;
41-
}
42-
var documentAuthorization = authAsJson.JsonDeserialization<DocumentAuthorization>();
43-
var user = GetDocumentAsEntity<AuthorizationUser>(userId);
44-
if (user == null)
45-
{
46-
if (logger != null)
47-
logger("Could not find user: " + userId + " for secured document: " + documentId);
48-
return false;
49-
}
50-
IEnumerable<IPermission> permissions =
51-
from permission in documentAuthorization.Permissions // permissions for user / role directly on document
52-
where DocumentPermissionMatchesUser(permission, user, userId)
53-
where OperationMatches(permission.Operation, operation)
54-
select permission;
55-
56-
permissions = permissions.Concat( // permissions on user matching the document's tags
57-
from permission in user.Permissions
58-
where OperationMatches(permission.Operation, operation)
59-
where TagsMatch(permission.Tags, documentAuthorization.Tags)
60-
select permission
61-
);
62-
63-
permissions = permissions.Concat( // permissions on all user's roles with tags matching the document
64-
from roleName in GetHierarchicalNames(user.Roles)
65-
let role = GetDocumentAsEntity<AuthorizationRole>(roleName)
66-
where role != null
67-
from permission in role.Permissions
68-
where OperationMatches(permission.Operation, operation)
69-
where TagsMatch(permission.Tags, documentAuthorization.Tags)
70-
select permission
71-
);
72-
73-
IEnumerable<IPermission> orderedPermissions = permissions.OrderByDescending(x => x.Priority).ThenBy(x => x.Allow);
74-
if (logger != null)
75-
{
76-
var list = orderedPermissions.ToList(); // avoid iterating twice on the list
77-
orderedPermissions = list;
78-
foreach (var permission in list)
79-
{
80-
logger(permission.Explain);
81-
}
82-
}
83-
var decidingPermission = orderedPermissions
84-
.FirstOrDefault();
85-
86-
if (decidingPermission == null)
87-
{
88-
if (logger != null)
89-
{
90-
ExplainWhyUserCantAccessTheDocument(logger, documentId, userId, user, documentAuthorization, operation);
91-
}
92-
return false;
93-
}
94-
95-
return decidingPermission.Allow;
96-
}
97-
98-
private static void ExplainWhyUserCantAccessTheDocument(Action<string> logger, string documentId, string userId, AuthorizationUser user, DocumentAuthorization documentAuthorization, string operation)
99-
{
100-
var sb = new StringBuilder("Could not find any permissions for operation: ")
101-
.Append(operation)
102-
.Append(" on ")
103-
.Append(documentId)
104-
.Append(" for user ")
105-
.Append(userId)
106-
.Append(".");
107-
108-
if(user.Roles.Count > 0)
109-
{
110-
sb.Append(" or the user's roles: [")
111-
.Append(string.Join(", ", user.Roles))
112-
.Append("]");
113-
}
114-
sb.AppendLine();
115-
116-
if(documentAuthorization.Permissions.Count(x=>x.Operation.Equals(operation, StringComparison.InvariantCultureIgnoreCase)) == 0)
117-
{
118-
sb.Append("No one may perform operation ")
119-
.Append(operation)
120-
.Append(" on ")
121-
.Append(documentId);
122-
}
123-
else
124-
{
125-
sb.Append("Only the following may perform operation ")
126-
.Append(operation)
127-
.Append(" on ")
128-
.Append(documentId)
129-
.AppendLine(":");
130-
131-
foreach (var documentPermission in documentAuthorization.Permissions)
132-
{
133-
sb.Append("\t")
134-
.Append(documentPermission.Explain)
135-
.AppendLine();
136-
}
137-
}
138-
139-
logger(sb.ToString());
140-
}
141-
142-
private static bool DocumentPermissionMatchesUser(DocumentPermission permission, AuthorizationUser user, string userId)
143-
{
144-
if (permission.User != null)
145-
return string.Equals(permission.User, userId, StringComparison.InvariantCultureIgnoreCase);
146-
if (permission.Role == null)
147-
return false;
148-
149-
return GetHierarchicalNames(user.Roles).Any(role => permission.Role.Equals(role, StringComparison.InvariantCultureIgnoreCase));
150-
}
151-
152-
private static string GetParentName(string operationName)
153-
{
154-
int lastIndex = operationName.LastIndexOf('/');
155-
if (lastIndex == -1)
156-
return "";
157-
return operationName.Substring(0, lastIndex);
158-
}
159-
160-
private static IEnumerable<string> GetHierarchicalNames(IEnumerable<string> names)
161-
{
162-
var hierarchicalNames = new HashSet<string>(StringComparer.InvariantCultureIgnoreCase);
163-
foreach (var name in names)
164-
{
165-
var copy = name;
166-
do
167-
{
168-
hierarchicalNames.Add(copy);
169-
copy = GetParentName(copy);
170-
} while (copy != "");
171-
}
172-
return hierarchicalNames;
173-
}
174-
175-
private static bool OperationMatches(string op1, string op2)
176-
{
177-
return op2.StartsWith(op1, StringComparison.InvariantCultureIgnoreCase);
178-
}
179-
180-
private static bool TagsMatch(IEnumerable<string> permissionTags, IEnumerable<string> documentTags)
181-
{
182-
return permissionTags.All(p => documentTags.Any(d => d.StartsWith(p, StringComparison.InvariantCultureIgnoreCase)));
183-
}
184-
185-
private T GetDocumentAsEntity<T>(string documentId) where T : class
186-
{
187-
var document = database.Documents.Get(documentId, null);
188-
if (document == null)
189-
return null;
190-
var entity = document.DataAsJson.JsonDeserialization<T>();
191-
return entity;
192-
}
193-
}
17+
public class AuthorizationDecisions
18+
{
19+
public const string RavenDocumentAuthorization = "Raven-Document-Authorization";
20+
21+
private readonly DocumentDatabase database;
22+
23+
public AuthorizationDecisions(DocumentDatabase database)
24+
{
25+
this.database = database;
26+
}
27+
28+
public bool IsAllowed(
29+
string userId,
30+
string operation,
31+
string documentId,
32+
RavenJObject documentMetadata,
33+
Action<string> logger)
34+
{
35+
var authAsJson = documentMetadata[RavenDocumentAuthorization] as RavenJObject;
36+
if (authAsJson == null)
37+
{
38+
if (logger != null)
39+
logger("Document " + documentId + " is not secured and can be accessed by everyone.");
40+
return true;
41+
}
42+
var documentAuthorization = authAsJson.JsonDeserialization<DocumentAuthorization>();
43+
var user = GetDocumentAsEntity<AuthorizationUser>(userId);
44+
if (user == null)
45+
{
46+
if (logger != null)
47+
logger("Could not find user: " + userId + " for secured document: " + documentId);
48+
return false;
49+
}
50+
IEnumerable<IPermission> permissions =
51+
from permission in documentAuthorization.Permissions // permissions for user / role directly on document
52+
where DocumentPermissionMatchesUser(permission, user, userId)
53+
where OperationMatches(permission.Operation, operation)
54+
select permission;
55+
56+
permissions = permissions.Concat( // permissions on user matching the document's tags
57+
from permission in user.Permissions
58+
where OperationMatches(permission.Operation, operation)
59+
where TagsMatch(permission.Tags, documentAuthorization.Tags)
60+
select permission
61+
);
62+
63+
permissions = permissions.Concat( // permissions on all user's roles with tags matching the document
64+
from roleName in GetHierarchicalNames(user.Roles)
65+
let role = GetDocumentAsEntity<AuthorizationRole>(roleName)
66+
where role != null
67+
from permission in role.Permissions
68+
where OperationMatches(permission.Operation, operation)
69+
where TagsMatch(permission.Tags, documentAuthorization.Tags)
70+
select permission
71+
);
72+
73+
IEnumerable<IPermission> orderedPermissions = permissions.OrderByDescending(x => x.Priority).ThenBy(x => x.Allow);
74+
if (logger != null)
75+
{
76+
var list = orderedPermissions.ToList(); // avoid iterating twice on the list
77+
orderedPermissions = list;
78+
foreach (var permission in list)
79+
{
80+
logger(permission.Explain);
81+
}
82+
}
83+
var decidingPermission = orderedPermissions
84+
.FirstOrDefault();
85+
86+
if (decidingPermission == null)
87+
{
88+
if (logger != null)
89+
{
90+
ExplainWhyUserCantAccessTheDocument(logger, documentId, userId, user, documentAuthorization, operation);
91+
}
92+
return false;
93+
}
94+
95+
return decidingPermission.Allow;
96+
}
97+
98+
private static void ExplainWhyUserCantAccessTheDocument(Action<string> logger, string documentId, string userId, AuthorizationUser user, DocumentAuthorization documentAuthorization, string operation)
99+
{
100+
var sb = new StringBuilder("Could not find any permissions for operation: ")
101+
.Append(operation)
102+
.Append(" on ")
103+
.Append(documentId)
104+
.Append(" for user ")
105+
.Append(userId)
106+
.Append(".");
107+
108+
if(user.Roles.Count > 0)
109+
{
110+
sb.Append(" or the user's roles: [")
111+
.Append(string.Join(", ", user.Roles))
112+
.Append("]");
113+
}
114+
sb.AppendLine();
115+
116+
if(documentAuthorization.Permissions.Count(x=>x.Operation.Equals(operation, StringComparison.InvariantCultureIgnoreCase)) == 0)
117+
{
118+
sb.Append("No one may perform operation ")
119+
.Append(operation)
120+
.Append(" on ")
121+
.Append(documentId);
122+
}
123+
else
124+
{
125+
sb.Append("Only the following may perform operation ")
126+
.Append(operation)
127+
.Append(" on ")
128+
.Append(documentId)
129+
.AppendLine(":");
130+
131+
foreach (var documentPermission in documentAuthorization.Permissions)
132+
{
133+
sb.Append("\t")
134+
.Append(documentPermission.Explain)
135+
.AppendLine();
136+
}
137+
}
138+
139+
logger(sb.ToString());
140+
}
141+
142+
private static bool DocumentPermissionMatchesUser(DocumentPermission permission, AuthorizationUser user, string userId)
143+
{
144+
if (permission.User != null)
145+
return string.Equals(permission.User, userId, StringComparison.InvariantCultureIgnoreCase);
146+
if (permission.Role == null)
147+
return false;
148+
149+
return GetHierarchicalNames(user.Roles).Any(role => permission.Role.Equals(role, StringComparison.InvariantCultureIgnoreCase));
150+
}
151+
152+
private static string GetParentName(string operationName)
153+
{
154+
int lastIndex = operationName.LastIndexOf('/');
155+
if (lastIndex == -1)
156+
return "";
157+
return operationName.Substring(0, lastIndex);
158+
}
159+
160+
private static IEnumerable<string> GetHierarchicalNames(IEnumerable<string> names)
161+
{
162+
var hierarchicalNames = new HashSet<string>(StringComparer.InvariantCultureIgnoreCase);
163+
foreach (var name in names)
164+
{
165+
var copy = name;
166+
do
167+
{
168+
hierarchicalNames.Add(copy);
169+
copy = GetParentName(copy);
170+
} while (copy != "");
171+
}
172+
return hierarchicalNames;
173+
}
174+
175+
private static bool OperationMatches(string op1, string op2)
176+
{
177+
return op2.StartsWith(op1, StringComparison.InvariantCultureIgnoreCase);
178+
}
179+
180+
private static bool TagsMatch(IEnumerable<string> permissionTags, IEnumerable<string> documentTags)
181+
{
182+
return permissionTags.All(p => documentTags.Any(d => d.StartsWith(p, StringComparison.InvariantCultureIgnoreCase)));
183+
}
184+
185+
private T GetDocumentAsEntity<T>(string documentId) where T : class
186+
{
187+
var document = database.Documents.Get(documentId, null);
188+
if (document == null)
189+
return null;
190+
var entity = document.DataAsJson.JsonDeserialization<T>();
191+
return entity;
192+
}
193+
}
194194
}

0 commit comments

Comments
 (0)