diff --git a/website/api/controllers/android-proxy/issue-command-on-android-device.js b/website/api/controllers/android-proxy/issue-command-on-android-device.js new file mode 100644 index 0000000000..843e2f8fe1 --- /dev/null +++ b/website/api/controllers/android-proxy/issue-command-on-android-device.js @@ -0,0 +1,201 @@ +module.exports = { + + + friendlyName: 'Issue command on android device', + + + description: 'Issues an AMAPI command (e.g. LOCK, RESET_PASSWORD, WIPE) to a device of an Android enterprise.', + + + inputs: { + androidEnterpriseId: { + type: 'string', + required: true, + }, + deviceId: { + type: 'string', + required: true, + }, + // Captured from the `:deviceId::issueCommand` route. Validated here so requests targeting any + // other colon-suffixed action (e.g. `/devices/:somethingElse`) are rejected up front rather + // than silently invoking issueCommand. Mirrors how `modify-enterprise-app-policy.js` captures + // `googleAction`. + issueCommand: { + type: 'string', + required: true, + isIn: ['issueCommand'], + }, + // AMAPI Command fields. Inputs are declared explicitly (rather than forwarding req.body) so the + // proxy's accepted surface is visible. `type` is not constrained via isIn so the Fleet server can + // issue any AMAPI command type without a proxy change. Adding entirely new Command FIELDS (e.g. a + // future *Params sibling Google adds to AMAPI) does still require updating this list. + type: { + type: 'string', + required: true, + description: 'The AMAPI command type (e.g. LOCK, RESET_PASSWORD, REBOOT, RELINQUISH_OWNERSHIP, CLEAR_APP_DATA, START_LOST_MODE, STOP_LOST_MODE, ADD_ESIM, REMOVE_ESIM, REQUEST_DEVICE_INFO, WIPE).', + }, + duration: { + type: 'string', + description: 'How long the command remains valid (e.g. "315360000s"). Forwarded to AMAPI verbatim.', + }, + newPassword: { + type: 'string', + description: 'New device password for RESET_PASSWORD. Fleet sends an empty string to clear the passcode, so an explicitly empty value is preserved.', + }, + resetPasswordFlags: { + type: ['string'], + description: 'AMAPI reset-password flags (REQUIRE_ENTRY, DO_NOT_ASK_CREDENTIALS_ON_BOOT, LOCK_NOW).', + }, + wipeParams: { + type: 'ref', + description: 'AMAPI WipeParams object (may be empty {}). Required by AMAPI for WIPE commands.', + }, + addEsimParams: { + type: 'ref', + description: 'AMAPI AddEsimParams object, for ADD_ESIM commands.', + }, + removeEsimParams: { + type: 'ref', + description: 'AMAPI RemoveEsimParams object, for REMOVE_ESIM commands.', + }, + clearAppsDataParams: { + type: 'ref', + description: 'AMAPI ClearAppsDataParams object, for CLEAR_APP_DATA commands.', + }, + startLostModeParams: { + type: 'ref', + description: 'AMAPI StartLostModeParams object, for START_LOST_MODE commands.', + }, + stopLostModeParams: { + type: 'ref', + description: 'AMAPI StopLostModeParams object, for STOP_LOST_MODE commands.', + }, + requestDeviceInfoParams: { + type: 'ref', + description: 'AMAPI RequestDeviceInfoParams object, for REQUEST_DEVICE_INFO commands.', + }, + }, + + + exits: { + success: { description: 'The command was successfully issued to the Android device. The AMAPI Operation is returned.' }, + missingAuthHeader: { description: 'This request was missing an authorization header.', responseType: 'unauthorized'}, + unauthorized: { description: 'Invalid authentication token.', responseType: 'unauthorized'}, + notFound: { description: 'No Android enterprise found for this Fleet server.', responseType: 'notFound' }, + deviceNoLongerManaged: { description: 'The specified device is no longer managed by the Android enterprise.', responseType: 'notFound' }, + }, + + + fn: async function ({ + androidEnterpriseId, deviceId, type, duration, newPassword, resetPasswordFlags, + wipeParams, addEsimParams, removeEsimParams, clearAppsDataParams, + startLostModeParams, stopLostModeParams, requestDeviceInfoParams, + }) { + + // Extract fleetServerSecret from the Authorization header + let authHeader = this.req.get('authorization'); + let fleetServerSecret; + + if (authHeader && authHeader.startsWith('Bearer')) { + fleetServerSecret = authHeader.replace('Bearer', '').trim(); + } else { + throw 'missingAuthHeader'; + } + + // Authenticate this request + let thisAndroidEnterprise = await AndroidEnterprise.findOne({ + androidEnterpriseId: androidEnterpriseId + }); + + // Return a 404 response if no records are found. + if (!thisAndroidEnterprise) { + throw 'notFound'; + } + // Return an unauthorized response if the provided secret does not match. + if (thisAndroidEnterprise.fleetServerSecret !== fleetServerSecret) { + throw 'unauthorized'; + } + + // Check the list of Android Enterprises managed by Fleet to see if this Android Enterprise is still managed. + let isEnterpriseManagedByFleet = await sails.helpers.androidProxy.getIsEnterpriseManagedByFleet(androidEnterpriseId); + // Return a 404 response if this Android enterprise is no longer managed by Fleet. + if (!isEnterpriseManagedByFleet) { + throw 'notFound'; + } + + // Build the AMAPI Command body from declared inputs (not req.body) so the proxy's accepted surface + // stays explicit. Use `!== undefined` rather than truthy checks because Fleet relies on forwarding + // an empty newPassword ("") to clear the device passcode and an empty wipeParams ({}) for WIPE. + let commandBody = { type: type }; + if (duration !== undefined) { + commandBody.duration = duration; + } + if (newPassword !== undefined) { + commandBody.newPassword = newPassword; + } + if (resetPasswordFlags !== undefined) { + commandBody.resetPasswordFlags = resetPasswordFlags; + } + if (wipeParams !== undefined) { + commandBody.wipeParams = wipeParams; + } + if (addEsimParams !== undefined) { + commandBody.addEsimParams = addEsimParams; + } + if (removeEsimParams !== undefined) { + commandBody.removeEsimParams = removeEsimParams; + } + if (clearAppsDataParams !== undefined) { + commandBody.clearAppsDataParams = clearAppsDataParams; + } + if (startLostModeParams !== undefined) { + commandBody.startLostModeParams = startLostModeParams; + } + if (stopLostModeParams !== undefined) { + commandBody.stopLostModeParams = stopLostModeParams; + } + if (requestDeviceInfoParams !== undefined) { + commandBody.requestDeviceInfoParams = requestDeviceInfoParams; + } + + // Issue the command to the device for this Android enterprise. + // Note: We're using sails.helpers.flow.build here to handle any errors that occur using google's node library. + let issueCommandResponse = await sails.helpers.flow.build(async () => { + let { google } = require('googleapis'); + let androidmanagement = google.androidmanagement('v1'); + let googleAuth = new google.auth.GoogleAuth({ + scopes: ['https://www.googleapis.com/auth/androidmanagement'], + credentials: { + client_email: sails.config.custom.androidEnterpriseServiceAccountEmailAddress,// eslint-disable-line camelcase + private_key: sails.config.custom.androidEnterpriseServiceAccountPrivateKey,// eslint-disable-line camelcase + }, + }); + // Acquire the google auth client, and bind it to all future calls + let authClient = await googleAuth.getClient(); + google.options({ auth: authClient }); + // [?]: https://googleapis.dev/nodejs/googleapis/latest/androidmanagement/classes/Resource$Enterprises$Devices.html#issueCommand + let response = await androidmanagement.enterprises.devices.issueCommand({ + name: `enterprises/${androidEnterpriseId}/devices/${deviceId}`, + requestBody: commandBody, + }); + return response.data; + }).intercept({status: 429}, (err)=>{ + // If the Android management API returns a 429 response, log an additional warning that will trigger a help-p1 alert. + sails.log.warn(`p1: Android management API rate limit exceeded!`); + return new Error(`When attempting to issue a command to a device for an Android enterprise (${androidEnterpriseId}), an error occurred. Error: ${err}`); + }).intercept((err)=>{ + let errorString = err.toString(); + if (errorString.includes('Device is no longer being managed')) { + return {'deviceNoLongerManaged': 'The device is no longer managed by the Android enterprise.'}; + } + return new Error(`When attempting to issue a command to a device for an Android enterprise (${androidEnterpriseId}), an error occurred. Error: ${require('util').inspect(err)}`); + }); + + + // Return the AMAPI Operation back to the Fleet server. + return issueCommandResponse; + + } + + +}; diff --git a/website/assets/js/cloud.setup.js b/website/assets/js/cloud.setup.js index 84a20834f3..8f0c52e402 100644 --- a/website/assets/js/cloud.setup.js +++ b/website/assets/js/cloud.setup.js @@ -13,7 +13,7 @@ Cloud.setup({ /* eslint-disable */ - methods: {"redirectToStripeBillingPortal":{"verb":"GET","url":"/customers/update-subscription","args":[]},"downloadSitemap":{"verb":"GET","url":"/sitemap.xml","args":[]},"downloadRssFeed":{"verb":"GET","url":"/rss/:categoryName","args":["categoryName"]},"receiveUsageAnalytics":{"verb":"POST","url":"/api/v1/webhooks/receive-usage-analytics","args":["anonymousIdentifier","fleetVersion","licenseTier","numHostsEnrolled","numUsers","numTeams","numPolicies","numLabels","softwareInventoryEnabled","vulnDetectionEnabled","systemUsersEnabled","hostsStatusWebHookEnabled","numWeeklyActiveUsers","numWeeklyPolicyViolationDaysActual","numWeeklyPolicyViolationDaysPossible","hostsEnrolledByOperatingSystem","hostsEnrolledByOrbitVersion","hostsEnrolledByOsqueryVersion","storedErrors","numHostsNotResponding","organization","mdmMacOsEnabled","mdmWindowsEnabled","liveQueryDisabled","hostExpiryEnabled","numSoftwareVersions","numHostSoftwares","numSoftwareTitles","numHostSoftwareInstalledPaths","numSoftwareCPEs","numSoftwareCVEs","aiFeaturesDisabled","maintenanceWindowsEnabled","maintenanceWindowsConfigured","numHostsFleetDesktopEnabled","numQueries","numHostsABMPending","fleetMaintainedAppsWindows","fleetMaintainedAppsMacOS","oktaConditionalAccessConfigured","entraConditionalAccessConfigured","conditionalAccessBypassDisabled","conditionalAccessEnabled"]},"receiveFromGithub":{"verb":"GET","url":"/api/v1/webhooks/github","args":["botSignature","action","sender","repository","changes","issue","comment","pull_request","label","release","projects_v2_item"]},"receiveFromStripe":{"verb":"POST","url":"/api/v1/webhooks/receive-from-stripe","args":["id","type","data","webhookSecret"]},"receiveFromZapier":{"verb":"POST","url":"/api/v1/webhooks/receive-from-zapier","args":["eventName","data","webhookSecret"]},"receiveFromClay":{"verb":"POST","url":"/api/v1/webhooks/receive-from-clay","args":["webhookSecret","firstName","lastName","linkedinUrl","emailAddress","contactSource","jobTitle","intentSignal","historicalContent","historicalContentUrl","relatedCampaign"]},"getEstDeviceCertificate":{"verb":"POST","url":"/api/v1/get-est-device-certificate","args":["csrData","authToken","introspectEndpoint","idpClientId","estEndpoint","estClientId","estClientKey"]},"createAndroidSignupUrl":{"verb":"POST","url":"/api/android/v1/signupUrls","args":["callbackUrl"]},"createAndroidEnterprise":{"verb":"POST","url":"/api/android/v1/enterprises","args":["signupUrlName","enterpriseToken","fleetLicenseKey","pubsubPushUrl","enterprise"]},"getAndroidEnterprises":{"verb":"GET","url":"/api/android/v1/enterprises","args":[]},"createAndroidEnrollmentToken":{"verb":"POST","url":"/api/android/v1/enterprises/:androidEnterpriseId/enrollmentTokens","args":["androidEnterpriseId"]},"modifyAndroidPolicies":{"verb":"PATCH","url":"/api/android/v1/enterprises/:androidEnterpriseId/policies/:policyId","args":["androidEnterpriseId","policyId"]},"deleteOneAndroidEnterprise":{"verb":"DELETE","url":"/api/android/v1/enterprises/:androidEnterpriseId","args":["androidEnterpriseId"]},"getAndroidDevice":{"verb":"GET","url":"/api/android/v1/enterprises/:androidEnterpriseId/devices/:deviceId","args":["androidEnterpriseId","deviceId"]},"getAndroidDevices":{"verb":"GET","url":"/api/android/v1/enterprises/:androidEnterpriseId/devices","args":["androidEnterpriseId","pageSize","pageToken","fields"]},"deleteAndroidDevice":{"verb":"DELETE","url":"/api/android/v1/enterprises/:androidEnterpriseId/devices/:deviceId","args":["androidEnterpriseId","deviceId"]},"modifyAndroidDevice":{"verb":"PATCH","url":"/api/android/v1/enterprises/:androidEnterpriseId/devices/:deviceId","args":["androidEnterpriseId","deviceId"]},"getEnterpriseApplications":{"verb":"GET","url":"/api/android/v1/enterprises/:androidEnterpriseId/applications/:applicationId","args":["androidEnterpriseId","applicationId"]},"modifyEnterpriseAppPolicy":{"verb":"POST","url":"/api/android/v1/enterprises/:androidEnterpriseId/policies/:policyId::googleAction","args":["androidEnterpriseId","policyId","googleAction","packageNames","changes"]},"createEnterpriseWebapp":{"verb":"POST","url":"/api/android/v1/enterprises/:androidEnterpriseId/webApps","args":["androidEnterpriseId","title","startUrl","icons","displayMode","versionCode"]},"deliverContactFormMessage":{"verb":"POST","url":"/api/v1/deliver-contact-form-message","args":["emailAddress","firstName","lastName","message","websiteUrl"]},"sendPasswordRecoveryEmail":{"verb":"POST","url":"/api/v1/entrance/send-password-recovery-email","args":["emailAddress","websiteUrl"]},"signup":{"verb":"POST","url":"/api/v1/customers/signup","args":["emailAddress","password","organization","firstName","lastName","signupReason"]},"updateProfile":{"verb":"POST","url":"/api/v1/account/update-profile","args":["firstName","lastName","organization","emailAddress"]},"updatePassword":{"verb":"POST","url":"/api/v1/account/update-password","args":["oldPassword","newPassword"]},"updateBillingCard":{"verb":"POST","url":"/api/v1/account/update-billing-card","args":["stripeToken","billingCardLast4","billingCardBrand","billingCardExpMonth","billingCardExpYear"]},"login":{"verb":"POST","url":"/api/v1/customers/login","args":["emailAddress","password","rememberMe"]},"logout":{"verb":"GET","url":"/api/v1/account/logout","args":[]},"createQuote":{"verb":"POST","url":"/api/v1/customers/create-quote","args":["macosHosts","windowsHosts","linuxHosts","iosHosts","androidHosts","otherHosts"]},"saveBillingInfoAndSubscribe":{"verb":"POST","url":"/api/v1/customers/save-billing-info-and-subscribe","args":["quoteId","organization","firstName","lastName","paymentSource"]},"updatePasswordAndLogin":{"verb":"POST","url":"/api/v1/entrance/update-password-and-login","args":["password","token"]},"deliverDemoSignup":{"verb":"POST","url":"/api/v1/deliver-demo-signup","args":["emailAddress"]},"createOrUpdateOneNewsletterSubscription":{"verb":"POST","url":"/api/v1/create-or-update-one-newsletter-subscription","args":["emailAddress"]},"unsubscribeFromAllNewsletters":{"verb":"GET","url":"/api/v1/unsubscribe-from-all-newsletters","args":["emailAddress"]},"buildLicenseKey":{"verb":"POST","url":"/api/v1/admin/build-license-key","args":["numberOfHosts","organization","expiresAt","partnerName"]},"createVantaAuthorizationRequest":{"verb":"POST","url":"/api/v1/create-vanta-authorization-request","args":["emailAddress","fleetInstanceUrl","fleetApiKey","redirectToExternalPageAfterAuthorization","sharedSecret"]},"redirectVantaAuthorizationRequest":{"verb":"GET","url":"/redirect-vanta-authorization-request","args":["vantaSourceId","state","vantaAuthorizationRequestURL","redirectAfterSetup"]},"getHumanInterpretationFromOsquerySql":{"verb":"POST","url":"/api/v1/get-human-interpretation-from-osquery-sql","args":["sql"]},"deliverAppleCsr":{"verb":"POST","url":"/api/v1/deliver-apple-csr","args":["unsignedCsrData","deliveryMethod"]},"provisionSandboxInstanceAndDeliverEmail":{"verb":"POST","url":"/api/v1/admin/provision-sandbox-instance-and-deliver-email","args":["userId"]},"deliverTalkToUsFormSubmission":{"verb":"POST","url":"/api/v1/deliver-talk-to-us-form-submission","args":["emailAddress","firstName","lastName","organization","numberOfHosts","primaryBuyingSituation"]},"saveQuestionnaireProgress":{"verb":"POST","url":"/api/v1/save-questionnaire-progress","args":["currentStep","formData"]},"updateStartCtaVisibility":{"verb":"POST","url":"/api/v1/account/update-start-cta-visibility","args":[]},"deliverDealRegistrationSubmission":{"verb":"POST","url":"/api/v1/deliver-deal-registration-submission","args":["submittersFirstName","submittersLastName","submittersEmailAddress","submittersOrganization","submitterIsExistingPartner","customersOrganization","customersName","customersEmailAddress","dealStage","expectedClose","numberOfHosts","platforms","useCase","notes","websiteUrl"]},"unsubscribeFromMarketingEmails":{"verb":"GET","url":"/api/v1/unsubscribe-from-marketing-emails","args":["emailAddress"]},"getStripeCheckoutSessionUrl":{"verb":"POST","url":"/api/v1/customers/get-stripe-checkout-session-url","args":["quoteId"]},"getLlmGeneratedSql":{"verb":"GET","url":"/api/v1/query-generator/get-llm-generated-sql","args":["naturalLanguageQuestion"]},"getLlmGeneratedConfigurationProfile":{"verb":"POST","url":"/api/v1/get-llm-generated-configuration-profile","args":["profileType","naturalLanguageInstructions"]},"deliverApplicationSubmission":{"verb":"POST","url":"/api/v1/deliver-application-submission","args":["firstName","lastName","emailAddress","position","linkedinProfileUrl","location","message"]},"deliverGitopsWorkshopRequest":{"verb":"POST","url":"/api/v1/deliver-gitops-request","args":["firstName","lastName","emailAddress","location","numberOfHosts","managedPlatforms","willingToHost"]},"resetOneFleetPremiumLocalTrial":{"verb":"POST","url":"/api/v1/admin/reset-one-fleet-premium-local-trial","args":["emailAddress"]},"deliverWhitepaperDownloadRequest":{"verb":"POST","url":"/api/v1/deliver-whitepaper-download-request","args":["firstName","lastName","emailAddress","whitepaperName"]},"deliverWebinarAccessRequest":{"verb":"POST","url":"/api/v1/deliver-webinar-access-request","args":["firstName","lastName","emailAddress","webinarName"]},"deliverPartnerRegistrationSubmission":{"verb":"POST","url":"/api/v1/deliver-partner-registration-submission","args":["submittersFirstName","submittersLastName","submittersEmailAddress","submittersOrganization","partnerType","partnerWebsite","partnerCountry","notes","servicesOffered","numberOfHosts","servicesCategory","websiteUrl"]},"createCompliancePartnerTenant":{"verb":"POST","url":"/api/v1/microsoft-compliance-partner","args":["entraTenantId"]},"getCompliancePartnerSettings":{"verb":"GET","url":"/api/v1/microsoft-compliance-partner/settings","args":["entraTenantId","fleetServerSecret"]},"removeOneCompliancePartnerTenant":{"verb":"DELETE","url":"/api/v1/microsoft-compliance-partner","args":["entraTenantId","fleetServerSecret"]},"updateOneDevicesComplianceStatus":{"verb":"POST","url":"/api/v1/microsoft-compliance-partner/device","args":["entraTenantId","fleetServerSecret","deviceId","deviceManagementState","deviceName","os","osVersion","userPrincipalName","compliant","lastCheckInTime"]},"getOneComplianceStatusResult":{"verb":"GET","url":"/api/v1/microsoft-compliance-partner/device/message","args":["entraTenantId","fleetServerSecret","messageId"]},"receiveRedirectFromMicrosoft":{"verb":"GET","url":"/api/v1/microsoft-compliance-partner/adminconsent","args":["tenant","state","error","error_description"]},"registerOneFleetInstanceUsingVpp":{"verb":"POST","url":"/api/vpp/v1/auth","args":["fleetServerUrl","fleetLicenseKey"]},"getVppAppMetadata":{"verb":"GET","url":"/api/vpp/v1/metadata/:storeRegion","args":["storeRegion","platform","additionalPlatforms","ids","extend"]}} + methods: {"redirectToStripeBillingPortal":{"verb":"GET","url":"/customers/update-subscription","args":[]},"downloadSitemap":{"verb":"GET","url":"/sitemap.xml","args":[]},"downloadRssFeed":{"verb":"GET","url":"/rss/:categoryName","args":["categoryName"]},"receiveUsageAnalytics":{"verb":"POST","url":"/api/v1/webhooks/receive-usage-analytics","args":["anonymousIdentifier","fleetVersion","licenseTier","numHostsEnrolled","numUsers","numTeams","numPolicies","numLabels","softwareInventoryEnabled","vulnDetectionEnabled","systemUsersEnabled","hostsStatusWebHookEnabled","numWeeklyActiveUsers","numWeeklyPolicyViolationDaysActual","numWeeklyPolicyViolationDaysPossible","hostsEnrolledByOperatingSystem","hostsEnrolledByOrbitVersion","hostsEnrolledByOsqueryVersion","storedErrors","numHostsNotResponding","organization","mdmMacOsEnabled","mdmWindowsEnabled","liveQueryDisabled","hostExpiryEnabled","numSoftwareVersions","numHostSoftwares","numSoftwareTitles","numHostSoftwareInstalledPaths","numSoftwareCPEs","numSoftwareCVEs","aiFeaturesDisabled","maintenanceWindowsEnabled","maintenanceWindowsConfigured","numHostsFleetDesktopEnabled","numQueries","numHostsABMPending","fleetMaintainedAppsWindows","fleetMaintainedAppsMacOS","oktaConditionalAccessConfigured","entraConditionalAccessConfigured","conditionalAccessBypassDisabled","conditionalAccessEnabled"]},"receiveFromGithub":{"verb":"GET","url":"/api/v1/webhooks/github","args":["botSignature","action","sender","repository","changes","issue","comment","pull_request","label","release","projects_v2_item"]},"receiveFromStripe":{"verb":"POST","url":"/api/v1/webhooks/receive-from-stripe","args":["id","type","data","webhookSecret"]},"receiveFromZapier":{"verb":"POST","url":"/api/v1/webhooks/receive-from-zapier","args":["eventName","data","webhookSecret"]},"receiveFromClay":{"verb":"POST","url":"/api/v1/webhooks/receive-from-clay","args":["webhookSecret","firstName","lastName","linkedinUrl","emailAddress","contactSource","jobTitle","intentSignal","historicalContent","historicalContentUrl","relatedCampaign"]},"getEstDeviceCertificate":{"verb":"POST","url":"/api/v1/get-est-device-certificate","args":["csrData","authToken","introspectEndpoint","idpClientId","estEndpoint","estClientId","estClientKey"]},"createAndroidSignupUrl":{"verb":"POST","url":"/api/android/v1/signupUrls","args":["callbackUrl"]},"createAndroidEnterprise":{"verb":"POST","url":"/api/android/v1/enterprises","args":["signupUrlName","enterpriseToken","fleetLicenseKey","pubsubPushUrl","enterprise"]},"getAndroidEnterprises":{"verb":"GET","url":"/api/android/v1/enterprises","args":[]},"createAndroidEnrollmentToken":{"verb":"POST","url":"/api/android/v1/enterprises/:androidEnterpriseId/enrollmentTokens","args":["androidEnterpriseId"]},"modifyAndroidPolicies":{"verb":"PATCH","url":"/api/android/v1/enterprises/:androidEnterpriseId/policies/:policyId","args":["androidEnterpriseId","policyId"]},"deleteOneAndroidEnterprise":{"verb":"DELETE","url":"/api/android/v1/enterprises/:androidEnterpriseId","args":["androidEnterpriseId"]},"getAndroidDevice":{"verb":"GET","url":"/api/android/v1/enterprises/:androidEnterpriseId/devices/:deviceId","args":["androidEnterpriseId","deviceId"]},"getAndroidDevices":{"verb":"GET","url":"/api/android/v1/enterprises/:androidEnterpriseId/devices","args":["androidEnterpriseId","pageSize","pageToken","fields"]},"deleteAndroidDevice":{"verb":"DELETE","url":"/api/android/v1/enterprises/:androidEnterpriseId/devices/:deviceId","args":["androidEnterpriseId","deviceId"]},"modifyAndroidDevice":{"verb":"PATCH","url":"/api/android/v1/enterprises/:androidEnterpriseId/devices/:deviceId","args":["androidEnterpriseId","deviceId"]},"issueCommandOnAndroidDevice":{"verb":"POST","url":"/api/android/v1/enterprises/:androidEnterpriseId/devices/:deviceId::issueCommand","args":["androidEnterpriseId","deviceId","issueCommand","type","duration","newPassword","resetPasswordFlags","wipeParams","addEsimParams","removeEsimParams","clearAppsDataParams","startLostModeParams","stopLostModeParams","requestDeviceInfoParams"]},"getEnterpriseApplications":{"verb":"GET","url":"/api/android/v1/enterprises/:androidEnterpriseId/applications/:applicationId","args":["androidEnterpriseId","applicationId"]},"modifyEnterpriseAppPolicy":{"verb":"POST","url":"/api/android/v1/enterprises/:androidEnterpriseId/policies/:policyId::googleAction","args":["androidEnterpriseId","policyId","googleAction","packageNames","changes"]},"createEnterpriseWebapp":{"verb":"POST","url":"/api/android/v1/enterprises/:androidEnterpriseId/webApps","args":["androidEnterpriseId","title","startUrl","icons","displayMode","versionCode"]},"deliverContactFormMessage":{"verb":"POST","url":"/api/v1/deliver-contact-form-message","args":["emailAddress","firstName","lastName","message","websiteUrl"]},"sendPasswordRecoveryEmail":{"verb":"POST","url":"/api/v1/entrance/send-password-recovery-email","args":["emailAddress","websiteUrl"]},"signup":{"verb":"POST","url":"/api/v1/customers/signup","args":["emailAddress","password","organization","firstName","lastName","signupReason"]},"updateProfile":{"verb":"POST","url":"/api/v1/account/update-profile","args":["firstName","lastName","organization","emailAddress"]},"updatePassword":{"verb":"POST","url":"/api/v1/account/update-password","args":["oldPassword","newPassword"]},"updateBillingCard":{"verb":"POST","url":"/api/v1/account/update-billing-card","args":["stripeToken","billingCardLast4","billingCardBrand","billingCardExpMonth","billingCardExpYear"]},"login":{"verb":"POST","url":"/api/v1/customers/login","args":["emailAddress","password","rememberMe"]},"logout":{"verb":"GET","url":"/api/v1/account/logout","args":[]},"createQuote":{"verb":"POST","url":"/api/v1/customers/create-quote","args":["macosHosts","windowsHosts","linuxHosts","iosHosts","androidHosts","otherHosts"]},"saveBillingInfoAndSubscribe":{"verb":"POST","url":"/api/v1/customers/save-billing-info-and-subscribe","args":["quoteId","organization","firstName","lastName","paymentSource"]},"updatePasswordAndLogin":{"verb":"POST","url":"/api/v1/entrance/update-password-and-login","args":["password","token"]},"deliverDemoSignup":{"verb":"POST","url":"/api/v1/deliver-demo-signup","args":["emailAddress"]},"createOrUpdateOneNewsletterSubscription":{"verb":"POST","url":"/api/v1/create-or-update-one-newsletter-subscription","args":["emailAddress"]},"unsubscribeFromAllNewsletters":{"verb":"GET","url":"/api/v1/unsubscribe-from-all-newsletters","args":["emailAddress"]},"buildLicenseKey":{"verb":"POST","url":"/api/v1/admin/build-license-key","args":["numberOfHosts","organization","expiresAt","partnerName"]},"createVantaAuthorizationRequest":{"verb":"POST","url":"/api/v1/create-vanta-authorization-request","args":["emailAddress","fleetInstanceUrl","fleetApiKey","redirectToExternalPageAfterAuthorization","sharedSecret"]},"redirectVantaAuthorizationRequest":{"verb":"GET","url":"/redirect-vanta-authorization-request","args":["vantaSourceId","state","vantaAuthorizationRequestURL","redirectAfterSetup"]},"getHumanInterpretationFromOsquerySql":{"verb":"POST","url":"/api/v1/get-human-interpretation-from-osquery-sql","args":["sql"]},"deliverAppleCsr":{"verb":"POST","url":"/api/v1/deliver-apple-csr","args":["unsignedCsrData","deliveryMethod"]},"provisionSandboxInstanceAndDeliverEmail":{"verb":"POST","url":"/api/v1/admin/provision-sandbox-instance-and-deliver-email","args":["userId"]},"deliverTalkToUsFormSubmission":{"verb":"POST","url":"/api/v1/deliver-talk-to-us-form-submission","args":["emailAddress","firstName","lastName","organization","numberOfHosts","primaryBuyingSituation"]},"saveQuestionnaireProgress":{"verb":"POST","url":"/api/v1/save-questionnaire-progress","args":["currentStep","formData"]},"updateStartCtaVisibility":{"verb":"POST","url":"/api/v1/account/update-start-cta-visibility","args":[]},"deliverDealRegistrationSubmission":{"verb":"POST","url":"/api/v1/deliver-deal-registration-submission","args":["submittersFirstName","submittersLastName","submittersEmailAddress","submittersOrganization","submitterIsExistingPartner","customersOrganization","customersName","customersEmailAddress","dealStage","expectedClose","numberOfHosts","platforms","useCase","notes","websiteUrl"]},"unsubscribeFromMarketingEmails":{"verb":"GET","url":"/api/v1/unsubscribe-from-marketing-emails","args":["emailAddress"]},"getStripeCheckoutSessionUrl":{"verb":"POST","url":"/api/v1/customers/get-stripe-checkout-session-url","args":["quoteId"]},"getLlmGeneratedSql":{"verb":"GET","url":"/api/v1/query-generator/get-llm-generated-sql","args":["naturalLanguageQuestion"]},"getLlmGeneratedConfigurationProfile":{"verb":"POST","url":"/api/v1/get-llm-generated-configuration-profile","args":["profileType","naturalLanguageInstructions"]},"deliverApplicationSubmission":{"verb":"POST","url":"/api/v1/deliver-application-submission","args":["firstName","lastName","emailAddress","position","linkedinProfileUrl","location","message"]},"deliverGitopsWorkshopRequest":{"verb":"POST","url":"/api/v1/deliver-gitops-request","args":["firstName","lastName","emailAddress","location","numberOfHosts","managedPlatforms","willingToHost"]},"resetOneFleetPremiumLocalTrial":{"verb":"POST","url":"/api/v1/admin/reset-one-fleet-premium-local-trial","args":["emailAddress"]},"deliverWhitepaperDownloadRequest":{"verb":"POST","url":"/api/v1/deliver-whitepaper-download-request","args":["firstName","lastName","emailAddress","whitepaperName"]},"deliverWebinarAccessRequest":{"verb":"POST","url":"/api/v1/deliver-webinar-access-request","args":["firstName","lastName","emailAddress","webinarName"]},"deliverPartnerRegistrationSubmission":{"verb":"POST","url":"/api/v1/deliver-partner-registration-submission","args":["submittersFirstName","submittersLastName","submittersEmailAddress","submittersOrganization","partnerType","partnerWebsite","partnerCountry","notes","servicesOffered","numberOfHosts","servicesCategory","websiteUrl"]},"createCompliancePartnerTenant":{"verb":"POST","url":"/api/v1/microsoft-compliance-partner","args":["entraTenantId"]},"getCompliancePartnerSettings":{"verb":"GET","url":"/api/v1/microsoft-compliance-partner/settings","args":["entraTenantId","fleetServerSecret"]},"removeOneCompliancePartnerTenant":{"verb":"DELETE","url":"/api/v1/microsoft-compliance-partner","args":["entraTenantId","fleetServerSecret"]},"updateOneDevicesComplianceStatus":{"verb":"POST","url":"/api/v1/microsoft-compliance-partner/device","args":["entraTenantId","fleetServerSecret","deviceId","deviceManagementState","deviceName","os","osVersion","userPrincipalName","compliant","lastCheckInTime"]},"getOneComplianceStatusResult":{"verb":"GET","url":"/api/v1/microsoft-compliance-partner/device/message","args":["entraTenantId","fleetServerSecret","messageId"]},"receiveRedirectFromMicrosoft":{"verb":"GET","url":"/api/v1/microsoft-compliance-partner/adminconsent","args":["tenant","state","error","error_description"]},"registerOneFleetInstanceUsingVpp":{"verb":"POST","url":"/api/vpp/v1/auth","args":["fleetServerUrl","fleetLicenseKey"]},"getVppAppMetadata":{"verb":"GET","url":"/api/vpp/v1/metadata/:storeRegion","args":["storeRegion","platform","additionalPlatforms","ids","extend"]}} /* eslint-enable */ }); diff --git a/website/config/routes.js b/website/config/routes.js index 7f11bda6a6..f47bbb7a5f 100644 --- a/website/config/routes.js +++ b/website/config/routes.js @@ -1422,6 +1422,7 @@ module.exports.routes = { 'GET /api/android/v1/enterprises/:androidEnterpriseId/devices': { action: 'android-proxy/get-android-devices' }, 'DELETE /api/android/v1/enterprises/:androidEnterpriseId/devices/:deviceId': { action: 'android-proxy/delete-android-device', csrf: false }, 'PATCH /api/android/v1/enterprises/:androidEnterpriseId/devices/:deviceId': { action: 'android-proxy/modify-android-device', csrf: false }, + 'POST /api/android/v1/enterprises/:androidEnterpriseId/devices/:deviceId::issueCommand': { action: 'android-proxy/issue-command-on-android-device', csrf: false }, 'GET /api/android/v1/enterprises/:androidEnterpriseId/applications/:applicationId': { action: 'android-proxy/get-enterprise-applications', skipAssets: false }, 'POST /api/android/v1/enterprises/:androidEnterpriseId/policies/:policyId::googleAction': { action: 'android-proxy/modify-enterprise-app-policy', csrf: false, skipAssets: false }, 'POST /api/android/v1/enterprises/:androidEnterpriseId/webApps': { action: 'android-proxy/create-enterprise-webapp', csrf: false, skipAssets: false },