Repository navigation
Tizen version label, updating apps installed with another certificate, banner dismiss (#44, #47, #43) - #48
Merged
Merged
Conversation
…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.
…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.
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
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.
This was referenced Oct 30, 2026
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.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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:required_version/api-version) before signing and pushing, for catalog installs and uploaded files alike, and answersNEEDS_NEWER_TIZENwith both versions;[118, -19](118019on a 2018 set) or[118, -4], the message says what the package asks for instead of the bare code;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](118012on 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.jskeeps 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;
/pingand Settings list the profiles on the TV;only when none matches:
service/refusal.jsreads the TV's refusal: "same id and different certificate", or a bare[118, -12]on a package the page says is on the TV, isCERT_MISMATCH; other[118, -12]reasons areCERT_REJECTEDwith 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: trueand the service runs0 vd_appuninstallon 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.jsandtest/certs.test.jscover the readings and the store;test/install.test.jsruns 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.