@@ -112671,7 +112671,8 @@ define("nls/root/strings", {
112671112671 "PROMO_GET_APP_UPSELL_BUTTON": "Get {0}",
112672112672 "PROMO_PRO_ENDED_TITLE": "Your {0} Trial has ended",
112673112673 "PROMO_PRO_TRIAL_DAYS_LEFT": "Phoenix Pro Trial ({0} days left)",
112674- "GET_PHOENIX_PRO": "Get Phoenix Pro"
112674+ "GET_PHOENIX_PRO": "Get Phoenix Pro",
112675+ "USER_FREE_PLAN_NAME": "Free Plan"
112675112676});
112676112677
112677112678/*
@@ -167452,12 +167453,14 @@ define("services/login-desktop", function (require, exports, module) {
167452167453define("services/login-service", function (require, exports, module) {
167453167454 require("./setup-login-service"); // this adds loginService to KernalModeTrust
167454167455 require("./promotions");
167456+ require("./login-utils");
167455167457
167456- const Metrics = require("utils/Metrics");
167457- const LoginUtils = require("./login-utils ");
167458+ const Metrics = require("utils/Metrics"),
167459+ Strings = require("strings ");
167458167460
167459167461 const MS_IN_DAY = 10 * 24 * 60 * 60 * 1000;
167460167462 const TEN_MINUTES = 10 * 60 * 1000;
167463+ const FREE_PLAN_VALIDITY_DAYS = 10000;
167461167464
167462167465 // the fallback salt is always a constant as this will only fail in rare circumstatnces and it needs to
167463167466 // be exactly same across versions of the app. Changing this will not affect the large majority of users and
@@ -167472,6 +167475,7 @@ define("services/login-service", function (require, exports, module) {
167472167475
167473167476 // save a copy of window.fetch so that extensions wont tamper with it.
167474167477 let fetchFn = window.fetch;
167478+ let dateNowFn = Date.now;
167475167479
167476167480 const KernalModeTrust = window.KernalModeTrust;
167477167481 if(!KernalModeTrust){
@@ -167775,8 +167779,8 @@ define("services/login-service", function (require, exports, module) {
167775167779 const current = await getEffectiveEntitlements(false); // Get effective entitlements
167776167780
167777167781 // Check if we need to refresh
167778- const expiredPlanName = LoginUtils.validTillExpired(current, lastRecordedState);
167779- const hasChanged = LoginUtils.haveEntitlementsChanged(current, lastRecordedState);
167782+ const expiredPlanName = KernalModeTrust. LoginUtils.validTillExpired(current, lastRecordedState);
167783+ const hasChanged = KernalModeTrust. LoginUtils.haveEntitlementsChanged(current, lastRecordedState);
167780167784
167781167785 if (expiredPlanName || hasChanged) {
167782167786 console.log(`Entitlements monitor detected changes, Expired: ${expiredPlanName},` +
@@ -167800,6 +167804,38 @@ define("services/login-service", function (require, exports, module) {
167800167804 console.log('Entitlements monitor started (10-minute interval)');
167801167805 }
167802167806
167807+ function _validateAndFilterEntitlements(entitlements) {
167808+ if (!entitlements) {
167809+ return;
167810+ }
167811+
167812+ const currentDate = dateNowFn();
167813+
167814+ if(entitlements.plan && (!entitlements.plan.validTill || currentDate > entitlements.plan.validTill)) {
167815+ entitlements.plan = {
167816+ ...entitlements.plan,
167817+ paidSubscriber: false,
167818+ name: Strings.USER_FREE_PLAN_NAME,
167819+ validTill: currentDate + (FREE_PLAN_VALIDITY_DAYS * MS_IN_DAY)
167820+ };
167821+ }
167822+
167823+ const featureEntitlements = entitlements.entitlements;
167824+ if (!featureEntitlements) {
167825+ return;
167826+ }
167827+
167828+ for(const featureName in featureEntitlements) {
167829+ const feature = featureEntitlements[featureName];
167830+ if(feature && (!feature.validTill || currentDate > feature.validTill)) {
167831+ feature.activated = false;
167832+ feature.upgradeToPlan = feature.upgradeToPlan || brackets.config.main_pro_plan;
167833+ feature.subscribeURL = feature.subscribeURL || brackets.config.purchase_url;
167834+ feature.validTill = feature.validTill || (currentDate - MS_IN_DAY);
167835+ }
167836+ }
167837+ }
167838+
167803167839 /**
167804167840 * Get effective entitlements for determining feature availability throughout the app.
167805167841 * This is the primary API that should be used across Phoenix to check entitlements and enable/disable features.
@@ -167891,6 +167927,7 @@ define("services/login-service", function (require, exports, module) {
167891167927 async function getEffectiveEntitlements(forceRefresh = false) {
167892167928 // Get raw server entitlements
167893167929 const serverEntitlements = await getEntitlements(forceRefresh);
167930+ _validateAndFilterEntitlements(serverEntitlements); // will prune invalid entitlements
167894167931
167895167932 // Get trial days remaining
167896167933 const trialDaysRemaining = await LoginService.getProTrialDaysRemaining();
@@ -167905,19 +167942,17 @@ define("services/login-service", function (require, exports, module) {
167905167942 // Logged-in user with trial
167906167943 if (serverEntitlements.plan.paidSubscriber) {
167907167944 // Already a paid subscriber, return as-is
167908- // todo we need to check and filter valid till for each fields that we are interested in.
167909167945 return serverEntitlements;
167910167946 }
167911167947 // Enhance entitlements for trial user
167912- // todo we need to prune and filter serverEntitlements valid till for each fields that we are interested in.
167913167948 // ie if any entitlement has valid till expired, we need to deactivate that entitlement
167914167949 return {
167915167950 ...serverEntitlements,
167916167951 plan: {
167917167952 ...serverEntitlements.plan,
167918167953 paidSubscriber: true,
167919167954 name: brackets.config.main_pro_plan,
167920- validTill: Date.now () + trialDaysRemaining * MS_IN_DAY
167955+ validTill: dateNowFn () + trialDaysRemaining * MS_IN_DAY
167921167956 },
167922167957 isInProTrial: true,
167923167958 trialDaysRemaining: trialDaysRemaining,
@@ -167927,7 +167962,7 @@ define("services/login-service", function (require, exports, module) {
167927167962 activated: true,
167928167963 subscribeURL: brackets.config.purchase_url,
167929167964 upgradeToPlan: brackets.config.main_pro_plan,
167930- validTill: Date.now () + trialDaysRemaining * MS_IN_DAY
167965+ validTill: dateNowFn () + trialDaysRemaining * MS_IN_DAY
167931167966 }
167932167967 }
167933167968 };
@@ -167938,7 +167973,7 @@ define("services/login-service", function (require, exports, module) {
167938167973 plan: {
167939167974 paidSubscriber: true,
167940167975 name: brackets.config.main_pro_plan,
167941- validTill: Date.now () + trialDaysRemaining * MS_IN_DAY
167976+ validTill: dateNowFn () + trialDaysRemaining * MS_IN_DAY
167942167977 },
167943167978 isInProTrial: true,
167944167979 trialDaysRemaining: trialDaysRemaining,
@@ -167947,7 +167982,7 @@ define("services/login-service", function (require, exports, module) {
167947167982 activated: true,
167948167983 subscribeURL: brackets.config.purchase_url,
167949167984 upgradeToPlan: brackets.config.main_pro_plan,
167950- validTill: Date.now () + trialDaysRemaining * MS_IN_DAY
167985+ validTill: dateNowFn () + trialDaysRemaining * MS_IN_DAY
167951167986 }
167952167987 }
167953167988 };
@@ -167966,7 +168001,11 @@ define("services/login-service", function (require, exports, module) {
167966168001 LoginService,
167967168002 setFetchFn: function _setFetchFn(fn) {
167968168003 fetchFn = fn;
167969- }
168004+ },
168005+ setDateNowFn: function _setDdateNowFn(fn) {
168006+ dateNowFn = fn;
168007+ },
168008+ _validateAndFilterEntitlements: _validateAndFilterEntitlements
167970168009 };
167971168010 }
167972168011
@@ -168001,9 +168040,15 @@ define("services/login-service", function (require, exports, module) {
168001168040
168002168041define("services/login-utils", function (require, exports, module) {
168003168042
168043+ const KernalModeTrust = window.KernalModeTrust;
168044+ if(!KernalModeTrust){
168045+ // integrated extensions will have access to kernal mode, but not external extensions
168046+ throw new Error("Login utils should have access to KernalModeTrust. Cannot boot without trust ring");
168047+ }
168048+
168004168049 /**
168005168050 * Check if any validTill time has expired
168006- *
168051+ *
168007168052 * @param {Object|null} entitlements - Current entitlements object
168008168053 * @param {Object|null} lastRecordedEntitlement - Previously recorded entitlements
168009168054 * @returns {string|null} - Name of expired plan/entitlement or null if none expired
@@ -168061,7 +168106,7 @@ define("services/login-utils", function (require, exports, module) {
168061168106
168062168107 /**
168063168108 * Check if entitlements have changed from last recorded state
168064- *
168109+ *
168065168110 * @param {Object|null} current - Current entitlements object
168066168111 * @param {Object|null} last - Last recorded entitlements object
168067168112 * @returns {boolean} - True if entitlements have changed, false otherwise
@@ -168105,10 +168150,17 @@ define("services/login-utils", function (require, exports, module) {
168105168150 return false;
168106168151 }
168107168152
168108- // Export functions
168109- exports.validTillExpired = validTillExpired;
168110- exports.haveEntitlementsChanged = haveEntitlementsChanged;
168153+ KernalModeTrust.LoginUtils = {
168154+ validTillExpired,
168155+ haveEntitlementsChanged
168156+ };
168157+ // Test only Export functions
168158+ if(Phoenix.isTestWindow) {
168159+ exports.validTillExpired = validTillExpired;
168160+ exports.haveEntitlementsChanged = haveEntitlementsChanged;
168161+ }
168111168162});
168163+
168112168164/*
168113168165 * GNU AGPL-3.0 License
168114168166 *
@@ -168850,7 +168902,7 @@ define("services/profile-menu", function (require, exports, module) {
168850168902 initials: profileData.profileIcon.initials,
168851168903 avatarColor: profileData.profileIcon.color,
168852168904 planClass: "user-plan-free",
168853- planName: "Free Plan" ,
168905+ planName: Strings.USER_FREE_PLAN_NAME ,
168854168906 titleText: "Ai Quota Used",
168855168907 usageText: "100 / 200 credits",
168856168908 usedPercent: 0,
0 commit comments