<!--

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>Create Server Admin</h2>
  <fieldset>
    <p class="help">
      Before a server admin is configured, all clients have admin privileges.
      This is fine when HTTP access is restricted 
      to trusted users. <strong>If end-users will be accessing this CouchDB, you must
      create an admin account to prevent accidental (or malicious) data loss.</strong>
    </p>
    <p class="help">Server admins can create and destroy databases, install 
      and update _design documents, run the test suite, and edit all aspects of CouchDB 
      configuration.
    </p>
    <table summary=""><tbody><tr>
      <th><label>Username:</label></th>
      <td><input type="text" name="name" size="24"></td>
    </tr><tr>
      <th><label>Password:</label></th>
      <td><input type="password" name="password" size="24"></td>
    </tr>
    </tbody></table>
    <p class="help">Non-admin users have read and write access to all databases, which
      are controlled by validation functions. CouchDB can be configured to block all
      access to anonymous users.
    </p>
    <h3>About Authentication</h3>     
    <p class="help">
      Couch has a pluggable authentication mechanism. Futon exposes a user friendly cookie-auth which handles login and logout, so app developers can relax. Just use <tt>$.couch.session()</tt> to load the current user's info.
    </p>

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