Skip to content

Commit

Permalink
Added application only check to some more commands
Browse files Browse the repository at this point in the history
  • Loading branch information
MathijsVerbeeck committed Feb 23, 2024
1 parent 1362f7d commit da45f2e
Show file tree
Hide file tree
Showing 26 changed files with 172 additions and 20 deletions.
46 changes: 46 additions & 0 deletions src/m365/base/ToDoCommand.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
import assert from 'assert';
import sinon from 'sinon';
import auth from '../../Auth.js';
import { telemetry } from '../../telemetry.js';
import PowerAutomateCommand from './PowerAutomateCommand.js';
import { accessToken } from '../../utils/accessToken.js';

class MockCommand extends PowerAutomateCommand {
public get name(): string {
return 'mock';
}

public get description(): string {
return 'Mock command';
}

public async commandAction(): Promise<void> {
}

public commandHelp(): void {
}
}

describe('ToDoCommand', () => {
const cmd = new MockCommand();

before(() => {
sinon.stub(telemetry, 'trackEvent').returns();
auth.service.accessTokens[auth.defaultResource] = {
expiresOn: 'abc',
accessToken: 'abc'
};
auth.service.connected = true;
});

after(() => {
sinon.restore();
auth.service.connected = false;
});

it('throws error when trying to use the command using application only permissions', () => {
sinon.stub(accessToken, 'isAppOnlyAccessToken').returns(true);
auth.service.connected = true;
assert.throws(() => (cmd as any).initAction({ options: {} }, {}));
});
});
12 changes: 12 additions & 0 deletions src/m365/base/ToDoCommand.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import { CommandArgs } from '../../Command.js';
import { Logger } from '../../cli/Logger.js';
import { accessToken } from '../../utils/accessToken.js';
import GraphCommand from './GraphCommand.js';

export default abstract class ToDoCommand extends GraphCommand {
protected initAction(args: CommandArgs, logger: Logger): void {
super.initAction(args, logger);

accessToken.ensureDelegatedAccessToken();
}
}
14 changes: 14 additions & 0 deletions src/m365/outlook/commands/message/message-list.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import { sinonUtil } from '../../../../utils/sinonUtil.js';
import commands from '../../commands.js';
import command from './message-list.js';
import { settingsNames } from '../../../../settingsNames.js';
import { accessToken } from '../../../../utils/accessToken.js';

