diff options
| author | Leitwolf11 | 2026-08-30 17:08:01 +0300 |
|---|---|---|
| committer | Leitwolf11 | 2026-08-30 17:08:01 +0300 |
| commit | 4bdd99b35493631aa4171753aa66d208c018f320 (patch) | |
| tree | 7025ddd07efd7d5491f996d32c97f66042522021 | |
| parent | 178f97b44da88d8653d1f942a993d06aad9b48cf (diff) | |
| download | website-4bdd99b35493631aa4171753aa66d208c018f320.tar.gz | |
Move ViGet to its canonical Progmasoft domain. Update registry navigation, authentication redirects, allowed hosts, Google OAuth callback documentation, and catalog identity to viget.progmasoft.com. Publish distinct honest empty-state roots for Visual X# .vipkg packages and Kotlin DSL plugin JARs without inventing unavailable package endpoints. Add production Nginx routing for the new host, preserve path and query strings through permanent redirects from viget.xsharp-lang.xyz, retain both ACME renewal surfaces, and exclude reproducible local publish output.
| -rw-r--r-- | .gitignore | 1 | ||||
| -rw-r--r-- | README.md | 12 | ||||
| -rw-r--r-- | backend/Auth/AuthEndpoints.cs | 6 | ||||
| -rw-r--r-- | backend/appsettings.json | 2 | ||||
| -rw-r--r-- | frontend/public/scripts/auth-flow.v3.js | 6 | ||||
| -rw-r--r-- | frontend/public/scripts/dashboard.v1.js | 6 | ||||
| -rw-r--r-- | frontend/src/components/AuthPanel.astro | 10 | ||||
| -rw-r--r-- | frontend/src/components/RepositoryHeader.astro | 11 | ||||
| -rw-r--r-- | frontend/src/pages/index.astro | 2 | ||||
| -rw-r--r-- | frontend/src/pages/repo/dashboard/index.astro | 4 | ||||
| -rw-r--r-- | frontend/src/pages/repo/dslplugins/index.astro | 54 | ||||
| -rw-r--r-- | frontend/src/pages/repo/index.astro | 4 | ||||
| -rw-r--r-- | ops/nginx/xsharp.conf | 53 |
13 files changed, 141 insertions, 30 deletions
@@ -2,6 +2,7 @@ # SPDX-License-Identifier: AGPL-3.0-or-later WITH AdditionRef-Progmasoft-Patent-Grant-1.0 .astro/ +.build/ .idea/ .vscode/ bin/ @@ -14,18 +14,26 @@ This repository contains the public web surface for the Visual X# programming la - `backend/` is the ASP.NET Core Identity and package-registry API. It owns password and Google authentication, verification/recovery mail, secure session cookies, PostgreSQL persistence, and digest-only CLI tokens. The registry account dashboard is available at -[`viget.xsharp-lang.xyz/dashboard`](https://viget.xsharp-lang.xyz/dashboard/). Package publication remains closed while +[`viget.progmasoft.com/dashboard`](https://viget.progmasoft.com/dashboard/). Package publication remains closed while the compiler package contract is completed. Registry tokens follow the Cargo model: the plaintext is returned once, only a SHA-256 digest is retained, and a user can revoke each token independently. Account deletion permanently removes the Identity account, external logins, verification records, and registry tokens. +ViGet keeps DSL plugins and Visual X# packages in separate canonical catalogs: + +- `https://viget.progmasoft.com/dslplugins/<Publisher>/<Name>/` contains Kotlin DSL plugin JARs. +- `https://viget.progmasoft.com/<Publisher>/<Name>/` contains Visual X# `.vipkg` packages. + +These paths reserve catalog identity; they do not imply that publishing or downloading is available before the registry +HTTP contract is implemented. + The PostgreSQL provider is selected solely by `ConnectionStrings__Registry`. Production uses the PostgreSQL instance on the project-owned server over a local Unix socket; the database is not delegated to a hosted database service or exposed to the browser. Google OAuth client credentials, the database connection, auth-code pepper, and data-protection certificate stay in host-managed secrets. The Google OAuth web client callback is -`https://viget.xsharp-lang.xyz/api/v1/auth/google/callback`. Configure it through +`https://viget.progmasoft.com/api/v1/auth/google/callback`. Configure it through `Authentication__Google__ClientId` and `Authentication__Google__ClientSecret`. Until both values exist, the frontend keeps the Google button visible but disabled and email/password authentication remains available. Every completed Google authorization still requires the short-lived Visual X# email code before a registry session is issued. diff --git a/backend/Auth/AuthEndpoints.cs b/backend/Auth/AuthEndpoints.cs index 077d673..9b490d0 100644 --- a/backend/Auth/AuthEndpoints.cs +++ b/backend/Auth/AuthEndpoints.cs @@ -15,9 +15,9 @@ namespace XSharp.Web.Api.Auth; internal static class AuthEndpoints { - private const string DashboardUrl = "https://viget.xsharp-lang.xyz/dashboard/"; - private const string LoginUrl = "https://viget.xsharp-lang.xyz/login/"; - private const string RegisterUrl = "https://viget.xsharp-lang.xyz/register/"; + private const string DashboardUrl = "https://viget.progmasoft.com/dashboard/"; + private const string LoginUrl = "https://viget.progmasoft.com/login/"; + private const string RegisterUrl = "https://viget.progmasoft.com/register/"; public static void MapAuthEndpoints(this WebApplication app) { diff --git a/backend/appsettings.json b/backend/appsettings.json index 9dc0107..735b2bc 100644 --- a/backend/appsettings.json +++ b/backend/appsettings.json @@ -5,7 +5,7 @@ "Microsoft.AspNetCore": "Warning" } }, - "AllowedHosts": "localhost;api.xsharp-lang.xyz;viget.xsharp-lang.xyz", + "AllowedHosts": "localhost;api.xsharp-lang.xyz;viget.progmasoft.com", "ConnectionStrings": { "Registry": "Host=127.0.0.1;Port=5432;Database=xs_registry;Username=xsharp_web" }, diff --git a/frontend/public/scripts/auth-flow.v3.js b/frontend/public/scripts/auth-flow.v3.js index 8f4af1f..6c16437 100644 --- a/frontend/public/scripts/auth-flow.v3.js +++ b/frontend/public/scripts/auth-flow.v3.js @@ -133,7 +133,7 @@ form?.addEventListener("submit", async (event) => { } const response = await request("login", { email, password }); if (!response.ok) return explainFailure(response); - window.location.assign("https://viget.xsharp-lang.xyz/dashboard/"); + window.location.assign("https://viget.progmasoft.com/dashboard/"); return; } @@ -165,7 +165,7 @@ form?.addEventListener("submit", async (event) => { } const response = await request("verify-email", { email, code, publisherName }); if (!response.ok) return explainFailure(response); - window.location.assign("https://viget.xsharp-lang.xyz/dashboard/"); + window.location.assign("https://viget.progmasoft.com/dashboard/"); return; } @@ -176,7 +176,7 @@ form?.addEventListener("submit", async (event) => { } const response = await request("recovery/complete", { email, code: recoveryCode, password }); if (!response.ok) return explainFailure(response); - window.location.assign("https://viget.xsharp-lang.xyz/dashboard/"); + window.location.assign("https://viget.progmasoft.com/dashboard/"); }); initializeGoogleVerification(); diff --git a/frontend/public/scripts/dashboard.v1.js b/frontend/public/scripts/dashboard.v1.js index efb5019..3337df3 100644 --- a/frontend/public/scripts/dashboard.v1.js +++ b/frontend/public/scripts/dashboard.v1.js @@ -67,7 +67,7 @@ async function revokeToken(id) { async function initialize() { const response = await fetch("/api/v1/auth/me", { credentials: "include" }); if (response.status === 401) { - window.location.replace("https://viget.xsharp-lang.xyz/login/"); + window.location.replace("https://viget.progmasoft.com/login/"); return; } if (!response.ok) return showAlert("Account information could not be loaded.", true); @@ -90,7 +90,7 @@ async function initialize() { root?.querySelector("[data-signout]")?.addEventListener("click", async () => { await fetch("/api/v1/auth/logout", { method: "POST", credentials: "include" }); - window.location.assign("https://viget.xsharp-lang.xyz/login/"); + window.location.assign("https://viget.progmasoft.com/login/"); }); root?.querySelector("[data-token-open]")?.addEventListener("click", () => dialog?.showModal()); dialog?.querySelector("[data-token-close]")?.addEventListener("click", () => dialog?.close()); @@ -122,7 +122,7 @@ deleteForm?.addEventListener("submit", async (event) => { showAlert("The account could not be deleted.", true); return; } - window.location.replace("https://viget.xsharp-lang.xyz/?account=deleted"); + window.location.replace("https://viget.progmasoft.com/?account=deleted"); }); tokenForm?.addEventListener("submit", async (event) => { diff --git a/frontend/src/components/AuthPanel.astro b/frontend/src/components/AuthPanel.astro index 9480562..96ad487 100644 --- a/frontend/src/components/AuthPanel.astro +++ b/frontend/src/components/AuthPanel.astro @@ -14,7 +14,7 @@ const copy = { submit: "Next", switchText: "New to the registry?", switchLabel: "Create an account", - switchHref: "https://viget.xsharp-lang.xyz/register/", + switchHref: "https://viget.progmasoft.com/register/", }, register: { title: "Create account", @@ -22,7 +22,7 @@ const copy = { submit: "Next", switchText: "Already have an account?", switchLabel: "Sign in", - switchHref: "https://viget.xsharp-lang.xyz/login/", + switchHref: "https://viget.progmasoft.com/login/", }, recover: { title: "Recover account", @@ -30,7 +30,7 @@ const copy = { submit: "Send code", switchText: "Remembered your password?", switchLabel: "Sign in", - switchHref: "https://viget.xsharp-lang.xyz/login/", + switchHref: "https://viget.progmasoft.com/login/", }, } as const; const content = copy[mode]; @@ -38,7 +38,7 @@ const content = copy[mode]; <main class="auth-main" data-auth-flow data-mode={mode}> <section class="auth-card glass-panel"> - <a class="auth-brand" href="https://viget.xsharp-lang.xyz/" aria-label="Visual X# package registry"> + <a class="auth-brand" href="https://viget.progmasoft.com/" aria-label="Visual X# package registry"> <img src="/xsharp-logo.webp" width="44" height="44" alt="" /> <span>Visual X# Registry</span> </a> @@ -99,7 +99,7 @@ const content = copy[mode]; <button class="auth-submit" type="submit">{mode === "register" ? "Create account" : "Sign in"}</button> { mode === "login" && ( - <a class="auth-recovery" href="https://viget.xsharp-lang.xyz/recover/">Forgot password?</a> + <a class="auth-recovery" href="https://viget.progmasoft.com/recover/">Forgot password?</a> ) } </div> diff --git a/frontend/src/components/RepositoryHeader.astro b/frontend/src/components/RepositoryHeader.astro index ac04dfa..4732ca4 100644 --- a/frontend/src/components/RepositoryHeader.astro +++ b/frontend/src/components/RepositoryHeader.astro @@ -12,20 +12,21 @@ const { authenticated = false } = Astro.props; --- <header class="repository-header glass-panel"> - <a class="brand" href="https://viget.xsharp-lang.xyz/" aria-label="Visual X# package registry home"> + <a class="brand" href="https://viget.progmasoft.com/" aria-label="Visual X# package registry home"> <img class="brand-mark" src="/xsharp-logo.webp" width="38" height="38" alt="" /> <span class="brand-name">Visual X#</span> <span class="brand-channel">package registry</span> </a> <nav class="repository-navigation" aria-label="Registry navigation"> - <a href="https://viget.xsharp-lang.xyz/">Packages</a> + <a href="https://viget.progmasoft.com/">Packages</a> + <a href="https://viget.progmasoft.com/dslplugins/">DSL plugins</a> { authenticated ? ( - <a href="https://viget.xsharp-lang.xyz/dashboard/">Dashboard</a> + <a href="https://viget.progmasoft.com/dashboard/">Dashboard</a> ) : ( <> - <a href="https://viget.xsharp-lang.xyz/login/">Log in</a> - <a class="repository-register" href="https://viget.xsharp-lang.xyz/register/">Register</a> + <a href="https://viget.progmasoft.com/login/">Log in</a> + <a class="repository-register" href="https://viget.progmasoft.com/register/">Register</a> </> ) } diff --git a/frontend/src/pages/index.astro b/frontend/src/pages/index.astro index 642b4ea..742fdf5 100644 --- a/frontend/src/pages/index.astro +++ b/frontend/src/pages/index.astro @@ -63,7 +63,7 @@ const capabilities = [ </a> <nav aria-label="Primary navigation"> <a href="#pipeline">Pipeline</a> - <a href="https://viget.xsharp-lang.xyz/">Packages</a> + <a href="https://viget.progmasoft.com/">Packages</a> <a href="https://github.com/Progmasoft/visual-xsharp/tree/main/Spec" target="_blank" rel="noreferrer">Specification</a> <a class="nav-source" href="https://github.com/Progmasoft/visual-xsharp" target="_blank" rel="noreferrer"> <Icon name="github" /> diff --git a/frontend/src/pages/repo/dashboard/index.astro b/frontend/src/pages/repo/dashboard/index.astro index a031a4a..a004b92 100644 --- a/frontend/src/pages/repo/dashboard/index.astro +++ b/frontend/src/pages/repo/dashboard/index.astro @@ -44,7 +44,7 @@ import SiteLayout from "../../../layouts/SiteLayout.astro"; <article class="dashboard-panel glass-panel"> <span>Published packages</span> <strong>0</strong> - <small>The registry does not contain public xspkg releases yet.</small> + <small>The registry does not contain public .vipkg releases yet.</small> </article> <article class="dashboard-panel glass-panel"> <span>Email status</span> @@ -106,7 +106,7 @@ import SiteLayout from "../../../layouts/SiteLayout.astro"; <strong>Password</strong> <span>Change your password through a verified recovery email.</span> </div> - <a class="button secondary glass-panel" href="https://viget.xsharp-lang.xyz/recover/">Reset password</a> + <a class="button secondary glass-panel" href="https://viget.progmasoft.com/recover/">Reset password</a> </div> </section> </div> diff --git a/frontend/src/pages/repo/dslplugins/index.astro b/frontend/src/pages/repo/dslplugins/index.astro new file mode 100644 index 0000000..10eb985 --- /dev/null +++ b/frontend/src/pages/repo/dslplugins/index.astro @@ -0,0 +1,54 @@ +--- +// SPDX-FileCopyrightText: 2026 Progmasoft <support@progmasoft.com> +// SPDX-License-Identifier: AGPL-3.0-or-later WITH AdditionRef-Progmasoft-Patent-Grant-1.0 + +import Icon from "../../../components/Icon.astro"; +import RepositoryHeader from "../../../components/RepositoryHeader.astro"; +import SiteLayout from "../../../layouts/SiteLayout.astro"; +--- + +<SiteLayout + title="DSL Plugins · ViGet Package Registry by Progmasoft" + description="The ViGet Kotlin DSL plugin catalog is online, but no plugins have been published yet." +> + <section class="repository-surface"> + <div class="ambient" aria-hidden="true"> + <span class="ambient-orb ambient-orb-a"></span> + <span class="ambient-orb ambient-orb-b"></span> + </div> + <RepositoryHeader /> + <main class="repository-main"> + <div class="repository-status glass-panel"> + <span class="repository-status-icon"><Icon name="modules" /></span> + DSL plugin catalog online + </div> + <p class="eyebrow">Kotlin DSL plugins</p> + <h1>No DSL plugins<br /><em>published yet.</em></h1> + <p class="repository-lede"> + Kotlin DSL plugins are distributed as JAR artifacts under + <code>/dslplugins/<Publisher>/<Name>/</code>. The catalog is ready, but it does not contain any public + plugin releases yet. + </p> + <div class="repository-actions"> + <a class="button primary" href="https://viget.progmasoft.com/"> + Browse Visual X# packages + <Icon name="arrow" /> + </a> + <a class="button secondary glass-panel" href="https://github.com/Progmasoft/visual-xsharp" target="_blank" rel="noreferrer"> + Follow development + </a> + </div> + <div class="repository-note glass-panel"> + <Icon name="terminal" /> + <div> + <strong>Publishing is not available yet</strong> + <span>No placeholder artifacts or package identities are shown before real plugins are published.</span> + </div> + </div> + </main> + <footer class="repository-footer"> + <span>viget.progmasoft.com/dslplugins</span> + <span>Kotlin DSL plugin catalog</span> + </footer> + </section> +</SiteLayout> diff --git a/frontend/src/pages/repo/index.astro b/frontend/src/pages/repo/index.astro index 065ac27..014aa5b 100644 --- a/frontend/src/pages/repo/index.astro +++ b/frontend/src/pages/repo/index.astro @@ -41,12 +41,12 @@ import SiteLayout from "../../layouts/SiteLayout.astro"; <Icon name="terminal" /> <div> <strong>Publishing is not available yet</strong> - <span>The future registry will use the native Visual X# package format and verified package metadata.</span> + <span>Visual X# packages use .vipkg coordinates; Kotlin DSL plugins have a separate JAR catalog under /dslplugins.</span> </div> </div> </main> <footer class="repository-footer"> - <span>viget.xsharp-lang.xyz</span> + <span>viget.progmasoft.com</span> <span>Package registry preview</span> </footer> </section> diff --git a/ops/nginx/xsharp.conf b/ops/nginx/xsharp.conf index 4fbf5b6..4216c68 100644 --- a/ops/nginx/xsharp.conf +++ b/ops/nginx/xsharp.conf @@ -31,16 +31,48 @@ server { } server { + listen 80; + listen [::]:80; + server_name viget.progmasoft.com; + server_tokens off; + + location ^~ /.well-known/acme-challenge/ { + root /var/lib/letsencrypt; + default_type text/plain; + } + + location / { + return 301 https://viget.progmasoft.com$request_uri; + } +} + +server { + listen 80; + listen [::]:80; + server_name viget.xsharp-lang.xyz; + server_tokens off; + + location ^~ /.well-known/acme-challenge/ { + root /var/lib/letsencrypt; + default_type text/plain; + } + + location / { + return 308 https://viget.progmasoft.com$request_uri; + } +} + +server { listen 443 ssl; listen [::]:443 ssl; - server_name viget.xsharp-lang.xyz; + server_name viget.progmasoft.com; root /srv/xsharp/website/current/frontend/repo; index index.html; server_tokens off; - ssl_certificate /etc/letsencrypt/live/xsharp-lang.xyz/fullchain.pem; - ssl_certificate_key /etc/letsencrypt/live/xsharp-lang.xyz/privkey.pem; + ssl_certificate /etc/letsencrypt/live/progmasoft.com/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/progmasoft.com/privkey.pem; include /etc/letsencrypt/options-ssl-nginx.conf; ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; @@ -96,6 +128,21 @@ server { server { listen 443 ssl; listen [::]:443 ssl; + server_name viget.xsharp-lang.xyz; + server_tokens off; + + ssl_certificate /etc/letsencrypt/live/xsharp-lang.xyz/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/xsharp-lang.xyz/privkey.pem; + include /etc/letsencrypt/options-ssl-nginx.conf; + ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; + + add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always; + return 308 https://viget.progmasoft.com$request_uri; +} + +server { + listen 443 ssl; + listen [::]:443 ssl; server_name www.xsharp-lang.xyz; server_tokens off; |