ipacl.h
上传用户:hzhsqp
上传日期:2007-01-06
资源大小:1600k
文件大小:10k
源码类别:

IP电话/视频会议

开发平台:

Visual C++

  1. /*
  2.  * ipacl.h
  3.  *
  4.  * PWLib application header file for rcsd
  5.  *
  6.  * Copyright 1998 Equivalence Pty. Ltd.
  7.  *
  8.  * $Log: ipacl.h,v $
  9.  * Revision 1.4  1999/03/09 08:01:46  robertj
  10.  * Changed comments for doc++ support (more to come).
  11.  *
  12.  * Revision 1.3  1999/02/25 05:05:15  robertj
  13.  * Added missing test for hidden entries not to be written to config file
  14.  *
  15.  * Revision 1.2  1999/02/08 08:05:39  robertj
  16.  * Changed semantics of IP access control list for empty list.
  17.  *
  18.  * Revision 1.1  1999/01/31 00:59:26  robertj
  19.  * Added IP Access Control List class to PTLib Components
  20.  *
  21.  */
  22. #ifndef _IPACL_H
  23. #define _IPACL_H
  24. #include <ptlib/sockets.h>
  25. /** This class is a single IP access control specification.
  26.  */
  27. class PIpAccessControlEntry : public PObject
  28. {
  29.   PCLASSINFO(PIpAccessControlEntry, PObject)
  30.   public:
  31.     /** Create a new IP access control specification. See the Parse() function
  32.        for more details on the format of the <CODE>description</CODE>
  33.        parameter.
  34.      */
  35.     PIpAccessControlEntry(
  36.       PIPSocket::Address addr,
  37.       PIPSocket::Address msk,
  38.       BOOL allow
  39.     );
  40.     PIpAccessControlEntry(
  41.       const PString & description
  42.     );
  43.     /** Set a new IP access control specification. See the Parse() function
  44.        for more details on the format of the <CODE>pstr</CODE> and
  45.        <CODE>cstr</CODE> parameters.
  46.      */
  47.     PIpAccessControlEntry & operator=(
  48.       const PString & pstr
  49.     );
  50.     PIpAccessControlEntry & operator=(
  51.       const char * cstr
  52.     );
  53.     /** Compare the two objects and return their relative rank.
  54.        @return
  55.        <CODE>LessThan</CODE>, <CODE>EqualTo</CODE> or <CODE>GreaterThan</CODE>
  56.        according to the relative rank of the objects.
  57.      */
  58.     virtual Comparison Compare(
  59.       const PObject & obj   // Object to compare against.
  60.     ) const;
  61.     /** Output the contents of the object to the stream. This outputs the same
  62.        format as the AsString() function.
  63.      */
  64.     virtual void PrintOn(
  65.       ostream &strm   // Stream to print the object into.
  66.     ) const;
  67.     /** Input the contents of the object from the stream. This expects the
  68.        next space delimited entry in the stream to be as described in the
  69.        Parse() function.
  70.      */
  71.     virtual void ReadFrom(
  72.       istream &strm   // Stream to read the objects contents from.
  73.     );
  74.     /** Convert the specification to a string, that can be processed by the
  75.        Parse() function.
  76.        @return
  77.        PString representation of the entry.
  78.      */
  79.     PString AsString() const;
  80.     /** Check the internal fields of the specification for validity.
  81.        @return
  82.        TRUE if entry is valid.
  83.      */
  84.     BOOL IsValid();
  85.     /** Parse the description string into this IP access control specification.
  86.        The string may be of several forms:
  87.           n.n.n.n         Simple IP number, this has an implicit mask of
  88.                           255.255.255.255
  89.           n.n.            IP with trailing dot, assumes a mask equal to the
  90.                           number of specified octets eg 10.1. is equivalent
  91.                           to 10.1.0.0/255.255.0.0
  92.           n.n.n.n/b       An IP network using b bits of mask, for example
  93.                           10.1.0.0/14 is equivalent to 10.0.1.0/255.248.0.0
  94.           n.n.n.n/m.m.m.m An IP network using the specified mask
  95.           hostname        A specific host name, this has an implicit mask of
  96.                           255.255.255.255
  97.           .domain.dom     Matches an IP number whose cannonical name (found
  98.                           using a reverse DNS lookup) ends with the specified
  99.                           domain.
  100.        @return
  101.        TRUE if entry is valid.
  102.      */
  103.     BOOL Parse(
  104.       const PString & description   // Description of the specification
  105.     );
  106.     /** Check to see if the specified IP address match any of the conditions
  107.        specifed in the Parse() function for this entry.
  108.        @return
  109.        TRUE if entry can match the address.
  110.      */
  111.     BOOL Match(
  112.       PIPSocket::Address & address    // Address to search for
  113.     );
  114.     BOOL IsAllowed() const { return allowed; }
  115.     BOOL IsHidden()  const { return hidden; }
  116.   protected:
  117.     PString            domain;
  118.     PIPSocket::Address address;
  119.     PIPSocket::Address mask;
  120.     BOOL               allowed;
  121.     BOOL               hidden;
  122. };
  123. PSORTED_LIST(PIpAccessControlList_base, PIpAccessControlEntry);
  124. /** This class is a list of IP address mask specifications used to validate if
  125.    an address may or may not be used in a connection.
  126.    The list may be totally internal to the application, or may use system
  127.    wide files commonly use under Linux (hosts.allow and hosts.deny file). These
  128.    will be used regardless of the platform.
  129.    When a search is done using IsAllowed() function, the first entry that
  130.    matches the specified IP address is found, and its allow flag returned. The
  131.    list sorted so that the most specific IP number specification is first and
  132.    the broadest onse later. The entry with the value having a mask of zero,
  133.    that is the match all entry, is always last.
  134.  */
  135. class PIpAccessControlList : public PIpAccessControlList_base
  136. {
  137.   PCLASSINFO(PIpAccessControlList, PIpAccessControlList_base)
  138.   public:
  139.     /** Create a new, empty, access control list.
  140.      */
  141.     PIpAccessControlList();
  142.     /** Load the system wide files commonly use under Linux (hosts.allow and
  143.        hosts.deny file) for IP access. See the Linux man entries on these
  144.        files for more information. Note, these files will be loaded regardless
  145.        of the actual platform used. The directory returned by the
  146.        PProcess::GetOSConfigDir() function is searched for the files.
  147.        The <CODE>daemonName</CODE> parameter is used as the search argument in
  148.        the hosts.allow/hosts.deny file. If this is NULL then the
  149.        PProcess::GetName() function is used.
  150.        @return
  151.        TRUE if all the entries in the file were added, if any failed then
  152.        FALSE is returned.
  153.      */
  154.     BOOL LoadHostsAccess(
  155.       const char * daemonName = NULL    // Name of "daemon" application
  156.     );
  157.     /** Load entries in the list from the configuration file specified. This is
  158.        equivalent to Load(cfg, "IP Access Control List").
  159.        @return
  160.        TRUE if all the entries in the file were added, if any failed then
  161.        FALSE is returned.
  162.      */
  163.     BOOL Load(
  164.       PConfig & cfg   // Configuration file to load entries from.
  165.     );
  166.     /** Load entries in the list from the configuration file specified, using
  167.        the base name for the array of configuration file values. The format of
  168.        entries in the configuration file are suitable for use with the
  169.        PHTTPConfig classes.
  170.        @return
  171.        TRUE if all the entries in the file were added, if any failed then
  172.        FALSE is returned.
  173.      */
  174.     BOOL Load(
  175.       PConfig & cfg,            // Configuration file to load entries from.
  176.       const PString & baseName  // Base name string for each entry in file.
  177.     );
  178.     /** Save entries in the list to the configuration file specified. This is
  179.        equivalent to Save(cfg, "IP Access Control List").
  180.      */
  181.     void Save(
  182.       PConfig & cfg   // Configuration file to save entries to.
  183.     );
  184.     /** Save entries in the list to the configuration file specified, using
  185.        the base name for the array of configuration file values. The format of
  186.        entries in the configuration file are suitable for use with the
  187.        PHTTPConfig classes.
  188.      */
  189.     void Save(
  190.       PConfig & cfg,            // Configuration file to save entries to.
  191.       const PString & baseName  // Base name string for each entry in file.
  192.     );
  193.     /** Add the specified entry into the list. See the PIpAccessControlEntry
  194.        class for more details on the format of the <CODE>description</CODE>
  195.        field.
  196.        @return
  197.        TRUE if the entries was successfully added.
  198.      */
  199.     BOOL Add(
  200.       const PString & description   // Description of the IP match parameters
  201.     );
  202.     BOOL Add(
  203.       PIPSocket::Address address,   // IP network address
  204.       PIPSocket::Address mask,      // Mask for IP network
  205.       BOOL allow                    // Flag for if network is allowed or not
  206.     );
  207.     /** Remove the specified entry into the list. See the PIpAccessControlEntry
  208.        class for more details on the format of the <CODE>description</CODE>
  209.        field.
  210.        @return
  211.        TRUE if the entries was successfully removed.
  212.      */
  213.     BOOL Remove(
  214.       const PString & description   // Description of the IP match parameters
  215.     );
  216.     BOOL Remove(
  217.       PIPSocket::Address address,   // IP network address
  218.       PIPSocket::Address mask       // Mask for IP network
  219.     );
  220.     /** Test the address/connection for if it is allowed within this access
  221.        control list. If the <CODE>socket</CODE> form is used the peer address
  222.        of the connection is tested.
  223.        If the list is empty then TRUE is returned. If the list is not empty,
  224.        but the IP address does not match any entries in the list, then FALSE
  225.        is returned. If a match is made then the allow state of that entry is
  226.        returned.
  227.        @return
  228.        TRUE if the remote host address is allowed.
  229.      */
  230.     BOOL IsAllowed(
  231.       PTCPSocket & socket           // Socket to test
  232.     );
  233.     BOOL IsAllowed(
  234.       PIPSocket::Address address    // IP Address to test
  235.     );
  236.   private:
  237.     BOOL InternalLoadHostsAccess(const PString & daemon, const char * file, BOOL allow);
  238.     BOOL InternalAddEntry(PIpAccessControlEntry & entry);
  239.     BOOL InternalRemoveEntry(PIpAccessControlEntry & entry);
  240. };
  241. #endif  // _IPACL_H
  242. // End of File ///////////////////////////////////////////////////////////////