| Title: Apache HTTP Server Project Guidelines and Voting Rules | |
| license: https://www.apache.org/licenses/LICENSE-2.0 | |
| # Guidelines | |
| This document defines the guidelines for the [Apache HTTP Server | |
| Project](/). It includes definitions of how conflict | |
| is resolved by voting, who is able to vote, and the procedures to follow | |
| for proposing and making changes to the Apache products. | |
| The objective here is to avoid unnecessary conflict over changes and | |
| continue to produce a quality system in a timely manner. Not all conflict | |
| can be avoided, but at least we can agree on the procedures for conflict to | |
| be resolved. | |
| # People, Places, and Things | |
| ### Apache HTTP Server Project Management Committee | |
| The group of volunteers who are responsible for managing the Apache | |
| HTTP Server Project. This includes deciding what is distributed as | |
| products of the Apache HTTP Server Project, maintaining the Project's | |
| shared resources, speaking on behalf of the Project, resolving license | |
| disputes regarding Apache products, nominating new PMC members or | |
| committers, and establishing these guidelines. | |
| Membership in the Apache PMC is by invitation only and must be approved by | |
| consensus of the active Apache PMC members. A PMC member is considered | |
| inactive by their own declaration or by not contributing in any form to the | |
| project for over six months. An inactive member can become active again by | |
| reversing whichever condition made them inactive ( *i.e.* , by reversing | |
| their earlier declaration or by once again contributing toward the | |
| project's work). Membership can be revoked by a unanimous vote of all the | |
| active PMC members other than the member in question. | |
| ### Apache HTTP Server Committers | |
| The group of volunteers who are responsible for the technical aspects | |
| of the Apache HTTP Server Project. This group has write access to the | |
| appropriate source repositories and these volunteers may cast binding | |
| votes on any technical discussion. | |
| Membership as a Committer is by invitation only and must be approved by | |
| consensus of the active Apache PMC members. A Committer is considered | |
| inactive by their own declaration or by not contributing in any form to the | |
| project for over six months. An inactive member can become active again by | |
| reversing whichever condition made them inactive ( *i.e.* , by reversing | |
| their earlier declaration or by once again contributing toward the | |
| project's work). Membership can be revoked by a unanimous vote of all the | |
| active PMC members (except the member in question if they are a PMC | |
| member). | |
| ### Apache Developers | |
| All of the volunteers who are contributing time, code, documentation, | |
| or resources to the Apache Project. A developer that makes sustained, | |
| welcome contributions to the project for over six months is usually | |
| invited to become a Committer, though the exact timing of such | |
| invitations depends on many factors. | |
| ### Mailing list | |
| The Apache developers' primary mailing list for discussion of issues | |
| and changes related to the project ( *dev@httpd.apache.org* ). | |
| Subscription to the list is open, but only subscribers can post | |
| directly to the list. | |
| ### Private list | |
| The Apache PMC's private mailing list for discussion of issues that | |
| are inappropriate for public discussion, such as legal, personal, or | |
| security issues prior to a published fix. Subscription to the list is | |
| only open (actually: mandatory) to Apache httpd's Project Management | |
| Committee. | |
| ### Subversion | |
| All of the Apache products are maintained in shared information | |
| repositories using [Subversion on](devnotes.html). Only some of the | |
| Apache developers have write access to these repositories; everyone | |
| has [read access](https://svn.apache.org/repos/asf/httpd/httpd). | |
| # STATUS # | |
| Each of the Apache Project's active source code repositories contain a file | |
| called "STATUS" which is used to keep track of the agenda and plans for | |
| work within that repository. The STATUS file includes information about | |
| release plans, a summary of code changes committed since the last release, | |
| a list of proposed changes that are under discussion, brief notes about | |
| items that individual developers are working on or want discussion about, | |
| and anything else that might be useful to help the group track progress. | |
| The active STATUS files are automatically posted to the mailing list each | |
| week. | |
| Many issues will be encountered by the project, each resulting in zero or | |
| more proposed action items. Issues should be raised on the mailing list as | |
| soon as they are identified. Action items **must** be raised on the mailing | |
| list and added to the relevant STATUS file. All action items may be voted | |
| on, but not all of them will require a formal vote. | |
| # Voting | |
| Any of the Apache Developers may vote on any issue or action item. However, | |
| the only binding votes are those cast by active members of the Apache HTTP | |
| Server; if the vote is about a change to source code or documentation, the | |
| primary author of what is being changed may also cast a binding vote on | |
| that issue. All other votes are non-binding. All developers are encouraged | |
| to participate in decisions, but the decision itself is made by those who | |
| have been long-time contributors to the project. In other words, the Apache | |
| httpd Project is a minimum-threshold meritocracy. | |
| The act of voting carries certain obligations -- voting members are not | |
| only stating their opinion, they are agreeing to help do the work of the | |
| Apache Project. Since we are all volunteers, members often become inactive | |
| for periods of time in order to take care of their "real jobs" or devote | |
| more time to other projects. It is therefore unlikely that the entire group | |
| membership will vote on every issue. To account for this, all voting | |
| decisions are based on a minimum quorum. | |
| Each vote can be made in one of three flavors: | |
| - **+1** : Yes, agree, or the action should be performed. On some issues, this | |
| vote is only binding if the voter has tested the action on their own system(s). | |
| - **±0** : Abstain, no opinion, or I am happy to let the other group members | |
| decide this issue. An abstention may have detrimental effects if too many people abstain. | |
| - **-1** : No. On issues where consensus is required, this vote counts as a **veto**. | |
| All vetos must include an explanation of why the veto is | |
| appropriate. A veto with no explanation is void. No veto can be | |
| overruled. If you disagree with the veto, you should lobby the person | |
| who cast the veto. Voters intending to veto an action item should make | |
| their opinions known to the group immediately, so that the problem can | |
| be remedied as early as possible. | |
| An action item requiring *consensus approval* must receive at least **3 | |
| binding +1** votes and **no vetos**. An action item requiring *majority | |
| approval* must receive at least **3 binding +1** votes and more **+1** | |
| votes than **-1** votes ( *i.e.* , a majority with a minimum quorum of | |
| three positive votes). All other action items are considered to have *lazy | |
| approval* until someone votes **-1** , after which point they are decided | |
| by either consensus or a majority vote, depending upon the type of action | |
| item. | |
| Votes are tallied within the STATUS file, adjacent to the action item under | |
| vote. All votes must be either sent to the mailing list or added directly | |
| to the STATUS file entry for that action item. | |
| # Types of Action Items # | |
| ### Long Term Plans | |
| Long term plans are simply announcements that group members are | |
| working on particular issues related to the Apache software. These are | |
| not voted on, but group members who do not agree with a particular | |
| plan, or think an alternate plan would be better, are obligated to | |
| inform the group of their feelings. In general, it is always better to | |
| hear about alternate plans **prior** to spending time on less adequate solutions. | |
| ### Short Term Plans | |
| Short term plans are announcements that a developer is working on a | |
| particular set of documentation or code files, with the implication | |
| that other developers should avoid them or try to coordinate their | |
| changes. This is a good way to proactively avoid conflict and possible | |
| duplication of work. | |
| ### Release Plan | |
| A release plan is used to keep all the developers aware of when a | |
| release is desired, who will be the release manager, when the | |
| repository will be frozen in order to create the release, and assorted | |
| other trivia to keep us from tripping over ourselves during the final | |
| moments. Lazy majority (at least 3 x +1 and more +1 than -1) decides | |
| each issue in the release plan. | |
| ### Release Testing | |
| After a new release is built, colloquially termed a tarball, it must | |
| be tested before being released to the public. Majority approval is | |
| required before the tarball can be publicly released. | |
| ### Showstoppers | |
| Showstoppers are issues that require a fix be in place before the next | |
| public release. They are listed in the STATUS file in order to focus | |
| special attention on the problem. An issue becomes a showstopper when | |
| it is listed as such in STATUS and remains so by lazy consensus. | |
| ### Product Changes | |
| Changes to the Apache products, including code and documentation, will | |
| appear as action items under several categories corresponding to the change status: | |
| * **Concept/Plan** : an idea or plan for a change. These are usually only listed in STATUS | |
| when the change is substantial, significantly impacts the API, or is | |
| likely to be controversial. Votes are being requested early so as to | |
| uncover conflicts before too much work is done. | |
| * **Proposed patch**: A specific set of changes to the current product in the form of [input | |
| to the patch command](#patch) (a diff output). | |
| * **Committed change** : A one-line summary of a change that has been committed to the | |
| repository since the last public release. All product changes to the currently active repository | |
| are subject to lazy consensus. | |
| All product changes to a prior-branch (old version) repository require consensus before | |
| the change is committed. | |
| * **Backport**: A backport is the application of a change on the Subversion repository | |
| trunk to the a maintenance branch of the project. This is necessary in | |
| cases where an issue exists in multiple versions of the Apache HTTP | |
| Server. A fix for such an issue will typically be developed for the | |
| trunk, which is under active development. | |
| # When to Commit a Change | |
| Ideas must be review-then-commit; patches can be commit-then-review. With a | |
| commit-then-review process, we trust that the developer doing the commit | |
| has a high degree of confidence in the change. Doubtful changes, new | |
| features, and large-scale overhauls need to be discussed before being | |
| committed to a repository. Any change that affects the semantics of | |
| arguments to configurable directives, significantly adds to the runtime | |
| size of the program, or changes the semantics of an existing API function | |
| must receive consensus approval on the mailing list before being committed. | |
| Each developer is responsible for notifying the mailing list and adding an | |
| action item to STATUS when they have an idea for a new feature or major | |
| change to propose for the product. The distributed nature of the Apache | |
| project requires an advance notice of 48 hours in order to properly review | |
| a major change -- consensus approval of either the concept or a specific | |
| patch is required before the change can be committed. Note that a member | |
| might veto the concept (with an adequate explanation), but later rescind | |
| that veto if a specific patch satisfies their objections. No advance notice | |
| is required to commit singular bug fixes. | |
| Related changes should be committed as a group, or very closely together. | |
| Half-completed projects should not be committed unless doing so is | |
| necessary to pass the baton to another developer who has agreed to complete | |
| the project in short order. All code changes must be successfully compiled | |
| on the developer's platform before being committed. | |
| The current source code tree should be capable of complete compilation at | |
| all times. However, it is sometimes impossible for a developer on one | |
| platform to avoid breaking some other platform when a change is committed, | |
| particularly when completing the change requires access to a special | |
| development tool on that other platform. If it is anticipated that a given | |
| change will break some other platform, the committer must indicate that in | |
| the commit log. | |
| The committer is responsible for the quality of any third-party code or | |
| documentation they commit to the repository. All software committed to the | |
| repository must be covered by the Apache LICENSE or contain a copyright and | |
| license that allows redistribution under the same conditions as the Apache | |
| LICENSE. | |
| A committed change must be reversed if it is vetoed by one of the voting | |
| members and the veto conditions cannot be immediately satisfied by the | |
| equivalent of a "bug fix" commit. The veto must be rescinded before the | |
| change can be included in any public release. | |
| # CHANGES file and Subversion logs | |
| ### Changelog | |
| Many code changes should be noted in the CHANGES file, and all should be | |
| documented in Subversion commit messages. Often the text of the Subversion | |
| log and the CHANGES entry are the same, but the distinct requirements | |
| sometimes result in different information. | |
| ### Subversion log | |
| The Subversion commit log message contains any information needed by | |
| - fellow developers or other people researching source code changes/fixes | |
| - end users (at least point out what the implications are for end users; it | |
| doesn't have to be in the most user friendly wording) | |
| If the code change was provided by a non-committer, attribute it using | |
| Submitted-by. If the change was committed verbatim, identify the | |
| committer(s) who reviewed it with Reviewed-by. If the change was committed | |
| with modifications, use the appropriate wording to document that, perhaps | |
| "committed with changes" if the person making the commit made the changes, | |
| or "committed with contributions from xxxx" if others made contributions to | |
| the code committed. | |
| Example log message: | |
| > Check the return code from parsing the content length, to avoid a | |
| > crash if requests contain an invalid content length. | |
| > | |
| > PR: 99999 | |
| > | |
| > Submitted by: Jane Doe <janedoe example.com> | |
| > | |
| > Reviewed by: susiecommitter | |
| Commit messages can be minimal when making routine updates to STATUS, for | |
| example to propose a backport or vote. | |
| ### CHANGES | |
| CHANGES is the subset of the information that end users need to see when | |
| they upgrade from one release to the next: | |
| - what can I now do that I couldn't do before | |
| - what problems that we anticipate a user could have suffered from are now | |
| fixed | |
| - all security fixes included, with CVE number. (If not available at the | |
| time of the commit, add later.) | |
| The usability of CHANGES for end users decreases as information of use to | |
| few individuals, or which doesn't pertain to evaluating the new release, is | |
| added. Specifically: | |
| - Fixes for bugs introduced after the last release don't belong in CHANGES. | |
| - Fixes for bugs that we don't expect anybody noticed don't belong in | |
| CHANGES. (Bend the rule a little for outside contributions, as the | |
| submitter may need to see their name in lights as reward for their efforts, | |
| which typically were undertaken with no guarantee that any committer would | |
| take interest.) | |
| - Documentation fixes, whether for end users or developers, don't belong in | |
| CHANGES. | |
| CHANGES applies to changes even between alpha releases, so backporting a | |
| change from trunk to a stable release does not generally require removing | |
| the change from the CHANGES file in trunk. | |
| The attribution for the change is anyone responsible for the code changes. | |
| ### Formatting | |
| Identify non-committers by name, and their email in obfuscated form if | |
| available. The obfuscation is done by replacing "@" with a space and adding | |
| "<" and ">" around the address. For example, change | |
| `user@example.com` to `<user example.com>`. | |
| Identify committers with their Apache userid, e.g. `xyz` (no domain name | |
| needed). | |
| If the change is related to a bugzilla issue, include the PR number in the | |
| log in the format: | |
| PR 1234 | |
| Security-related changes should start like this: | |
| *) SECURITY: CVE-YYYY-NNNN (cve.mitre.org) | |
| xxxxx | |
| Most changes are inserted at the top of the CHANGES file. However, | |
| security-related changes should always be at the top of the list of changes | |
| for the relevant release, so if there are unreleased security changes at | |
| the top of the file, insert other changes below them. | |
| Example CHANGES entries: | |
| *) SECURITY: CVE-2009-3095 (cve.mitre.org) | |
| mod_proxy_ftp: sanity check authn credentials. | |
| [Stefan Fritsch <sf fritsch.de>, Joe Orton] | |
| *) SECURITY: CVE-2016-1546 (cve.mitre.org) | |
| mod_http2: restricting number of concurrent stream workers per connection if client is slow. | |
| # Committing Security Fixes | |
| Open source projects, ASF or otherwise, have varying procedures for | |
| commits of vulnerability fixes. One important aspect of these procedures | |
| is whether or not fixes to vulnerabilities can be committed to a | |
| repository with commit logs and possibly CHANGES entries which | |
| purposefully obscure the vulnerability and omit any available | |
| vulnerability tracking information. The Apache HTTP Server project has | |
| decided that it is in the best interest of our users that the initial | |
| commit of such code changes to any branch will provide the best | |
| description available at that time as well as any available tracking | |
| information such as CVE number. Committing of the fix will be delayed | |
| until the project determines that all of the information about the issue | |
| can be shared. | |
| In some cases there are very real benefits to sharing code early even if | |
| full information about the issue cannot, including the potential for | |
| broader review, testing, and distribution of the fix. This is outweighed | |
| by the concern that sharing only the code changes allows skilled analysts | |
| to determine the impact and exploit mechanisms but does not allow the | |
| general user community to determine if preventative measures should be | |
| taken. | |
| If a vulnerability is partially disclosed by committing a fix before the | |
| bug is determined to be exploitable, the httpd security team will decide | |
| on a case by case basis when to document the security implications and | |
| tracking number. | |
| # Patch Format | |
| ### Patch | |
| When a specific change to the software is proposed for discussion or voting | |
| on the mailing list, it should be presented in the form of input to the | |
| patch command. When sent to the mailing list, the message should contain a | |
| Subject beginning with `[PATCH]` and a distinctive one-line summary | |
| corresponding to the action item for that patch. Afterwords, the patch | |
| summary in the STATUS file should be updated to point to the Message-ID of | |
| that message. | |
| The patch should be created by using the `diff -u` command from | |
| the original software file(s) to the modified software file(s). E.g. one of the following: | |
| * `diff -u http_main.c.orig http_main.c >> patchfile.txt` | |
| * `svn diff http_main.c >> patchfile.txt` | |
| All patches necessary to address an action item should be concatenated | |
| within a single patch message. If later modification of the patch proves | |
| necessary, the entire new patch should be posted and not just the | |
| difference between two patches. The STATUS file entry should then be | |
| updated to point to the new patch message. | |
| The completed patchfile should produce no errors or prompts when the | |
| following command is issued in the target repository: `patch -s < patchfile` | |
| # Addendum # | |
| Outstanding issues with this document | |
| - We may need a better definition for "lazy consensus". | |
| - We should clarify under what conditions a veto can be rescinded or | |
| overridden. | |
| - Should we set a time limit on vetos of patches? Two weeks? | |