solid-ui 2.4.26 → 2.4.27-109c4946

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 (86) hide show
  1. package/dist/670.solid-ui.min.js +1 -0
  2. package/dist/805.solid-ui.min.js +3 -0
  3. package/dist/805.solid-ui.min.js.LICENSE.txt +58 -0
  4. package/dist/805.solid-ui.min.js.map +1 -0
  5. package/dist/_2b19.solid-ui.js +14 -0
  6. package/dist/_2b19.solid-ui.js.map +1 -0
  7. package/dist/index.html +1 -9
  8. package/dist/{main.js → solid-ui.js} +6349 -19457
  9. package/dist/solid-ui.js.map +1 -0
  10. package/dist/solid-ui.min.js +3 -0
  11. package/dist/solid-ui.min.js.LICENSE.txt +54 -0
  12. package/dist/solid-ui.min.js.map +1 -0
  13. package/dist/vendors-node_modules_jsonld_lib_jsonld_js.solid-ui.js +12134 -0
  14. package/dist/vendors-node_modules_jsonld_lib_jsonld_js.solid-ui.js.map +1 -0
  15. package/lib/acl/access-controller.d.ts +2 -3
  16. package/lib/acl/access-controller.d.ts.map +1 -1
  17. package/lib/acl/access-controller.js +17 -15
  18. package/lib/acl/access-controller.js.map +1 -1
  19. package/lib/acl/access-groups.d.ts.map +1 -1
  20. package/lib/acl/access-groups.js +78 -8
  21. package/lib/acl/access-groups.js.map +1 -1
  22. package/lib/acl/acl-control.d.ts.map +1 -1
  23. package/lib/acl/acl-control.js +10 -11
  24. package/lib/acl/acl-control.js.map +1 -1
  25. package/lib/acl/acl.d.ts +1 -1
  26. package/lib/acl/acl.js +1 -1
  27. package/lib/acl/acl.js.map +1 -1
  28. package/lib/acl/add-agent-buttons.d.ts.map +1 -1
  29. package/lib/acl/add-agent-buttons.js +4 -3
  30. package/lib/acl/add-agent-buttons.js.map +1 -1
  31. package/lib/chat/chatLogic.js +35 -17
  32. package/lib/chat/chatLogic.js.map +1 -1
  33. package/lib/chat/crypto.d.ts +1 -0
  34. package/lib/chat/crypto.d.ts.map +1 -0
  35. package/lib/chat/crypto.js +257 -0
  36. package/lib/chat/crypto.js.map +1 -0
  37. package/lib/chat/keys.d.ts +5 -0
  38. package/lib/chat/keys.d.ts.map +1 -0
  39. package/lib/chat/keys.js +88 -0
  40. package/lib/chat/keys.js.map +1 -0
  41. package/lib/chat/message.js +16 -0
  42. package/lib/chat/message.js.map +1 -1
  43. package/lib/chat/signature.d.ts +27 -0
  44. package/lib/chat/signature.d.ts.map +1 -0
  45. package/lib/chat/signature.js +110 -0
  46. package/lib/chat/signature.js.map +1 -0
  47. package/lib/footer/index.d.ts.map +1 -1
  48. package/lib/footer/index.js +5 -1
  49. package/lib/footer/index.js.map +1 -1
  50. package/lib/header/index.d.ts.map +1 -1
  51. package/lib/header/index.js +41 -20
  52. package/lib/header/index.js.map +1 -1
  53. package/lib/login/login.d.ts.map +1 -1
  54. package/lib/login/login.js +43 -39
  55. package/lib/login/login.js.map +1 -1
  56. package/lib/style.js +60 -2
  57. package/lib/style.js.map +1 -1
  58. package/lib/utils/headerFooterHelpers.d.ts +0 -4
  59. package/lib/utils/headerFooterHelpers.d.ts.map +1 -1
  60. package/lib/utils/headerFooterHelpers.js +0 -27
  61. package/lib/utils/headerFooterHelpers.js.map +1 -1
  62. package/lib/versionInfo.js +6 -6
  63. package/lib/versionInfo.js.map +1 -1
  64. package/lib/widgets/buttons.d.ts.map +1 -1
  65. package/lib/widgets/buttons.js +43 -49
  66. package/lib/widgets/buttons.js.map +1 -1
  67. package/lib/widgets/forms.js +8 -4
  68. package/lib/widgets/forms.js.map +1 -1
  69. package/package.json +20 -17
  70. package/dist/main.js.map +0 -1
  71. package/lib/acl/styles.d.ts +0 -90
  72. package/lib/acl/styles.d.ts.map +0 -1
  73. package/lib/acl/styles.js +0 -98
  74. package/lib/acl/styles.js.map +0 -1
  75. package/lib/footer/styleMap.d.ts +0 -8
  76. package/lib/footer/styleMap.d.ts.map +0 -1
  77. package/lib/footer/styleMap.js +0 -15
  78. package/lib/footer/styleMap.js.map +0 -1
  79. package/lib/header/styleMap.d.ts +0 -117
  80. package/lib/header/styleMap.d.ts.map +0 -1
  81. package/lib/header/styleMap.js +0 -139
  82. package/lib/header/styleMap.js.map +0 -1
  83. package/lib/jss/index.d.ts +0 -20
  84. package/lib/jss/index.d.ts.map +0 -1
  85. package/lib/jss/index.js +0 -47
  86. package/lib/jss/index.js.map +0 -1
@@ -23,6 +23,8 @@ var _solidLogic = require("solid-logic");
23
23
  var ns = _interopRequireWildcard(require("../ns"));
24
24
  var $rdf = _interopRequireWildcard(require("rdflib"));
25
25
  var utils = _interopRequireWildcard(require("../utils"));
26
+ var _signature = require("./signature");
27
+ var _keys = require("./keys");
26
28
  function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
27
29
  function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
