solid-logic 1.3.17-64c8b7a5 → 1.3.17-7b8c254b

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (123) hide show
  1. package/README.md +2 -2
  2. package/lib/acl/aclLogic.d.ts +3 -30
  3. package/lib/acl/aclLogic.d.ts.map +1 -1
  4. package/lib/acl/aclLogic.js +150 -119
  5. package/lib/acl/aclLogic.js.map +1 -1
  6. package/lib/authn/SolidAuthnLogic.d.ts.map +1 -1
  7. package/lib/authn/SolidAuthnLogic.js +2 -2
  8. package/lib/authn/SolidAuthnLogic.js.map +1 -1
  9. package/lib/chat/chatLogic.d.ts +3 -0
  10. package/lib/chat/chatLogic.d.ts.map +1 -0
  11. package/lib/chat/{ChatLogic.js → chatLogic.js} +82 -86
  12. package/lib/chat/chatLogic.js.map +1 -0
  13. package/lib/inbox/inboxLogic.d.ts +3 -0
  14. package/lib/inbox/inboxLogic.d.ts.map +1 -0
  15. package/lib/inbox/{InboxLogic.js → inboxLogic.js} +59 -64
  16. package/lib/inbox/inboxLogic.js.map +1 -0
  17. package/lib/index.d.ts +6 -11
  18. package/lib/index.d.ts.map +1 -1
  19. package/lib/index.js +5 -38
  20. package/lib/index.js.map +1 -1
  21. package/lib/logic/CustomError.d.ts +4 -0
  22. package/lib/logic/CustomError.d.ts.map +1 -1
  23. package/lib/logic/CustomError.js +17 -1
  24. package/lib/logic/CustomError.js.map +1 -1
  25. package/lib/logic/solidLogic.d.ts +6 -0
  26. package/lib/logic/solidLogic.d.ts.map +1 -0
  27. package/lib/logic/solidLogic.js +92 -0
  28. package/lib/logic/solidLogic.js.map +1 -0
  29. package/lib/logic/solidLogicSingleton.d.ts +1 -2
  30. package/lib/logic/solidLogicSingleton.d.ts.map +1 -1
  31. package/lib/logic/solidLogicSingleton.js +3 -3
  32. package/lib/logic/solidLogicSingleton.js.map +1 -1
  33. package/lib/profile/profileLogic.d.ts +3 -0
  34. package/lib/profile/profileLogic.d.ts.map +1 -0
  35. package/lib/profile/profileLogic.js +246 -0
  36. package/lib/profile/profileLogic.js.map +1 -0
  37. package/lib/typeIndex/typeIndexLogic.d.ts +2 -21
  38. package/lib/typeIndex/typeIndexLogic.d.ts.map +1 -1
  39. package/lib/typeIndex/typeIndexLogic.js +304 -296
  40. package/lib/typeIndex/typeIndexLogic.js.map +1 -1
  41. package/lib/types.d.ts +82 -1
  42. package/lib/types.d.ts.map +1 -1
  43. package/lib/util/containerLogic.d.ts +11 -0
  44. package/lib/util/containerLogic.d.ts.map +1 -0
  45. package/lib/{profile/ProfileLogic.js → util/containerLogic.js} +51 -44
  46. package/lib/util/containerLogic.js.map +1 -0
  47. package/lib/util/ns.d.ts +2 -0
  48. package/lib/util/ns.d.ts.map +1 -0
  49. package/lib/util/ns.js +34 -0
  50. package/lib/util/ns.js.map +1 -0
  51. package/lib/util/utilityLogic.d.ts +15 -0
  52. package/lib/util/utilityLogic.d.ts.map +1 -0
  53. package/lib/util/utilityLogic.js +274 -0
  54. package/lib/util/utilityLogic.js.map +1 -0
  55. package/lib/util/utils.d.ts +8 -0
  56. package/lib/util/utils.d.ts.map +1 -0
  57. package/lib/util/utils.js +48 -0
  58. package/lib/util/utils.js.map +1 -0
  59. package/package.json +3 -1
  60. package/src/acl/aclLogic.ts +136 -118
  61. package/src/authn/SolidAuthnLogic.ts +3 -2
  62. package/src/chat/chatLogic.ts +225 -0
  63. package/src/inbox/inboxLogic.ts +58 -0
  64. package/src/index.ts +11 -42
  65. package/src/logic/CustomError.ts +5 -1
  66. package/src/logic/solidLogic.ts +75 -0
  67. package/src/logic/solidLogicSingleton.ts +3 -3
  68. package/src/profile/profileLogic.ts +126 -0
  69. package/src/typeIndex/typeIndexLogic.ts +175 -182
  70. package/src/types.ts +83 -4
  71. package/src/util/containerLogic.ts +53 -0
  72. package/src/util/ns.ts +5 -0
  73. package/src/util/utilityLogic.ts +156 -0
  74. package/src/util/utils.ts +52 -0
  75. package/test/aclLogic.test.ts +13 -4
  76. package/test/chatLogic.test.ts +70 -71
  77. package/test/container.test.ts +57 -0
  78. package/test/helpers/dataSetup.ts +134 -0
  79. package/test/helpers/setup.ts +4 -0
  80. package/test/inboxLogic.test.ts +40 -38
  81. package/test/logic.test.ts +10 -9
  82. package/test/profileLogic.test.ts +246 -0
  83. package/test/typeIndexLogic.test.ts +487 -30
  84. package/test/utilityLogic.test.ts +172 -126
  85. package/test/utils.test.ts +32 -0
  86. package/lib/chat/ChatLogic.d.ts +0 -26
  87. package/lib/chat/ChatLogic.d.ts.map +0 -1
  88. package/lib/chat/ChatLogic.js.map +0 -1
  89. package/lib/chat/determineChatContainer.d.ts +0 -3
  90. package/lib/chat/determineChatContainer.d.ts.map +0 -1
  91. package/lib/chat/determineChatContainer.js +0 -12
  92. package/lib/chat/determineChatContainer.js.map +0 -1
  93. package/lib/discovery/discoveryLogic.d.ts +0 -37
  94. package/lib/discovery/discoveryLogic.d.ts.map +0 -1
  95. package/lib/discovery/discoveryLogic.js +0 -502
  96. package/lib/discovery/discoveryLogic.js.map +0 -1
  97. package/lib/inbox/InboxLogic.d.ts +0 -18
  98. package/lib/inbox/InboxLogic.d.ts.map +0 -1
  99. package/lib/inbox/InboxLogic.js.map +0 -1
  100. package/lib/logic/SolidLogic.d.ts +0 -48
  101. package/lib/logic/SolidLogic.d.ts.map +0 -1
  102. package/lib/logic/SolidLogic.js +0 -321
  103. package/lib/logic/SolidLogic.js.map +0 -1
  104. package/lib/profile/ProfileLogic.d.ts +0 -13
  105. package/lib/profile/ProfileLogic.d.ts.map +0 -1
  106. package/lib/profile/ProfileLogic.js.map +0 -1
  107. package/lib/util/UtilityLogic.d.ts +0 -33
  108. package/lib/util/UtilityLogic.d.ts.map +0 -1
  109. package/lib/util/UtilityLogic.js +0 -240
  110. package/lib/util/UtilityLogic.js.map +0 -1
  111. package/lib/util/uri.d.ts +0 -3
  112. package/lib/util/uri.d.ts.map +0 -1
  113. package/lib/util/uri.js +0 -9
  114. package/lib/util/uri.js.map +0 -1
  115. package/src/chat/ChatLogic.ts +0 -244
  116. package/src/chat/determineChatContainer.ts +0 -14
  117. package/src/discovery/discoveryLogic.ts +0 -269
  118. package/src/inbox/InboxLogic.ts +0 -66
  119. package/src/logic/SolidLogic.ts +0 -262
  120. package/src/profile/ProfileLogic.ts +0 -44
  121. package/src/util/UtilityLogic.ts +0 -161
  122. package/src/util/uri.ts +0 -5
  123. package/test/discoveryLogic.test.ts +0 -712