describe(commands.MESSAGE_LIST, () => {
let log: string[];
Expand Down Expand Up @@ -353,6 +354,11 @@ describe(commands.MESSAGE_LIST, () => {
sinon.stub(telemetry, 'trackEvent').returns();
sinon.stub(pid, 'getProcessName').returns('');
sinon.stub(session, 'getId').returns('');
sinon.stub(accessToken, 'isAppOnlyAccessToken').returns(false);
auth.service.accessTokens[auth.defaultResource] = {
expiresOn: 'abc',
accessToken: 'abc'
};
auth.service.connected = true;
commandInfo = cli.getCommandInfo(command);
});
Expand Down Expand Up @@ -566,6 +572,14 @@ describe(commands.MESSAGE_LIST, () => {
new CommandError('An error has occurred'));
});

it('throws error when using application permissions', async () => {
sinonUtil.restore(accessToken.isAppOnlyAccessToken);
sinon.stub(accessToken, 'isAppOnlyAccessToken').returns(true);

await assert.rejects(command.action(logger, { options: {} } as any),
new CommandError('This command does not support application-only permissions.'));
});

it('fails validation if neither folderId nor folderName are specified', async () => {
sinon.stub(cli, 'getSettingWithDefaultValue').callsFake((settingName, defaultValue) => {
if (settingName === settingsNames.prompt) {
Expand Down
3 changes: 3 additions & 0 deletions src/m365/outlook/commands/message/message-list.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import GraphCommand from '../../../base/GraphCommand.js';
import commands from '../../commands.js';
import { Outlook } from '../../Outlook.js';
import { cli } from '../../../../cli/cli.js';
import { accessToken } from '../../../../utils/accessToken.js';

interface CommandArgs {
options: Options;
Expand Down Expand Up @@ -67,6 +68,8 @@ class OutlookMessageListCommand extends GraphCommand {

public async commandAction(logger: Logger, args: CommandArgs): Promise<void> {
try {
accessToken.ensureDelegatedAccessToken();

const folderId = await this.getFolderId(args);

const url: string = folderId ? `me/mailFolders/${folderId}/messages` : 'me/messages';
Expand Down
14 changes: 14 additions & 0 deletions src/m365/outlook/commands/message/message-move.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import { sinonUtil } from '../../../../utils/sinonUtil.js';
import commands from '../../commands.js';
import command from './message-move.js';
import { settingsNames } from '../../../../settingsNames.js';
import { accessToken } from '../../../../utils/accessToken.js';

describe(commands.MESSAGE_MOVE, () => {
let log: string[];
Expand All @@ -24,6 +25,11 @@ describe(commands.MESSAGE_MOVE, () => {
sinon.stub(telemetry, 'trackEvent').returns();
sinon.stub(pid, 'getProcessName').returns('');
sinon.stub(session, 'getId').returns('');
sinon.stub(accessToken, 'isAppOnlyAccessToken').returns(false);
auth.service.accessTokens[auth.defaultResource] = {
expiresOn: 'abc',
accessToken: 'abc'
};
auth.service.connected = true;
commandInfo = cli.getCommandInfo(command);
});
Expand Down Expand Up @@ -371,6 +377,14 @@ describe(commands.MESSAGE_MOVE, () => {
new CommandError('An error has occurred'));
});

it('throws error when using application permissions', async () => {
sinonUtil.restore(accessToken.isAppOnlyAccessToken);
sinon.stub(accessToken, 'isAppOnlyAccessToken').returns(true);

await assert.rejects(command.action(logger, { options: { id: 'AAMkAGVmMDEzMTM4LTZmYWUtNDdkNC1hMDZiLTU1OGY5OTZhYmY4OABGAAAAAAAiQ8W967B7TKBjgx9rVEURBwAiIsqMbYjsT5e-T7KzowPTAAAAAAEMAAAiIsqMbYjsT5e-T7KzowPTAALvuv07AAA', sourceFolderId: 'inbox', targetFolderId: 'archive' } } as any),
new CommandError('This command does not support application-only permissions.'));
});

it('passes validation if all required options specified', async () => {
const actual = await command.validate({ options: { id: 'AAMkAGVmMDEzMTM4LTZmYWUtNDdkNC1hMDZiLTU1OGY5OTZhYmY4OABGAAAAAAAiQ8W967B7TKBjgx9rVEURBwAiIsqMbYjsT5e-T7KzowPTAAAAAAEMAAAiIsqMbYjsT5e-T7KzowPTAALvuv07AAA', sourceFolderId: 'inbox', targetFolderId: 'archive' } }, commandInfo);
assert.strictEqual(actual, true);
Expand Down
3 changes: 3 additions & 0 deletions src/m365/outlook/commands/message/message-move.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import GraphCommand from '../../../base/GraphCommand.js';
import commands from '../../commands.js';
import { Outlook } from '../../Outlook.js';
import { cli } from '../../../../cli/cli.js';
import { accessToken } from '../../../../utils/accessToken.js';

interface CommandArgs {
options: Options;
Expand Down Expand Up @@ -83,6 +84,8 @@ class OutlookMessageMoveCommand extends GraphCommand {
let targetFolder: string;

try {
accessToken.ensureDelegatedAccessToken();

sourceFolder = await this.getFolderId(args.options.sourceFolderId, args.options.sourceFolderName);
targetFolder = await this.getFolderId(args.options.targetFolderId, args.options.targetFolderName);

Expand Down
6 changes: 6 additions & 0 deletions src/m365/todo/commands/list/list-add.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import { session } from '../../../../utils/session.js';
import { sinonUtil } from '../../../../utils/sinonUtil.js';
import commands from '../../commands.js';
import command from './list-add.js';
import { accessToken } from '../../../../utils/accessToken.js';

describe(commands.LIST_ADD, () => {
let log: string[];
Expand All @@ -20,6 +21,11 @@ describe(commands.LIST_ADD, () => {
sinon.stub(telemetry, 'trackEvent').returns();
sinon.stub(pid, 'getProcessName').returns('');
sinon.stub(session, 'getId').returns('');
sinon.stub(accessToken, 'isAppOnlyAccessToken').returns(false);
auth.service.accessTokens[auth.defaultResource] = {
expiresOn: 'abc',
accessToken: 'abc'
};
auth.service.connected = true;
});

Expand Down
4 changes: 2 additions & 2 deletions src/m365/todo/commands/list/list-add.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { Logger } from '../../../../cli/Logger.js';
import GlobalOptions from '../../../../GlobalOptions.js';
import request from '../../../../request.js';
import GraphCommand from '../../../base/GraphCommand.js';
import ToDoCommand from '../../../base/ToDoCommand.js';
import commands from '../../commands.js';

interface CommandArgs {
Expand All @@ -12,7 +12,7 @@ interface Options extends GlobalOptions {
name: string;
}

class TodoListAddCommand extends GraphCommand {
class TodoListAddCommand extends ToDoCommand {
public get name(): string {
return commands.LIST_ADD;
}
Expand Down
6 changes: 6 additions & 0 deletions src/m365/todo/commands/list/list-get.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import { session } from '../../../../utils/session.js';
import { sinonUtil } from '../../../../utils/sinonUtil.js';
import commands from '../../commands.js';
import command from './list-get.js';
import { accessToken } from '../../../../utils/accessToken.js';

describe(commands.LIST_GET, () => {
let commandInfo: CommandInfo;
Expand All @@ -39,6 +40,11 @@ describe(commands.LIST_GET, () => {
sinon.stub(telemetry, 'trackEvent').returns();
sinon.stub(pid, 'getProcessName').returns('');
sinon.stub(session, 'getId').returns('');
sinon.stub(accessToken, 'isAppOnlyAccessToken').returns(false);
auth.service.accessTokens[auth.defaultResource] = {
expiresOn: 'abc',
accessToken: 'abc'
};
auth.service.connected = true;
commandInfo = cli.getCommandInfo(command);
});
Expand Down
4 changes: 2 additions & 2 deletions src/m365/todo/commands/list/list-get.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import { Logger } from '../../../../cli/Logger.js';
import GlobalOptions from '../../../../GlobalOptions.js';
import request, { CliRequestOptions } from '../../../../request.js';
import { formatting } from '../../../../utils/formatting.js';
import GraphCommand from '../../../base/GraphCommand.js';
import ToDoCommand from '../../../base/ToDoCommand.js';
import commands from '../../commands.js';
import { ToDoList } from '../../ToDoList.js';

Expand All @@ -15,7 +15,7 @@ interface Options extends GlobalOptions {
name?: string;
}

class TodoListGetCommand extends GraphCommand {
class TodoListGetCommand extends ToDoCommand {
public get name(): string {
return commands.LIST_GET;
}
Expand Down
6 changes: 6 additions & 0 deletions src/m365/todo/commands/list/list-list.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import { session } from '../../../../utils/session.js';
import { sinonUtil } from '../../../../utils/sinonUtil.js';
import commands from '../../commands.js';
import command from './list-list.js';
import { accessToken } from '../../../../utils/accessToken.js';

describe(commands.LIST_LIST, () => {
let log: string[];
Expand All @@ -20,6 +21,11 @@ describe(commands.LIST_LIST, () => {
sinon.stub(telemetry, 'trackEvent').returns();
sinon.stub(pid, 'getProcessName').returns('');
sinon.stub(session, 'getId').returns('');
sinon.stub(accessToken, 'isAppOnlyAccessToken').returns(false);
auth.service.accessTokens[auth.defaultResource] = {
expiresOn: 'abc',
accessToken: 'abc'
};
auth.service.connected = true;
});

Expand Down
4 changes: 2 additions & 2 deletions src/m365/todo/commands/list/list-list.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
import { Logger } from '../../../../cli/Logger.js';
import { odata } from '../../../../utils/odata.js';
import GraphCommand from '../../../base/GraphCommand.js';
import ToDoCommand from '../../../base/ToDoCommand.js';
import commands from '../../commands.js';
import { ToDoList } from '../../ToDoList.js';

class TodoListListCommand extends GraphCommand {
class TodoListListCommand extends ToDoCommand {
public get name(): string {
return commands.LIST_LIST;
}
Expand Down
6 changes: 6 additions & 0 deletions src/m365/todo/commands/list/list-remove.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import { sinonUtil } from '../../../../utils/sinonUtil.js';
import commands from '../../commands.js';
import command from './list-remove.js';
import { settingsNames } from '../../../../settingsNames.js';
import { accessToken } from '../../../../utils/accessToken.js';

describe(commands.LIST_REMOVE, () => {
let log: string[];
Expand All @@ -24,6 +25,11 @@ describe(commands.LIST_REMOVE, () => {
sinon.stub(telemetry, 'trackEvent').returns();
sinon.stub(pid, 'getProcessName').returns('');
sinon.stub(session, 'getId').returns('');
sinon.stub(accessToken, 'isAppOnlyAccessToken').returns(false);
auth.service.accessTokens[auth.defaultResource] = {
expiresOn: 'abc',
accessToken: 'abc'
};
auth.service.connected = true;
sinon.stub(cli, 'promptForConfirmation').resolves(true);
commandInfo = cli.getCommandInfo(command);
Expand Down
4 changes: 2 additions & 2 deletions src/m365/todo/commands/list/list-remove.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import { cli } from '../../../../cli/cli.js';
import { Logger } from '../../../../cli/Logger.js';
import GlobalOptions from '../../../../GlobalOptions.js';
import request from '../../../../request.js';
import GraphCommand from '../../../base/GraphCommand.js';
import ToDoCommand from '../../../base/ToDoCommand.js';
import commands from '../../commands.js';

interface CommandArgs {
Expand All @@ -15,7 +15,7 @@ interface Options extends GlobalOptions {
force?: boolean;
}

class TodoListRemoveCommand extends GraphCommand {
class TodoListRemoveCommand extends ToDoCommand {
public get name(): string {
return commands.LIST_REMOVE;
}
Expand Down
6 changes: 6 additions & 0 deletions src/m365/todo/commands/list/list-set.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import { sinonUtil } from '../../../../utils/sinonUtil.js';
import commands from '../../commands.js';
import command from './list-set.js';
import { settingsNames } from '../../../../settingsNames.js';
import { accessToken } from '../../../../utils/accessToken.js';

describe(commands.LIST_SET, () => {
let log: string[];
Expand All @@ -24,6 +25,11 @@ describe(commands.LIST_SET, () => {
sinon.stub(telemetry, 'trackEvent').returns();
sinon.stub(pid, 'getProcessName').returns('');
sinon.stub(session, 'getId').returns('');
sinon.stub(accessToken, 'isAppOnlyAccessToken').returns(false);
auth.service.accessTokens[auth.defaultResource] = {
expiresOn: 'abc',
accessToken: 'abc'
};
auth.service.connected = true;
commandInfo = cli.getCommandInfo(command);
});
Expand Down
4 changes: 2 additions & 2 deletions src/m365/todo/commands/list/list-set.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { Logger } from '../../../../cli/Logger.js';
import GlobalOptions from '../../../../GlobalOptions.js';
import request from '../../../../request.js';
import GraphCommand from '../../../base/GraphCommand.js';
import ToDoCommand from '../../../base/ToDoCommand.js';
import commands from '../../commands.js';

interface CommandArgs {
Expand All @@ -14,7 +14,7 @@ interface Options extends GlobalOptions {
newName: string;
}

class TodoListSetCommand extends GraphCommand {
class TodoListSetCommand extends ToDoCommand {
public get name(): string {
return commands.LIST_SET;
}
Expand Down
6 changes: 6 additions & 0 deletions src/m365/todo/commands/task/task-add.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import { session } from '../../../../utils/session.js';
import { sinonUtil } from '../../../../utils/sinonUtil.js';
import commands from '../../commands.js';
import command from './task-add.js';
import { accessToken } from '../../../../utils/accessToken.js';

describe(commands.TASK_ADD, () => {
let log: string[];
Expand Down Expand Up @@ -44,6 +45,11 @@ describe(commands.TASK_ADD, () => {
sinon.stub(telemetry, 'trackEvent').returns();
sinon.stub(pid, 'getProcessName').returns('');
sinon.stub(session, 'getId').returns('');
sinon.stub(accessToken, 'isAppOnlyAccessToken').returns(false);
auth.service.accessTokens[auth.defaultResource] = {
expiresOn: 'abc',
accessToken: 'abc'
};
auth.service.connected = true;
commandInfo = cli.getCommandInfo(command);
});
Expand Down
4 changes: 2 additions & 2 deletions src/m365/todo/commands/task/task-add.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import { Logger } from '../../../../cli/Logger.js';
import GlobalOptions from '../../../../GlobalOptions.js';
import request, { CliRequestOptions } from '../../../../request.js';
import { validation } from '../../../../utils/validation.js';
import GraphCommand from '../../../base/GraphCommand.js';
import ToDoCommand from '../../../base/ToDoCommand.js';
import commands from '../../commands.js';

interface CommandArgs {
Expand All @@ -24,7 +24,7 @@ interface Options extends GlobalOptions {
status?: string;
}

class TodoTaskAddCommand extends GraphCommand {
class TodoTaskAddCommand extends ToDoCommand {
private static readonly allowedStatuses: string[] = ['notStarted', 'inProgress', 'completed', 'waitingOnOthers', 'deferred'];

public get name(): string {
Expand Down

0 comments on commit da45f2e

Please sign in to comment.