Ensure adhoc builds expire correctly

This commit is contained in:
trevor-signal 2025-01-16 11:44:23 -05:00 committed by GitHub
parent 423a92df4d
commit 9bec59b70a
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
7 changed files with 39 additions and 16 deletions

View file

@ -7,7 +7,7 @@ import { writeFileSync } from 'fs';
import { DAY } from '../util/durations';
import { version } from '../../package.json';
import { isAdhoc } from '../util/version';
import { isNotUpdatable } from '../util/version';
const unixTimestamp = parseInt(
process.env.SOURCE_DATE_EPOCH ||
@ -16,7 +16,10 @@ const unixTimestamp = parseInt(
);
const buildCreation = unixTimestamp * 1000;
const buildExpiration = buildCreation + DAY * 90;
// NB: Build expirations are also determined via users' auto-update settings; see
// getExpirationTimestamp
const validDuration = isNotUpdatable(version) ? DAY * 30 : DAY * 90;
const buildExpiration = buildCreation + validDuration;
const localProductionPath = join(
__dirname,
@ -26,7 +29,7 @@ const localProductionPath = join(
const localProductionConfig = {
buildCreation,
buildExpiration,
...(isAdhoc(version) ? { updatesEnabled: false } : {}),
...(isNotUpdatable(version) ? { updatesEnabled: false } : {}),
};
writeFileSync(

View file

@ -10,6 +10,7 @@ import * as log from '../../logging/log';
import type { StateType } from '../reducer';
import type { ExpirationStateType } from '../ducks/expiration';
import { getRemoteBuildExpiration, getAutoDownloadUpdate } from './items';
import { isNotUpdatable } from '../../util/version';
const NINETY_ONE_DAYS = 91 * DAY;
const THIRTY_ONE_DAYS = 31 * DAY;
@ -32,7 +33,8 @@ export const getExpirationTimestamp = createSelector(
remoteBuildExpiration: number | undefined,
autoDownloadUpdate: boolean
): number => {
const localBuildExpiration = autoDownloadUpdate
const localBuildExpiration =
isNotUpdatable(window.getVersion()) || autoDownloadUpdate
? buildExpiration
: buildExpiration - SIXTY_DAYS;

View file

@ -19,6 +19,7 @@ import { getPreferredReactionEmoji as getPreferredReactionEmojiFromStoredValue }
import { DurationInSeconds } from '../../util/durations';
import * as Bytes from '../../Bytes';
import { contactByEncryptedUsernameRoute } from '../../util/signalRoutes';
import { isNotUpdatable } from '../../util/version';
const DEFAULT_PREFERRED_LEFT_PANE_WIDTH = 320;
@ -215,8 +216,13 @@ export const getRemoteBuildExpiration = createSelector(
export const getAutoDownloadUpdate = createSelector(
getItems,
(state: ItemsStateType): boolean =>
Boolean(state['auto-download-update'] ?? true)
(state: ItemsStateType): boolean => {
if (isNotUpdatable(window.getVersion())) {
return false;
}
return Boolean(state['auto-download-update'] ?? true);
}
);
export const getTextFormattingEnabled = createSelector(

View file

@ -5,7 +5,7 @@ import semver from 'semver';
import type { OSType } from '../util/os/shared';
import { SystemTraySetting } from './SystemTraySetting';
import { isProduction } from '../util/version';
import { isNotUpdatable, isProduction } from '../util/version';
const MIN_WINDOWS_VERSION = '8.0.0';
@ -56,8 +56,15 @@ export const isMinimizeToAndStartInSystemTraySupported = (
OS: OSType
): boolean => !OS.isWindows() && isSystemTraySupported(OS);
export const isAutoDownloadUpdatesSupported = (OS: OSType): boolean =>
OS.isWindows() || OS.isMacOS();
export const isAutoDownloadUpdatesSupported = (
OS: OSType,
appVersion: string
): boolean => {
if (isNotUpdatable(appVersion)) {
return false;
}
return OS.isWindows() || OS.isMacOS();
};
export const shouldHideExpiringMessageBody = (
OS: OSType,

View file

@ -28,10 +28,10 @@ import { strictAssert } from '../util/assert';
import { drop } from '../util/drop';
import * as durations from '../util/durations';
import {
isAdhoc,
isAlpha,
isAxolotl,
isBeta,
isNotUpdatable,
isStaging,
} from '../util/version';
@ -527,9 +527,9 @@ export abstract class Updater {
async #checkForUpdates(
checkType: CheckType
): Promise<UpdateInformationType | undefined> {
if (isAdhoc(packageJson.version)) {
if (isNotUpdatable(packageJson.version)) {
this.logger.info(
'checkForUpdates: not checking for updates, this is an adhoc build'
'checkForUpdates: not checking for updates, this is not an updatable build'
);
return;
}
@ -950,7 +950,7 @@ export function getUpdatesFileName(): string {
function getChannel(): string {
const { version } = packageJson;
if (isAdhoc(version)) {
if (isNotUpdatable(version)) {
// we don't want ad hoc versions to update
return version;
}

View file

@ -28,6 +28,8 @@ export const isAxolotl = (version: string): boolean =>
export const isAdhoc = (version: string): boolean =>
semver.parse(version)?.prerelease[0] === 'adhoc';
export const isNotUpdatable = (version: string): boolean => isAdhoc(version);
export const isStaging = (version: string): boolean =>
semver.parse(version)?.prerelease[0] === 'staging';

View file

@ -330,7 +330,10 @@ async function renderPreferences() {
setGlobalDefaultConversationColor: ipcSetGlobalDefaultConversationColor,
// Limited support features
isAutoDownloadUpdatesSupported: Settings.isAutoDownloadUpdatesSupported(OS),
isAutoDownloadUpdatesSupported: Settings.isAutoDownloadUpdatesSupported(
OS,
MinimalSignalContext.getVersion()
),
isAutoLaunchSupported: Settings.isAutoLaunchSupported(OS),
isHideMenuBarSupported: Settings.isHideMenuBarSupported(OS),
isNotificationAttentionSupported: Settings.isDrawAttentionSupported(OS),