@@ -0,0 +1,274 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
26
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
27
+ return new (P || (P = Promise))(function (resolve, reject) {
28
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
29
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
30
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
31
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
32
+ });
33
+ };
34
+ var __generator = (this && this.__generator) || function (thisArg, body) {
35
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
36
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
37
+ function verb(n) { return function (v) { return step([n, v]); }; }
38
+ function step(op) {
39
+ if (f) throw new TypeError("Generator is already executing.");
40
+ while (_) try {
41
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
42
+ if (y = 0, t) op = [op[0] & 2, t.value];
43
+ switch (op[0]) {
44
+ case 0: case 1: t = op; break;
45
+ case 4: _.label++; return { value: op[1], done: false };
46
+ case 5: _.label++; y = op[1]; op = [0]; continue;
47
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
48
+ default:
49
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
50
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
51
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
52
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
53
+ if (t[2]) _.ops.pop();
54
+ _.trys.pop(); continue;
55
+ }
56
+ op = body.call(thisArg, _);
57
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
58
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
59
+ }
60
+ };
61
+ Object.defineProperty(exports, "__esModule", { value: true });
62
+ exports.createUtilityLogic = void 0;
63
+ var rdflib_1 = require("rdflib");
64
+ var CustomError_1 = require("../logic/CustomError");
65
+ var debug = __importStar(require("../util/debug"));
66
+ var utils_1 = require("./utils");
67
+ function createUtilityLogic(store, aclLogic, containerLogic) {
68
+ function recursiveDelete(containerNode) {
69
+ return __awaiter(this, void 0, void 0, function () {
70
+ var aclDocUrl, containerMembers, nodeToStringHere, e_1;
71
+ return __generator(this, function (_a) {
72
+ switch (_a.label) {
73
+ case 0:
74
+ _a.trys.push([0, 6, , 7]);
75
+ if (!containerLogic.isContainer(containerNode)) return [3 /*break*/, 5];
76
+ return [4 /*yield*/, aclLogic.findAclDocUrl(containerNode)];
77
+ case 1:
78
+ aclDocUrl = _a.sent();
79
+ return [4 /*yield*/, store.fetcher._fetch(aclDocUrl, { method: "DELETE" })];
80
+ case 2:
81
+ _a.sent();
82
+ return [4 /*yield*/, containerLogic.getContainerMembers(containerNode)];
83
+ case 3:
84
+ containerMembers = _a.sent();
85
+ return [4 /*yield*/, Promise.all(containerMembers.map(function (url) { return recursiveDelete(url); }))];
86
+ case 4:
87
+ _a.sent();
88
+ _a.label = 5;
89
+ case 5:
90
+ nodeToStringHere = containerNode.value;
91
+ return [2 /*return*/, store.fetcher._fetch(nodeToStringHere, { method: "DELETE" })];
92
+ case 6:
93
+ e_1 = _a.sent();
94
+ return [3 /*break*/, 7];
95
+ case 7: return [2 /*return*/];
96
+ }
97
+ });
98
+ });
99
+ }
100
+ /**
101
+ * Create a resource if it really does not exist
102
+ * Be absolutely sure something does not exist before creating a new empty file
103
+ * as otherwise existing could be deleted.
104
+ * @param doc {NamedNode} - The resource
105
+ */
106
+ function loadOrCreateIfNotExists(doc) {
107
+ return __awaiter(this, void 0, void 0, function () {
108
+ var response, err_1, err_2, msg, msg;
109
+ return __generator(this, function (_a) {
110
+ switch (_a.label) {
111
+ case 0:
112
+ _a.trys.push([0, 2, , 10]);
113
+ return [4 /*yield*/, store.fetcher.load(doc)];
114
+ case 1:
115
+ response = _a.sent();
116
+ return [3 /*break*/, 10];
117
+ case 2:
118
+ err_1 = _a.sent();
119
+ if (!(err_1.response.status === 404)) return [3 /*break*/, 8];
120
+ _a.label = 3;
121
+ case 3:
122
+ _a.trys.push([3, 5, , 6]);
123
+ return [4 /*yield*/, store.fetcher.webOperation('PUT', doc, { data: '', contentType: 'text/turtle' })];
124
+ case 4:
125
+ _a.sent();
126
+ return [3 /*break*/, 6];
127
+ case 5:
128
+ err_2 = _a.sent();
129
+ msg = 'createIfNotExists: PUT FAILED: ' + doc + ': ' + err_2;
130
+ throw new CustomError_1.WebOperationError(msg);
131
+ case 6: return [4 /*yield*/, store.fetcher.load(doc)];
132
+ case 7:
133
+ _a.sent();
134
+ return [3 /*break*/, 9];
135
+ case 8:
136
+ if (err_1.response.status === 401) {
137
+ throw new CustomError_1.UnauthorizedError();
138
+ }
139
+ if (err_1.response.status === 403) {
140
+ if ((0, utils_1.differentOrigin)(doc)) {
141
+ throw new CustomError_1.CrossOriginForbiddenError();
142
+ }
143
+ throw new CustomError_1.SameOriginForbiddenError();
144
+ }
145
+ msg = 'createIfNotExists doc load error NOT 404: ' + doc + ': ' + err_1;
146
+ throw new CustomError_1.FetchError(err_1.status, err_1.message + msg);
147
+ case 9: return [3 /*break*/, 10];
148
+ case 10: return [2 /*return*/, response];
149
+ }
150
+ });
151
+ });
152
+ }
153
+ /* Follow link from this doc to another thing, or else make a new link
154
+ **
155
+ ** @returns existing object, or creates it if non existent
156
+ */
157
+ function followOrCreateLink(subject, predicate, object, doc) {
158
+ return __awaiter(this, void 0, void 0, function () {
159
+ var result, msg, err_3, msg, err_4;
160
+ return __generator(this, function (_a) {
161
+ switch (_a.label) {
162
+ case 0: return [4 /*yield*/, store.fetcher.load(doc)];
163
+ case 1:
164
+ _a.sent();
165
+ result = store.any(subject, predicate, null, doc);
166
+ if (result)
167
+ return [2 /*return*/, result];
168
+ if (!store.updater.editable(doc)) {
169
+ msg = "followOrCreateLink: cannot edit ".concat(doc.value);
170
+ debug.warn(msg);
171
+ throw new CustomError_1.NotEditableError(msg);
172
+ }
173
+ _a.label = 2;
174
+ case 2:
175
+ _a.trys.push([2, 4, , 5]);
176
+ return [4 /*yield*/, store.updater.update([], [(0, rdflib_1.st)(subject, predicate, object, doc)])];
177
+ case 3:
178
+ _a.sent();
179
+ return [3 /*break*/, 5];
180
+ case 4:
181
+ err_3 = _a.sent();
182
+ msg = "followOrCreateLink: Error making link in ".concat(doc, " to ").concat(object, ": ").concat(err_3);
183
+ debug.warn(msg);
184
+ throw new CustomError_1.WebOperationError(err_3);
185
+ case 5:
186
+ _a.trys.push([5, 7, , 8]);
187
+ return [4 /*yield*/, loadOrCreateIfNotExists(object)
188
+ // store.fetcher.webOperation('PUT', object, { data: '', contentType: 'text/turtle'})
189
+ ];
190
+ case 6:
191
+ _a.sent();
192
+ return [3 /*break*/, 8];
193
+ case 7:
194
+ err_4 = _a.sent();
195
+ debug.warn("followOrCreateLink: Error loading or saving new linked document: ".concat(object, ": ").concat(err_4));
196
+ throw err_4;
197
+ case 8: return [2 /*return*/, object];
198
+ }
199
+ });
200
+ });
201
+ }
202
+ // Copied from https://github.com/solidos/web-access-control-tests/blob/v3.0.0/test/surface/delete.test.ts#L5
203
+ function setSinglePeerAccess(options) {
204
+ return __awaiter(this, void 0, void 0, function () {
205
+ var str, aclDocUrl;
206
+ return __generator(this, function (_a) {
207
+ switch (_a.label) {
208
+ case 0:
209
+ str = [
210
+ '@prefix acl: <http://www.w3.org/ns/auth/acl#>.',
211
+ '',
212
+ "<#alice> a acl:Authorization;\n acl:agent <".concat(options.ownerWebId, ">;"),
213
+ " acl:accessTo <".concat(options.target, ">;"),
214
+ " acl:default <".concat(options.target, ">;"),
215
+ ' acl:mode acl:Read, acl:Write, acl:Control.',
216
+ ''
217
+ ].join('\n');
218
+ if (options.accessToModes) {
219
+ str += [
220
+ '<#bobAccessTo> a acl:Authorization;',
221
+ " acl:agent <".concat(options.peerWebId, ">;"),
222
+ " acl:accessTo <".concat(options.target, ">;"),
223
+ " acl:mode ".concat(options.accessToModes, "."),
224
+ ''
225
+ ].join('\n');
226
+ }
227
+ if (options.defaultModes) {
228
+ str += [
229
+ '<#bobDefault> a acl:Authorization;',
230
+ " acl:agent <".concat(options.peerWebId, ">;"),
231
+ " acl:default <".concat(options.target, ">;"),
232
+ " acl:mode ".concat(options.defaultModes, "."),
233
+ ''
234
+ ].join('\n');
235
+ }
236
+ return [4 /*yield*/, aclLogic.findAclDocUrl((0, rdflib_1.sym)(options.target))];
237
+ case 1:
238
+ aclDocUrl = _a.sent();
239
+ return [2 /*return*/, store.fetcher._fetch(aclDocUrl, {
240
+ method: 'PUT',
241
+ body: str,
242
+ headers: [
243
+ ['Content-Type', 'text/turtle']
244
+ ]
245
+ })];
246
+ }
247
+ });
248
+ });
249
+ }
250
+ function createEmptyRdfDoc(doc, comment) {
251
+ return __awaiter(this, void 0, void 0, function () {
252
+ return __generator(this, function (_a) {
253
+ switch (_a.label) {
254
+ case 0: return [4 /*yield*/, store.fetcher.webOperation("PUT", doc.uri, {
255
+ data: "# ".concat(new Date(), " ").concat(comment, "\n "),
256
+ contentType: "text/turtle",
257
+ })];
258
+ case 1:
259
+ _a.sent();
260
+ return [2 /*return*/];
261
+ }
262
+ });
263
+ });
264
+ }
265
+ return {
266
+ recursiveDelete: recursiveDelete,
267
+ setSinglePeerAccess: setSinglePeerAccess,
268
+ createEmptyRdfDoc: createEmptyRdfDoc,
269
+ followOrCreateLink: followOrCreateLink,
270
+ loadOrCreateIfNotExists: loadOrCreateIfNotExists
271
+ };
272
+ }
273
+ exports.createUtilityLogic = createUtilityLogic;
274
+ //# sourceMappingURL=utilityLogic.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utilityLogic.js","sourceRoot":"","sources":["../../src/util/utilityLogic.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { NamedNode } from "rdflib";
2
+ export declare function newThing(doc: NamedNode): NamedNode;
3
+ export declare function uniqueNodes(arr: NamedNode[]): NamedNode[];
4
+ export declare function getArchiveUrl(baseUrl: string, date: Date): string;
5
+ export declare function differentOrigin(doc: any): boolean;
6
+ export declare function suggestPreferencesFile(me: NamedNode): NamedNode;
7
+ export declare function determineChatContainer(invitee: NamedNode, podRoot: NamedNode): NamedNode;
8
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/util/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAO,MAAM,QAAQ,CAAC;AAExC,wBAAgB,QAAQ,CAAC,GAAG,EAAE,SAAS,GAAG,SAAS,CAElD;AAED,wBAAgB,WAAW,CAAE,GAAG,EAAE,SAAS,EAAE,GAAG,SAAS,EAAE,CAM1D;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,UAOxD;AAED,wBAAgB,eAAe,CAAC,GAAG,KAAA,GAAG,OAAO,CAO5C;AAED,wBAAgB,sBAAsB,CAAE,EAAE,EAAC,SAAS,aAMnD;AAED,wBAAgB,sBAAsB,CAClC,OAAO,EAAE,SAAS,EAClB,OAAO,EAAE,SAAS,GACnB,SAAS,CAQX"}
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.determineChatContainer = exports.suggestPreferencesFile = exports.differentOrigin = exports.getArchiveUrl = exports.uniqueNodes = exports.newThing = void 0;
4
+ var rdflib_1 = require("rdflib");
5
+ function newThing(doc) {
6
+ return (0, rdflib_1.sym)(doc.uri + "#" + "id" + ("" + Date.now()));
7
+ }
8
+ exports.newThing = newThing;
9
+ function uniqueNodes(arr) {
10
+ var uris = arr.map(function (x) { return x.uri; });
11
+ var set = new Set(uris);
12
+ var uris2 = Array.from(set);
13
+ var arr2 = uris2.map(function (u) { return new rdflib_1.NamedNode(u); });
14
+ return arr2; // Array.from(new Set(arr.map(x => x.uri))).map(u => sym(u))
15
+ }
16
+ exports.uniqueNodes = uniqueNodes;
17
+ function getArchiveUrl(baseUrl, date) {
18
+ var year = date.getUTCFullYear();
19
+ var month = ('0' + (date.getUTCMonth() + 1)).slice(-2);
20
+ var day = ('0' + (date.getUTCDate())).slice(-2);
21
+ var parts = baseUrl.split('/');
22
+ var filename = parts[parts.length - 1];
23
+ return new URL("./archive/".concat(year, "/").concat(month, "/").concat(day, "/").concat(filename), baseUrl).toString();
24
+ }
25
+ exports.getArchiveUrl = getArchiveUrl;
26
+ function differentOrigin(doc) {
27
+ if (!doc) {
28
+ return true;
29
+ }
30
+ return ("".concat(window.location.origin, "/") !== new URL(doc.value).origin);
31
+ }
32
+ exports.differentOrigin = differentOrigin;
33
+ function suggestPreferencesFile(me) {
34
+ var stripped = me.uri.replace('/profile/', '/').replace('/public/', '/');
35
+ // const stripped = me.uri.replace(\/[p|P]rofile/\g, '/').replace(\/[p|P]ublic/\g, '/')
36
+ var folderURI = stripped.split('/').slice(0, -1).join('/') + '/Settings/';
37
+ var fileURI = folderURI + 'Preferences.ttl';
38
+ return (0, rdflib_1.sym)(fileURI);
39
+ }
40
+ exports.suggestPreferencesFile = suggestPreferencesFile;
41
+ function determineChatContainer(invitee, podRoot) {
42
+ // Create chat
43
+ // See https://gitter.im/solid/chat-app?at=5f3c800f855be416a23ae74a
44
+ var chatContainerStr = new URL("IndividualChats/".concat(new URL(invitee.value).host, "/"), podRoot.value).toString();
45
+ return new rdflib_1.NamedNode(chatContainerStr);
46
+ }
47
+ exports.determineChatContainer = determineChatContainer;
48
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/util/utils.ts"],"names":[],"mappings":";;;AAAA,iCAAwC;AAExC,SAAgB,QAAQ,CAAC,GAAc;IACnC,OAAO,IAAA,YAAG,EAAC,GAAG,CAAC,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;AACzD,CAAC;AAFD,4BAEC;AAED,SAAgB,WAAW,CAAE,GAAgB;IACzC,IAAM,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC,UAAA,CAAC,IAAI,OAAA,CAAC,CAAC,GAAG,EAAL,CAAK,CAAC,CAAA;IAChC,IAAM,GAAG,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,CAAA;IACzB,IAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IAC7B,IAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,UAAA,CAAC,IAAI,OAAA,IAAI,kBAAS,CAAC,CAAC,CAAC,EAAhB,CAAgB,CAAC,CAAA;IAC7C,OAAO,IAAI,CAAA,CAAC,4DAA4D;AAC5E,CAAC;AAND,kCAMC;AAED,SAAgB,aAAa,CAAC,OAAe,EAAE,IAAU;IACrD,IAAM,IAAI,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;IACnC,IAAM,KAAK,GAAG,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,GAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACvD,IAAM,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAClD,IAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACjC,IAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAE,CAAC,CAAE,CAAC;IACzC,OAAO,IAAI,GAAG,CAAC,oBAAa,IAAI,cAAI,KAAK,cAAI,GAAG,cAAI,QAAQ,CAAE,EAAE,OAAO,CAAC,CAAC,QAAQ,EAAE,CAAC;AACxF,CAAC;AAPD,sCAOC;AAED,SAAgB,eAAe,CAAC,GAAG;IAC/B,IAAI,CAAC,GAAG,EAAE;QACN,OAAO,IAAI,CAAC;KACf;IACD,OAAO,CACH,UAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,MAAG,KAAK,IAAI,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,MAAM,CAC7D,CAAC;AACN,CAAC;AAPD,0CAOC;AAED,SAAgB,sBAAsB,CAAE,EAAY;IAChD,IAAM,QAAQ,GAAG,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC,CAAA;IAC1E,uFAAuF;IACvF,IAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,YAAY,CAAA;IAC1E,IAAM,OAAO,GAAG,SAAS,GAAG,iBAAiB,CAAA;IAC7C,OAAO,IAAA,YAAG,EAAC,OAAO,CAAC,CAAA;AACvB,CAAC;AAND,wDAMC;AAED,SAAgB,sBAAsB,CAClC,OAAkB,EAClB,OAAkB;IAElB,cAAc;IACd,mEAAmE;IACnE,IAAM,gBAAgB,GAAG,IAAI,GAAG,CAC5B,0BAAmB,IAAI,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,MAAG,EACjD,OAAO,CAAC,KAAK,CAChB,CAAC,QAAQ,EAAE,CAAC;IACb,OAAO,IAAI,kBAAS,CAAC,gBAAgB,CAAC,CAAC;AAC3C,CAAC;AAXD,wDAWC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "solid-logic",
3
- "version": "1.3.17-64c8b7a5",
3
+ "version": "1.3.17-7b8c254b",
4
4
  "description": "Core business logic of Solid OS",
5
5
  "main": "lib/index.js",
6
6
  "scripts": {
@@ -25,6 +25,7 @@
25
25
  },
26
26
  "homepage": "https://github.com/solidos/solid-logic#readme",
27
27
  "devDependencies": {
28
+ "@babel/core": "^7.17.10",
28
29
  "@babel/plugin-proposal-class-properties": "~7.16.7",
29
30
  "@babel/plugin-proposal-optional-chaining": "~7.16.7",
30
31
  "@babel/plugin-transform-async-to-generator": "~7.16.8",
@@ -34,6 +35,7 @@
34
35
  "@types/jest": "^27.4.1",
35
36
  "@typescript-eslint/eslint-plugin": "^5.19.0",
36
37
  "@typescript-eslint/parser": "^5.19.0",
38
+ "babel-jest": "^28.0.3",
37
39
  "eslint": "^8.13.0",
38
40
  "jest": "^27.5.1",
39
41
  "jest-environment-node-debug": "^2.0.0",
@@ -1,137 +1,155 @@
1
- /**
2
- * Simple Access Control
3
- *
4
- * This function sets up a simple default ACL for a resource, with
5
- * RWC for the owner, and a specified access (default none) for the public.
6
- * In all cases owner has read write control.
7
- * Parameter lists modes allowed to public
8
- *
9
- * @param options
10
- * @param options.public eg ['Read', 'Write']
11
- *
12
- * @returns Resolves with aclDoc uri on successful write
13
- */
1
+ import { graph, NamedNode, Namespace, serialize, sym } from "rdflib"
2
+ import { AclLogic } from "../types";
3
+ import { ns as namespace } from '../util/ns'
14
4
 
15
- import { graph, NamedNode, Namespace, serialize } from "rdflib"
16
- import solidNamespace from 'solid-namespace'
17
- import * as $rdf from 'rdflib'
18
- import { solidLogicSingleton } from "../logic/solidLogicSingleton"
19
- import { ACL_LINK } from "../util/UtilityLogic"
20
5
 
21
- export const ns = solidNamespace($rdf)
6
+ export const ACL_LINK = sym(
7
+ "http://www.iana.org/assignments/link-relations/acl"
8
+ );
22
9
 
23
- export function setACLUserPublic (
24
- docURI: string,
25
- me: NamedNode,
26
- options: {
27
- defaultForNew?: boolean,
28
- public?: []
29
- }
30
- ): Promise<NamedNode> {
31
- const aclDoc = solidLogicSingleton.store.any(
32
- solidLogicSingleton.store.sym(docURI),
33
- ACL_LINK
34
- )
10
+ export function createAclLogic(store): AclLogic {
35
11
 
36
- return Promise.resolve()
37
- .then(() => {
38
- if (aclDoc) {
39
- return aclDoc as NamedNode
12
+ const ns = namespace
13
+
14
+ async function findAclDocUrl(url: NamedNode) {
15
+ await store.fetcher.load(url);
16
+ const docNode = store.any(url, ACL_LINK);
17
+ if (!docNode) {
18
+ throw new Error(`No ACL link discovered for ${url}`);
19
+ }
20
+ return docNode.value;
40
21
  }
41
-
42
- return fetchACLRel(docURI).catch(err => {
43
- throw new Error(`Error fetching rel=ACL header for ${docURI}: ${err}`)
44
- })
45
- })
46
- .then(aclDoc => {
47
- const aclText = genACLText(docURI, me, aclDoc.uri, options)
48
- if (!solidLogicSingleton.store.fetcher) {
49
- throw new Error('Cannot PUT this, store has no fetcher')
22
+ /**
23
+ * Simple Access Control
24
+ *
25
+ * This function sets up a simple default ACL for a resource, with
26
+ * RWC for the owner, and a specified access (default none) for the public.
27
+ * In all cases owner has read write control.
28
+ * Parameter lists modes allowed to public
29
+ *
30
+ * @param options
31
+ * @param options.public eg ['Read', 'Write']
32
+ *
33
+ * @returns Resolves with aclDoc uri on successful write
34
+ */
35
+ function setACLUserPublic (
36
+ docURI: string,
37
+ me: NamedNode,
38
+ options: {
39
+ defaultForNew?: boolean,
40
+ public?: []
50
41
  }
51
- return solidLogicSingleton.store.fetcher
52
- .webOperation('PUT', aclDoc.uri, {
53
- data: aclText,
54
- contentType: 'text/turtle'
55
- })
56
- .then(result => {
57
- if (!result.ok) {
58
- throw new Error('Error writing ACL text: ' + result.error)
42
+ ): Promise<NamedNode> {
43
+ const aclDoc = store.any(
44
+ store.sym(docURI),
45
+ ACL_LINK
46
+ )
47
+
48
+ return Promise.resolve()
49
+ .then(() => {
50
+ if (aclDoc) {
51
+ return aclDoc as NamedNode
59
52
  }
60
53
 
61
- return aclDoc
54
+ return fetchACLRel(docURI).catch(err => {
55
+ throw new Error(`Error fetching rel=ACL header for ${docURI}: ${err}`)
56
+ })
62
57
  })
63
- })
64
- }
58
+ .then(aclDoc => {
59
+ const aclText = genACLText(docURI, me, aclDoc.uri, options)
60
+ if (!store.fetcher) {
61
+ throw new Error('Cannot PUT this, store has no fetcher')
62
+ }
63
+ return store.fetcher
64
+ .webOperation('PUT', aclDoc.uri, {
65
+ data: aclText,
66
+ contentType: 'text/turtle'
67
+ })
68
+ .then(result => {
69
+ if (!result.ok) {
70
+ throw new Error('Error writing ACL text: ' + result.error)
71
+ }
65
72
 
66
- /**
67
- * @param docURI
68
- * @returns
69
- */
70
- function fetchACLRel (docURI: string): Promise<NamedNode> {
71
- const fetcher = solidLogicSingleton.store.fetcher
72
- if (!fetcher) {
73
- throw new Error('Cannot fetch ACL rel, store has no fetcher')
73
+ return aclDoc
74
+ })
75
+ })
74
76
  }
75
77
 
76
- return fetcher.load(docURI).then(result => {
77
- if (!result.ok) {
78
- throw new Error('fetchACLRel: While loading:' + (result as any).error)
78
+ /**
79
+ * @param docURI
80
+ * @returns
81
+ */
82
+ function fetchACLRel (docURI: string): Promise<NamedNode> {
83
+ const fetcher = store.fetcher
84
+ if (!fetcher) {
85
+ throw new Error('Cannot fetch ACL rel, store has no fetcher')
79
86
  }
80
87
 
81
- const aclDoc = solidLogicSingleton.store.any(
82
- solidLogicSingleton.store.sym(docURI),
83
- ACL_LINK
84
- )
88
+ return fetcher.load(docURI).then(result => {
89
+ if (!result.ok) {
90
+ throw new Error('fetchACLRel: While loading:' + (result as any).error)
91
+ }
85
92
 
86
- if (!aclDoc) {
87
- throw new Error('fetchACLRel: No Link rel=ACL header for ' + docURI)
88
- }
93
+ const aclDoc = store.any(
94
+ store.sym(docURI),
95
+ ACL_LINK
96
+ )
89
97
 
90
- return aclDoc as NamedNode
91
- })
92
- }
98
+ if (!aclDoc) {
99
+ throw new Error('fetchACLRel: No Link rel=ACL header for ' + docURI)
100
+ }
101
+
102
+ return aclDoc as NamedNode
103
+ })
104
+ }
93
105
 
94
- /**
95
- * @param docURI
96
- * @param me
97
- * @param aclURI
98
- * @param options
99
- *
100
- * @returns Serialized ACL
101
- */
102
- export function genACLText (
103
- docURI: string,
104
- me: NamedNode,
105
- aclURI: string,
106
- options: {
107
- defaultForNew?: boolean,
108
- public?: []
109
- } = {}
110
- ): string | undefined {
111
- const optPublic = options.public || []
112
- const g = graph()
113
- const auth = Namespace('http://www.w3.org/ns/auth/acl#')
114
- let a = g.sym(`${aclURI}#a1`)
115
- const acl = g.sym(aclURI)
116
- const doc = g.sym(docURI)
117
- g.add(a, ns.rdf('type'), auth('Authorization'), acl)
118
- g.add(a, auth('accessTo'), doc, acl)
119
- if (options.defaultForNew) {
120
- g.add(a, auth('default'), doc, acl)
121
- }
122
- g.add(a, auth('agent'), me, acl)
123
- g.add(a, auth('mode'), auth('Read'), acl)
124
- g.add(a, auth('mode'), auth('Write'), acl)
125
- g.add(a, auth('mode'), auth('Control'), acl)
106
+ /**
107
+ * @param docURI
108
+ * @param me
109
+ * @param aclURI
110
+ * @param options
111
+ *
112
+ * @returns Serialized ACL
113
+ */
114
+ function genACLText (
115
+ docURI: string,
116
+ me: NamedNode,
117
+ aclURI: string,
118
+ options: {
119
+ defaultForNew?: boolean,
120
+ public?: []
121
+ } = {}
122
+ ): string | undefined {
123
+ const optPublic = options.public || []
124
+ const g = graph()
125
+ const auth = Namespace('http://www.w3.org/ns/auth/acl#')
126
+ let a = g.sym(`${aclURI}#a1`)
127
+ const acl = g.sym(aclURI)
128
+ const doc = g.sym(docURI)
129
+ g.add(a, ns.rdf('type'), auth('Authorization'), acl)
130
+ g.add(a, auth('accessTo'), doc, acl)
131
+ if (options.defaultForNew) {
132
+ g.add(a, auth('default'), doc, acl)
133
+ }
134
+ g.add(a, auth('agent'), me, acl)
135
+ g.add(a, auth('mode'), auth('Read'), acl)
136
+ g.add(a, auth('mode'), auth('Write'), acl)
137
+ g.add(a, auth('mode'), auth('Control'), acl)
126
138
 
127
- if (optPublic.length) {
128
- a = g.sym(`${aclURI}#a2`)
129
- g.add(a, ns.rdf('type'), auth('Authorization'), acl)
130
- g.add(a, auth('accessTo'), doc, acl)
131
- g.add(a, auth('agentClass'), ns.foaf('Agent'), acl)
132
- for (let p = 0; p < optPublic.length; p++) {
133
- g.add(a, auth('mode'), auth(optPublic[p]), acl) // Like 'Read' etc
139
+ if (optPublic.length) {
140
+ a = g.sym(`${aclURI}#a2`)
141
+ g.add(a, ns.rdf('type'), auth('Authorization'), acl)
142
+ g.add(a, auth('accessTo'), doc, acl)
143
+ g.add(a, auth('agentClass'), ns.foaf('Agent'), acl)
144
+ for (let p = 0; p < optPublic.length; p++) {
145
+ g.add(a, auth('mode'), auth(optPublic[p]), acl) // Like 'Read' etc
146
+ }
147
+ }
148
+ return serialize(acl, g, aclURI)
149
+ }
150
+ return {
151
+ findAclDocUrl,
152
+ setACLUserPublic,
153
+ genACLText
134
154
  }
135
- }
136
- return serialize(acl, g, aclURI)
137
- }
155
+ }