@corellium/corellium-cli 1.2.6 → 1.2.8

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,6 +1,6 @@
1
1
  <?xml version="1.0" ?>
2
2
  <!DOCTYPE coverage SYSTEM "http://cobertura.sourceforge.net/xml/coverage-04.dtd">
3
- <coverage lines-valid="0" lines-covered="0" line-rate="NaN" branches-valid="0" branches-covered="0" branch-rate="NaN" timestamp="1715705808060" complexity="0" version="0.1">
3
+ <coverage lines-valid="0" lines-covered="0" line-rate="NaN" branches-valid="0" branches-covered="0" branch-rate="NaN" timestamp="1715897730108" complexity="0" version="0.1">
4
4
  <sources>
5
5
  <source>/builds/middleware/corellium-cli</source>
6
6
  </sources>
@@ -86,7 +86,7 @@
86
86
  <div class='footer quiet pad2 space-top1 center small'>
87
87
  Code coverage generated by
88
88
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
89
- at 2024-05-14T16:56:48.070Z
89
+ at 2024-05-16T22:15:30.115Z
90
90
  </div>
91
91
  <script src="prettify.js"></script>
92
92
  <script>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@corellium/corellium-cli",
3
- "version": "1.2.6",
3
+ "version": "1.2.8",
4
4
  "description": "Corellium CLI Tool",
5
5
  "scripts": {
6
6
  "corellium": "node index.js",
@@ -27,7 +27,7 @@
27
27
  ],
