cozy-sharing 9.0.0 → 9.0.2

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.
package/CHANGELOG.md CHANGED
@@ -3,6 +3,28 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ ## [9.0.2](https://github.com/cozy/cozy-libs/compare/cozy-sharing@9.0.1...cozy-sharing@9.0.2) (2023-09-11)
7
+
8
+
9
+ ### Bug Fixes
10
+
11
+ * BuildSharingLink works also for perm from mes papiers ([64980a8](https://github.com/cozy/cozy-libs/commit/64980a81c769168c927fd0348a320db60a48d1bb))
12
+
13
+
14
+
15
+
16
+
17
+ ## [9.0.1](https://github.com/cozy/cozy-libs/compare/cozy-sharing@9.0.0...cozy-sharing@9.0.1) (2023-09-06)
18
+
19
+
20
+ ### Bug Fixes
21
+
22
+ * Index only existing document after a realtime update ([f678ef7](https://github.com/cozy/cozy-libs/commit/f678ef71f658583b7c10bf0db853b550e24f15d9))
23
+
24
+
25
+
26
+
27
+
6
28
  # 9.0.0 (2023-08-23)
7
29
 
8
30
 
@@ -26,7 +26,7 @@ import { fetchFilesPaths } from './helpers/files';
26
26
  import { getSharingObject, createSharingInStore, updateSharingInStore } from './helpers/sharings';
27
27
  import { SynchronousJobQueue } from './helpers/synchronousJobQueue';
28
28
  import { fetchApps } from './queries/queries';
29
- import reducer, { receiveSharings, addSharing, updateSharing, addSharingLink, updateSharingLink, revokeSharingLink, revokeRecipient, revokeSelf, receivePaths, isOwner as _isOwner, canReshare as _canReshare, getOwner as _getOwner, getRecipients as _getRecipients, getSharingById, getSharingDocIds, getSharingForSelf as _getSharingForSelf, getSharingType as _getSharingType, getSharingLink as _getSharingLink, getSharedDocIdsBySharings, getDocumentSharing, getDocumentPermissions as _getDocumentPermissions, hasSharedParent as _hasSharedParent, hasSharedChild as _hasSharedChild, getSharedParentPath as _getSharedParentPath } from './state';
29
+ import reducer, { receiveSharings, addSharing, updateSharing, addSharingLink, updateSharingLink, revokeSharingLink, revokeRecipient, revokeSelf, receivePaths, isOwner as _isOwner, canReshare as _canReshare, getOwner as _getOwner, getRecipients as _getRecipients, getSharingById, getExternalSharingIds, getSharingForSelf as _getSharingForSelf, getSharingType as _getSharingType, getSharingLink as _getSharingLink, getSharedDocIdsBySharings, getDocumentSharing, getDocumentPermissions as _getDocumentPermissions, hasSharedParent as _hasSharedParent, hasSharedChild as _hasSharedChild, getSharedParentPath as _getSharedParentPath } from './state';
30
30
  var SHARING_DOCTYPE = 'io.cozy.sharings';
31
31
  var PERMISSION_DOCTYPE = 'io.cozy.permissions';
32
32
  export var SharingProvider = /*#__PURE__*/function (_Component) {
@@ -81,7 +81,7 @@ export var SharingProvider = /*#__PURE__*/function (_Component) {
81
81
  if (internalSharing) {
82
82
  updateSharingInStore(_this.dispatch, newSharing);
83
83
  } else {
84
- docsId = getSharingDocIds(newSharing);
84
+ docsId = getExternalSharingIds(newSharing, client.getStackClient().uri);
85
85
 
86
86
  _this.synchronousJobQueue.push({
87
87
  function: createSharingInStore,
@@ -3,6 +3,7 @@ import _regeneratorRuntime from "@babel/runtime/regenerator";
3
3
  import { Q } from 'cozy-client';
4
4
  import { fetchFilesPaths } from './files';
5
5
  import { updateInternalObjectFromRealtime, normalizeDocFromRealtime } from './realtime';
6
+ import logger from '../logger';
6
7
  import { addSharing, updateSharing } from '../state';
7
8
  export var getSharingObject = function getSharingObject(internalSharing, sharing) {
8
9
  if (internalSharing) {
@@ -25,56 +26,65 @@ export var createSharingInStore = /*#__PURE__*/function () {
25
26
  return _regeneratorRuntime.wrap(function _callee$(_context) {
26
27
  while (1) switch (_context.prev = _context.next) {
27
28
  case 0:
29
+ _context.prev = 0;
30
+
28
31
  if (!(doctype === 'io.cozy.files')) {
29
- _context.next = 6;
32
+ _context.next = 7;
30
33
  break;
31
34
  }
32
35
 
33
- _context.next = 3;
36
+ _context.next = 4;
34
37
  return client.query(Q(doctype).getById(id));
35
38
 
36
- case 3:
39
+ case 4:
37
40
  _context.t0 = _context.sent;
38
- _context.next = 7;
41
+ _context.next = 8;
39
42
  break;
40
43
 
41
- case 6:
44
+ case 7:
42
45
  _context.t0 = undefined;
43
46
 
44
- case 7:
47
+ case 8:
45
48
  file = _context.t0;
46
49
  _context.t1 = file;
47
50
 
48
51
  if (!_context.t1) {
49
- _context.next = 16;
52
+ _context.next = 17;
50
53
  break;
51
54
  }
52
55
 
53
56
  _context.t2 = file.data.path;
54
57
 
55
58
  if (_context.t2) {
56
- _context.next = 15;
59
+ _context.next = 16;
57
60
  break;
58
61
  }
59
62
 
60
- _context.next = 14;
63
+ _context.next = 15;
61
64
  return fetchFilesPaths(client, doctype, [file.data]);
62
65
 
63
- case 14:
66
+ case 15:
64
67
  _context.t2 = _context.sent;
65
68
 
66
- case 15:
69
+ case 16:
67
70
  _context.t1 = _context.t2;
68
71
 
69
- case 16:
72
+ case 17:
70
73
  path = _context.t1;
71
74
  dispatch(addSharing(sharing, path));
75
+ _context.next = 24;
76
+ break;
77
+
78
+ case 21:
79
+ _context.prev = 21;
80
+ _context.t3 = _context["catch"](0);
81
+ logger.log(_context.t3);
72
82
 
73
- case 18:
83
+ case 24:
74
84
  case "end":
75
85
  return _context.stop();
76
86
  }
77
- }, _callee);
87
+ }, _callee, null, [[0, 21]]);
78
88
  }));
79
89
 
80
90
  return function (_x2) {
package/dist/state.js CHANGED
@@ -408,8 +408,15 @@ export var getSharingLink = function getSharingLink(state, docId, documentType)
408
408
  // This shouldn't have happened, but unfortunately some duplicate sharing links have been created in the past
409
409
  var perms = getDocumentPermissions(state, docId);
410
410
  if (perms.length === 0) return null;
411
- var perm = perms[0];
412
- var code = get(perm, 'attributes.shortcodes.email') || get(perm, 'attributes.codes.email');
411
+ var perm = perms[0]; // We used to use `email` as `codes` attribute for a sharingByLink.
412
+ // But when we use cozy-client to create a Permission, by default
413
+ // the codes attribute is set to `code`. MesPapiers app is using this
414
+ // default behavior... So the sharing by link created by mes papiers
415
+ // didn't appear correctly in cozy-sharing.
416
+ // This is a bit ugly, we should have a better way to know if this is
417
+ // a sharing by link or not.
418
+
419
+ var code = get(perm, 'attributes.shortcodes.email') || get(perm, 'attributes.shortcodes.code') || get(perm, 'attributes.codes.email') || get(perm, 'attributes.codes.code');
413
420
 
414
421
  if (code) {
415
422
  return buildSharingLink(state, documentType, code);
@@ -509,6 +516,33 @@ export var getSharingDocIds = function getSharingDocIds(sharing) {
509
516
  docs.push(sharing.attributes.shortcut_id);
510
517
  }
511
518
 
519
+ return docs;
520
+ };
521
+ /**
522
+ * Get ids of shared documents, but only if sharing is ready so files exist
523
+ * @param {object} sharing
524
+ * @param {string} instanceUri
525
+ * @returns {string[]} List of document ids of a sharing
526
+ */
527
+
528
+ export var getExternalSharingIds = function getExternalSharingIds(sharing, instanceUri) {
529
+ var member = sharing.attributes.members.find(function (member) {
530
+ return member.instance === instanceUri;
531
+ });
532
+ var docs = [];
533
+
534
+ if ((member === null || member === void 0 ? void 0 : member.status) === 'ready') {
535
+ docs = sharing.attributes.rules.map(function (r) {
536
+ return r.values;
537
+ }).reduce(function (acc, val) {
538
+ return acc.concat(val);
539
+ }, []);
540
+ }
541
+
542
+ if (sharing.attributes.shortcut_id) {
543
+ docs.push(sharing.attributes.shortcut_id);
544
+ }
545
+
512
546
  return docs;
513
547
  }; // Some permissions can not have values since they can
514
548
  // be on a global doctype. In that case, we can't sort
@@ -4,7 +4,7 @@ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (O
4
4
 
5
5
  function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
6
6
 
7
- import reducer, { receiveSharings, addSharing, addSharingLink, updateSharingLink, revokeSharingLink, getRecipients, revokeRecipient, revokeSelf, matchingInstanceName, getSharingLink, hasSharedParent, hasSharedChild, getSharedDocIdsBySharings, getSharingType, getPermissionDocIds, getDocumentSharingType, getSharedParentPath } from './state';
7
+ import reducer, { receiveSharings, addSharing, addSharingLink, updateSharingLink, revokeSharingLink, getRecipients, revokeRecipient, revokeSelf, matchingInstanceName, getSharingLink, hasSharedParent, hasSharedChild, getSharedDocIdsBySharings, getSharingType, getPermissionDocIds, getDocumentSharingType, getSharedParentPath, getExternalSharingIds } from './state';
8
8
  import { SHARING_1, SHARING_2, SHARING_3, SHARING_READ_ONLY, PERM_1, PERM_2, PERM_WITHOUT_DOC, SHARING_NO_ACTIVE, SHARING_WITH_SHORTCUT, APPS } from '../__tests__/fixtures';
9
9
  describe('Sharing state', function () {
10
10
  it('should have a default state', function () {
@@ -475,4 +475,55 @@ describe('getSharedParentPath', function () {
475
475
  expect(getSharedParentPath(state, '/folder-2/sub-folder-2/file-2')).toBe('/folder-2');
476
476
  expect(getSharedParentPath(state, '/folder-3/sub-folder-4/sub-folder-5/file-4')).toBe('/folder-3/sub-folder-4');
477
477
  });
478
+ });
479
+ /* eslint-disable jest/no-focused-tests */
480
+
481
+ fdescribe('getExternalSharingIds', function () {
482
+ var getAttributes = function getAttributes() {
483
+ var memberStatus = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'mail-not-sent';
484
+ return {
485
+ rules: [{
486
+ title: 'Photos',
487
+ doctype: 'io.cozy.files',
488
+ values: ['5f8c1090afad686a8f7f56cce07e8098'],
489
+ add: 'sync',
490
+ update: 'sync',
491
+ remove: 'sync'
492
+ }],
493
+ members: [{
494
+ status: 'owner',
495
+ name: 'Jane Doe',
496
+ email: 'jane@doe.com',
497
+ instance: 'http://cozy.tools:8080'
498
+ }, {
499
+ status: memberStatus,
500
+ name: 'John Doe',
501
+ email: 'john@doe.com',
502
+ instance: 'http://cozy.local:8080'
503
+ }]
504
+ };
505
+ };
506
+
507
+ it('should add shorcut ', function () {
508
+ var res = getExternalSharingIds({
509
+ attributes: _objectSpread({}, getAttributes('ready'))
510
+ }, 'http://cozy.local:8080');
511
+ expect(res).toStrictEqual(['5f8c1090afad686a8f7f56cce07e8098']);
512
+ });
513
+ it('should get only shorcut if share is not ready', function () {
514
+ var res = getExternalSharingIds({
515
+ attributes: _objectSpread(_objectSpread({}, getAttributes()), {}, {
516
+ shortcut_id: 'c63de58b2c898e457fbdfdc11a24a986'
517
+ })
518
+ }, 'http://cozy.local:8080');
519
+ expect(res).toStrictEqual(['c63de58b2c898e457fbdfdc11a24a986']);
520
+ });
521
+ it('should add shorcut ', function () {
522
+ var res = getExternalSharingIds({
523
+ attributes: _objectSpread(_objectSpread({}, getAttributes('ready')), {}, {
524
+ shortcut_id: 'c63de58b2c898e457fbdfdc11a24a986'
525
+ })
526
+ }, 'http://cozy.local:8080');
527
+ expect(res).toStrictEqual(['5f8c1090afad686a8f7f56cce07e8098', 'c63de58b2c898e457fbdfdc11a24a986']);
528
+ });
478
529
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cozy-sharing",
3
- "version": "9.0.0",
3
+ "version": "9.0.2",
4
4
  "description": "Provides sharing login for React applications.",
5
5
  "main": "dist/index.js",
6
6
  "author": "Cozy",
@@ -61,5 +61,5 @@
61
61
  "sideEffects": [
62
62
  "*.css"
63
63
  ],
64
- "gitHead": "670ac9c9b27b720c7f4a7423b60a34ed445d3c53"
64
+ "gitHead": "2476315ef7d75a1b63d34637fefbe93db710c3e9"
65
65
  }
@@ -27,7 +27,7 @@ import reducer, {
27
27
  getOwner,
28
28
  getRecipients,
29
29
  getSharingById,
30
- getSharingDocIds,
30
+ getExternalSharingIds,
31
31
  getSharingForSelf,
32
32
  getSharingType,
33
33
  getSharingLink,
@@ -155,7 +155,10 @@ export class SharingProvider extends Component {
155
155
  if (internalSharing) {
156
156
  updateSharingInStore(this.dispatch, newSharing)
157
157
  } else {
158
- const docsId = getSharingDocIds(newSharing)
158
+ const docsId = getExternalSharingIds(
159
+ newSharing,
160
+ client.getStackClient().uri
161
+ )
159
162
  this.synchronousJobQueue.push({
160
163
  function: createSharingInStore,
161
164
  arguments: {
@@ -5,6 +5,7 @@ import {
5
5
  updateInternalObjectFromRealtime,
6
6
  normalizeDocFromRealtime
7
7
  } from './realtime'
8
+ import logger from '../logger'
8
9
  import { addSharing, updateSharing } from '../state'
9
10
 
10
11
  export const getSharingObject = (internalSharing, sharing) => {
@@ -25,17 +26,21 @@ export const createSharingInStore = async ({
25
26
  // TODO Check if we can getByIds to avoid query in map
26
27
  await Promise.all(
27
28
  docsId.map(async id => {
28
- const file =
29
- doctype === 'io.cozy.files'
30
- ? await client.query(Q(doctype).getById(id))
31
- : undefined
29
+ try {
30
+ const file =
31
+ doctype === 'io.cozy.files'
32
+ ? await client.query(Q(doctype).getById(id))
33
+ : undefined
32
34
 
33
- const path =
34
- file &&
35
- (file.data.path ||
36
- (await fetchFilesPaths(client, doctype, [file.data])))
35
+ const path =
36
+ file &&
37
+ (file.data.path ||
38
+ (await fetchFilesPaths(client, doctype, [file.data])))
37
39
 
38
- dispatch(addSharing(sharing, path))
40
+ dispatch(addSharing(sharing, path))
41
+ } catch (e) {
42
+ logger.log(e)
43
+ }
39
44
  })
40
45
  )
41
46
  }
package/src/state.js CHANGED
@@ -304,9 +304,18 @@ export const getSharingLink = (state, docId, documentType) => {
304
304
  const perms = getDocumentPermissions(state, docId)
305
305
  if (perms.length === 0) return null
306
306
  const perm = perms[0]
307
+ // We used to use `email` as `codes` attribute for a sharingByLink.
308
+ // But when we use cozy-client to create a Permission, by default
309
+ // the codes attribute is set to `code`. MesPapiers app is using this
310
+ // default behavior... So the sharing by link created by mes papiers
311
+ // didn't appear correctly in cozy-sharing.
312
+ // This is a bit ugly, we should have a better way to know if this is
313
+ // a sharing by link or not.
307
314
  const code =
308
315
  get(perm, 'attributes.shortcodes.email') ||
309
- get(perm, 'attributes.codes.email')
316
+ get(perm, 'attributes.shortcodes.code') ||
317
+ get(perm, 'attributes.codes.email') ||
318
+ get(perm, 'attributes.codes.code')
310
319
  if (code) {
311
320
  return buildSharingLink(state, documentType, code)
312
321
  } else {
@@ -395,6 +404,31 @@ export const getSharingDocIds = sharing => {
395
404
  return docs
396
405
  }
397
406
 
407
+ /**
408
+ * Get ids of shared documents, but only if sharing is ready so files exist
409
+ * @param {object} sharing
410
+ * @param {string} instanceUri
411
+ * @returns {string[]} List of document ids of a sharing
412
+ */
413
+ export const getExternalSharingIds = (sharing, instanceUri) => {
414
+ const member = sharing.attributes.members.find(
415
+ member => member.instance === instanceUri
416
+ )
417
+
418
+ let docs = []
419
+ if (member?.status === 'ready') {
420
+ docs = sharing.attributes.rules
421
+ .map(r => r.values)
422
+ .reduce((acc, val) => acc.concat(val), [])
423
+ }
424
+
425
+ if (sharing.attributes.shortcut_id) {
426
+ docs.push(sharing.attributes.shortcut_id)
427
+ }
428
+
429
+ return docs
430
+ }
431
+
398
432
  // Some permissions can not have values since they can
399
433
  // be on a global doctype. In that case, we can't sort
400
434
  // them by id
package/src/state.spec.js CHANGED
@@ -15,7 +15,8 @@ import reducer, {
15
15
  getSharingType,
16
16
  getPermissionDocIds,
17
17
  getDocumentSharingType,
18
- getSharedParentPath
18
+ getSharedParentPath,
19
+ getExternalSharingIds
19
20
  } from './state'
20
21
  import {
21
22
  SHARING_1,
@@ -643,3 +644,74 @@ describe('getSharedParentPath', () => {
643
644
  ).toBe('/folder-3/sub-folder-4')
644
645
  })
645
646
  })
647
+
648
+ /* eslint-disable jest/no-focused-tests */
649
+ fdescribe('getExternalSharingIds', () => {
650
+ const getAttributes = (memberStatus = 'mail-not-sent') => ({
651
+ rules: [
652
+ {
653
+ title: 'Photos',
654
+ doctype: 'io.cozy.files',
655
+ values: ['5f8c1090afad686a8f7f56cce07e8098'],
656
+ add: 'sync',
657
+ update: 'sync',
658
+ remove: 'sync'
659
+ }
660
+ ],
661
+ members: [
662
+ {
663
+ status: 'owner',
664
+ name: 'Jane Doe',
665
+ email: 'jane@doe.com',
666
+ instance: 'http://cozy.tools:8080'
667
+ },
668
+ {
669
+ status: memberStatus,
670
+ name: 'John Doe',
671
+ email: 'john@doe.com',
672
+ instance: 'http://cozy.local:8080'
673
+ }
674
+ ]
675
+ })
676
+
677
+ it('should add shorcut ', () => {
678
+ const res = getExternalSharingIds(
679
+ {
680
+ attributes: {
681
+ ...getAttributes('ready')
682
+ }
683
+ },
684
+ 'http://cozy.local:8080'
685
+ )
686
+ expect(res).toStrictEqual(['5f8c1090afad686a8f7f56cce07e8098'])
687
+ })
688
+
689
+ it('should get only shorcut if share is not ready', () => {
690
+ const res = getExternalSharingIds(
691
+ {
692
+ attributes: {
693
+ ...getAttributes(),
694
+ shortcut_id: 'c63de58b2c898e457fbdfdc11a24a986'
695
+ }
696
+ },
697
+ 'http://cozy.local:8080'
698
+ )
699
+ expect(res).toStrictEqual(['c63de58b2c898e457fbdfdc11a24a986'])
700
+ })
701
+
702
+ it('should add shorcut ', () => {
703
+ const res = getExternalSharingIds(
704
+ {
705
+ attributes: {
706
+ ...getAttributes('ready'),
707
+ shortcut_id: 'c63de58b2c898e457fbdfdc11a24a986'
708
+ }
709
+ },
710
+ 'http://cozy.local:8080'
711
+ )
712
+ expect(res).toStrictEqual([
713
+ '5f8c1090afad686a8f7f56cce07e8098',
714
+ 'c63de58b2c898e457fbdfdc11a24a986'
715
+ ])
716
+ })
717
+ })