diff --git a/inc/DAVResource.php b/inc/DAVResource.php index 106290f2..92d4b490 100644 --- a/inc/DAVResource.php +++ b/inc/DAVResource.php @@ -12,98 +12,6 @@ require_once('AwlQuery.php'); -/** -* Given a privilege string, or an array of privilege strings, return a bit mask -* of the privileges. -* @param mixed $raw_privs The string (or array of strings) of privilege names -* @return integer A bit mask of the privileges. -*/ -function privilege_to_bits( $raw_privs ) { - $out_priv = 0; - - if ( gettype($raw_privs) == 'string' ) $raw_privs = array( $raw_privs ); - - foreach( $raw_privs AS $priv ) { - $trim_priv = trim(strtolower(preg_replace( '/^.*:/', '', $priv))); - switch( $trim_priv ) { - case 'read' : $out_priv |= 4609; break; // 1 + 512 + 4096 - case 'write' : $out_priv |= 198; break; // 2 + 4 + 64 + 128 - case 'write-properties' : $out_priv |= 2; break; - case 'write-content' : $out_priv |= 4; break; - case 'unlock' : $out_priv |= 8; break; - case 'read-acl' : $out_priv |= 16; break; - case 'read-current-user-privilege-set' : $out_priv |= 32; break; - case 'bind' : $out_priv |= 64; break; - case 'unbind' : $out_priv |= 128; break; - case 'write-acl' : $out_priv |= 256; break; - case 'read-free-busy' : $out_priv |= 4608; break; // 512 + 4096 - case 'schedule-deliver' : $out_priv |= 7168; break; // 1024 + 2048 + 4096 - case 'schedule-deliver-invite' : $out_priv |= 1024; break; - case 'schedule-deliver-reply' : $out_priv |= 2048; break; - case 'schedule-query-freebusy' : $out_priv |= 4096; break; - case 'schedule-send' : $out_priv |= 57344; break; // 8192 + 16384 + 32768 - case 'schedule-send-invite' : $out_priv |= 8192; break; - case 'schedule-send-reply' : $out_priv |= 16384; break; - case 'schedule-send-freebusy' : $out_priv |= 32768; break; - default: - dbg_error_log( 'ERROR', 'Cannot convert privilege of "%s" into bits.', $priv ); - - } - } - return $out_priv; -} - - -/** -* Given a bit mask of the privileges, will return an array of the -* text values of privileges. -* @param integer $raw_bits A bit mask of the privileges. -* @return mixed The string (or array of strings) of privilege names -*/ -function bits_to_privilege( $raw_bits ) { - $out_priv = array(); - - if ( is_string($raw_bits) ) { - $raw_bits = bindec($raw_bits); - } - - if ( ($raw_bits & 16777215) == 16777215 ) $out_priv[] = 'all'; - - if ( ($raw_bits & 1) != 0 ) $out_priv[] = 'DAV::read'; - if ( ($raw_bits & 8) != 0 ) $out_priv[] = 'DAV::unlock'; - if ( ($raw_bits & 16) != 0 ) $out_priv[] = 'DAV::read-acl'; - if ( ($raw_bits & 32) != 0 ) $out_priv[] = 'DAV::read-current-user-privilege-set'; - if ( ($raw_bits & 256) != 0 ) $out_priv[] = 'DAV::write-acl'; - if ( ($raw_bits & 512) != 0 ) $out_priv[] = 'urn:ietf:params:xml:ns:caldav:read-free-busy'; - - if ( ($raw_bits & 198) != 0 ) { - if ( ($raw_bits & 198) == 198 ) $out_priv[] = 'DAV::write'; - if ( ($raw_bits & 2) != 0 ) $out_priv[] = 'DAV::write-properties'; - if ( ($raw_bits & 4) != 0 ) $out_priv[] = 'DAV::write-content'; - if ( ($raw_bits & 64) != 0 ) $out_priv[] = 'DAV::bind'; - if ( ($raw_bits & 128) != 0 ) $out_priv[] = 'DAV::unbind'; - } - - if ( ($raw_bits & 7168) != 0 ) { - if ( ($raw_bits & 7168) == 7168 ) $out_priv[] = 'urn:ietf:params:xml:ns:caldav:schedule-deliver'; - if ( ($raw_bits & 1024) != 0 ) $out_priv[] = 'urn:ietf:params:xml:ns:caldav:schedule-deliver-invite'; - if ( ($raw_bits & 2048) != 0 ) $out_priv[] = 'urn:ietf:params:xml:ns:caldav:schedule-deliver-reply'; - if ( ($raw_bits & 4096) != 0 ) $out_priv[] = 'urn:ietf:params:xml:ns:caldav:schedule-query-freebusy'; - } - - if ( ($raw_bits & 57344) != 0 ) { - if ( ($raw_bits & 57344) == 57344 ) $out_priv[] = 'urn:ietf:params:xml:ns:caldav:schedule-send'; - if ( ($raw_bits & 8192) != 0 ) $out_priv[] = 'urn:ietf:params:xml:ns:caldav:schedule-send-invite'; - if ( ($raw_bits & 16384) != 0 ) $out_priv[] = 'urn:ietf:params:xml:ns:caldav:schedule-send-reply'; - if ( ($raw_bits & 32768) != 0 ) $out_priv[] = 'urn:ietf:params:xml:ns:caldav:schedule-send-freebusy'; - } - -// dbg_error_log( 'DAVResource', ' Privilege bit "%s" is "%s".', $raw_bits, implode(', ', $out_priv) ); - - return $out_priv; -} - - /** * A class for things to do with a DAV Resource * diff --git a/inc/always.php b/inc/always.php index abf39eb4..26eb80f0 100644 --- a/inc/always.php +++ b/inc/always.php @@ -35,6 +35,7 @@ $c->http_auth_mode = 'Basic'; $c->default_locale = 'en'; $c->base_url = preg_replace('#/[^/]+\.php.*$#', '', $_SERVER['SCRIPT_NAME']); $c->base_directory = preg_replace('#/[^/]*$#', '', $_SERVER['DOCUMENT_ROOT']); +$c->default_privileges = array('read-free-busy', 'schedule-query-freebusy'); $c->stylesheets = array( $c->base_url.'/davical.css' ); $c->images = $c->base_url . '/images'; @@ -339,3 +340,101 @@ function DateToISODate( $indate ) { // Use strtotime since strptime is not available on Windows platform. return( date('c', strtotime($indate)) ); } + +/** +* Given a privilege string, or an array of privilege strings, return a bit mask +* of the privileges. +* @param mixed $raw_privs The string (or array of strings) of privilege names +* @return integer A bit mask of the privileges. +*/ +define("DAVICAL_MAXPRIV", "65535"); +function privilege_to_bits( $raw_privs ) { + $out_priv = 0; + + if ( gettype($raw_privs) == 'string' ) $raw_privs = array( $raw_privs ); + + foreach( $raw_privs AS $priv ) { + $trim_priv = trim(strtolower(preg_replace( '/^.*:/', '', $priv))); + switch( $trim_priv ) { + case 'read' : $out_priv |= 1; break; + case 'write-properties' : $out_priv |= 2; break; + case 'write-content' : $out_priv |= 4; break; + case 'unlock' : $out_priv |= 8; break; + case 'read-acl' : $out_priv |= 16; break; + case 'read-current-user-privilege-set' : $out_priv |= 32; break; + case 'bind' : $out_priv |= 64; break; + case 'unbind' : $out_priv |= 128; break; + case 'write-acl' : $out_priv |= 256; break; + case 'read-free-busy' : $out_priv |= 512; break; + case 'schedule-deliver-invite' : $out_priv |= 1024; break; + case 'schedule-deliver-reply' : $out_priv |= 2048; break; + case 'schedule-query-freebusy' : $out_priv |= 4096; break; + case 'schedule-send-invite' : $out_priv |= 8192; break; + case 'schedule-send-reply' : $out_priv |= 16384; break; + case 'schedule-send-freebusy' : $out_priv |= 32768; break; + + /** Aggregates of Privileges */ + case 'write' : $out_priv |= 198; break; // 2 + 4 + 64 + 128 + case 'schedule-deliver' : $out_priv |= 7168; break; // 1024 + 2048 + 4096 + case 'schedule-send' : $out_priv |= 57344; break; // 8192 + 16384 + 32768 + case 'all' : $out_priv = DAVICAL_MAXPRIV; break; + default: + dbg_error_log( 'ERROR', 'Cannot convert privilege of "%s" into bits.', $priv ); + + } + } + + // 'all' will include future privileges + if ( $out_priv >= DAVICAL_MAXPRIV ) $out_priv = pow(2,25) - 1; + return $out_priv; +} + + +/** +* Given a bit mask of the privileges, will return an array of the +* text values of privileges. +* @param integer $raw_bits A bit mask of the privileges. +* @return mixed The string (or array of strings) of privilege names +*/ +function bits_to_privilege( $raw_bits ) { + $out_priv = array(); + + if ( is_string($raw_bits) ) { + $raw_bits = bindec($raw_bits); + } + + if ( ($raw_bits & DAVICAL_MAXPRIV) == DAVICAL_MAXPRIV ) $out_priv[] = 'all'; + + if ( ($raw_bits & 1) != 0 ) $out_priv[] = 'DAV::read'; + if ( ($raw_bits & 8) != 0 ) $out_priv[] = 'DAV::unlock'; + if ( ($raw_bits & 16) != 0 ) $out_priv[] = 'DAV::read-acl'; + if ( ($raw_bits & 32) != 0 ) $out_priv[] = 'DAV::read-current-user-privilege-set'; + if ( ($raw_bits & 256) != 0 ) $out_priv[] = 'DAV::write-acl'; + if ( ($raw_bits & 512) != 0 ) $out_priv[] = 'urn:ietf:params:xml:ns:caldav:read-free-busy'; + + if ( ($raw_bits & 198) != 0 ) { + if ( ($raw_bits & 198) == 198 ) $out_priv[] = 'DAV::write'; + if ( ($raw_bits & 2) != 0 ) $out_priv[] = 'DAV::write-properties'; + if ( ($raw_bits & 4) != 0 ) $out_priv[] = 'DAV::write-content'; + if ( ($raw_bits & 64) != 0 ) $out_priv[] = 'DAV::bind'; + if ( ($raw_bits & 128) != 0 ) $out_priv[] = 'DAV::unbind'; + } + + if ( ($raw_bits & 7168) != 0 ) { + if ( ($raw_bits & 7168) == 7168 ) $out_priv[] = 'urn:ietf:params:xml:ns:caldav:schedule-deliver'; + if ( ($raw_bits & 1024) != 0 ) $out_priv[] = 'urn:ietf:params:xml:ns:caldav:schedule-deliver-invite'; + if ( ($raw_bits & 2048) != 0 ) $out_priv[] = 'urn:ietf:params:xml:ns:caldav:schedule-deliver-reply'; + if ( ($raw_bits & 4096) != 0 ) $out_priv[] = 'urn:ietf:params:xml:ns:caldav:schedule-query-freebusy'; + } + + if ( ($raw_bits & 57344) != 0 ) { + if ( ($raw_bits & 57344) == 57344 ) $out_priv[] = 'urn:ietf:params:xml:ns:caldav:schedule-send'; + if ( ($raw_bits & 8192) != 0 ) $out_priv[] = 'urn:ietf:params:xml:ns:caldav:schedule-send-invite'; + if ( ($raw_bits & 16384) != 0 ) $out_priv[] = 'urn:ietf:params:xml:ns:caldav:schedule-send-reply'; + if ( ($raw_bits & 32768) != 0 ) $out_priv[] = 'urn:ietf:params:xml:ns:caldav:schedule-send-freebusy'; + } + +// dbg_error_log( 'DAVResource', ' Privilege bit "%s" is "%s".', $raw_bits, implode(', ', $out_priv) ); + + return $out_priv; +} diff --git a/inc/always.php.in b/inc/always.php.in index 6b77288c..624bfa06 100644 --- a/inc/always.php.in +++ b/inc/always.php.in @@ -35,6 +35,7 @@ $c->http_auth_mode = 'Basic'; $c->default_locale = 'en'; $c->base_url = preg_replace('#/[^/]+\.php.*$#', '', $_SERVER['SCRIPT_NAME']); $c->base_directory = preg_replace('#/[^/]*$#', '', $_SERVER['DOCUMENT_ROOT']); +$c->default_privileges = array('read-free-busy', 'schedule-query-freebusy'); $c->stylesheets = array( $c->base_url.'/davical.css' ); $c->images = $c->base_url . '/images'; @@ -339,3 +340,101 @@ function DateToISODate( $indate ) { // Use strtotime since strptime is not available on Windows platform. return( date('c', strtotime($indate)) ); } + +/** +* Given a privilege string, or an array of privilege strings, return a bit mask +* of the privileges. +* @param mixed $raw_privs The string (or array of strings) of privilege names +* @return integer A bit mask of the privileges. +*/ +define("DAVICAL_MAXPRIV", "65535"); +function privilege_to_bits( $raw_privs ) { + $out_priv = 0; + + if ( gettype($raw_privs) == 'string' ) $raw_privs = array( $raw_privs ); + + foreach( $raw_privs AS $priv ) { + $trim_priv = trim(strtolower(preg_replace( '/^.*:/', '', $priv))); + switch( $trim_priv ) { + case 'read' : $out_priv |= 1; break; + case 'write-properties' : $out_priv |= 2; break; + case 'write-content' : $out_priv |= 4; break; + case 'unlock' : $out_priv |= 8; break; + case 'read-acl' : $out_priv |= 16; break; + case 'read-current-user-privilege-set' : $out_priv |= 32; break; + case 'bind' : $out_priv |= 64; break; + case 'unbind' : $out_priv |= 128; break; + case 'write-acl' : $out_priv |= 256; break; + case 'read-free-busy' : $out_priv |= 512; break; + case 'schedule-deliver-invite' : $out_priv |= 1024; break; + case 'schedule-deliver-reply' : $out_priv |= 2048; break; + case 'schedule-query-freebusy' : $out_priv |= 4096; break; + case 'schedule-send-invite' : $out_priv |= 8192; break; + case 'schedule-send-reply' : $out_priv |= 16384; break; + case 'schedule-send-freebusy' : $out_priv |= 32768; break; + + /** Aggregates of Privileges */ + case 'write' : $out_priv |= 198; break; // 2 + 4 + 64 + 128 + case 'schedule-deliver' : $out_priv |= 7168; break; // 1024 + 2048 + 4096 + case 'schedule-send' : $out_priv |= 57344; break; // 8192 + 16384 + 32768 + case 'all' : $out_priv = DAVICAL_MAXPRIV; break; + default: + dbg_error_log( 'ERROR', 'Cannot convert privilege of "%s" into bits.', $priv ); + + } + } + + // 'all' will include future privileges + if ( $out_priv >= DAVICAL_MAXPRIV ) $out_priv = pow(2,25) - 1; + return $out_priv; +} + + +/** +* Given a bit mask of the privileges, will return an array of the +* text values of privileges. +* @param integer $raw_bits A bit mask of the privileges. +* @return mixed The string (or array of strings) of privilege names +*/ +function bits_to_privilege( $raw_bits ) { + $out_priv = array(); + + if ( is_string($raw_bits) ) { + $raw_bits = bindec($raw_bits); + } + + if ( ($raw_bits & DAVICAL_MAXPRIV) == DAVICAL_MAXPRIV ) $out_priv[] = 'all'; + + if ( ($raw_bits & 1) != 0 ) $out_priv[] = 'DAV::read'; + if ( ($raw_bits & 8) != 0 ) $out_priv[] = 'DAV::unlock'; + if ( ($raw_bits & 16) != 0 ) $out_priv[] = 'DAV::read-acl'; + if ( ($raw_bits & 32) != 0 ) $out_priv[] = 'DAV::read-current-user-privilege-set'; + if ( ($raw_bits & 256) != 0 ) $out_priv[] = 'DAV::write-acl'; + if ( ($raw_bits & 512) != 0 ) $out_priv[] = 'urn:ietf:params:xml:ns:caldav:read-free-busy'; + + if ( ($raw_bits & 198) != 0 ) { + if ( ($raw_bits & 198) == 198 ) $out_priv[] = 'DAV::write'; + if ( ($raw_bits & 2) != 0 ) $out_priv[] = 'DAV::write-properties'; + if ( ($raw_bits & 4) != 0 ) $out_priv[] = 'DAV::write-content'; + if ( ($raw_bits & 64) != 0 ) $out_priv[] = 'DAV::bind'; + if ( ($raw_bits & 128) != 0 ) $out_priv[] = 'DAV::unbind'; + } + + if ( ($raw_bits & 7168) != 0 ) { + if ( ($raw_bits & 7168) == 7168 ) $out_priv[] = 'urn:ietf:params:xml:ns:caldav:schedule-deliver'; + if ( ($raw_bits & 1024) != 0 ) $out_priv[] = 'urn:ietf:params:xml:ns:caldav:schedule-deliver-invite'; + if ( ($raw_bits & 2048) != 0 ) $out_priv[] = 'urn:ietf:params:xml:ns:caldav:schedule-deliver-reply'; + if ( ($raw_bits & 4096) != 0 ) $out_priv[] = 'urn:ietf:params:xml:ns:caldav:schedule-query-freebusy'; + } + + if ( ($raw_bits & 57344) != 0 ) { + if ( ($raw_bits & 57344) == 57344 ) $out_priv[] = 'urn:ietf:params:xml:ns:caldav:schedule-send'; + if ( ($raw_bits & 8192) != 0 ) $out_priv[] = 'urn:ietf:params:xml:ns:caldav:schedule-send-invite'; + if ( ($raw_bits & 16384) != 0 ) $out_priv[] = 'urn:ietf:params:xml:ns:caldav:schedule-send-reply'; + if ( ($raw_bits & 32768) != 0 ) $out_priv[] = 'urn:ietf:params:xml:ns:caldav:schedule-send-freebusy'; + } + +// dbg_error_log( 'DAVResource', ' Privilege bit "%s" is "%s".', $raw_bits, implode(', ', $out_priv) ); + + return $out_priv; +}