28
28
  "dependencies": {
29
29
  "@corellium/client-api": "^0.1.0",
30
- "@corellium/corellium-api": "^1.7.3",
30
+ "@corellium/corellium-api": "^1.7.7",
31
31
  "axios": "^0.27.2",
32
32
  "chalk": "^4.1.2",
33
33
  "cli-progress": "^3.12.0",
@@ -6,8 +6,15 @@ const { progressBar } = require('../progress')
6
6
  const { getCorelliumApi } = require('../corellium-api')
7
7
 
8
8
  /**
9
- * @typedef {object} AppsResult
10
- * @property {Array<{object}>} apps
9
+ * @typedef {object} App
10
+ * @property {Array<any>} tags
11
+ * @property {boolean} running
12
+ * @property {string} [icon]
13
+ * @property {number} diskUsage
14
+ * @property {number} date
15
+ * @property {string} applicationType
16
+ * @property {string} name
17
+ * @property {string} bundleID
11
18
  */
12
19
 
13
20
  /**
@@ -30,14 +37,19 @@ class AgentCLI extends Client {
30
37
 
31
38
  /**
32
39
  * List apps on device
33
- * @returns {Promise<Array<{apps: Array<{object}>}>>}
40
+ * @returns {Promise<Array<App>>}
34
41
  */
35
- listApps = async (options) => {
42
+ listApps = async (options = { loadIcons: false }) => {
36
43
  const { loadIcons } = options
37
44
  const response = (await this._fetch('GET', `${this.agentBasePath()}/app/apps?loadIcons=${loadIcons ? 1 : 0}`, {}))
38
45
  return response ? response.apps : []
39
46
  }
40
47
 
48
+ /**
49
+ * Install an app on device
50
+ * @param {string} app - path to app
51
+ * @returns {Promise<void>}
52
+ */
41
53
  installApp = async (app) => {
42
54
  // get app info
43
55
  const filePath = resolve(app)
@@ -47,6 +59,7 @@ class AgentCLI extends Client {
47
59
  const corellium = await getCorelliumApi()
48
60
  const instance = await corellium.getInstance(this.instance)
49
61
  const agent = await instance.agent()
62
+ await agent.ready()
50
63
 
51
64
  // configure upload bar for user
52
65
  const uploadBar = progressBar()
@@ -64,6 +77,23 @@ class AgentCLI extends Client {
64
77
  // cleanup
65
78
  await agent.disconnect()
66
79
  };
80
+
81
+ /**
82
+ * Open an application on a device
83
+ * @param {string} bundleId - Application Bundle ID
84
+ * @returns {Promise<void>}
85
+ */
86
+ openApp = async (bundleId) => {
87
+ // get agent
88
+ const corellium = await getCorelliumApi()
89
+ const instance = await corellium.getInstance(this.instance)
90
+ const agent = await instance.agent()
91
+ await agent.ready()
92
+ await agent.openApp(bundleId)
93
+
94
+ // cleanup
95
+ await agent.disconnect()
96
+ }
67
97
  }
68
98
 
69
99
  module.exports = AgentCLI
@@ -3,35 +3,42 @@ const { displayTable } = require('../../../table')
3
3
  const { validateNonEmpty } = require('../../../utils')
4
4
  const { handleError } = require('../../../error')
5
5
  const InstallCommand = require('./install')
6
+ const OpenCommand = require('./open')
6
7
 
7
8
  async function builder (yargs) {
8
9
  yargs.option('verbose', {
9
10
  alias: 'v',
10
11
  type: 'boolean',
11
12
  describe: 'Console will receive verbose error output'
12
- }).option('project', {
13
- type: 'input',
14
- describe: 'Project ID',
15
- demandOption: true,
16
- string: true,
17
- validateNonEmpty
18
- }).option('instance', {
19
- type: 'input',
20
- describe: 'Instance ID',
21
- demandOption: true,
22
- string: true,
23
- validateNonEmpty
24
- }).option('load-icons', {
25
- type: 'input',
26
- describe: 'Toggle loading of icons',
27
- demandOption: false,
28
- boolean: true
29
- }).option('format', {
30
- type: 'input',
31
- describe: 'Output format (default is json) e.g. table',
32
- string: true,
33
- choices: ['table', 'json', 'csv']
34
- }).command(InstallCommand)
13
+ })
14
+ .option('project', {
15
+ type: 'input',
16
+ describe: 'Project ID',
17
+ demandOption: true,
18
+ string: true,
19
+ validateNonEmpty
20
+ })
21
+ .option('instance', {
22
+ type: 'input',
23
+ describe: 'Instance ID',
24
+ demandOption: true,
25
+ string: true,
26
+ validateNonEmpty
27
+ })
28
+ .option('load-icons', {
29
+ type: 'input',
30
+ describe: 'Toggle loading of icons',
31
+ demandOption: false,
32
+ boolean: true
33
+ })
34
+ .option('format', {
35
+ type: 'input',
36
+ describe: 'Output format (default is json) e.g. table',
37
+ string: true,
38
+ choices: ['table', 'json', 'csv']
39
+ })
40
+ .command(InstallCommand)
41
+ .command(OpenCommand)
35
42
  }
36
43
 
37
44
  async function handler (argv) {
@@ -0,0 +1,37 @@
1
+ const AgentCLI = require('../../../clients/Agent')
2
+ const { validateNonEmpty } = require('../../../utils')
3
+ const { handleError } = require('../../../error')
4
+ const log = require('../../../logging')
5
+
6
+ async function builder (yargs) {
7
+ yargs.option('bundle', {
8
+ alias: 'b',
9
+ type: 'string',
10
+ demandOption: true,
11
+ describe: 'application bundle id',
12
+ validateNonEmpty
13
+ })
14
+ }
15
+
16
+ async function handler (argv) {
17
+ try {
18
+ const { bundle: bundleId } = argv
19
+ const agent = new AgentCLI(argv)
20
+ log.info('Opening app...')
21
+ const apps = await agent.listApps()
22
+ if (!apps.filter(app => app.bundleID === bundleId).length) {
23
+ throw new Error('App not installed.')
24
+ }
25
+ await agent.openApp(bundleId)
26
+ log.info('App opened.')
27
+ } catch (err) {
28
+ handleError(err, 'Open app failed', argv.verbose)
29
+ }
30
+ }
31
+
32
+ module.exports = {
33
+ builder,
34
+ handler,
35
+ command: 'open',
36
+ describe: 'Open app on device instance'
37
+ }
@@ -0,0 +1,21 @@
1
+ const { MAST_API_BASE_PATH, MAST_API_BASE_PATH_LEGACY } = require('./constants')
2
+
3
+ /**
4
+ * Temporarily support backwards compatibility with mast/matrix routes.
5
+ * Until all environments are listening on /matrix at the conclusion of release 6.4.0, we need to handle
6
+ * the possibility that some environments will listen to MAST on /mast or /matrix
7
+ *
8
+ * This temporary code can be removed in release 6.5.0 - CORE-7670
9
+ */
10
+ async function getMastApiBasePath (client, instance) {
11
+ try {
12
+ await client._fetch('GET', `${MAST_API_BASE_PATH}/${instance}/instances/${instance}/assessments`)
13
+ return MAST_API_BASE_PATH
14
+ } catch (_) {
15
+ // no-op, we want to fall back to legacy route.
16
+ }
17
+
18
+ return MAST_API_BASE_PATH_LEGACY
19
+ }
20
+
21
+ module.exports = { getMastApiBasePath }
@@ -1,3 +1,4 @@
1
1
  module.exports = {
2
- MAST_API_BASE_PATH: 'v1/services/matrix'
2
+ MAST_API_BASE_PATH: 'v1/services/matrix',
3
+ MAST_API_BASE_PATH_LEGACY: 'v1/services/mast' // CORE-7670
3
4
  }
@@ -1,6 +1,6 @@
1
1
  const Client = require('../../clients/Client')
2
2
  const { handleError } = require('../../error')
3
- const { MAST_API_BASE_PATH } = require('./constants')
3
+ const { getMastApiBasePath } = require('./api-base-path')
4
4
 
5
5
  /**
6
6
  * Create an assessment via corellium-mast API.
@@ -42,7 +42,8 @@ async function handler (argv) {
42
42
  const client = new Client(argv)
43
43
  try {
44
44
  const body = { instanceId: instance, bundleId: bundle, wordlistId: wordlist }
45
- const res = await client._fetch('POST', `${MAST_API_BASE_PATH}/${instance}/assessments`, body)
45
+ const API_BASE_PATH = await getMastApiBasePath(client, instance)
46
+ const res = await client._fetch('POST', `${API_BASE_PATH}/${instance}/assessments`, body)
46
47
  console.log(JSON.stringify(res))
47
48
  } catch (error) {
48
49
  handleError(error, 'create-assessment failed', verbose)
@@ -1,7 +1,7 @@
1
1
  const Client = require('../../clients/Client')
2
2
  const { handleError } = require('../../error')
3
- const { MAST_API_BASE_PATH } = require('./constants')
4
3
  const log = require('../../logging')
4
+ const { getMastApiBasePath } = require('./api-base-path')
5
5
 
6
6
  /**
7
7
  * Delete an assessment via corellium-mast API.
@@ -35,7 +35,8 @@ async function handler (argv) {
35
35
  const { assessment, instance, verbose } = argv
36
36
  const client = new Client(argv)
37
37
  try {
38
- await client._fetch('DELETE', `${MAST_API_BASE_PATH}/${instance}/assessments/${assessment}`)
38
+ const API_BASE_PATH = await getMastApiBasePath(client, instance)
39
+ await client._fetch('DELETE', `${API_BASE_PATH}/${instance}/assessments/${assessment}`)
39
40
  log.info('Assessment deleted.')
40
41
  } catch (error) {
41
42
  handleError(error, 'delete-assessment failed', verbose)
@@ -1,6 +1,6 @@
1
1
  const Client = require('../../clients/Client')
2
2
  const { handleError } = require('../../error')
3
- const { MAST_API_BASE_PATH } = require('./constants')
3
+ const { getMastApiBasePath } = require('./api-base-path')
4
4
 
5
5
  /**
6
6
  * Download assessment report via corellium-mast API.
@@ -43,7 +43,8 @@ async function handler (argv) {
43
43
  const { assessment, instance, format, verbose } = argv
44
44
  const client = new Client(argv)
45
45
  try {
46
- const res = await client._fetch('GET', `${MAST_API_BASE_PATH}/${instance}/assessments/${assessment}/download?format=${format}`)
46
+ const API_BASE_PATH = await getMastApiBasePath(client, instance)
47
+ const res = await client._fetch('GET', `${API_BASE_PATH}/${instance}/assessments/${assessment}/download?format=${format}`)
47
48
  console.log(res)
48
49
  } catch (error) {
49
50
  handleError(error, 'download-report failed', verbose)
@@ -1,6 +1,6 @@
1
1
  const Client = require('../../clients/Client')
2
2
  const { handleError } = require('../../error')
3
- const { MAST_API_BASE_PATH } = require('./constants')
3
+ const { getMastApiBasePath } = require('./api-base-path')
4
4
 
5
5
  /**
6
6
  * Get an assessment via corellium-mast API.
@@ -36,7 +36,8 @@ async function handler (argv) {
36
36
  const { assessment, instance, verbose } = argv
37
37
  const client = new Client(argv)
38
38
  try {
39
- const res = await client._fetch('GET', `${MAST_API_BASE_PATH}/${instance}/assessments/${assessment}`)
39
+ const API_BASE_PATH = await getMastApiBasePath(client, instance)
40
+ const res = await client._fetch('GET', `${API_BASE_PATH}/${instance}/assessments/${assessment}`)
40
41
  console.log(JSON.stringify(res))
41
42
  } catch (error) {
42
43
  handleError(error, 'get-assessment failed', verbose)
@@ -1,6 +1,6 @@
1
1
  const Client = require('../../clients/Client')
2
2
  const { handleError } = require('../../error')
3
- const { MAST_API_BASE_PATH } = require('./constants')
3
+ const { getMastApiBasePath } = require('./api-base-path')
4
4
 
5
5
  /**
6
6
  * Get assessments for an instance via corellium-mast API.
@@ -29,7 +29,8 @@ async function handler (argv) {
29
29
  const { instance, verbose } = argv
30
30
  const client = new Client(argv)
31
31
  try {
32
- const res = await client._fetch('GET', `${MAST_API_BASE_PATH}/${instance}/instances/${instance}/assessments`)
32
+ const API_BASE_PATH = await getMastApiBasePath(client, instance)
33
+ const res = await client._fetch('GET', `${API_BASE_PATH}/${instance}/instances/${instance}/assessments`)
33
34
  console.log(JSON.stringify(res))
34
35
  } catch (error) {
35
36
  handleError(error, 'get-assessments failed', verbose)
@@ -1,7 +1,7 @@
1
1
  const Client = require('../../clients/Client')
2
2
  const { handleError } = require('../../error')
3
- const { MAST_API_BASE_PATH } = require('./constants')
4
3
  const log = require('../../logging')
4
+ const { getMastApiBasePath } = require('./api-base-path')
5
5
 
6
6
  /**
7
7
  * The start-monitor command starts device monitoring via the start-monitor API on corellium-mast
@@ -37,7 +37,8 @@ async function handler (argv) {
37
37
  const { assessment, instance, verbose } = argv
38
38
  const client = new Client(argv)
39
39
  try {
40
- await client._fetch('POST', `${MAST_API_BASE_PATH}/${instance}/assessments/${assessment}/start`)
40
+ const API_BASE_PATH = await getMastApiBasePath(client, instance)
41
+ await client._fetch('POST', `${API_BASE_PATH}/${instance}/assessments/${assessment}/start`)
41
42
  log.info('Monitoring started.')
42
43
  } catch (error) {
43
44
  handleError(error, 'start-monitor failed', verbose)
@@ -1,7 +1,7 @@
1
1
  const Client = require('../../clients/Client')
2
2
  const { handleError } = require('../../error')
3
- const { MAST_API_BASE_PATH } = require('./constants')
4
3
  const log = require('../../logging')
4
+ const { getMastApiBasePath } = require('./api-base-path')
5
5
 
6
6
  /**
7
7
  * The stop-monitor command stops device monitoring via the stop-monitor API on corellium-mast.
@@ -37,7 +37,8 @@ async function handler (argv) {
37
37
  const { assessment, instance, verbose } = argv
38
38
  const client = new Client(argv)
39
39
  try {
40
- await client._fetch('POST', `${MAST_API_BASE_PATH}/${instance}/assessments/${assessment}/stop`)
40
+ const API_BASE_PATH = await getMastApiBasePath(client, instance)
41
+ await client._fetch('POST', `${API_BASE_PATH}/${instance}/assessments/${assessment}/stop`)
41
42
  log.info('Monitoring stopped.')
42
43
  } catch (error) {
43
44
  handleError(error, 'stop-monitor failed', verbose)
@@ -1,6 +1,6 @@
1
1
  const Client = require('../../clients/Client')
2
2
  const { handleError } = require('../../error')
3
- const { MAST_API_BASE_PATH } = require('./constants')
3
+ const { getMastApiBasePath } = require('./api-base-path')
4
4
 
5
5
  /**
6
6
  * The test command executes device testing via the test API on corellium-mast.
@@ -47,7 +47,8 @@ async function handler (argv) {
47
47
  const { grep, invert, assessment, instance, verbose } = argv
48
48
  const client = new Client(argv)
49
49
  try {
50
- const res = await client._fetch('POST', `${MAST_API_BASE_PATH}/${instance}/assessments/${assessment}/test`, { grep, invert })
50
+ const API_BASE_PATH = await getMastApiBasePath(client, instance)
51
+ const res = await client._fetch('POST', `${API_BASE_PATH}/${instance}/assessments/${assessment}/test`, { grep, invert })
51
52
  console.log(JSON.stringify(res))
52
53
  } catch (error) {
53
54
  handleError(error, 'test failed', verbose)