28
30
  /**
@@ -83,7 +85,7 @@ var ChatChannel = /*#__PURE__*/function () {
83
85
  var oldMsg = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
84
86
  var deleteIt = arguments.length > 2 ? arguments[2] : undefined;
85
87
  return /*#__PURE__*/_regenerator["default"].mark(function _callee2() {
86
- var sts, now, timestamp, dateStamp, chatDocument, message, me, msg;
88
+ var sts, now, timestamp, dateStamp, chatDocument, message, me, msg, privateKey, errMsg;
87
89
  return _regenerator["default"].wrap(function _callee2$(_context2) {
88
90
  while (1) switch (_context2.prev = _context2.next) {
89
91
  case 0:
@@ -94,41 +96,57 @@ var ChatChannel = /*#__PURE__*/function () {
94
96
  chatDocument = oldMsg ? oldMsg.doc() : _this.dateFolder.leafDocumentFromDate(now);
95
97
  message = _solidLogic.store.sym(chatDocument.uri + '#' + 'Msg' + timestamp); // const content = store.literal(text)
96
98
  me = _solidLogic.authn.currentUser(); // If already logged on
99
+ msg = _signature.getBlankMsg;
100
+ msg.id = message;
97
101
  if (oldMsg) {
98
102
  // edit message replaces old one
99
103
  sts.push($rdf.st(mostRecentVersion(oldMsg), ns.dct('isReplacedBy'), message, chatDocument));
104
+ // do we need to rebuild oldMsg signaturen ?
100
105
  if (deleteIt) {
101
106
  sts.push($rdf.st(message, ns.schema('dateDeleted'), dateStamp, chatDocument));
107
+ msg.dateDeleted = dateStamp;
102
108
  }
103
109
  } else {
104
110
  // link new message to channel
105
111
  sts.push($rdf.st(_this.channel, ns.wf('message'), message, chatDocument));
106
112
  }
107
113
  sts.push($rdf.st(message, ns.sioc('content'), _solidLogic.store.literal(text), chatDocument));
114
+ msg.content = text;
108
115
  sts.push($rdf.st(message, ns.dct('created'), dateStamp, chatDocument));
109
- if (me) {
110
- sts.push($rdf.st(message, ns.foaf('maker'), me, chatDocument));
116
+ msg.created = dateStamp;
117
+ if (!me) {
118
+ _context2.next = 21;
119
+ break;
111
120
  }
112
- _context2.prev = 11;
113
- _context2.next = 14;
121
+ sts.push($rdf.st(message, ns.foaf('maker'), me, chatDocument));
122
+ msg.maker = me;
123
+ // privateKey the cached private key of me, cache should be deleted after a certain time
124
+ _context2.next = 19;
125
+ return (0, _keys.getPrivateKey)(me);
126
+ case 19:
127
+ privateKey = _context2.sent;
128
+ sts.push($rdf.st(message, $rdf.sym("".concat(_signature.SEC, "Proof")), $rdf.sym((0, _signature.signMsg)(msg, privateKey), chatDocument)));
129
+ case 21:
130
+ _context2.prev = 21;
131
+ _context2.next = 24;
114
132
  return _solidLogic.store.updater.update([], sts);
115
- case 14:
116
- _context2.next = 22;
133
+ case 24:
134
+ _context2.next = 32;
117
135
  break;
118
- case 16:
119
- _context2.prev = 16;
120
- _context2.t0 = _context2["catch"](11);
121
- msg = 'Error saving chat message: ' + _context2.t0;
122
- debug.warn(msg);
123
- alert(msg);
124
- throw new Error(msg);
125
- case 22:
136
+ case 26:
137
+ _context2.prev = 26;
138
+ _context2.t0 = _context2["catch"](21);
139
+ errMsg = 'Error saving chat message: ' + _context2.t0;
140
+ debug.warn(errMsg);
141
+ alert(errMsg);
142
+ throw new Error(errMsg);
143
+ case 32:
126
144
  return _context2.abrupt("return", message);
127
- case 23:
145
+ case 33:
128
146
  case "end":
129
147
  return _context2.stop();
130
148
  }
131
- }, _callee2, null, [[11, 16]]);
149
+ }, _callee2, null, [[21, 26]]);
132
150
  })();
133
151
  });
