README.sharedfolders.txt
上传用户:s81996212
上传日期:2007-01-04
资源大小:722k
文件大小:13k
源码类别:

WEB邮件程序

开发平台:

C/C++

  1.                                 Shared folders
  2.                                        
  3.    This document describes how shared folders are implemented by
  4.    Courier-IMAP, and SqWebMail, within the framework of the Maildir mail
  5.    store format. Having the ability to implement shared folders was badly
  6.    needed for some time. And finally, there's a way to do it!
  7.    
  8. Terminology
  9.      * Sharable Maildir - a maildir that contains folders that can be
  10.        shared.
  11.      * Sharable folder - one or more folders in a sharable Maildir that
  12.        can be shared.
  13.        
  14. Technical Overview
  15.      * They are a somewhat logical extension of the base Maildir format.
  16.      * Older versions of Courier-IMAP and SqWebMail will completely
  17.        ignore shared folders.
  18.      * Messages in shared folders do not count towards any individual
  19.        maildir quotas (see README.maildirquota.html).
  20.      * Shared folders are implemented as additional, Maildir-based
  21.        folders. The messages will be soft links to the messages in the
  22.        sharable folder. Soft links will be used instead of hard links in
  23.        order to be able to have a folder containing large messages, and
  24.        then be able to reclaim space immediately when the messages are
  25.        purged, instead of waiting for everyone to sync up and delete
  26.        their hard link. The flip side is that you can expect the usual
  27.        sorts of errors and increased confusion if someone attempts to
  28.        read a message that has just been removed, but their client
  29.        (Courier-IMAP or SqWebMail) doesn't know that yet. That's
  30.        unavoidable. You'll probably have to set some kind of a policy in
  31.        order to keep the expected insanity to a minimum.
  32.      * Sharable folders are subscribed to by creating a separate
  33.        maildir-type directory within the main Maildir. It's created in a
  34.        separate subdirectory that is ignored by other Maildir clients.
  35.      * The new directory will contains soft links to the messages in the
  36.        sharable folder. "Synchronization" code will be used to
  37.        synchronize the contents of the sharable folder, and the copy of
  38.        it in the regular Maildir. Once links to the messages are created,
  39.        they can be manipulated like regular messages in a Maildir. This
  40.        procedure will be transparently performed by Courier-IMAP or
  41.        SqWebMail behind the scenes.
  42.      * Access to shared folders is controlled by a combination of an
  43.        explicit configuration, plus regular filesystem permissions. If
  44.        account owners have shell access to the server, they can create
  45.        shared folders, and link their mailbox to other accounts' shared
  46.        folders. Then, the actual access is controlled by regular
  47.        filesystem permissions. The owner of the shared folder will use
  48.        the regular filesystem permission to give read and/or write access
  49.        to either everyone else, or everyone else who uses the same system
  50.        group ID. Read access allows people to read messages from a shared
  51.        folder. Write access allows people to add and delete messages in
  52.        the shared. The owner of the shared folder can remove any message,
  53.        everyone else will be able to remove only their own messages.
  54.        
  55. Functional Overview
  56.    Generally speaking, shared folders are configured using a
  57.    feature-enhanced maildirmake command as follows:
  58.      * make install will install a maildirmake command that has a bunch
  59.        of funny options. The modified maildirmake command is installed
  60.        into Courier-IMAP's or SqWebMail's installation directory.
  61.      * Somebody, maybe you, will use some of these options to create a
  62.        maildir with modified permissions. The same somebody will run
  63.        maildirmake again, with a few other options, to create folders in
  64.        that maildir, also with modified permissions. Those permissions
  65.        allows global read (and optionally write) access to those folders.
  66.      * Do NOT use this maildir as the primary mailbox, INBOX, for an
  67.        account. Instead, you must create this maildir separately, perhaps
  68.        as $HOME/Maildir-shared, then set it up as one of your sharable
  69.        maildirs (see below), and access it in shared mode. Because you
  70.        own it, you have unlimited read/write access to it. The previously
  71.        mentioned options will select whether or not access permissions
  72.        are given to everyone else, and they do not apply to you.
  73.      * Everyone else will run maildirmake with even more funny options.
  74.        Those options install a link from their own maildir to a maildir
  75.        that contains sharable folders. A given maildir may contain links
  76.        to more than one sharable maildir. As long as their system
  77.        user/group permissions allow them to access messages, they can
  78.        SUBSCRIBE via their IMAP client to the folder, or use the
  79.        SUBSCRIBE function in SqWebmail.
  80.      * If people do not have shell access, the system administrator will
  81.        have to run maildirmake on their behalf, in order to create the
  82.        links to the sharable maildirs.
  83.      * People with write access can add messages to a sharable folder.
  84.        Messages from a sharable folder can be removed only by the owner
  85.        of the shared folder, or by the owner of each message.
  86.      * This sharable maildir implementation cannot use maildir
  87.        soft-quotas. There cannot be a soft-quota installed in a sharable
  88.        maildir. If you need quota support, you will have to use
  89.        filesystem-based quotas. There are some sticky issues with
  90.        updating quotas on a sharable maildir.
  91.        
  92.    Also, note that anyone, not just the superuser, can create a sharable
  93.    maildir in their account, and invite anyone else to access it, as long
  94.    as their system user/group permissions allow them access.
  95.    
  96.    To summarize:
  97.      * Use the -S option to maildirmake to create a maildir that can
  98.        contain sharable folders.
  99.      * Use the -s and -f options to maildirmake to create sharable
  100.        folders. The same sharable maildir may contain multiple sharable
  101.        folders with different access permissions, as selected by the -s
  102.        option.
  103.      * Use the --add option to install a link from a regular maildir to a
  104.        sharable maildir. Afterwards, IMAP clients will be able to
  105.        subscribe to folders in the sharable maildir.
  106.      * Use the --del option to remove a link.
  107.        
  108.    For more information on these options, see the maildirmake manual page
  109.    that will be installed.
  110.    
  111. More on additional options for the maildirmake command
  112.    The '-S' option to maildirmake to create a maildir that will contain
  113.    shared folders. The -S option gives group and world read permissions
  114.    on the maildir itself (where group/world permissions are normally not
  115.    set for a regular maildir). This allows access to any folders in the
  116.    shared maildir, and that's why you should not use this Maildir
  117.    directly as your primary mailbox.
  118.    
  119.    The "new" and "cur" subdirectories will not be used or shared,
  120.    although they will still be created. Both SqWebMail and Courier-IMAP
  121.    create their auxiliary files in the main Maildir with the group and
  122.    world permissions turned off, so this maildir can, theoretically,
  123.    still be used as the primary INBOX, but I don't recommend that.
  124.    
  125.    The -S option is not limited to the system administrator. In fact,
  126.    anyone can use the -S option, to create shared maildirs that they
  127.    maintain.
  128.    
  129.    Shared folders are created like any other folder, using the -f option
  130.    to maildirmake. However, that normally creates a folder that is not
  131.    sharable, because it will not have any group or world permissions.
  132.    Therefore, maildirmake will take the following options to create a
  133.    sharable folder:
  134.      * -s read will create a "moderated" folder. The folder will have
  135.        group and world read permissions, letting anyone read messages,
  136.        but only the owner of the sharable Maildir can add messages to the
  137.        sharable folder.
  138.      * -s write will create an "unmoderated" folder. The folder will have
  139.        group and world read/write permissions, letting anyone read and
  140.        add messages to the folder. The folder will be created with the
  141.        sticky bit set, like the /tmp directory, preventing people from
  142.        removing someone else's messages.
  143.      * -s read,group/-s write,group append a comma and the word "group"
  144.        to modify the semantics of moderated and unmoderated folders only
  145.        on the group level, not the group and world level, as far as
  146.        permissions go. This restricts sharing the folder only to members
  147.        of the same system group as the owner of the sharable maildir.
  148.        
  149.    It's worth noting that it is perfectly permissible for folders in the
  150.    same sharable maildir to have different access levels.
  151.    
  152.    Also, this is driven entirely by filesystem permissions, so
  153.    theoretically it's possible to create a folder that has write
  154.    permissions for the group, and read permissions for everyone else.
  155.    However, I'm too lazy to actually do it. Feel free to patch
  156.    maildirmake to add this functionality, then send me the patch.
  157.    
  158. Accessing shared folders
  159.    The rest of the document consists of technical implementation notes.
  160.    
  161.    Accessing a collection of shared folders is implemented by a new file
  162.    that is installed in the primary maildir (usually $HOME/Maildir), and
  163.    a new subdirectory hierarchy underneath the primary maildir, which are
  164.    hereby declared.
  165.    
  166.   shared-maildirs
  167.   
  168.    This file must be created by the administrator or by the maildir
  169.    owner, manually. This file lists all available sharable maildirs that
  170.    this maildir can access in shared mode (confused yet?). This file
  171.    contains one or more lines of the following format:
  172.    
  173.    name /path/to/shared/maildir
  174.    
  175.    "name" is an arbitrary name that's given to this collection of shared
  176.    folders. The name may not contain slashes, periods, or spaces. This is
  177.    followed by a pathname to the maildir containing shared folders. Note
  178.    that this is NOT the sharable folder itself, but the maildir that
  179.    contains one or more sharable folders. The maildir client will be able
  180.    to selectively subscribe to any sharable folder in that maildir.
  181.    
  182.   shared-folders
  183.   
  184.    This subdirectory forms the root of all the shared folders that are
  185.    subscribed to. Let's say that shared-maildirs has the following
  186.    contents:
  187.    
  188.    firmwide /home/bigcheese/Maildir-shared
  189.    tech /home/gearhead/Maildir-shared
  190.    
  191.    Subscribing to folders 'golf' and 'boat' in bigcheese's shared
  192.    Maildir, and to the folder 'maintenance' in gearhead's shared Maildir
  193.    involves creating the following subdirectories:
  194.    shared-folders/firmwide/.golf, shared-folders/firmwide/.boat, and
  195.    shared-folders/tech/.maintenance.
  196.    
  197.   shared
  198.   
  199.    This is a soft link that's automatically created in
  200.    shared-folder/name. It is a soft link that points to the sharable
  201.    maildir, which contains the sharable folders.
  202.    
  203. Subscribing to a shared folder
  204.      * Read shared-maildirs.
  205.      * Read the shared-folders hierarchy to determine which folders are
  206.        already subscribed to.
  207.      * Read the folders in each maildir listed in shared-folders, and
  208.        ignore the ones that are already subscribed to. Make sure to
  209.        stat() each folder to make sure that you can read it.
  210.      * If necessary, create shared-folders/name, and create the
  211.        shared-folders/name/shared soft link.
  212.      * Create shared-folders/name/.foldername, then create the standard
  213.        tmp, new, and cur subdirectories. All the directories are created
  214.        without any group or world permissions.
  215.        
  216. Unsubscribing
  217.      * Delete everything in shared-folders/name/.foldername.
  218.      * If this is there are no more subscribed folders in this sharable
  219.        maildir, delete shared-folders/name for good measure as well.
  220.        
  221. Opening a shared folder
  222.    The process of "opening" a shared folder involves basically "syncing"
  223.    the contents of shared-folder/name/.foldername with the contents of
  224.    the sharable folder in the original sharable maildir.
  225.      * Do the usual processing on the tmp subdirectory.
  226.      * Read the contents of shared-folder/name/shared/.foldername/new. If
  227.        you find anything in there, rename it to .../cur, ignoring any
  228.        errors from the rename. The sharable maildir owner can arrange for
  229.        mail to be delivered directly to this folder, and the first one to
  230.        open it will put the message into cur.
  231.      * Read the contents of shared-folder/name/shared/.foldername/cur.
  232.        Call this directory "A", for short.
  233.      * Read the contents of shared-folder/name/shared/.foldername/cur.
  234.        Call this directory "B", for short.
  235.      * stat() A and B to see if they live on different devices.
  236.      * Remove all messages in B that do not exist in A. You want to
  237.        compare the filenames up to the : character.
  238.      * Create soft links from messages that exist in A and do not exist
  239.        in B. The name in B should not have any flags after the :, so it
  240.        shows up as a new message.
  241.      * You can now do whatever you normally do with a maildir. Note that
  242.        new is completely ignored, though. Moving messages IN and OUT of
  243.        the shared folder involves copying the message as if it were a new
  244.        message. Copying the message INTO the shared folder means copying
  245.        the message into the underlying sharable folder's tmp/cur
  246.        directory, and it will show up after the next sync.