Skip to content

Commit

Permalink
fix index tests and add more test cases
Browse files Browse the repository at this point in the history
  • Loading branch information
TamaraFinogina committed Jan 14, 2025
1 parent 713d46c commit 1acdebf
Show file tree
Hide file tree
Showing 3 changed files with 311 additions and 18 deletions.
3 changes: 3 additions & 0 deletions src/app/share/services/share.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -867,6 +867,9 @@ const shareService = {
validateSharingInvitation,
getPublicSharedItemInfo,
getSharedFolderSize,
inviteUserToSharedFolder,
getSharedFolderInvitationsAsInvitedUser,
getSharingRoles,
};

export default shareService;
306 changes: 298 additions & 8 deletions src/app/store/slices/sharedLinks/index.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,17 @@
import { describe, expect, it, vi, beforeEach, beforeAll } from 'vitest';
import { sharedThunks, ShareFileWithUserPayload } from './index';
const { shareItemWithUser } = sharedThunks;
import { generateNewKeys, hybridDecryptMessageWithPrivateKey } from '../../../crypto/services/pgp.service';
import {
generateNewKeys,
hybridDecryptMessageWithPrivateKey,
decryptMessageWithPrivateKey,
} from '../../../crypto/services/pgp.service';
import navigationService from 'app/core/services/navigation.service';
import { RootState } from '../..';
import { Buffer } from 'buffer';
import { UserSettings } from '@internxt/sdk/dist/shared/types/userSettings';
import userService from '../../../auth/services/user.service';
import * as shareService from 'app/share/services/share.service';
import shareService from 'app/share/services/share.service';