134
152
  function updateMessage(_x2) {
@@ -1 +1 @@
1
- {"version":3,"file":"chatLogic.js","names":["debug","_interopRequireWildcard","require","_dateFolder","_solidLogic","ns","$rdf","utils","_getRequireWildcardCache","nodeInterop","WeakMap","cacheBabelInterop","cacheNodeInterop","obj","__esModule","_typeof","cache","has","get","newObj","hasPropertyDescriptor","Object","defineProperty","getOwnPropertyDescriptor","key","prototype","hasOwnProperty","call","desc","set","ChatChannel","channel","options","_classCallCheck2","channelRoot","doc","dateFolder","DateFolder","div","_createClass2","value","_createMessage","_asyncToGenerator2","_regenerator","mark","_callee","text","wrap","_callee$","_context","prev","next","abrupt","updateMessage","stop","createMessage","_x","apply","arguments","_updateMessage","_this","oldMsg","length","undefined","deleteIt","_callee2","sts","now","timestamp","dateStamp","chatDocument","message","me","msg","_callee2$","_context2","Date","getTime","term","leafDocumentFromDate","store","sym","uri","authn","currentUser","push","st","mostRecentVersion","dct","schema","wf","sioc","literal","foaf","updater","update","t0","warn","alert","Error","_x2","_deleteMessage","_callee3","_callee3$","_context3","deleteMessage","_x3","exports","originalVersion","any","isDeleted","holds","isReplaced","isHidden","nick","person","s","label","_createIfNotExists","_x4","_createIfNotExists2","contentType","data","_callee4","response","_callee4$","_context4","fetcher","load","sent","status","log","webOperation","t1","requested"],"sources":["../../src/chat/chatLogic.js"],"sourcesContent":["/**\n * Contains the [[ChatChannel]] class and logic for Solid Chat\n * @packageDocumentation\n */\n\nimport * as debug from '../debug'\nimport { DateFolder } from './dateFolder'\nimport { store, authn } from 'solid-logic'\nimport * as ns from '../ns'\nimport * as $rdf from 'rdflib' // pull in first avoid cross-refs\nimport * as utils from '../utils'\n\n/* The Solid logic for a 'LongChat'\n*/\n/**\n * Common code for a chat (discussion area of messages about something)\n * This version runs over a series of files for different time periods\n *\n * Parameters for the whole chat like its title are stored on\n * index.ttl#this and the chats messages are stored in YYYY/MM/DD/chat.ttl\n *\n */\n\nexport class ChatChannel {\n constructor (channel, options) {\n this.channel = channel\n this.channelRoot = channel.doc()\n this.options = options\n this.dateFolder = new DateFolder(this.channelRoot, 'chat.ttl')\n this.div = null // : HTMLElement\n }\n\n /* Store a new message in the web,\n */\n async createMessage (text) {\n return this.updateMessage(text)\n }\n\n /* Store a new message in the web,\n as a replacement for an existing one.\n The old one iis left, and the two are linked\n */\n async updateMessage (text, oldMsg = null, deleteIt) {\n const sts = []\n const now = new Date()\n const timestamp = '' + now.getTime()\n const dateStamp = $rdf.term(now)\n const chatDocument = oldMsg ? oldMsg.doc() : this.dateFolder.leafDocumentFromDate(now)\n const message = store.sym(chatDocument.uri + '#' + 'Msg' + timestamp)\n // const content = store.literal(text)\n\n const me = authn.currentUser() // If already logged on\n\n if (oldMsg) { // edit message replaces old one\n sts.push($rdf.st(mostRecentVersion(oldMsg), ns.dct('isReplacedBy'), message, chatDocument))\n if (deleteIt) {\n sts.push($rdf.st(message, ns.schema('dateDeleted'), dateStamp, chatDocument))\n }\n } else { // link new message to channel\n sts.push($rdf.st(this.channel, ns.wf('message'), message, chatDocument))\n }\n sts.push(\n $rdf.st(message, ns.sioc('content'), store.literal(text), chatDocument)\n )\n sts.push(\n $rdf.st(message, ns.dct('created'), dateStamp, chatDocument)\n )\n if (me) {\n sts.push($rdf.st(message, ns.foaf('maker'), me, chatDocument))\n }\n try {\n await store.updater.update([], sts)\n } catch (err) {\n const msg = 'Error saving chat message: ' + err\n debug.warn(msg)\n alert(msg)\n throw new Error(msg)\n }\n return message\n }\n\n /* Mark a message as deleted\n * Wee add a new version of the message,m witha deletion flag (deletion date)\n * so that the deletion can be revoked by adding another non-deleted update\n */\n async deleteMessage (message) {\n return this.updateMessage('(message deleted)', message, true)\n }\n} // class ChatChannel\n\nexport function originalVersion (message) {\n let msg = message\n while (msg) {\n message = msg\n msg = store.any(null, ns.dct('isReplacedBy'), message, message.doc())\n }\n return message\n}\n\nexport function mostRecentVersion (message) {\n let msg = message\n while (msg) {\n message = msg\n msg = store.any(message, ns.dct('isReplacedBy'), null, message.doc())\n }\n return message\n}\n\nexport function isDeleted (message) {\n return store.holds(message, ns.schema('dateDeleted'), null, message.doc())\n}\n\nexport function isReplaced (message) {\n return store.holds(message, ns.dct('isReplacedBy'), null, message.doc())\n}\n\nexport function isHidden (message) {\n return this.isDeleted(message) || this.isReplaced(message)\n}\n\n// A Nickname for a person\n\nexport function nick (person) {\n const s = store.any(person, ns.foaf('nick'))\n if (s) return '' + s.value\n return '' + utils.label(person)\n}\n\nexport async function _createIfNotExists (doc, contentType = 'text/turtle', data = '') {\n let response\n try {\n response = await store.fetcher.load(doc)\n } catch (err) {\n if (err.response.status === 404) {\n debug.log(\n 'createIfNotExists: doc does NOT exist, will create... ' + doc\n )\n try {\n response = await store.fetcher.webOperation('PUT', doc.uri, {\n data,\n contentType\n })\n } catch (err) {\n debug.log('createIfNotExists doc FAILED: ' + doc + ': ' + err)\n throw err\n }\n delete store.fetcher.requested[doc.uri] // delete cached 404 error\n // debug.log('createIfNotExists doc created ok ' + doc)\n return response\n } else {\n debug.log(\n 'createIfNotExists doc load error NOT 404: ' + doc + ': ' + err\n )\n throw err\n }\n }\n // debug.log('createIfNotExists: doc exists, all good: ' + doc)\n return response\n}\n// ends\n"],"mappings":"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"}
1
+ {"version":3,"file":"chatLogic.js","names":["debug","_interopRequireWildcard","require","_dateFolder","_solidLogic","ns","$rdf","utils","_signature","_keys","_getRequireWildcardCache","nodeInterop","WeakMap","cacheBabelInterop","cacheNodeInterop","obj","__esModule","_typeof","cache","has","get","newObj","hasPropertyDescriptor","Object","defineProperty","getOwnPropertyDescriptor","key","prototype","hasOwnProperty","call","desc","set","ChatChannel","channel","options","_classCallCheck2","channelRoot","doc","dateFolder","DateFolder","div","_createClass2","value","_createMessage","_asyncToGenerator2","_regenerator","mark","_callee","text","wrap","_callee$","_context","prev","next","abrupt","updateMessage","stop","createMessage","_x","apply","arguments","_updateMessage","_this","oldMsg","length","undefined","deleteIt","_callee2","sts","now","timestamp","dateStamp","chatDocument","message","me","msg","privateKey","errMsg","_callee2$","_context2","Date","getTime","term","leafDocumentFromDate","store","sym","uri","authn","currentUser","getBlankMsg","id","push","st","mostRecentVersion","dct","schema","dateDeleted","wf","sioc","literal","content","created","foaf","maker","getPrivateKey","sent","concat","SEC","signMsg","updater","update","t0","warn","alert","Error","_x2","_deleteMessage","_callee3","_callee3$","_context3","deleteMessage","_x3","exports","originalVersion","any","isDeleted","holds","isReplaced","isHidden","nick","person","s","label","_createIfNotExists","_x4","_createIfNotExists2","contentType","data","_callee4","response","_callee4$","_context4","fetcher","load","status","log","webOperation","t1","requested"],"sources":["../../src/chat/chatLogic.js"],"sourcesContent":["/**\n * Contains the [[ChatChannel]] class and logic for Solid Chat\n * @packageDocumentation\n */\n\nimport * as debug from '../debug'\nimport { DateFolder } from './dateFolder'\nimport { store, authn } from 'solid-logic'\nimport * as ns from '../ns'\nimport * as $rdf from 'rdflib' // pull in first avoid cross-refs\nimport * as utils from '../utils'\nimport { getBlankMsg, signMsg, SEC } from './signature'\nimport { getPrivateKey } from './keys'\n\n/* The Solid logic for a 'LongChat'\n*/\n/**\n * Common code for a chat (discussion area of messages about something)\n * This version runs over a series of files for different time periods\n *\n * Parameters for the whole chat like its title are stored on\n * index.ttl#this and the chats messages are stored in YYYY/MM/DD/chat.ttl\n *\n */\n\nexport class ChatChannel {\n constructor (channel, options) {\n this.channel = channel\n this.channelRoot = channel.doc()\n this.options = options\n this.dateFolder = new DateFolder(this.channelRoot, 'chat.ttl')\n this.div = null // : HTMLElement\n }\n\n /* Store a new message in the web,\n */\n async createMessage (text) {\n return this.updateMessage(text)\n }\n\n /* Store a new message in the web,\n as a replacement for an existing one.\n The old one iis left, and the two are linked\n */\n async updateMessage (text, oldMsg = null, deleteIt) {\n const sts = []\n const now = new Date()\n const timestamp = '' + now.getTime()\n const dateStamp = $rdf.term(now)\n const chatDocument = oldMsg ? oldMsg.doc() : this.dateFolder.leafDocumentFromDate(now)\n const message = store.sym(chatDocument.uri + '#' + 'Msg' + timestamp)\n // const content = store.literal(text)\n\n const me = authn.currentUser() // If already logged on\n\n const msg = getBlankMsg\n msg.id = message\n if (oldMsg) { // edit message replaces old one\n sts.push($rdf.st(mostRecentVersion(oldMsg), ns.dct('isReplacedBy'), message, chatDocument))\n // do we need to rebuild oldMsg signaturen ?\n if (deleteIt) {\n sts.push($rdf.st(message, ns.schema('dateDeleted'), dateStamp, chatDocument))\n msg.dateDeleted = dateStamp\n }\n } else { // link new message to channel\n sts.push($rdf.st(this.channel, ns.wf('message'), message, chatDocument))\n }\n sts.push(\n $rdf.st(message, ns.sioc('content'), store.literal(text), chatDocument)\n )\n msg.content = text\n\n sts.push(\n $rdf.st(message, ns.dct('created'), dateStamp, chatDocument)\n )\n msg.created = dateStamp\n if (me) {\n sts.push($rdf.st(message, ns.foaf('maker'), me, chatDocument))\n msg.maker = me\n // privateKey the cached private key of me, cache should be deleted after a certain time\n const privateKey = await getPrivateKey(me)\n sts.push($rdf.st(message, $rdf.sym(`${SEC}Proof`), $rdf.sym(signMsg(msg, privateKey), chatDocument)))\n }\n try {\n await store.updater.update([], sts)\n } catch (err) {\n const errMsg = 'Error saving chat message: ' + err\n debug.warn(errMsg)\n alert(errMsg)\n throw new Error(errMsg)\n }\n return message\n }\n\n /* Mark a message as deleted\n * Wee add a new version of the message,m witha deletion flag (deletion date)\n * so that the deletion can be revoked by adding another non-deleted update\n */\n async deleteMessage (message) {\n return this.updateMessage('(message deleted)', message, true)\n }\n} // class ChatChannel\n\nexport function originalVersion (message) {\n let msg = message\n while (msg) {\n message = msg\n msg = store.any(null, ns.dct('isReplacedBy'), message, message.doc())\n }\n return message\n}\n\nexport function mostRecentVersion (message) {\n let msg = message\n while (msg) {\n message = msg\n msg = store.any(message, ns.dct('isReplacedBy'), null, message.doc())\n }\n return message\n}\n\nexport function isDeleted (message) {\n return store.holds(message, ns.schema('dateDeleted'), null, message.doc())\n}\n\nexport function isReplaced (message) {\n return store.holds(message, ns.dct('isReplacedBy'), null, message.doc())\n}\n\nexport function isHidden (message) {\n return this.isDeleted(message) || this.isReplaced(message)\n}\n\n// A Nickname for a person\n\nexport function nick (person) {\n const s = store.any(person, ns.foaf('nick'))\n if (s) return '' + s.value\n return '' + utils.label(person)\n}\n\nexport async function _createIfNotExists (doc, contentType = 'text/turtle', data = '') {\n let response\n try {\n response = await store.fetcher.load(doc)\n } catch (err) {\n if (err.response.status === 404) {\n debug.log(\n 'createIfNotExists: doc does NOT exist, will create... ' + doc\n )\n try {\n response = await store.fetcher.webOperation('PUT', doc.uri, {\n data,\n contentType\n })\n } catch (err) {\n debug.log('createIfNotExists doc FAILED: ' + doc + ': ' + err)\n throw err\n }\n delete store.fetcher.requested[doc.uri] // delete cached 404 error\n // debug.log('createIfNotExists doc created ok ' + doc)\n return response\n } else {\n debug.log(\n 'createIfNotExists doc load error NOT 404: ' + doc + ': ' + err\n )\n throw err\n }\n }\n // debug.log('createIfNotExists: doc exists, all good: ' + doc)\n return response\n}\n// ends\n"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ //# sourceMappingURL=crypto.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crypto.d.ts","sourceRoot":"","sources":["../../src/chat/crypto.ts"],"names":[],"mappings":""}
@@ -0,0 +1,257 @@
1
+ /* import { literal, quad, Statement } from 'rdflib';
2
+ // import { PODCHAT, removeHashFromUrl } from './Constants';
3
+ import { authn } from 'solid-logic'
4
+ import * as UI from 'solid-ui'
5
+ import * as $rdf from 'rdflib'
6
+
7
+ const ns = UI.ns
8
+
9
+ const removeHashFromUrl = (url: string) => {
10
+ const newUrl = new URL(url)
11
+ newUrl.hash = ''
12
+ return newUrl.href
13
+ }
14
+ const PODCHAT_NS = 'https://www.pod-chat.com/';
15
+ const PODCHAT = {
16
+ LongChatMessage: PODCHAT_NS + 'LongChatMessage',
17
+ LongChatMessageReply: PODCHAT_NS + 'LongChatMessageReply',
18
+ RSAPublicKey: PODCHAT_NS + 'RSAPublicKey',
19
+ RSAPrivateKey: PODCHAT_NS + 'RSAPrivateKey',
20
+ signature: PODCHAT_NS + 'signature'
21
+ }
22
+
23
+ // import rdfStore, { extractObjectLastValue } from './RdfStore';
24
+
25
+ export type RdfStore = {
26
+ cache: Store,
27
+ fetcher: Fetcher,
28
+ updateManager: UpdateManager
29
+ }
30
+ function extractObject({ cache }: RdfStore, webid: string, resourceUrl: string, predicate: PredicateType): Array<Node> {
31
+ return cache.each(cache.sym(webid), predicate, undefined, cache.sym(resourceUrl));
32
+ }
33
+ function extractObjectLastValue(rdfStore: RdfStore, webid: string, resourceUrl: string, predicate: PredicateType): string | undefined {
34
+ return extractObject(rdfStore, webid, resourceUrl, predicate).map(q => q.value).pop();
35
+ }
36
+
37
+ export const prepareRsaKeyPair = async (profileId: string, rsaPrivateKeyResourceUrl: string): Promise<void> => {
38
+
39
+ const privKey = await getPrivateKey(rsaPrivateKeyResourceUrl);
40
+ const pubKey = await getPublicKey(profileId);
41
+
42
+ if (!privKey || !pubKey) {
43
+ await createKeyPair(profileId, rsaPrivateKeyResourceUrl);
44
+ const privKeyNew = await getPrivateKey(rsaPrivateKeyResourceUrl);
45
+ const pubKeyNew = await getPublicKey(profileId);
46
+ if (!privKeyNew || !pubKeyNew) {
47
+ throw new Error('Unable to create RSA keypair.');
48
+ }
49
+ }
50
+ }
51
+
52
+ export const signMessage = async (rsaPrivateKeyResourceUrl: string, messageContent: string): Promise<string | undefined> => {
53
+ const privateKey = await getPrivateKey(rsaPrivateKeyResourceUrl);
54
+ if (privateKey) {
55
+ const messageContentEnc = new TextEncoder().encode(messageContent);
56
+ const signature = await window.crypto.subtle.sign(
57
+ {
58
+ name: "RSA-PSS",
59
+ saltLength: 32,
60
+ },
61
+ privateKey,
62
+ messageContentEnc
63
+ );
64
+ const exportedAsString = ab2str(signature);
65
+ const exportedAsBase64 = window.btoa(exportedAsString);
66
+ return exportedAsBase64;
67
+ }
68
+
69
+ return undefined;
70
+ }
71
+
72
+ export const verifyMessage = async (profileId: string, messageId: string, messageContent: string, signatureEncoded: string): Promise<{ messageId: string, trusted: boolean }> => {
73
+ let encoded = new TextEncoder().encode(messageContent);
74
+ const publicKey = await getPublicKey(profileId);
75
+ // base64 decode the string to get the binary data
76
+ const binaryDerString = window.atob(signatureEncoded);
77
+ // convert from a binary string to an ArrayBuffer
78
+ const signature = str2ab(binaryDerString);
79
+
80
+ if (publicKey) {
81
+ const trusted = await window.crypto.subtle.verify(
82
+ {
83
+ name: "RSA-PSS",
84
+ saltLength: 32,
85
+ },
86
+ publicKey,
87
+ signature,
88
+ encoded
89
+ );
90
+ return { messageId, trusted };
91
+ }
92
+
93
+ return { messageId, trusted: false };
94
+ }
95
+
96
+ const getPublicKey = async (profileId: string): Promise<CryptoKey | undefined> => {
97
+ const profileResourceUrl = removeHashFromUrl(profileId);
98
+ await rdfStore.fetcher.load(profileResourceUrl);
99
+ const pubKeyEncoded = extractObjectLastValue(rdfStore, PODCHAT.RSAPublicKey, profileResourceUrl, rdfStore.cache.sym(SIOC.content_encoded));
100
+ if (pubKeyEncoded) {
101
+ return importPublicKey(pubKeyEncoded);
102
+ }
103
+
104
+ return undefined;
105
+ }
106
+
107
+ const getPrivateKey = async (rsaPrivateKeyResourceUrl: string): Promise<CryptoKey | undefined> => {
108
+ await rdfStore.fetcher.load(rsaPrivateKeyResourceUrl);
109
+ const privKeyEncoded = extractObjectLastValue(rdfStore, PODCHAT.RSAPrivateKey, rsaPrivateKeyResourceUrl, rdfStore.cache.sym(SIOC.content_encoded));
110
+ if (privKeyEncoded) {
111
+ return importPrivateKey(privKeyEncoded);
112
+ }
113
+ return undefined;
114
+ }
115
+
116
+ /*
117
+ Import a PEM encoded RSA private key, to use for RSA-PSS signing.
118
+ Takes a string containing the PEM encoded key, and returns a Promise
119
+ that will resolve to a CryptoKey representing the private key.
120
+ */
121
+ /* function importPrivateKey(pem: string) {
122
+ // base64 decode the string to get the binary data
123
+ const binaryDerString = window.atob(pem);
124
+ // convert from a binary string to an ArrayBuffer
125
+ const binaryDer = str2ab(binaryDerString);
126
+
127
+ return window.crypto.subtle.importKey(
128
+ "pkcs8",
129
+ binaryDer,
130
+ {
131
+ name: "RSA-PSS",
132
+ // Consider using a 4096-bit key for systems that require long-term security
133
+ //modulusLength: 4096,
134
+ //publicExponent: new Uint8Array([1, 0, 1]),
135
+ hash: "SHA-256",
136
+ },
137
+ true,
138
+ ["sign"]
139
+ );
140
+ }
141
+
142
+ /*
143
+ Import a PEM encoded RSA public key, to use for RSA-OAEP encryption.
144
+ Takes a string containing the PEM encoded key, and returns a Promise
145
+ that will resolve to a CryptoKey representing the public key.
146
+ */
147
+ /* function importPublicKey(pem: string) {
148
+ // base64 decode the string to get the binary data
149
+ const binaryDerString = window.atob(pem);
150
+ // convert from a binary string to an ArrayBuffer
151
+ const binaryDer = str2ab(binaryDerString);
152
+
153
+ return window.crypto.subtle.importKey(
154
+ "spki",
155
+ binaryDer,
156
+ {
157
+ name: "RSA-PSS",
158
+ hash: "SHA-256"
159
+ },
160
+ true,
161
+ ["verify"]
162
+ );
163
+ }
164
+
165
+ /* const createKeyPair = async (profileId: string, rsaPrivateKeyResourceUrl: string) => {
166
+ const key = await window.crypto.subtle
167
+ .generateKey(
168
+ {
169
+ name: "RSA-PSS",
170
+ // Consider using a 4096-bit key for systems that require long-term security
171
+ modulusLength: 4096,
172
+ publicExponent: new Uint8Array([1, 0, 1]),
173
+ hash: "SHA-256",
174
+ },
175
+ true,
176
+ ["sign", "verify"]
177
+ );
178
+
179
+ await privKeyPkcs8Pem(key.privateKey, profileId, rsaPrivateKeyResourceUrl);
180
+ await pubKeySpkiPem(key.publicKey, profileId);
181
+ } */
182
+
183
+ /* async function privKeyPkcs8Pem(privKey: CryptoKey, profileId: string, rsaPrivateKeyResourceUrl: string) {
184
+ const exported = await window.crypto.subtle.exportKey("pkcs8", privKey);
185
+ const exportedAsString = ab2str(exported);
186
+ const exportedAsBase64 = window.btoa(exportedAsString);
187
+ const del: Statement[] = [];
188
+ const ins: Statement[] = [];
189
+ del.push(...rdfStore.cache.statementsMatching(
190
+ rdfStore.cache.sym(PODCHAT.RSAPrivateKey),
191
+ rdfStore.cache.sym(SIOC.content_encoded),
192
+ undefined,
193
+ rdfStore.cache.sym(rsaPrivateKeyResourceUrl)
194
+ ));
195
+ ins.push(quad(
196
+ rdfStore.cache.sym(PODCHAT.RSAPrivateKey),
197
+ rdfStore.cache.sym(SIOC.content_encoded),
198
+ literal(exportedAsBase64), // alain
199
+ rdfStore.cache.sym(rsaPrivateKeyResourceUrl)
200
+ ));
201
+ await rdfStore.updateManager.update(del, ins);
202
+ await aclForResource(rsaPrivateKeyResourceUrl, profileId);
203
+ }
204
+
205
+ async function aclForResource(resourceUrl: string, ownerId: string) {
206
+ const ins: Statement[] = [];
207
+ const aclResourceUrl = resourceUrl + '.acl';
208
+ const graph = rdfStore.cache.sym(aclResourceUrl);
209
+ const aclId = rdfStore.cache.sym(aclResourceUrl + '#ControlReadWrite');
210
+ ins.push(quad(aclId, rdfStore.cache.sym(RDF.type), rdfStore.cache.sym(ACL.Authorization), graph));
211
+ ins.push(quad(aclId, rdfStore.cache.sym(ACL.accessTo), rdfStore.cache.sym(resourceUrl), graph));
212
+ [ACL.Control, ACL.Write, ACL.Read].forEach(mode => {
213
+ ins.push(quad(aclId, rdfStore.cache.sym(ACL.mode), rdfStore.cache.sym(mode), graph));
214
+ });
215
+ ins.push(quad(aclId, rdfStore.cache.sym(ACL.agent), rdfStore.cache.sym(ownerId), graph));
216
+ await rdfStore.updateManager.update([], ins);
217
+ }
218
+
219
+ async function pubKeySpkiPem(pubKey: CryptoKey, profileId: string) {
220
+ const exported = await window.crypto.subtle.exportKey("spki", pubKey);
221
+ const exportedAsString = ab2str(exported);
222
+ const exportedAsBase64 = window.btoa(exportedAsString);
223
+ const profileResourceUrl = removeHashFromUrl(profileId);
224
+ const del: Statement[] = [];
225
+ const ins: Statement[] = [];
226
+ del.push(...rdfStore.cache.statementsMatching(
227
+ rdfStore.cache.sym(PODCHAT.RSAPublicKey),
228
+ rdfStore.cache.sym(SIOC.content_encoded),
229
+ undefined,
230
+ rdfStore.cache.sym(profileResourceUrl)
231
+ ));
232
+ ins.push(quad(
233
+ rdfStore.cache.sym(PODCHAT.RSAPublicKey),
234
+ rdfStore.cache.sym(SIOC.content_encoded),
235
+ literal(exportedAsBase64), // alain
236
+ rdfStore.cache.sym(profileResourceUrl)
237
+ ));
238
+ await rdfStore.updateManager.update(del, ins);
239
+ }
240
+
241
+ /*
242
+ Convert an ArrayBuffer into a string
243
+ */
244
+ /* function ab2str(buf: ArrayBuffer) {
245
+ return String.fromCharCode.apply(null, new Uint8Array(buf) as unknown as number[]);
246
+ }
247
+
248
+ function str2ab(str: string) {
249
+ const buf = new ArrayBuffer(str.length);
250
+ const bufView = new Uint8Array(buf);
251
+ for (let i = 0, strLen = str.length; i < strLen; i++) {
252
+ bufView[i] = str.charCodeAt(i);
253
+ }
254
+ return buf;
255
+ } */
256
+ "use strict";
257
+ //# sourceMappingURL=crypto.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crypto.js","names":[],"sources":["../../src/chat/crypto.ts"],"sourcesContent":["/* import { literal, quad, Statement } from 'rdflib';\r\n// import { PODCHAT, removeHashFromUrl } from './Constants';\r\nimport { authn } from 'solid-logic'\r\nimport * as UI from 'solid-ui'\r\nimport * as $rdf from 'rdflib'\r\n\r\nconst ns = UI.ns\r\n\r\nconst removeHashFromUrl = (url: string) => {\r\n const newUrl = new URL(url)\r\n newUrl.hash = ''\r\n return newUrl.href\r\n}\r\nconst PODCHAT_NS = 'https://www.pod-chat.com/';\r\nconst PODCHAT = {\r\n LongChatMessage: PODCHAT_NS + 'LongChatMessage',\r\n LongChatMessageReply: PODCHAT_NS + 'LongChatMessageReply',\r\n RSAPublicKey: PODCHAT_NS + 'RSAPublicKey',\r\n RSAPrivateKey: PODCHAT_NS + 'RSAPrivateKey',\r\n signature: PODCHAT_NS + 'signature'\r\n}\r\n\r\n// import rdfStore, { extractObjectLastValue } from './RdfStore';\r\n\r\nexport type RdfStore = {\r\n cache: Store,\r\n fetcher: Fetcher,\r\n updateManager: UpdateManager\r\n}\r\nfunction extractObject({ cache }: RdfStore, webid: string, resourceUrl: string, predicate: PredicateType): Array<Node> {\r\n return cache.each(cache.sym(webid), predicate, undefined, cache.sym(resourceUrl));\r\n}\r\nfunction extractObjectLastValue(rdfStore: RdfStore, webid: string, resourceUrl: string, predicate: PredicateType): string | undefined {\r\n return extractObject(rdfStore, webid, resourceUrl, predicate).map(q => q.value).pop();\r\n}\r\n\r\nexport const prepareRsaKeyPair = async (profileId: string, rsaPrivateKeyResourceUrl: string): Promise<void> => {\r\n\r\n const privKey = await getPrivateKey(rsaPrivateKeyResourceUrl);\r\n const pubKey = await getPublicKey(profileId);\r\n\r\n if (!privKey || !pubKey) {\r\n await createKeyPair(profileId, rsaPrivateKeyResourceUrl);\r\n const privKeyNew = await getPrivateKey(rsaPrivateKeyResourceUrl);\r\n const pubKeyNew = await getPublicKey(profileId);\r\n if (!privKeyNew || !pubKeyNew) {\r\n throw new Error('Unable to create RSA keypair.');\r\n }\r\n }\r\n}\r\n\r\nexport const signMessage = async (rsaPrivateKeyResourceUrl: string, messageContent: string): Promise<string | undefined> => {\r\n const privateKey = await getPrivateKey(rsaPrivateKeyResourceUrl);\r\n if (privateKey) {\r\n const messageContentEnc = new TextEncoder().encode(messageContent);\r\n const signature = await window.crypto.subtle.sign(\r\n {\r\n name: \"RSA-PSS\",\r\n saltLength: 32,\r\n },\r\n privateKey,\r\n messageContentEnc\r\n );\r\n const exportedAsString = ab2str(signature);\r\n const exportedAsBase64 = window.btoa(exportedAsString);\r\n return exportedAsBase64;\r\n }\r\n\r\n return undefined;\r\n}\r\n\r\nexport const verifyMessage = async (profileId: string, messageId: string, messageContent: string, signatureEncoded: string): Promise<{ messageId: string, trusted: boolean }> => {\r\n let encoded = new TextEncoder().encode(messageContent);\r\n const publicKey = await getPublicKey(profileId);\r\n // base64 decode the string to get the binary data\r\n const binaryDerString = window.atob(signatureEncoded);\r\n // convert from a binary string to an ArrayBuffer\r\n const signature = str2ab(binaryDerString);\r\n\r\n if (publicKey) {\r\n const trusted = await window.crypto.subtle.verify(\r\n {\r\n name: \"RSA-PSS\",\r\n saltLength: 32,\r\n },\r\n publicKey,\r\n signature,\r\n encoded\r\n );\r\n return { messageId, trusted };\r\n }\r\n\r\n return { messageId, trusted: false };\r\n}\r\n\r\nconst getPublicKey = async (profileId: string): Promise<CryptoKey | undefined> => {\r\n const profileResourceUrl = removeHashFromUrl(profileId);\r\n await rdfStore.fetcher.load(profileResourceUrl);\r\n const pubKeyEncoded = extractObjectLastValue(rdfStore, PODCHAT.RSAPublicKey, profileResourceUrl, rdfStore.cache.sym(SIOC.content_encoded));\r\n if (pubKeyEncoded) {\r\n return importPublicKey(pubKeyEncoded);\r\n }\r\n\r\n return undefined;\r\n}\r\n\r\nconst getPrivateKey = async (rsaPrivateKeyResourceUrl: string): Promise<CryptoKey | undefined> => {\r\n await rdfStore.fetcher.load(rsaPrivateKeyResourceUrl);\r\n const privKeyEncoded = extractObjectLastValue(rdfStore, PODCHAT.RSAPrivateKey, rsaPrivateKeyResourceUrl, rdfStore.cache.sym(SIOC.content_encoded));\r\n if (privKeyEncoded) {\r\n return importPrivateKey(privKeyEncoded);\r\n }\r\n return undefined;\r\n}\r\n\r\n/*\r\n Import a PEM encoded RSA private key, to use for RSA-PSS signing.\r\n Takes a string containing the PEM encoded key, and returns a Promise\r\n that will resolve to a CryptoKey representing the private key.\r\n */\r\n/* function importPrivateKey(pem: string) {\r\n // base64 decode the string to get the binary data\r\n const binaryDerString = window.atob(pem);\r\n // convert from a binary string to an ArrayBuffer\r\n const binaryDer = str2ab(binaryDerString);\r\n\r\n return window.crypto.subtle.importKey(\r\n \"pkcs8\",\r\n binaryDer,\r\n {\r\n name: \"RSA-PSS\",\r\n // Consider using a 4096-bit key for systems that require long-term security\r\n //modulusLength: 4096,\r\n //publicExponent: new Uint8Array([1, 0, 1]),\r\n hash: \"SHA-256\",\r\n },\r\n true,\r\n [\"sign\"]\r\n );\r\n}\r\n\r\n/*\r\n Import a PEM encoded RSA public key, to use for RSA-OAEP encryption.\r\n Takes a string containing the PEM encoded key, and returns a Promise\r\n that will resolve to a CryptoKey representing the public key.\r\n */\r\n/* function importPublicKey(pem: string) {\r\n // base64 decode the string to get the binary data\r\n const binaryDerString = window.atob(pem);\r\n // convert from a binary string to an ArrayBuffer\r\n const binaryDer = str2ab(binaryDerString);\r\n\r\n return window.crypto.subtle.importKey(\r\n \"spki\",\r\n binaryDer,\r\n {\r\n name: \"RSA-PSS\",\r\n hash: \"SHA-256\"\r\n },\r\n true,\r\n [\"verify\"]\r\n );\r\n}\r\n\r\n/* const createKeyPair = async (profileId: string, rsaPrivateKeyResourceUrl: string) => {\r\n const key = await window.crypto.subtle\r\n .generateKey(\r\n {\r\n name: \"RSA-PSS\",\r\n // Consider using a 4096-bit key for systems that require long-term security\r\n modulusLength: 4096,\r\n publicExponent: new Uint8Array([1, 0, 1]),\r\n hash: \"SHA-256\",\r\n },\r\n true,\r\n [\"sign\", \"verify\"]\r\n );\r\n\r\n await privKeyPkcs8Pem(key.privateKey, profileId, rsaPrivateKeyResourceUrl);\r\n await pubKeySpkiPem(key.publicKey, profileId);\r\n} */\r\n\r\n/* async function privKeyPkcs8Pem(privKey: CryptoKey, profileId: string, rsaPrivateKeyResourceUrl: string) {\r\n const exported = await window.crypto.subtle.exportKey(\"pkcs8\", privKey);\r\n const exportedAsString = ab2str(exported);\r\n const exportedAsBase64 = window.btoa(exportedAsString);\r\n const del: Statement[] = [];\r\n const ins: Statement[] = [];\r\n del.push(...rdfStore.cache.statementsMatching(\r\n rdfStore.cache.sym(PODCHAT.RSAPrivateKey),\r\n rdfStore.cache.sym(SIOC.content_encoded),\r\n undefined,\r\n rdfStore.cache.sym(rsaPrivateKeyResourceUrl)\r\n ));\r\n ins.push(quad(\r\n rdfStore.cache.sym(PODCHAT.RSAPrivateKey),\r\n rdfStore.cache.sym(SIOC.content_encoded),\r\n literal(exportedAsBase64), // alain\r\n rdfStore.cache.sym(rsaPrivateKeyResourceUrl)\r\n ));\r\n await rdfStore.updateManager.update(del, ins);\r\n await aclForResource(rsaPrivateKeyResourceUrl, profileId);\r\n}\r\n\r\nasync function aclForResource(resourceUrl: string, ownerId: string) {\r\n const ins: Statement[] = [];\r\n const aclResourceUrl = resourceUrl + '.acl';\r\n const graph = rdfStore.cache.sym(aclResourceUrl);\r\n const aclId = rdfStore.cache.sym(aclResourceUrl + '#ControlReadWrite');\r\n ins.push(quad(aclId, rdfStore.cache.sym(RDF.type), rdfStore.cache.sym(ACL.Authorization), graph));\r\n ins.push(quad(aclId, rdfStore.cache.sym(ACL.accessTo), rdfStore.cache.sym(resourceUrl), graph));\r\n [ACL.Control, ACL.Write, ACL.Read].forEach(mode => {\r\n ins.push(quad(aclId, rdfStore.cache.sym(ACL.mode), rdfStore.cache.sym(mode), graph));\r\n });\r\n ins.push(quad(aclId, rdfStore.cache.sym(ACL.agent), rdfStore.cache.sym(ownerId), graph));\r\n await rdfStore.updateManager.update([], ins);\r\n}\r\n\r\nasync function pubKeySpkiPem(pubKey: CryptoKey, profileId: string) {\r\n const exported = await window.crypto.subtle.exportKey(\"spki\", pubKey);\r\n const exportedAsString = ab2str(exported);\r\n const exportedAsBase64 = window.btoa(exportedAsString);\r\n const profileResourceUrl = removeHashFromUrl(profileId);\r\n const del: Statement[] = [];\r\n const ins: Statement[] = [];\r\n del.push(...rdfStore.cache.statementsMatching(\r\n rdfStore.cache.sym(PODCHAT.RSAPublicKey),\r\n rdfStore.cache.sym(SIOC.content_encoded),\r\n undefined,\r\n rdfStore.cache.sym(profileResourceUrl)\r\n ));\r\n ins.push(quad(\r\n rdfStore.cache.sym(PODCHAT.RSAPublicKey),\r\n rdfStore.cache.sym(SIOC.content_encoded),\r\n literal(exportedAsBase64), // alain\r\n rdfStore.cache.sym(profileResourceUrl)\r\n ));\r\n await rdfStore.updateManager.update(del, ins);\r\n}\r\n\r\n/*\r\n Convert an ArrayBuffer into a string\r\n */\r\n/* function ab2str(buf: ArrayBuffer) {\r\n return String.fromCharCode.apply(null, new Uint8Array(buf) as unknown as number[]);\r\n}\r\n\r\nfunction str2ab(str: string) {\r\n const buf = new ArrayBuffer(str.length);\r\n const bufView = new Uint8Array(buf);\r\n for (let i = 0, strLen = str.length; i < strLen; i++) {\r\n bufView[i] = str.charCodeAt(i);\r\n }\r\n return buf;\r\n} */\r\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAXA"}
@@ -0,0 +1,5 @@
1
+ export declare function generatePrivateKey(): string;
2
+ export declare function generatePublicKey(privateKey: string): string;
3
+ export declare function getPublicKey(webId: any): any;
4
+ export declare function getPrivateKey(webId: any): Promise<any>;
5
+ //# sourceMappingURL=keys.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keys.d.ts","sourceRoot":"","sources":["../../src/chat/keys.ts"],"names":[],"mappings":"AAOA,wBAAgB,kBAAkB,IAAK,MAAM,CAE5C;AAED,wBAAgB,iBAAiB,CAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAE7D;AAED,wBAAgB,YAAY,CAAE,KAAK,KAAA,OAQlC;AAmBD,wBAAsB,aAAa,CAAE,KAAK,KAAA,gBAsBzC"}
@@ -0,0 +1,88 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _typeof = require("@babel/runtime/helpers/typeof");
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.generatePrivateKey = generatePrivateKey;
9
+ exports.generatePublicKey = generatePublicKey;
10
+ exports.getPrivateKey = getPrivateKey;
11
+ exports.getPublicKey = getPublicKey;
12
+ var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
13
+ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
14
+ var _secp256k = require("@noble/curves/secp256k1");
15
+ var _utils = require("@noble/hashes/utils");
16
+ var _signature = require("./signature");
17
+ var _solidLogic = require("solid-logic");
18
+ var $rdf = _interopRequireWildcard(require("rdflib"));
19
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
20
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
21
+ function generatePrivateKey() {
22
+ return (0, _utils.bytesToHex)(_secp256k.schnorr.utils.randomPrivateKey());
23
+ }
24
+ function generatePublicKey(privateKey) {
25
+ return (0, _utils.bytesToHex)(_secp256k.schnorr.getPublicKey(privateKey));
26
+ }
27
+ function getPublicKey(webId) {
28
+ // find publickey
29
+ /* const url = new URL(webId)
30
+ url.hash = ''
31
+ store.fetcher.load(url.href)
32
+ let publicKey = store.any(store.sym(webId), store.sym(CERT +'publicKey')) */
33
+ var publicKey = publicKeyExists(webId);
34
+ return publicKey === null || publicKey === void 0 ? void 0 : publicKey.uri;
35
+ }
36
+ function publicKeyExists(webId) {
37
+ // find publickey
38
+ var url = new URL(webId);
39
+ url.hash = '';
40
+ _solidLogic.store.fetcher.load(url.href);
41
+ var publicKey = _solidLogic.store.any(_solidLogic.store.sym(webId), _solidLogic.store.sym(_signature.CERT + 'publicKey'));
42
+ return publicKey;
43
+ }
44
+ function privateKeyExists(webId) {
45
+ var url = new URL(webId);
46
+ var privateKeyUrl = url.hostname + '/profile/privateKey.ttl';
47
+ _solidLogic.store.fetcher.load(privateKeyUrl);
48
+ var privateKey = _solidLogic.store.any(_solidLogic.store.sym(webId), _solidLogic.store.sym(_signature.CERT + 'privateKey'));
49
+ return privateKey;
50
+ }
51
+ function getPrivateKey(_x) {
52
+ return _getPrivateKey.apply(this, arguments);
53
+ }
54
+ function _getPrivateKey() {
55
+ _getPrivateKey = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee(webId) {
56
+ var url, privateKeyUrl, publicKey, privateKey, del, add;
57
+ return _regenerator["default"].wrap(function _callee$(_context) {
58
+ while (1) switch (_context.prev = _context.next) {
59
+ case 0:
60
+ url = new URL(webId);
61
+ privateKeyUrl = url.hostname + '/profile/privateKey.ttl'; // find publickey
62
+ publicKey = publicKeyExists(webId); // find privateKey
63
+ privateKey = privateKeyExists(webId); // create key pair
64
+ if (!(!privateKey || !publicKey)) {
65
+ _context.next = 15;
66
+ break;
67
+ }
68
+ del = [];
69
+ add = [];
70
+ if (privateKey) del.push($rdf.st($rdf.sym(webId), $rdf.sym(_signature.CERT + 'privateKey'), privateKey, $rdf.sym(privateKeyUrl)));
71
+ if (publicKey) del.push($rdf.st($rdf.sym(webId), $rdf.sym(_signature.CERT + 'publicKey'), publicKey, $rdf.sym(url.href)));
72
+ privateKey = _solidLogic.store.sym(generatePrivateKey());
73
+ publicKey = _solidLogic.store.sym(generatePublicKey(privateKey.uri));
74
+ add.push($rdf.st($rdf.sym(webId), $rdf.sym(_signature.CERT + 'privateKey'), $rdf.literal(privateKey.uri), $rdf.sym(privateKeyUrl)));
75
+ add.push($rdf.st($rdf.sym(webId), $rdf.sym(_signature.CERT + 'publicKey'), $rdf.literal(publicKey.uri), $rdf.sym(url.href)));
76
+ _context.next = 15;
77
+ return _solidLogic.store.updater.updateMany(del, add);
78
+ case 15:
79
+ return _context.abrupt("return", privateKey.uri);
80
+ case 16:
81
+ case "end":
82
+ return _context.stop();
83
+ }
84
+ }, _callee);
85
+ }));
86
+ return _getPrivateKey.apply(this, arguments);
87
+ }
88
+ //# sourceMappingURL=keys.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keys.js","names":["_secp256k","require","_utils","_signature","_solidLogic","$rdf","_interopRequireWildcard","_getRequireWildcardCache","nodeInterop","WeakMap","cacheBabelInterop","cacheNodeInterop","obj","__esModule","_typeof","cache","has","get","newObj","hasPropertyDescriptor","Object","defineProperty","getOwnPropertyDescriptor","key","prototype","hasOwnProperty","call","desc","set","generatePrivateKey","bytesToHex","schnorr","utils","randomPrivateKey","generatePublicKey","privateKey","getPublicKey","webId","publicKey","publicKeyExists","uri","url","URL","hash","store","fetcher","load","href","any","sym","CERT","privateKeyExists","privateKeyUrl","hostname","getPrivateKey","_x","_getPrivateKey","apply","arguments","_asyncToGenerator2","_regenerator","mark","_callee","del","add","wrap","_callee$","_context","prev","next","push","st","literal","updater","updateMany","abrupt","stop"],"sources":["../../src/chat/keys.ts"],"sourcesContent":["import { schnorr } from '@noble/curves/secp256k1'\r\nimport { bytesToHex } from '@noble/hashes/utils'\r\nimport { CERT } from './signature'\r\nimport { store } from 'solid-logic'\r\nimport * as $rdf from 'rdflib'\r\nimport { NamedNode, literal } from 'rdflib'\r\n\r\nexport function generatePrivateKey (): string {\r\n return bytesToHex(schnorr.utils.randomPrivateKey())\r\n}\r\n\r\nexport function generatePublicKey (privateKey: string): string {\r\n return bytesToHex(schnorr.getPublicKey(privateKey))\r\n}\r\n\r\nexport function getPublicKey (webId) {\r\n // find publickey\r\n /* const url = new URL(webId)\r\n url.hash = ''\r\n store.fetcher.load(url.href)\r\n let publicKey = store.any(store.sym(webId), store.sym(CERT +'publicKey')) */\r\n const publicKey = publicKeyExists(webId)\r\n return publicKey?.uri as any\r\n}\r\n\r\nfunction publicKeyExists (webId: string): NamedNode {\r\n // find publickey\r\n const url = new URL(webId)\r\n url.hash = ''\r\n store.fetcher.load(url.href)\r\n const publicKey = store.any(store.sym(webId), store.sym(CERT + 'publicKey'))\r\n return publicKey as NamedNode\r\n}\r\n\r\nfunction privateKeyExists (webId: string): NamedNode {\r\n const url = new URL(webId)\r\n const privateKeyUrl = url.hostname + '/profile/privateKey.ttl'\r\n store.fetcher.load(privateKeyUrl)\r\n const privateKey = store.any(store.sym(webId), store.sym(CERT + 'privateKey'))\r\n return privateKey as NamedNode\r\n}\r\n\r\nexport async function getPrivateKey (webId) {\r\n const url = new URL(webId)\r\n const privateKeyUrl = url.hostname + '/profile/privateKey.ttl'\r\n // find publickey\r\n let publicKey = publicKeyExists(webId)\r\n // find privateKey\r\n let privateKey = privateKeyExists(webId)\r\n // create key pair\r\n if (!privateKey || !publicKey) {\r\n const del: any[] = []\r\n const add: any[] = []\r\n if (privateKey) del.push($rdf.st($rdf.sym(webId), $rdf.sym(CERT + 'privateKey'), privateKey, $rdf.sym(privateKeyUrl)))\r\n if (publicKey) del.push($rdf.st($rdf.sym(webId), $rdf.sym(CERT + 'publicKey'), publicKey, $rdf.sym(url.href)))\r\n\r\n privateKey = store.sym(generatePrivateKey())\r\n publicKey = store.sym(generatePublicKey(privateKey.uri))\r\n\r\n add.push($rdf.st($rdf.sym(webId), $rdf.sym(CERT + 'privateKey'), $rdf.literal(privateKey.uri), $rdf.sym(privateKeyUrl)))\r\n add.push($rdf.st($rdf.sym(webId), $rdf.sym(CERT + 'publicKey'), $rdf.literal(publicKey.uri), $rdf.sym(url.href)))\r\n await store.updater.updateMany(del, add)\r\n }\r\n return privateKey.uri as any\r\n}\r\n"],"mappings":"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"}
@@ -27,6 +27,8 @@ var pad = _interopRequireWildcard(require("../pad"));
27
27
  var style = _interopRequireWildcard(require("../style"));
28
28
  var utils = _interopRequireWildcard(require("../utils"));
29
29
  var widgets = _interopRequireWildcard(require("../widgets"));
30
+ var _signature = require("./signature");
31
+ var _keys = require("./keys");
30
32
  function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
31
33
  function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
32
34
  function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; }
