Skip to content

Tizen version label, updating apps installed with another certificate, banner dismiss (#44, #47, #43) - #48

Merged
PatrickSt1991 merged 6 commits into
mainfrom
tizen-version-label
Oct 30, 2026
Merged

PatrickSt1991 merged 6 commits into
mainfrom
tizen-version-label

Conversation

@PatrickSt1991

@PatrickSt1991 PatrickSt1991 commented Oct 30, 2026 •

Copy link
Copy Markdown
Contributor

Refs #44, refs #47, refs #43. Commits: the Tizen label, the certificate reading, every profile handed over, and the banner's Got it.

Tizen version label (#47, IPTV-Manager in #44). The catalog now says what Tizen each file asks for (required_version, from Apps2Samsung/tizen-community-packages#170 and Apps2Samsung/Apps2Samsung#926). The page reads this TV's platform version and:

  • badges a build the TV is too old for with Needs Tizen X on cards, the selected card, pinned cards and variant rows, dims the card, and disables Install with the reason in the sheet; an app with a build for older sets lands on that build;
  • sends the TV's version with every install, so the service checks the package's own manifest (required_version / api-version) before signing and pushing, for catalog installs and uploaded files alike, and answers NEEDS_NEWER_TIZEN with both versions;
  • when the TV still refuses with [118, -19] (118019 on a 2018 set) or [118, -4], the message says what the package asks for instead of the bare code;
  • Settings shows this TV's Tizen version.

Until the two catalog PRs are merged and a new community release and snapshot have run, nothing in the catalog carries the field, so the page shows no badges; the service-side check works from the package itself from day one.

Another certificate (HackTV in #44). An app installed from a phone or PC carries that device's author certificate, and the TV only updates it with the same one, so TV-Store's re-sign got install failed[118, -12] (118012 on a 2018 set). Now arming hands over every signing profile the phone or PC holds (Apps2Samsung/Apps2Samsung#927) and TV-Store updates in place:

  • service/certs.js keeps them all ({ primary, certificates[] }, id = SHA-256 of the author leaf; a second device's arming adds its profiles; a 0.3.x one-profile file still reads), remembers which profile each package took, and gives the order to try;

  • the service signs with the remembered profile (else the head's first choice) and, when the TV answers "same id and different certificate", signs again with the next profile from the same file until one is taken; /ping and Settings list the profiles on the TV;

  • only when none matches:

  • service/refusal.js reads the TV's refusal: "same id and different certificate", or a bare [118, -12] on a package the page says is on the TV, is CERT_MISMATCH; other [118, -12] reasons are CERT_REJECTED with the clock / internet / re-arm advice (as in Apps2Samsung#907);

  • the install screen offers Remove the old copy and install again or Keep the old copy; the retry sends replace: true and the service runs 0 vd_appuninstall on its own connection before the push (a refusal is logged, the install goes ahead and the TV's answer is what the user sees);

  • the app sheet says when an app came from a phone or PC (TV-Store never installed that package) and what happens on a mismatch;

  • README: "Apps installed from a phone or PC".

test/refusal.test.js and test/certs.test.js cover the readings and the store; test/install.test.js runs the real service against the fake sdbd (A2S_SDB_PORT): retry with the next profile, remembered profile first, all refused, replace uninstalls first. All wired into both workflows; all tests pass. Verified in headless Chrome against a mock service with a Tizen 4.0 stub: the badge and disabled Install for IPTV Manager, a group landing on its 4.0 build, Settings showing "QE65Q6FNA · Tizen 4.0", the mismatch screen, the replace retry and the done screen. Not run on a TV.

Banner (#43). The "TV-Store vX is out" banner (and the renamed-copy one) gets a Got it that hides it for that catalog version, remembered on the TV; the next release brings it back. The On the TV row and the sheet keep saying the newer version. Checked in headless Chrome: banner, dismissed, still hidden after a reload.

…stall before the push (#47)

The catalog now says what Tizen each file asks for (required_version, from
tizen-community-packages and the Apps2Samsung snapshot). The page reads this
TV's platform version and:
- badges a build the TV is too old for with "Needs Tizen X" on cards, the
  selected card, pinned cards and variant rows, dims the card, and disables
  Install with the reason in the sheet; an app with a build for older sets
  lands on that build;
- sends the TV's version with every install, so the service checks the
  package's own manifest (required_version / api-version) before signing and
  pushing, for catalog installs and uploaded files alike, and answers
  NEEDS_NEWER_TIZEN with the two versions;
- when the TV still refuses with [118, -19] (118019 on a 2018 set) or
  [118, -4], the message says what the package asks for instead of the bare
  code. Settings shows this TV's Tizen version.

Refs #44: IPTV-Manager asks for Tizen 6.0 and the reporter's 2018 set runs
4.0, which the TV reported as install failed[118019].
…alling it again (#44)

An app installed from a phone or PC carries that device's author certificate,
and the TV only updates it with the same one: TV-Store's re-sign gets
install failed[118, -12] (118012 on a 2018 set, HackTV in #44). Now:
- service/refusal.js reads the TV's refusal: "same id and different
  certificate", or a bare [118, -12] on a package the page says is on the
  TV, is CERT_MISMATCH; other [118, -12] reasons are CERT_REJECTED with the
  clock / internet / re-arm advice; the Tizen-version readings moved here too;
- the install screen then offers "Remove the old copy and install again" or
  "Keep the old copy"; the retry sends replace: true and the service runs
  0 vd_appuninstall on its own connection before the push (a refusal is
  logged, the install goes ahead and the TV's answer is what the user sees);
- the app sheet says when an app came from a phone or PC (TV-Store never
  installed that package) and what happens on a certificate mismatch;
- README: Apps installed from a phone or PC.

test/refusal.test.js covers every reading; wired into both workflows.
Verified in headless Chrome against a mock service: the mismatch screen, the
replace retry and the done screen. Not run on a TV.
@PatrickSt1991 PatrickSt1991 changed the title Label apps that ask for a newer Tizen than this TV, and stop their install before the push Tizen version label, and a way past an app installed with another certificate (#44, #47) Oct 30, 2026
…the app was installed with (#44)

A Samsung TV only updates an app with the author certificate it was installed
with. Arming now brings every profile the phone or PC holds (Apps2Samsung
branch feat/tvstore-arm-all-profiles); the service keeps them all:
- service/certs.js: the store ({ primary, certificates[] }, id = SHA-256 of
  the author leaf), the payload shapes (certificates[] from 3.2+ heads, the
  four top-level fields from every head since 0.2.0), merge of a second
  hand-over (a second device adds its profiles), the order to try per package,
  and a 0.3.x one-profile file read as a one-entry store;
- signAndInstall signs with the profile the package took last time (else the
  head's first choice), and on "same id and different certificate" signs
  again with the next profile from the same input file until the TV takes one;
  the profile that worked is remembered per package; only when none is taken
  is the answer CERT_MISMATCH, naming the profiles tried, and the screen
  offers to remove the old copy;
- /ping and Settings list the profiles on the TV; the sheet hint says an app
  from a phone or PC updates once that device armed this TV.

test/certs.test.js covers the store; test/install.test.js runs the real
service against the fake sdbd (A2S_SDB_PORT): retry with the next profile,
remembered profile first, all refused, replace uninstalls first. Both are in
the workflows. Not run on a TV.
@PatrickSt1991 PatrickSt1991 changed the title Tizen version label, and a way past an app installed with another certificate (#44, #47) Tizen version label, and updating apps installed with another certificate (#44, #47) Oct 30, 2026
A profile whose distributor does not cover this set (a PC's bundled one on a
newer TV) gets a [118, -12] with another reason than the mismatch; the loop
now moves to the next profile on any certificate refusal and answers the
mismatch when it saw one, else the last refusal. install.test.js covers the
chain refusal, mismatch then chain, and chain only.
The banner cannot be acted on from the TV, so it gets a Got it that hides it
for that catalog version (settings.hideSelfNotice in localStorage); the next
release brings it back. Both the update banner and the renamed-copy one go
through it. The On the TV row and the sheet keep saying the newer version.
Checked in headless Chrome: banner, dismissed, still hidden after a reload,
row still shows the update.
@PatrickSt1991 PatrickSt1991 changed the title Tizen version label, and updating apps installed with another certificate (#44, #47) Tizen version label, updating apps installed with another certificate, banner dismiss (#44, #47, #43) Oct 30, 2026
PatrickSt1991 added a commit to Apps2Samsung/Apps2Samsung that referenced this pull request Oct 30, 2026
Refs Apps2Samsung/TV-Store#47 and Apps2Samsung/TV-Store#44.

`CommunityCatalogEntry` and `Asset` get `required_version`, read from
config.xml (`required_version`) or tizen-manifest.xml (`api-version`).
The community bundle's `catalog.json` records it once
Apps2Samsung/tizen-community-packages#170 is in; `CommunityAppList`
stamps it on the asset like the version and the ids. For the other
providers the snapshot tool reads it out of the asset (`WgtPackageInfo`
gains `RequiredVersion`), and reads an asset once more when the previous
snapshot has no value, so `resolved.json` fills in on the next run
without a new release.

TV-Store (Apps2Samsung/TV-Store#48) uses it to label an app that asks
for a newer Tizen than the TV runs and to stop the install before the
push, instead of the TV refusing with `install failed[118, -19]`. The
heads do not show it yet; their pre-install gate already reads the
package itself.

Core.Tests: 173 pass (two new); CatalogSnapshot and the desktop head
build.
@PatrickSt1991
PatrickSt1991 merged commit a05d5d2 into main Oct 30, 2026
1 check passed
@PatrickSt1991
PatrickSt1991 deleted the tizen-version-label branch October 30, 2026 08:43
PatrickSt1991 added a commit to Apps2Samsung/Apps2Samsung that referenced this pull request Oct 30, 2026
Refs Apps2Samsung/TV-Store#44; pairs with Apps2Samsung/TV-Store#48.

A Samsung TV only updates an app with the author certificate it was
installed with. Arm TV-Store handed over one profile, so an app
installed from the desktop with another profile (the bundled one on
Tizen 5 to 6 sets, a Partner profile, an import) could never be updated
from TV-Store: the TV answers `[118, -12]`. Now every profile goes along
and TV-Store picks the one the app was installed with.

- `SigningCertificatePem` carries the profile's `Name`;
`ProfilesIn(stores)` lists every complete profile folder (author.p12,
distributor.p12, password.txt, author still valid); `OpenAll(primary,
others)` opens them with the primary first, dropping repeats (same
folder or same author leaf) and skipping profiles that will not open.
- `TvStoreClient.ArmAsync` takes the list; `ArmPayload` keeps the first
profile's four PEM fields at the top level (TV-Store 0.2.0 to 0.3.11
read only those) and adds `certificates[]` with names for 0.3.12 and
later.
- Desktop hands over the certificate store plus the bundled profiles,
mobile and the CLI their store; the profile covering the TV stays first,
as before.

TV-Store 0.3.12 (TV-Store#48) keeps every profile, remembers which one
each package took, and on a mismatch signs again with the next before it
ever offers to remove the app.

Core.Tests: 176 pass (three new: profile listing, hand-over list,
payload shape); desktop and CLI build; mobile compiles in CI. Not run
against a TV.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant