# This file is a work of a US government employee and as such is in the Public domain.
# Simson L. Garfinkel, March 12, 2012

Upload protocol.

Goals:
1. Anybody who is approved can upload. 
2. Omipodent.
3. Stateless server.
4. Automatic integration into the library.


Database change:
 * Add nonce to drives table.
 * Add a new table for uploaders
       uploaders

uploaders:
 * ID - my ID (8 digits hex)
 * Country - my ISO Country Code
 * Sequence - Sequence number for this uploader

RPC command ping:
 * args: a dictionary with
   * uid:uploaderID
 * Returns OK if this user is authorized
 * Raises exception if user is not.

RPC check command:
 * args: a dictionary with
   * image_gid_hex:image_gid
   * uid:uploaderID
   * seg_name: segment name being uploaded
 * Reports if the segment has been uploaded or not.

RPC upload command:
 * args: check dictionary with additions:
   * seg_arg: argument 
   * seg_len: length
   * seg_md5: md5 of data
   * seg_data: the data
 * Calls check. If we can upload, does upload

RPC command: seglist
 * args: dictionary with 
 * runs ping

Upload returns:
 * OK
 * HAVE (already have)
 * FAIL
 * Permission Denied (GID already exists with different random number)

Algorithm on upload:
 * Check uploader id; if it is not valid, return
 * Get country & sequence numbers from ID
 *
 * If image_gid is not in the database
   - add it to the database
   - add the nonce to the database
   - allocate a new AFF filename given the appropriate country code.

 * If image_gid is in the database
   - If nonce does not matche the nonce in the database, generate an error

 * If command is seglist:
  - return a list of the segments in the file
 
 * If command is check:
  - return TRUE if the segent is in the file, otherwise return FALSE

 * If the command is upload:
  - add the segment to the file

 * server maps image_gid to a filename. Server remembers random number.
 * If random number is different, no more upload is provided.