describe('Encryption and Decryption', () => {
beforeAll(() => {
Expand All @@ -21,9 +25,11 @@ describe('Encryption and Decryption', () => {
default: { push: vi.fn() },
}));
vi.mock('app/share/services/share.service', () => ({
inviteUserToSharedFolder: vi.fn(),
getSharedFolderInvitationsAsInvitedUser: vi.fn(),
getSharingRoles: vi.fn(),
default: {
inviteUserToSharedFolder: vi.fn(),
getSharedFolderInvitationsAsInvitedUser: vi.fn(),
getSharingRoles: vi.fn(),
},
}));
vi.mock('../../../auth/services/user.service', () => ({
default: {
Expand Down Expand Up @@ -52,7 +58,7 @@ describe('Encryption and Decryption', () => {
vi.clearAllMocks();
});

it('should setup workspace and encrypt mnemonic with kyber', async () => {
it('shareItemWithUser encrypts with kyber for an existing user', async () => {
const keys = await generateNewKeys();
const mockPayload: ShareFileWithUserPayload = {
publicKey: keys.publicKeyArmored,
Expand Down Expand Up @@ -94,15 +100,204 @@ describe('Encryption and Decryption', () => {
getSharedFolderInvitationsAsInvitedUser: vi.fn(),
getSharingRoles: vi.fn(),
};

vi.spyOn(shareService, 'getSharedFolderInvitationsAsInvitedUser').mockImplementation(
mockShareService.getSharedFolderInvitationsAsInvitedUser,
);
vi.spyOn(shareService, 'getSharingRoles').mockImplementation(mockShareService.getSharingRoles);
vi.spyOn(shareService, 'inviteUserToSharedFolder').mockImplementation(mockShareService.inviteUserToSharedFolder);

vi.spyOn(userService, 'getPublicKeyByEmail').mockReturnValue(
Promise.resolve({ publicKey: user.keys.ecc.publicKey, publicKyberKey: user.keys?.kyber.publicKey }),
Promise.resolve({ publicKey: '', publicKyberKey: '' }),
);
vi.spyOn(userService, 'preCreateUser').mockReturnValue(
Promise.resolve({
publicKey: '',
publicKyberKey: '',
user: {
uuid: '',
email: '',
},
}),
);

const getStateMock = vi.fn(() => mockRootState as RootState);
const dispatchMock = vi.fn();

const thunk = shareItemWithUser(mockPayload);
await thunk(dispatchMock, getStateMock, undefined);

const [inviteUserToSharedFolderInput] = mockShareService.inviteUserToSharedFolder.mock.calls[0];
expect(inviteUserToSharedFolderInput.encryptionKey).toBeDefined();

const { encryptionKey = '' } = inviteUserToSharedFolderInput;
const decryptedMessage = await hybridDecryptMessageWithPrivateKey({
encryptedMessageInBase64: encryptionKey,
privateKeyInBase64: Buffer.from(keys.privateKeyArmored).toString('base64'),
privateKyberKeyInBase64: keys.privateKyberKeyBase64,
});

expect(decryptedMessage).toEqual(mockUser.mnemonic);
expect(mockShareService.inviteUserToSharedFolder).toHaveBeenCalledWith(
expect.objectContaining({
itemId: mockPayload.itemId,
itemType: mockPayload.itemType,
sharedWith: mockPayload.sharedWith,
notifyUser: mockPayload.notifyUser,
notificationMessage: mockPayload.notificationMessage,
encryptionKey: encryptionKey,
encryptionAlgorithm: mockPayload.encryptionAlgorithm,
roleId: mockPayload.roleId,
persistPreviousSharing: true,
}),
);
});

it('shareItemWithUser encrypts without kyber for an existing user', async () => {
const keys = await generateNewKeys();
const mockPayload: ShareFileWithUserPayload = {
publicKey: keys.publicKeyArmored,
publicKyberKey: '',
isNewUser: false,
itemId: 'mock-itemId',
itemType: 'file',
notifyUser: false,
notificationMessage: 'mock-notificationMessage',
sharedWith: 'mock-sharedWith',
encryptionAlgorithm: 'mock-encryptionAlgorithm',
roleId: 'mock-roleId',
};

const mockUser: Partial<UserSettings> = {
mnemonic:
'truck arch rather sell tilt return warm nurse rack vacuum rubber tribe unfold scissors copper sock panel ozone harsh ahead danger soda legal state',
keys: {
ecc: {
publicKey: keys.publicKeyArmored,
privateKeyEncrypted: Buffer.from(keys.privateKeyArmored).toString('base64'),
},
kyber: {
publicKey: keys.publicKyberKeyBase64,
privateKeyEncrypted: keys.privateKyberKeyBase64,
},
},
};

const mockRootState: Partial<RootState> = {
user: { user: mockUser as UserSettings, isInitializing: false, isAuthenticated: false, isInitialized: false },
};

const user = mockUser as UserSettings;
vi.spyOn(navigationService, 'push').mockImplementation(() => {});

const mockShareService = {
inviteUserToSharedFolder: vi.fn(),
getSharedFolderInvitationsAsInvitedUser: vi.fn(),
getSharingRoles: vi.fn(),
};

vi.spyOn(shareService, 'getSharedFolderInvitationsAsInvitedUser').mockImplementation(
mockShareService.getSharedFolderInvitationsAsInvitedUser,
);
vi.spyOn(shareService, 'getSharingRoles').mockImplementation(mockShareService.getSharingRoles);
vi.spyOn(shareService, 'inviteUserToSharedFolder').mockImplementation(mockShareService.inviteUserToSharedFolder);

vi.spyOn(userService, 'getPublicKeyByEmail').mockReturnValue(
Promise.resolve({ publicKey: '', publicKyberKey: '' }),
);
vi.spyOn(userService, 'preCreateUser').mockReturnValue(
Promise.resolve({
publicKey: '',
publicKyberKey: '',
user: {
uuid: '',
email: '',
},
}),
);

const getStateMock = vi.fn(() => mockRootState as RootState);
const dispatchMock = vi.fn();

const thunk = shareItemWithUser(mockPayload);
await thunk(dispatchMock, getStateMock, undefined);

const [inviteUserToSharedFolderInput] = mockShareService.inviteUserToSharedFolder.mock.calls[0];
expect(inviteUserToSharedFolderInput.encryptionKey).toBeDefined();

const { encryptionKey = '' } = inviteUserToSharedFolderInput;
const decryptedMessage = await decryptMessageWithPrivateKey({
encryptedMessage: atob(encryptionKey),
privateKeyInBase64: Buffer.from(keys.privateKeyArmored).toString('base64'),
});

expect(decryptedMessage).toEqual(mockUser.mnemonic);
expect(mockShareService.inviteUserToSharedFolder).toHaveBeenCalledWith(
expect.objectContaining({
itemId: mockPayload.itemId,
itemType: mockPayload.itemType,
sharedWith: mockPayload.sharedWith,
notifyUser: mockPayload.notifyUser,
notificationMessage: mockPayload.notificationMessage,
encryptionKey: encryptionKey,
encryptionAlgorithm: mockPayload.encryptionAlgorithm,
roleId: mockPayload.roleId,
persistPreviousSharing: true,
}),
);
});

it('shareItemWithUser encrypts with kyber for an new user', async () => {
const keys = await generateNewKeys();
const mockPayload: ShareFileWithUserPayload = {
publicKey: '',
publicKyberKey: '',
isNewUser: true,
itemId: 'mock-itemId',
itemType: 'file',
notifyUser: false,
notificationMessage: 'mock-notificationMessage',
sharedWith: 'mock-sharedWith',
encryptionAlgorithm: 'mock-encryptionAlgorithm',
roleId: 'mock-roleId',
};

const mockUser: Partial<UserSettings> = {
mnemonic:
'truck arch rather sell tilt return warm nurse rack vacuum rubber tribe unfold scissors copper sock panel ozone harsh ahead danger soda legal state',
keys: {
ecc: {
publicKey: keys.publicKeyArmored,
privateKeyEncrypted: Buffer.from(keys.privateKeyArmored).toString('base64'),
},
kyber: {
publicKey: keys.publicKyberKeyBase64,
privateKeyEncrypted: keys.privateKyberKeyBase64,
},
},
};

const mockRootState: Partial<RootState> = {
user: { user: mockUser as UserSettings, isInitializing: false, isAuthenticated: false, isInitialized: false },
};

const user = mockUser as UserSettings;
vi.spyOn(navigationService, 'push').mockImplementation(() => {});

const mockShareService = {
inviteUserToSharedFolder: vi.fn(),
getSharedFolderInvitationsAsInvitedUser: vi.fn(),
getSharingRoles: vi.fn(),
};

vi.spyOn(shareService, 'getSharedFolderInvitationsAsInvitedUser').mockImplementation(
mockShareService.getSharedFolderInvitationsAsInvitedUser,
);
vi.spyOn(shareService, 'getSharingRoles').mockImplementation(mockShareService.getSharingRoles);
vi.spyOn(shareService, 'inviteUserToSharedFolder').mockImplementation(mockShareService.inviteUserToSharedFolder);

vi.spyOn(userService, 'getPublicKeyByEmail').mockReturnValue(
Promise.resolve({ publicKey: '', publicKyberKey: '' }),
);
vi.spyOn(userService, 'preCreateUser').mockReturnValue(
Promise.resolve({
Expand Down Expand Up @@ -146,4 +341,99 @@ describe('Encryption and Decryption', () => {
}),
);
});

it('shareItemWithUser encrypts with kyber key obtained via getPublicKeyByEmail ', async () => {
const keys = await generateNewKeys();
const mockPayload: ShareFileWithUserPayload = {
publicKey: '',
publicKyberKey: '',
isNewUser: false,
itemId: 'mock-itemId',
itemType: 'file',
notifyUser: false,
notificationMessage: 'mock-notificationMessage',
sharedWith: 'mock-sharedWith',
encryptionAlgorithm: 'mock-encryptionAlgorithm',
roleId: 'mock-roleId',
};

const mockUser: Partial<UserSettings> = {
mnemonic:
'truck arch rather sell tilt return warm nurse rack vacuum rubber tribe unfold scissors copper sock panel ozone harsh ahead danger soda legal state',
keys: {
ecc: {
publicKey: keys.publicKeyArmored,
privateKeyEncrypted: Buffer.from(keys.privateKeyArmored).toString('base64'),
},
kyber: {
publicKey: keys.publicKyberKeyBase64,
privateKeyEncrypted: keys.privateKyberKeyBase64,
},
},
};

const mockRootState: Partial<RootState> = {
user: { user: mockUser as UserSettings, isInitializing: false, isAuthenticated: false, isInitialized: false },
};

const user = mockUser as UserSettings;
vi.spyOn(navigationService, 'push').mockImplementation(() => {});

const mockShareService = {
inviteUserToSharedFolder: vi.fn(),
getSharedFolderInvitationsAsInvitedUser: vi.fn(),
getSharingRoles: vi.fn(),
};

vi.spyOn(shareService, 'getSharedFolderInvitationsAsInvitedUser').mockImplementation(
mockShareService.getSharedFolderInvitationsAsInvitedUser,
);
vi.spyOn(shareService, 'getSharingRoles').mockImplementation(mockShareService.getSharingRoles);
vi.spyOn(shareService, 'inviteUserToSharedFolder').mockImplementation(mockShareService.inviteUserToSharedFolder);

vi.spyOn(userService, 'getPublicKeyByEmail').mockReturnValue(
Promise.resolve({ publicKey: user.keys.ecc.publicKey, publicKyberKey: user.keys?.kyber.publicKey }),
);
vi.spyOn(userService, 'preCreateUser').mockReturnValue(
Promise.resolve({
publicKey: '',
publicKyberKey: '',
user: {
uuid: '',
email: '',
},
}),
);

const getStateMock = vi.fn(() => mockRootState as RootState);
const dispatchMock = vi.fn();

const thunk = shareItemWithUser(mockPayload);
await thunk(dispatchMock, getStateMock, undefined);

const [inviteUserToSharedFolderInput] = mockShareService.inviteUserToSharedFolder.mock.calls[0];
expect(inviteUserToSharedFolderInput.encryptionKey).toBeDefined();

const { encryptionKey = '' } = inviteUserToSharedFolderInput;
const decryptedMessage = await hybridDecryptMessageWithPrivateKey({
encryptedMessageInBase64: encryptionKey,
privateKeyInBase64: Buffer.from(keys.privateKeyArmored).toString('base64'),
privateKyberKeyInBase64: keys.privateKyberKeyBase64,
});

expect(decryptedMessage).toEqual(mockUser.mnemonic);
expect(mockShareService.inviteUserToSharedFolder).toHaveBeenCalledWith(
expect.objectContaining({
itemId: mockPayload.itemId,
itemType: mockPayload.itemType,
sharedWith: mockPayload.sharedWith,
notifyUser: mockPayload.notifyUser,
notificationMessage: mockPayload.notificationMessage,
encryptionKey: encryptionKey,
encryptionAlgorithm: mockPayload.encryptionAlgorithm,
roleId: mockPayload.roleId,
persistPreviousSharing: true,
}),
);
});
});
Loading

0 comments on commit 1acdebf

Please sign in to comment.