<!--

Licensed under the Apache License, Version 2.0 (the "License"); you may not use
this file except in compliance with the License. You may obtain a copy of the
License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed
under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
CONDITIONS OF ANY KIND, either express or implied. See the License for the
specific language governing permissions and limitations under the License.

-->
<form action="" method="post">
  <h2>Security</h2>
  <fieldset>
    <p class="help">
      Each database contains lists of admins and members.
      Admins and members are each defined by <tt>names</tt> and <tt>roles</tt>, which are lists of strings.
    </p>

    <h3>Admins</h3>
    <p class="help">Database admins can update design documents and edit the admin and member lists.</p>
    <table summary=""><tbody><tr>
      <th><label>Names:</label></th>
      <td><input type="text" name="admin_names" size="40"></td>
    </tr><tr>
      <th><label>Roles:</label></th>
      <td><input type="text" name="admin_roles" size="40"></td>
    </tr>
    </tbody></table>

    <h3>Members</h3>
    <p class="help">Database members can access the database. If no members are defined, the database is public.</p>
    <table summary=""><tbody><tr>
      <th><label>Names:</label></th>
      <td><input type="text" name="member_names" size="40"></td>
    </tr><tr>
      <th><label>Roles:</label></th>
      <td><input type="text" name="member_roles" size="40"></td>
    </tr>
    </tbody></table>

  </fieldset>
  <div class="buttons">
    <button type="submit">Update</button>
    <button type="button" class="cancel">Cancel</button>
  </div>
</form>
