From b83aed25373cc8960d20a7b9bc39d2199bea6654 Mon Sep 17 00:00:00 2001 From: Eric Date: Tue, 17 Feb 2026 11:59:30 -0600 Subject: [PATCH] Website: Create admin page for resetting Fleet Premium trials (#39980) Changes: - Added /admin/reset-trial, a page where website admins can reset local Fleet Premium trials. - Added a link to the reset trial page to the navigation on admin pages. --- .../reset-one-fleet-premium-local-trial.js | 53 +++++++++++++++ .../api/controllers/admin/view-reset-trial.js | 27 ++++++++ website/assets/js/cloud.setup.js | 2 +- .../assets/js/pages/admin/reset-trial.page.js | 47 +++++++++++++ website/assets/styles/importer.less | 1 + .../styles/pages/admin/reset-trial.less | 66 +++++++++++++++++++ website/config/routes.js | 9 +++ website/views/layouts/layout.ejs | 3 + website/views/pages/admin/reset-trial.ejs | 45 +++++++++++++ 9 files changed, 252 insertions(+), 1 deletion(-) create mode 100644 website/api/controllers/admin/reset-one-fleet-premium-local-trial.js create mode 100644 website/api/controllers/admin/view-reset-trial.js create mode 100644 website/assets/js/pages/admin/reset-trial.page.js create mode 100644 website/assets/styles/pages/admin/reset-trial.less create mode 100644 website/views/pages/admin/reset-trial.ejs diff --git a/website/api/controllers/admin/reset-one-fleet-premium-local-trial.js b/website/api/controllers/admin/reset-one-fleet-premium-local-trial.js new file mode 100644 index 0000000000..19b1fccf12 --- /dev/null +++ b/website/api/controllers/admin/reset-one-fleet-premium-local-trial.js @@ -0,0 +1,53 @@ +module.exports = { + + + friendlyName: 'Reset one fleet premium local trial', + + + description: '', + + + inputs: { + emailAddress: { type: 'string', required: true, }, + }, + + + exits: { + success: {description: 'A user\'s Fleet premium trial was successfully reset.'}, + userNotFound: {description: 'No user account was found using the provided email address.', responseType: 'notFound'}, + trialTypeUnsupported: {description: 'This user has a Render trial.', responseType: 'badRequest'} + }, + + + fn: async function ({emailAddress}) { + + let thisUser = await User.findOne({emailAddress}); + + if(!thisUser) { + throw 'userNotFound'; + } + + if(thisUser.fleetPremiumTrialType === 'render trial') { + throw 'trialTypeUnsupported'; + } + + let thirtyDaysFromNowAt = Date.now() + (1000 * 60 * 60 * 24 * 30); + + let newTrialLicenseKeyForThisUser = await sails.helpers.createLicenseKey.with({ + numberOfHosts: 10, + organization: thisUser.organization, + expiresAt: thirtyDaysFromNowAt, + }); + + await User.updateOne({id: thisUser.id}).set({ + fleetPremiumTrialLicenseKeyExpiresAt: thirtyDaysFromNowAt, + fleetPremiumTrialLicenseKey: newTrialLicenseKeyForThisUser, + }); + + // All done. + return; + + } + + +}; diff --git a/website/api/controllers/admin/view-reset-trial.js b/website/api/controllers/admin/view-reset-trial.js new file mode 100644 index 0000000000..f295936076 --- /dev/null +++ b/website/api/controllers/admin/view-reset-trial.js @@ -0,0 +1,27 @@ +module.exports = { + + + friendlyName: 'View reset trial', + + + description: 'Display "Reset trial" page.', + + + exits: { + + success: { + viewTemplatePath: 'pages/admin/reset-trial' + } + + }, + + + fn: async function () { + + // Respond with view. + return {}; + + } + + +}; diff --git a/website/assets/js/cloud.setup.js b/website/assets/js/cloud.setup.js index 5b8677b89a..60a1388ab6 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"]},"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","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","args":["androidEnterpriseId","policyId"]},"deliverContactFormMessage":{"verb":"POST","url":"/api/v1/deliver-contact-form-message","args":["emailAddress","firstName","lastName","message"]},"sendPasswordRecoveryEmail":{"verb":"POST","url":"/api/v1/entrance/send-password-recovery-email","args":["emailAddress"]},"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":["numberOfHosts"]},"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"]},"deliverMdmBetaSignup":{"verb":"POST","url":"/api/v1/deliver-mdm-beta-signup","args":["emailAddress","fullName","jobTitle","numberOfHosts"]},"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"]},"deliverMdmDemoEmail":{"verb":"POST","url":"/api/v1/deliver-mdm-demo-email","args":["emailAddress"]},"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","customersFirstName","customersLastName","customersEmailAddress","linkedinUrl","customersOrganization","customersCurrentMdm","otherMdmEvaluated","preferredHosting","expectedDealSize","expectedCloseDate","notes"]},"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"]},"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"]},"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"]},"deliverContactFormMessage":{"verb":"POST","url":"/api/v1/deliver-contact-form-message","args":["emailAddress","firstName","lastName","message"]},"sendPasswordRecoveryEmail":{"verb":"POST","url":"/api/v1/entrance/send-password-recovery-email","args":["emailAddress"]},"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":["numberOfHosts"]},"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"]},"deliverMdmBetaSignup":{"verb":"POST","url":"/api/v1/deliver-mdm-beta-signup","args":["emailAddress","fullName","jobTitle","numberOfHosts"]},"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"]},"deliverMdmDemoEmail":{"verb":"POST","url":"/api/v1/deliver-mdm-demo-email","args":["emailAddress"]},"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","customersFirstName","customersLastName","customersEmailAddress","linkedinUrl","customersOrganization","customersCurrentMdm","otherMdmEvaluated","preferredHosting","expectedDealSize","expectedCloseDate","notes"]},"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"]},"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/assets/js/pages/admin/reset-trial.page.js b/website/assets/js/pages/admin/reset-trial.page.js new file mode 100644 index 0000000000..1650250328 --- /dev/null +++ b/website/assets/js/pages/admin/reset-trial.page.js @@ -0,0 +1,47 @@ +parasails.registerPage('reset-trial', { + // ╦╔╗╔╦╔╦╗╦╔═╗╦ ╔═╗╔╦╗╔═╗╔╦╗╔═╗ + // ║║║║║ ║ ║╠═╣║ ╚═╗ ║ ╠═╣ ║ ║╣ + // ╩╝╚╝╩ ╩ ╩╩ ╩╩═╝ ╚═╝ ╩ ╩ ╩ ╩ ╚═╝ + data: { + // Form data + formData: {}, + // For tracking client-side validation errors in our form. + // > Has property set to `true` for each invalid property in `formData`. + formErrors: {}, + // Form rules + formRules: { + emailAddress: {required: true}, + }, + // Syncing / loading state + syncing: false, + // Server error state + cloudError: '', + cloudSuccess: false, + }, + + // ╦ ╦╔═╗╔═╗╔═╗╦ ╦╔═╗╦ ╔═╗ + // ║ ║╠╣ ║╣ ║ ╚╦╝║ ║ ║╣ + // ╩═╝╩╚ ╚═╝╚═╝ ╩ ╚═╝╩═╝╚═╝ + beforeMount: function() { + //… + }, + mounted: async function() { + //… + }, + + // ╦╔╗╔╔╦╗╔═╗╦═╗╔═╗╔═╗╔╦╗╦╔═╗╔╗╔╔═╗ + // ║║║║ ║ ║╣ ╠╦╝╠═╣║ ║ ║║ ║║║║╚═╗ + // ╩╝╚╝ ╩ ╚═╝╩╚═╩ ╩╚═╝ ╩ ╩╚═╝╝╚╝╚═╝ + methods: { + submittedForm: async function() { + this.syncing = false; + this.cloudSuccess = true; + }, + clickClearFormFields: async function() { + this.cloudSuccess = false; + this.formErrors = {}; + this.formData = {}; + await this.forceRender(); + } + } +}); diff --git a/website/assets/styles/importer.less b/website/assets/styles/importer.less index f1e513ffad..2400e02556 100644 --- a/website/assets/styles/importer.less +++ b/website/assets/styles/importer.less @@ -101,3 +101,4 @@ @import 'pages/landing-pages/gitops-workshop.less'; @import 'pages/landing-pages/basic-comparison.less'; @import 'pages/fleet-gitops.less'; +@import 'pages/admin/reset-trial.less'; diff --git a/website/assets/styles/pages/admin/reset-trial.less b/website/assets/styles/pages/admin/reset-trial.less new file mode 100644 index 0000000000..5d88f256d3 --- /dev/null +++ b/website/assets/styles/pages/admin/reset-trial.less @@ -0,0 +1,66 @@ +#reset-trial { + + padding-top: 80px; + + h1 { + font-size: 28px; + line-height: 38px; + } + [purpose='form'] { + max-width: 480px; + input::-webkit-outer-spin-button, input::-webkit-inner-spin-button { + -webkit-appearance: none; + margin: 0; + } + input[type='number'] { + -moz-appearance: textfield; + } + label { + font-weight: 400; + margin-bottom: 4px; + } + .form-control { + height: 40px; + border-radius: 6px; + } + .card { + border-radius: 6px; + } + .card-body { + padding: 2em; + } + } + [purpose='cloud-error'] { + max-width: fit-content; + } + [purpose='submit-button'] { + margin-left: auto; + margin-right: auto; + border-radius: 4px; + padding-top: 10px; + padding-bottom: 10px; + display: flex; + span { + display: inline; + margin-left: auto; + margin-right: auto; + font-size: 16px; + line-height: 20px; + text-align: center; + font-weight: 400; + } + + } + + [purpose='result'] { + border: 1px solid @bg-lt-gray; + padding: 4px 6px; + border-radius: 4px; + position: relative; + code { + font: @code-font; + color: @core-fleet-black; + } + } + +} diff --git a/website/config/routes.js b/website/config/routes.js index df4368fd8a..f22432865d 100644 --- a/website/config/routes.js +++ b/website/config/routes.js @@ -389,6 +389,14 @@ module.exports.routes = { } }, + 'GET /admin/reset-trial': { + action: 'admin/view-reset-trial', + locals: { + hideFooterLinks: true, + showAdminLinks: true, + } + }, + 'GET /connect-vanta': { action: 'view-connect-vanta', @@ -1257,6 +1265,7 @@ module.exports.routes = { 'POST /api/v1/get-llm-generated-configuration-profile': { action: 'get-llm-generated-configuration-profile', hasSocketFeatures: true }, 'POST /api/v1/deliver-application-submission': { action: 'deliver-application-submission' }, 'POST /api/v1/deliver-gitops-request': { action: 'deliver-gitops-workshop-request' }, + 'POST /api/v1/admin/reset-one-fleet-premium-local-trial': { action: 'admin/reset-one-fleet-premium-local-trial' }, // ╔╦╗╦╔═╗╦═╗╔═╗╔═╗╔═╗╔═╗╔╦╗ ╔═╗╦═╗╔═╗═╗ ╦╦ ╦ ╔═╗╔╗╔╔╦╗╔═╗╔═╗╦╔╗╔╔╦╗╔═╗ diff --git a/website/views/layouts/layout.ejs b/website/views/layouts/layout.ejs index 6d124f5f16..0a08247f24 100644 --- a/website/views/layouts/layout.ejs +++ b/website/views/layouts/layout.ejs @@ -366,6 +366,7 @@ Generate queries License generator HTML Email preview tool + Reset local Fleet Premium trial <%}%> @@ -613,6 +614,7 @@ Generate queries License generator HTML Email preview tool + Reset Premium trial <%} %> @@ -797,6 +799,7 @@ + diff --git a/website/views/pages/admin/reset-trial.ejs b/website/views/pages/admin/reset-trial.ejs new file mode 100644 index 0000000000..dd90f4a57f --- /dev/null +++ b/website/views/pages/admin/reset-trial.ejs @@ -0,0 +1,45 @@ +
+ +
+
+
+

Reset Fleet Premium trial

+

Reset a user's 30-day local Fleet Premium trial

+
+
+
+ +
+ +
+ + +
Please enter an email address associated with an account.
+
+ +
+ No user was found with that email address + This tool can only be used to reset local Fleet Premium trials. + + +
+ Reset trial +
+
+
+
+
+
+

Trial reset!

+
+
+ Reset another trial +
+
+
+
+
+
+ +
+<%- /* Expose server-rendered data as window.SAILS_LOCALS :: */ exposeLocalsToBrowser() %>