@@ -114,6 +116,20 @@ function renderMessageRow(channelObject, message, fresh, options, userContext) {
114
116
  var date = _solidLogic.store.any(message, ns.dct('created'));
115
117
  var latestVersion = (0, _chatLogic.mostRecentVersion)(message);
116
118
  var content = _solidLogic.store.any(latestVersion, ns.sioc('content'));
119
+ var signature = _solidLogic.store.any(message, $rdf.sym("".concat(_signature.SEC, "Proof")));
120
+
121
+ // verify signature
122
+ var msg = (0, _signature.getBlankMsg)();
123
+ msg.id = message;
124
+ msg.created = date;
125
+ // this is not correct.
126
+ // If the message has been edited/deleted we must verify the latest message and may be the intermediate ones
127
+ msg.content = content;
128
+ msg.maker = creator;
129
+
130
+ // pubKey could be store in a cache for all makers
131
+ var pubKey = (0, _keys.getPublicKey)(creator); // alain no
132
+ if (!(0, _signature.verifySignature)(signature, msg, pubKey)) throw new Error();
117
133
  var originalMessage = (0, _chatLogic.originalVersion)(message);
118
134
  var edited = !message.sameTerm(originalMessage);
119
135
  var sortDate = _solidLogic.store.the(originalMessage, ns.dct('created'), null, originalMessage.doc()); // In message