起きたこと
content.allowedInternalCidrs を設定していない環境でも、共有URL発行パネルの「公開範囲」に 「社内限定」が選択肢として表示されます。
この状態で「社内限定」を選んで発行すると、API が 400 { "error": "Internal sharing is not configured" } を返して失敗します。
さらに「社内限定」は <option> の先頭にあり、selected 属性も初期化処理も無いため既定値になっています。
<!-- web/app/index.html -->
<select id="page-share-scope">
<option value="i">社内限定</option> <!-- ← 既定 -->
<option value="p">IP制限なし</option>
</select>
そのため CIDR未設定の環境では、パネルを開いて何も触らずに「発行してコピー」を押すと必ず失敗します。
web/mobile-page-shell.js のセレクタも同じ並びです。
分かりにくい点
失敗時のメッセージがUIに出ません。
issue.textContent = generatedUrl ? 'URLを表示しました' : '発行できませんでした';
APIは Internal sharing is not configured という的確なメッセージを返しているのに、画面には「発行できませんでした」としか出ないため、設定が原因だと気づけませんでした。ブラウザの開発者ツールを開いて初めて分かりました。
提案
未設定なら選択肢を出さない。設定済みなら「社内限定」を既定のまま残す。
安全側を既定にするという現状の意図は良いと思うので、それは維持したうえで、使えないときだけ選択肢から外す形です。
allowedInternalCidrs |
選択肢 |
既定 |
| あり |
社内限定 / IP制限なし |
社内限定 |
| なし |
IP制限なしのみ |
IP制限なし |
html-share publish は設定を知っているので、manifest.json に真偽値を1つ足せば判断できます。CIDRそのものはブラウザへ渡しません(組織のIPをクライアントに配らないため)。
// src/bundle.ts
export interface BuildManifest {
generatedAt: string;
internalSharing: boolean;
pages: BuiltPage[];
}
const manifest = {
generatedAt: new Date().toISOString(),
internalSharing: config.content.allowedInternalCidrs.length > 0,
pages,
};
手元で試したところ、manifest.json は src/publish.ts の2箇所(copyConsole の呼び出しと ownerManifest)でも組み立て直されているため、そちらにも通す必要がありました。
UI側は、フラグが偽なら option[value="i"] を取り除いて value = 'p' にするだけで動きました。
再現手順
content.allowedInternalCidrs を設定せずに html-share publish する
- コンソールでページを開き、共有パネルを開く
- 「公開範囲」が「社内限定」になっている
- そのまま「発行してコピー」を押す
- 「発行できませんでした」と表示される(開発者ツールでは 400
Internal sharing is not configured)
環境
- Node.js 24
main ブランチ相当(2026-08-17 時点)
起きたこと
content.allowedInternalCidrsを設定していない環境でも、共有URL発行パネルの「公開範囲」に 「社内限定」が選択肢として表示されます。この状態で「社内限定」を選んで発行すると、API が
400 { "error": "Internal sharing is not configured" }を返して失敗します。さらに「社内限定」は
<option>の先頭にあり、selected属性も初期化処理も無いため既定値になっています。そのため CIDR未設定の環境では、パネルを開いて何も触らずに「発行してコピー」を押すと必ず失敗します。
web/mobile-page-shell.jsのセレクタも同じ並びです。分かりにくい点
失敗時のメッセージがUIに出ません。
APIは
Internal sharing is not configuredという的確なメッセージを返しているのに、画面には「発行できませんでした」としか出ないため、設定が原因だと気づけませんでした。ブラウザの開発者ツールを開いて初めて分かりました。提案
未設定なら選択肢を出さない。設定済みなら「社内限定」を既定のまま残す。
安全側を既定にするという現状の意図は良いと思うので、それは維持したうえで、使えないときだけ選択肢から外す形です。
allowedInternalCidrshtml-share publishは設定を知っているので、manifest.jsonに真偽値を1つ足せば判断できます。CIDRそのものはブラウザへ渡しません(組織のIPをクライアントに配らないため)。手元で試したところ、
manifest.jsonはsrc/publish.tsの2箇所(copyConsoleの呼び出しとownerManifest)でも組み立て直されているため、そちらにも通す必要がありました。UI側は、フラグが偽なら
option[value="i"]を取り除いてvalue = 'p'にするだけで動きました。再現手順
content.allowedInternalCidrsを設定せずにhtml-share publishするInternal sharing is not configured)環境
mainブランチ相当(2026-08-17 時点)