diff --git a/.github/ISSUE_TEMPLATE/bug.md b/.github/ISSUE_TEMPLATE/bug.md new file mode 100644 index 000000000..0691bb2c6 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug.md @@ -0,0 +1,39 @@ +--- +name: 不具合 +about: 動かない・想定と違う挙動を報告する +labels: bug +--- + + + +## 現象 + + + +## 環境 + +| | | +|---|---| +| バージョン | | +| ターゲット | | +| DBMS | | + +## 再現手順 + + + +## 期待する動作 + +## 調べたこと + + diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 000000000..6212323d7 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,16 @@ +# Issue テンプレートの設定 +# +# blank_issues_enabled: true にしてあるため、**テンプレートは任意**である。 +# 「Open a blank issue」から、素の Issue も起票できる。 +# +# テンプレートを Markdown(.md)にしているのも、任意にするため。 +# YAML フォーム(.yml)にすると必須項目を強制でき、書きたいことが書けなくなる。 +blank_issues_enabled: true + +contact_links: + - name: 脆弱性の報告(Security) + url: https://github.com/OpenTouryoProject/OpenTouryo/security/advisories/new + about: セキュリティに関する問題は、公開の Issue ではなく Private vulnerability reporting へ。SECURITY.md を参照。 + - name: 質問・相談 + url: https://github.com/OpenTouryoProject/OpenTouryo/issues?q=is%3Aissue + about: 同じ問題が既に挙がっていないか、先に検索してください。 diff --git a/.github/ISSUE_TEMPLATE/enhancement.md b/.github/ISSUE_TEMPLATE/enhancement.md new file mode 100644 index 000000000..425f10f31 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/enhancement.md @@ -0,0 +1,31 @@ +--- +name: 機能追加・改善 +about: 新しい機能や、既存機能の改善を提案する +labels: enhancement +--- + + + +## 何をしたいか + +## なぜ必要か + + + +## 案 + + + +## 影響 + + diff --git a/.github/ISSUE_TEMPLATE/quality.md b/.github/ISSUE_TEMPLATE/quality.md new file mode 100644 index 000000000..75c466431 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/quality.md @@ -0,0 +1,47 @@ +--- +name: 品質改善 +about: リファクタリング、規約整備、CI・セキュリティの整備、文書の整理 +labels: quality improvement +--- + + + +## 概要 + + + +## 現状 + + + +## 対応 + + + +## 検証 + + + +## 利用者への影響 + + diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 000000000..5b2af8c41 --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,46 @@ + + +## 概要 + + + +## 変更内容 + + + +## 検証 + + + +## 利用者への影響 + + + +--- + + diff --git a/AGENTS.md b/AGENTS.md index 171d94214..1caa82b7d 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -60,6 +60,23 @@ gh issue create --repo OpenTouryoProject/OpenTouryo --title --body-file - 本文は一時ファイルに書き、`--body-file` で渡す(改行・記号の欠落を避ける) - 投稿後は URL を報告する +**テンプレートは自動では適用されない。読んで、その構成に沿って書くこと。** + +`gh issue create` / `gh pr create` の `--template` は「エディタで編集する前提の +開始テキスト」であり、**`--body-file` と併用すると本文で上書きされる。** +エージェントは `--body-file` を使うため、テンプレートは効かない。 + +``` +.github/ISSUE_TEMPLATE/bug.md 不具合 +.github/ISSUE_TEMPLATE/enhancement.md 機能追加・改善 +.github/ISSUE_TEMPLATE/quality.md 品質改善(リファクタリング・規約・CI・文書) +.github/pull_request_template.md PR +``` + +**テンプレートは任意**(`blank_issues_enabled: true`)だが、 +**「利用者への影響」は、無いなら「無し」と明記する。** +空欄だと、確認したのか未確認なのかが読み手に分からない。 + **このリポジトリでは `OsscJpDevInfra` アカウントを使用する。** `gh auth status` に複数のアカウントが登録されていることがあるため、 投稿前にアクティブなアカウントを確認すること。異なる場合は `gh auth switch` で切り替える。 @@ -72,6 +89,23 @@ gh auth switch --user OsscJpDevInfra # 異なる場合は切り替え **Issue のクローズ・ラベル変更・アサイン、PR の作成やマージは人が行う。** これらは成果物の検収と同じ扱いとし、エージェントは提案に留める。 +**PR のレビューは、`--comment` だけ行ってよい。** + +| 操作 | 誰が行うか | +|---|---| +| `gh pr review --comment` | **エージェント可**(文面を提示し、承認を得てから) | +| `gh pr review --approve` / `--request-changes` | **人のみ。検収に当たる** | +| PR の作成・マージ | **人のみ** | + +`--comment` は `COMMENTED` として記録され、**必須レビューを満たさない**。 +`reviewDecision` は `REVIEW_REQUIRED` のまま変わらないので、 +**マージを進めてしまう心配は無い。** + +> **承認が必須レビューとして数えられるのは `write` 以上の人だけ。** +> 公開リポジトリなので誰でも `read` は持つが、それでは足りない。 +> **自分が出した PR は、自分で承認できない。** +> レビュアーの構成は [`GitHubUsage.md`](GitHubUsage.md) 2 節。 + ### コーディング規約は CODING.md、領域ごとの事情は ANALYSIS.md に従う **規約は全領域に共通、分析は領域ごと**に分かれている。 diff --git a/GitHubUsage.md b/GitHubUsage.md index 42ea1018c..28966f9f5 100644 --- a/GitHubUsage.md +++ b/GitHubUsage.md @@ -234,23 +234,72 @@ fixed 12 件 ≠ 12 件が直った | ブランチ | 役割 | 保護 | |---|---|---| | `develop` | 既定ブランチ。開発の集約先 | force-push 禁止 / 削除禁止 | -| `master` | リリース | 上記 + **レビュー 1 名必須** | +| `master` | リリース | 上記 + **レビュー 1 名必須** + **必須チェック `build`** | | `deps` | Dependabot PR の受け先 | なし | ブランチ運用は git-flow。**規約は [`Contributing.ja.md`](Contributing.ja.md)。** -### 現状の弱点 +### レビュアー + +`master` へのマージには**レビュー 1 名の承認**が要る(必須チェック `build` とあわせて 2 つの関所)。 + +| | ロール | 承認 | +|---|---|---| +| `daisukenishino2` | admin | 可 | +| `OsscJpDevInfra` | admin | 可 | +| `daisukenishino77` | **write**(2026-08-10 に追加) | 可 | + +> **承認が必須レビューとして数えられるのは、`write` 以上の人だけ。** +> `read` / `triage` でもレビューは書けるが、**ブランチ保護は満たさない。** +> 公開リポジトリなので誰でも `read` は持つが、それでは足りない。 + +> **自分が出した PR は、自分で承認できない。** +> 3 名いるので、誰が PR を出しても残り 2 名から選べる。 + +組織の `default_repository_permission` は `none`。 +リポジトリへの権限は**明示的に付与する**(`affiliation=direct` で確認できる)。 + +```bash +gh api repos/OpenTouryoProject/OpenTouryo/collaborators/<login>/permission --jq '{permission, role_name}' +gh api "repos/OpenTouryoProject/OpenTouryo/collaborators?affiliation=direct" --jq '.[] | "\(.login) \(.role_name)"' +gh api repos/OpenTouryoProject/OpenTouryo/invitations # 承諾待ちの招待 +``` + +### 意図的にそうしている設定 + +**弱点に見えるが、この運用では正しい**もの。理由を書いておかないと、また提案が出る。 + - **`develop` に必須ステータス チェックは置かない**(意図的)。 `deps` ⇔ `develop` ⇔ feature と往復が多く、毎回のマージが CI 待ちになるため。 - 代わりに **`master` 宛の PR で CI を動かす**(7 節) + 代わりに **`master` 宛の PR で CI を動かす**(3 節・7 節) - `master` の `enforce_admins` は無効(少人数運用のため意図的) -- `delete_branch_on_merge` は無効。マージ済みブランチが残る +- **`delete_branch_on_merge` は無効にしておく**(意図的)。 + **作業ブランチを継続利用する運用**のため。`3rd_agent` は 4 回、`2nd_agent` は 6 回と、 + 同じブランチを何度も `develop` へマージしている。 + **自動削除にすると 1 回目で消えて、毎回作り直しになる。** + `deps`(Dependabot の受けブランチ)が消えると、`dependabot-retarget.yml` も機能しなくなる。 + この設定は **PR ごとに使い捨てるブランチ**を前提としたもので、この運用には合わない + +### マージ方式は「通常のマージ」だけ + +``` +allow_merge_commit true +allow_squash_merge false … 2026-08-10 に無効化 +allow_rebase_merge false … 同上 +``` -> **squash merge / rebase merge を許可している。** -> ただし **squash はコミットを消すため、NuGet パッケージの Source Link を壊す** -> ([`root/programs/CS/NuGet/README.md`](root/programs/CS/NuGet/README.md) 7 節)。 -> `master` へは `--no-ff` で入れること。**運用で担保している。** +**squash と rebase はコミットを消す**(rebase は SHA が変わる)。 +公開済みの NuGet パッケージは**詰めた時のコミットに固定される**ため、 +そのコミットが到達不能になると **Source Link が壊れる。公開後には直せない** +([`root/programs/CS/NuGet/README.md`](root/programs/CS/NuGet/README.md) 7 節)。 + +**以前は「`master` へは `--no-ff` で」という申し合わせだけで担保していた。** +実績としても squash は未使用、rebase も 1 度だけだったため、 +**選択肢ごと無くして、仕組みで防ぐことにした。** + +> ローカルの `git rebase`(push 前の整理)には影響しない。 +> PR のマージ ボタンから選択肢が消えるだけである。 --- @@ -263,6 +312,8 @@ fixed 12 件 ≠ 12 件が直った | [`workflows/build-windows.yml`](.github/workflows/build-windows.yml) | 検証 3 本(ビルド・単体テスト・疎通)を windows-latest で | | [`workflows/dependabot-retarget.yml`](.github/workflows/dependabot-retarget.yml) | Dependabot PR の向き先を `deps` へ変更 | | [`secret_scanning.yml`](.github/secret_scanning.yml) | Secret scanning のアラートから除外するパス(1 節) | +| [`ISSUE_TEMPLATE/`](.github/ISSUE_TEMPLATE) | Issue テンプレート 3 種 + `config.yml`(5 節) | +| [`pull_request_template.md`](.github/pull_request_template.md) | PR テンプレート(5 節) | **`dependabot.yml` は置いていない**(4 節)。 @@ -325,7 +376,57 @@ Actions が PR を承認できると、`master` のレビュー必須が形骸 --- -## 5. 有効にしていない機能 +## 5. Issue と PR + +### ラベル + +11 個を定義している。**設定は人が行う**(`AGENTS.md`)。 + +| ラベル | 用途 | +|---|---| +| `bug` / `enhancement` / `question` | 種別 | +| `duplicate` / `invalid` / `wontfix` | 処理の結果 | +| **`quality improvement`** | 品質改善。**リファクタリング・規約整備・CI/セキュリティの整備**はここ | +| `good first issue` / `help wanted` | 外部の参加者向け | +| `dependencies` / `.NET` | **Dependabot が自動で付ける**。手で付けない | + +```bash +gh label list --repo OpenTouryoProject/OpenTouryo +gh issue view <番号> --repo OpenTouryoProject/OpenTouryo --json labels +``` + +### テンプレート + +``` +.github/ISSUE_TEMPLATE/config.yml 任意化 + Security への導線 +.github/ISSUE_TEMPLATE/bug.md 不具合 → labels: bug +.github/ISSUE_TEMPLATE/enhancement.md 機能追加・改善 → labels: enhancement +.github/ISSUE_TEMPLATE/quality.md 品質改善 → labels: quality improvement +.github/pull_request_template.md PR +``` + +**強制しない。** そのために次の 2 点を選んでいる。 + +| | 理由 | +|---|---| +| **Markdown 形式(`.md`)** | YAML フォーム(`.yml`)は**必須項目を強制できる**。書きたいことが書けなくなる | +| **`blank_issues_enabled: true`** | 「Open a blank issue」から**素の Issue も起票できる** | + +`config.yml` の `contact_links` で、**セキュリティ問題を Private vulnerability reporting へ +誘導している**(Issue の選択画面で分岐するので、公開 Issue に書かれる前に止まる)。 + +**ラベルはテンプレートの front matter が自動で付ける。** +画面から起票した場合のみで、`gh` の `--body-file` では付かない。 + +> **エージェントにはテンプレートが自動適用されない。** +> `--template` は「エディタで編集する前提の開始テキスト」で、 +> **`--body-file` と併用すると本文で上書きされる。** +> エージェントはテンプレートを**読んで、その構成に沿って書く** +> ([`AGENTS.md`](AGENTS.md))。 + +--- + +## 6. 有効にしていない機能 | 機能 | 判断 | |---|---| @@ -337,7 +438,7 @@ Actions が PR を承認できると、`master` のレビュー必須が形骸 --- -## 6. 実行したコマンドの記録 +## 7. 実行したコマンドの記録 **エージェントが `gh` で直接実行した設定変更。** 参照系(GET)は除く。 @@ -424,6 +525,76 @@ gh api repos/OpenTouryoProject/OpenTouryo/actions/permissions/workflow grep -A3 '^permissions:' .github/workflows/*.yml ``` +### 2026-08-10 : master に必須チェックを設定 + +`develop → master` の PR で `build-windows.yml` を発火させ(`pull_request: [master]`)、 +その成功をマージの条件にする。**リリースの関所。** + +**チェック名は `build`**(ワークフロー名 `Build on Windows` ではなく **ジョブ名**)。 +実測で確認すること。**名前を誤ると、通らないチェックを待ち続けてマージできなくなる。** + +```bash +gh api repos/OpenTouryoProject/OpenTouryo/actions/runs/<run_id>/jobs --jq '.jobs[].name' +``` + +**`PATCH .../required_status_checks` は使えない**(未設定の状態では 404)。 +**ブランチ保護全体を `PUT` する**ため、**既存の設定を取得してから同じ値を明示的に渡す。** +渡し漏れた項目は既定値に戻ってしまう。 + +```bash +# 1. 現在の設定を確認する +gh api repos/OpenTouryoProject/OpenTouryo/branches/master/protection + +# 2. 既存値を保ったまま required_status_checks を足して PUT する +cat > prot.json <<'JSON' +{ + "required_status_checks": { "strict": false, "contexts": ["build"] }, + "enforce_admins": false, + "required_pull_request_reviews": { + "dismiss_stale_reviews": false, + "require_code_owner_reviews": false, + "require_last_push_approval": false, + "required_approving_review_count": 1 + }, + "restrictions": null, + "required_linear_history": false, + "allow_force_pushes": false, + "allow_deletions": false, + "block_creations": false, + "required_conversation_resolution": false, + "lock_branch": false, + "allow_fork_syncing": false +} +JSON + +gh api -X PUT repos/OpenTouryoProject/OpenTouryo/branches/master/protection --input prot.json + +# 3. 全項目を照合する(渡し漏れが無いか) +gh api repos/OpenTouryoProject/OpenTouryo/branches/master/protection +``` + +`strict`(Require branches to be up to date)は **`false`**。 +`true` にすると、`master` が動くたびに PR の再更新と CI 再実行が要る。 +リリース時の 1 回きりの操作なので不要。 + +> **詰まったら。** `enforce_admins` は `false` なので管理者権限で回避できる。 +> 解除は同じ `PUT` で `required_status_checks` を `null` にする。 + +**設定した直後に、検証用の PR で動作を確かめた**(`#539`、マージせずクローズ)。 + +``` +build pass 13m57s ← pull_request:[master] で発火し、成功 +CodeQL pass +mergeStateStatus BLOCKED +reviewDecision REVIEW_REQUIRED ← 止まっているのはレビュー未承認だけ +``` + +**チェック名が違っていれば、`build` が「Required だが未実行」として別の形で止まる。** +`BLOCKED` の理由がレビューだけであることを確認すれば、名前が一致していると分かる。 + +**CI は約 14 分**かかる。ローカルの実測(ビルド 9 分 + テスト + 疎通)より長いのは、 +DB の導入と初期化が入るため。**リリース時はこれを見込むこと。** + ### 有効化後の運用 **新しく push する内容だけ**が検査される。既存の履歴は対象外。 @@ -440,15 +611,11 @@ grep -A3 '^permissions:' .github/workflows/*.yml --- -## 7. 未着手の提案 +## 8. 未着手の提案 | | 内容 | |---|---| -| **`master` の CI 必須化** | `build-windows.yml` に `on: pull_request: branches: [master]` を足し、`master` のブランチ保護で必須チェックにする。**リリースの関所**として働く(下記) | | `allowed_actions` を絞る / SHA 固定 | 現在 `all` / 強制なし。サプライ チェーン対策。**運用が重くなる**ので、必要性とあわせて判断する | -| `delete_branch_on_merge` | マージ済みブランチを自動削除する | -| `SECURITY.md` | Private vulnerability reporting は有効にしたが、文書は未整備 | -| Issue / PR テンプレート | 「調査 → 実装 → 検証」の型が定まっているのでテンプレート化できる | | `.github/dependabot.yml` | #517 の決着後 | > **`develop` を必須チェックの対象にはしない。** diff --git a/README.md b/README.md index aa56059e6..84b531b6b 100644 --- a/README.md +++ b/README.md @@ -36,3 +36,12 @@ For the setup and build steps, refer to [/root/README.md](root/README.md). ### [AGENTS.md](AGENTS.md) This is the **entry point** when working on this repository with a coding agent. It summarizes the policies to follow and the links to the documents to refer to. + +### [CONTRIBUTING.md](CONTRIBUTING.md) +Coding rules and conventions, the branching model, and the granularity of pull requests. +**The same rules apply to people and to coding agents.** + +### [SECURITY.md](SECURITY.md) +How to report a vulnerability, which versions are supported, and what is out of scope. +**Do not open a public issue for a security problem** — use +[private vulnerability reporting](https://github.com/OpenTouryoProject/OpenTouryo/security/advisories/new). diff --git a/Readme.ja.md b/Readme.ja.md index 8c4c44fa9..c5fff4a81 100644 --- a/Readme.ja.md +++ b/Readme.ja.md @@ -36,3 +36,12 @@ Open 棟梁のドキュメントは、[OpenTouryoDocuments リポジトリ](http ### [AGENTS.md](AGENTS.md) コーディング エージェントで本リポジトリを扱う場合の**入口**です。 守るべきポリシーと、参照すべき文書への導線をまとめています。 + +### [Contributing.ja.md](Contributing.ja.md) +コーディング規約、ブランチ運用、プルリクエストの粒度をまとめています。 +**人もコーディング エージェントも、同じ規約に従います。** + +### [Security.ja.md](Security.ja.md) +脆弱性の報告方法、対象バージョン、対象範囲をまとめています。 +**セキュリティに関する問題を、公開の Issue に書かないでください。** +[Private vulnerability reporting](https://github.com/OpenTouryoProject/OpenTouryo/security/advisories/new) を使ってください。 diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 000000000..ae0f63e3c --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,76 @@ +# Security Policy + +Click [here](Security.ja.md) for the Japanese version of this file. + +## Supported Versions + +Security fixes are applied to the latest release line only. + +| Version | Supported | +|---|---| +| 3.0.x | :white_check_mark: | +| 2.x | :x: | + +Prerelease packages (`-preview*` / `-alpha*`) are for evaluation and are not supported. + +## Reporting a Vulnerability + +**Please do not open a public issue for a security problem.** + +Use **[Private vulnerability reporting](https://github.com/OpenTouryoProject/OpenTouryo/security/advisories/new)**. +The report stays private until a fix is published, and the discussion happens in the same place. + +Please include: + +- Which assembly and version (for example, `OpenTouryo.Public.Security` 3.0.0) +- Which target framework (`net48` or `net10.0`) — **the two are separate implementations + in several places**, so a problem may exist in only one of them +- Steps to reproduce, or the code path you believe is affected +- What an attacker gains + +We are a small team. We will acknowledge the report and tell you what we intend to do, +but we cannot promise a fixed turnaround time. + +## Scope + +This repository contains both the framework and the samples that show how to use it. + +| Path | Scope | +|---|---| +| `root/programs/CS/Frameworks/Infrastructure/` | **In scope.** This is what ships as NuGet packages | +| `root/programs/CS/Frameworks/Tools/` | **In scope** | +| `root/programs/CS/Samples/`, `Samples4NetCore/`, `root/programs/VB/` | Samples. **Reports are welcome**, but they are teaching material and are not shipped | +| `root/files/resource/X509/` | **Out of scope.** Self-signed certificates and private keys **for tests only** | + +## Already known and accepted + +**Static analysis (CodeQL) runs on this repository, and its findings have been triaged.** +Before reporting a scanner result, please check +**[#536](https://github.com/OpenTouryoProject/OpenTouryo/issues/536)** — it records what was +fixed, what was dismissed, and why. + +The following are known and deliberate: + +- **`CipherMode_ECB`** is marked `[Obsolete]`. It is one of five cipher modes the caller can + choose, and it is **not the default** — when no mode is given, .NET's default (CBC) is used. + It is kept for backward compatibility +- **`BinarySerialize`** (`BinaryFormatter`) exists **for `net48` only**. It is excluded from + the `net10.0` build (`<Compile Remove>` in `Public_netcore100.csproj`) +- **Sample `Web.config` files use `requireSSL="false"`**, because the samples are meant to be + run over HTTP. The production setting is provided next to it, commented out, with a note to + enable it + +Reports that show a **concrete exploit** for any of the above are still welcome. + +## Security Practices in This Repository + +| | | +|---|---| +| Secret scanning + Push protection | Enabled | +| Code scanning (CodeQL) | Enabled. `csharp`, `javascript-typescript`, `actions` | +| Dependabot alerts / security updates | Enabled | +| Private vulnerability reporting | Enabled | +| Branch protection (`master`) | Review required + CI must pass | + +The settings themselves live on GitHub and are not visible from the files in this repository, +so they are written down in [`GitHubUsage.md`](GitHubUsage.md). diff --git a/Security.ja.md b/Security.ja.md new file mode 100644 index 000000000..5256d9c79 --- /dev/null +++ b/Security.ja.md @@ -0,0 +1,75 @@ +# セキュリティ ポリシー + +英語版は [SECURITY.md](SECURITY.md) を参照。 + +## 対象バージョン + +**セキュリティ修正は、最新のリリース系統にのみ適用する。** + +| バージョン | 対象 | +|---|---| +| 3.0.x | :white_check_mark: | +| 2.x | :x: | + +プレリリース版(`-preview*` / `-alpha*`)は評価用であり、対象外。 + +## 脆弱性の報告 + +**セキュリティに関する問題を、公開の Issue に書かないでください。** + +**[Private vulnerability reporting](https://github.com/OpenTouryoProject/OpenTouryo/security/advisories/new)** +を使ってください。修正が公開されるまで非公開のまま扱われ、やり取りも同じ場所で行えます。 + +報告には次を含めてください。 + +- **どのアセンブリの、どのバージョンか**(例: `OpenTouryo.Public.Security` 3.0.0) +- **どのターゲット フレームワークか**(`net48` / `net10.0`)。 + **両者は複数の箇所で別実装**であり、**片方にしか存在しない問題**があり得る +- 再現手順、または問題があると考えるコード パス +- 攻撃者が何を得られるか + +少人数で開発しているため、**受領と対応方針は連絡しますが、期限の確約はできません。** + +## 対象範囲 + +本リポジトリには、フレームワーク本体と、その使い方を示すサンプルの両方が含まれる。 + +| パス | 範囲 | +|---|---| +| `root/programs/CS/Frameworks/Infrastructure/` | **対象。** NuGet パッケージとして配布しているもの | +| `root/programs/CS/Frameworks/Tools/` | **対象** | +| `root/programs/CS/Samples/`、`Samples4NetCore/`、`root/programs/VB/` | サンプル。**報告は歓迎する**が、教材であり配布物ではない | +| `root/files/resource/X509/` | **対象外。** **テスト専用**の自己署名証明書と秘密鍵 | + +## 既知であり、意図的なもの + +**本リポジトリでは静的解析(CodeQL)を実施し、検出結果をトリアージ済みである。** +スキャナの結果を報告する前に、 +**[#536](https://github.com/OpenTouryoProject/OpenTouryo/issues/536)** を確認してください。 +**何を修正し、何を棄却し、その理由は何か**を記録している。 + +次は既知であり、意図的なものである。 + +- **`CipherMode_ECB`** には `[Obsolete]` を付与済み。利用者が選べる 5 つの暗号モードの 1 つで、 + **既定ではない**(モードを指定しなければ .NET の既定である CBC が使われる)。 + **下位互換のために残している** +- **`BinarySerialize`**(`BinaryFormatter`)は **`net48` のみ**に存在する。 + `net10.0` のビルドからは除外している(`Public_netcore100.csproj` の `<Compile Remove>`) +- **サンプルの `Web.config` が `requireSSL="false"`** なのは、 + **サンプルを HTTP で動かす前提**のため。本番用の設定は、その隣にコメントアウトで併記し、 + 有効にするよう注記してある + +**上記について具体的な攻撃が成立することを示す報告**は、引き続き歓迎する。 + +## 本リポジトリでの取り組み + +| | | +|---|---| +| Secret scanning + Push protection | 有効 | +| Code scanning(CodeQL) | 有効。`csharp` / `javascript-typescript` / `actions` | +| Dependabot alerts / security updates | 有効 | +| Private vulnerability reporting | 有効 | +| ブランチ保護(`master`) | レビュー必須 + CI の成功が必須 | + +設定の実体は GitHub 側にあり、**リポジトリのファイルからは見えない**ため、 +[`GitHubUsage.md`](GitHubUsage.md) に記録している。 diff --git a/root/programs/CHEATSHEET.md b/root/programs/CHEATSHEET.md index 1d7f0d367..7940e361c 100644 --- a/root/programs/CHEATSHEET.md +++ b/root/programs/CHEATSHEET.md @@ -42,7 +42,8 @@ cd root\programs **一次情報は [`RELEASE.md`](RELEASE.md) と [`CS/NuGet/README.md`](CS/NuGet/README.md)。** ``` -1. develop → master へマージ(--no-ff)し、タグをプッシュ +1. develop → master へ PR を出し、マージ(--no-ff)してタグをプッシュ + master は PR 経由のみ。レビュー 1 名 + CI(build、約 14 分)が要る 2. .\0_SetVersion.ps1 -Version 3.3.0 3. コミット & push ← Source Link はこのコミットに固定される 4. CS\0_Release4Nuget.bat ← 版はアセンブリに焼き込まれる @@ -188,5 +189,6 @@ powershell.exe -NoProfile -Command "Set-Location 'root\programs'; .\3_SmokeTest. - **GitHub への投稿は、文面を提示して承認を得てから。** `gh` で行い、`--body-file` を使う。 アカウントは `OsscJpDevInfra`(`gh auth status` で確認) - **Issue のクローズ・ラベル・アサイン、PR の作成やマージは人が行う** +- **PR のレビューは `--comment` だけ。** `--approve` / `--request-changes` は人のみ - **NuGet への push は人のみ**(外部公開で取り消しが困難) - 前提となるサービスや DB の状態が足りないときは、**勝手に変えず対処方法とともに報告する** diff --git a/root/programs/CS/NuGet/README.md b/root/programs/CS/NuGet/README.md index 4e3c7f611..984115e2f 100644 --- a/root/programs/CS/NuGet/README.md +++ b/root/programs/CS/NuGet/README.md @@ -546,6 +546,14 @@ https://raw.githubusercontent.com/OpenTouryoProject/OpenTouryo/<SHA>/<パ **したがって、詰めたコミットは `--no-ff` で develop → master へ流して残す。** master は履歴を書き換えないため、これが最も確実である。 +> **上の 2 つ(squash / rebase)は、GitHub 側で選べないようにしてある。** +> リポジトリ設定で `allow_squash_merge` / `allow_rebase_merge` を無効にしたため、 +> **PR のマージ ボタンからは「通常のマージ」しか選べない** +> ([`GitHubUsage.md`](../../../../GitHubUsage.md) 2 節)。 +> +> **残る 3 つは依然として手作業で起こせる。** +> force-push と、ブランチの削除には気を付けること。 + ### 「先頭コミット」ではない 守るべきは**詰めた時点の HEAD** であり、そのブランチの先端であり続ける必要はない。 diff --git a/root/programs/RELEASE.md b/root/programs/RELEASE.md index 3de3df9f4..1e9c55960 100644 --- a/root/programs/RELEASE.md +++ b/root/programs/RELEASE.md @@ -304,6 +304,9 @@ cd root\programs … パッケージは**詰めた時のコミットに永久に固定される**。 同じバージョンは一度しか公開できないため、develop 段階で出すなら **プレリリース版**(`3.3.0-alpha1` など)にする(`README.md` 1 節(0)・7 節) + … **`master` は PR 経由でしか入らない。** ブランチ保護で + **レビュー 1 名 + CI(`build`)の成功**が必須。**CI は約 14 分かかる** + (ローカルの検証 3 本に加え、CI 側は DB の導入と初期化が入るため) - [ ] **そのコミットを push 済みである** … 未 push だと Source Link が 404 になる。**公開後には直せない** - [ ] `CS\0_Release4Nuget.bat` を実行した