Page Menu
Home
Phorge
Search
Configure Global Search
Log In
Files
F117751484
kolab_storage_folder_api.php
No One
Temporary
Actions
Download File
Edit File
Delete File
View Transforms
Subscribe
Flag For Later
Award Token
Authored By
Unknown
Size
9 KB
Referenced Files
None
Subscribers
None
kolab_storage_folder_api.php
View Options
<?php
/**
* Abstract interface class for Kolab storage IMAP folder objects
*
* @author Thomas Bruederli <bruederli@kolabsys.com>
*
* Copyright (C) 2014, Kolab Systems AG <contact@kolabsys.com>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
abstract
class
kolab_storage_folder_api
{
/**
* Folder identifier
* @var string
*/
public
$id
;
/**
* The folder name.
* @var string
*/
public
$name
;
/**
* The type of this folder.
* @var string
*/
public
$type
;
/**
* The subtype of this folder.
* @var string
*/
public
$subtype
;
/**
* Is this folder set to be the default for its type
* @var boolean
*/
public
$default
=
false
;
/**
* List of direct child folders
* @var array
*/
public
$children
=
array
();
/**
* Name of the parent folder
* @var string
*/
public
$parent
=
''
;
protected
$imap
;
protected
$owner
;
protected
$info
;
protected
$idata
;
protected
$namespace
;
protected
$metadata
;
/**
* Private constructor
*/
protected
function
__construct
(
$name
)
{
$this
->
name
=
$name
;
$this
->
id
=
kolab_storage
::
folder_id
(
$name
);
$this
->
imap
=
rcube
::
get_instance
()->
get_storage
();
}
/**
* Returns the owner of the folder.
*
* @param boolean Return a fully qualified owner name (i.e. including domain for shared folders)
* @return string The owner of this folder.
*/
public
function
get_owner
(
$fully_qualified
=
false
)
{
// return cached value
if
(
isset
(
$this
->
owner
))
return
$this
->
owner
;
$info
=
$this
->
get_folder_info
();
$rcmail
=
rcube
::
get_instance
();
switch
(
$info
[
'namespace'
])
{
case
'personal'
:
$this
->
owner
=
$rcmail
->
get_user_name
();
break
;
case
'shared'
:
$this
->
owner
=
'anonymous'
;
break
;
default
:
list
(
$prefix
,
$this
->
owner
)
=
explode
(
$this
->
imap
->
get_hierarchy_delimiter
(),
$info
[
'name'
]);
$fully_qualified
=
true
;
// enforce email addresses (backwards compatibility)
break
;
}
if
(
$fully_qualified
&&
strpos
(
$this
->
owner
,
'@'
)
===
false
)
{
// extract domain from current user name
$domain
=
strstr
(
$rcmail
->
get_user_name
(),
'@'
);
// fall back to mail_domain config option
if
(
empty
(
$domain
)
&&
(
$mdomain
=
$rcmail
->
config
->
mail_domain
(
$this
->
imap
->
options
[
'host'
])))
{
$domain
=
'@'
.
$mdomain
;
}
$this
->
owner
.=
$domain
;
}
return
$this
->
owner
;
}
/**
* Getter for the name of the namespace to which the IMAP folder belongs
*
* @return string Name of the namespace (personal, other, shared)
*/
public
function
get_namespace
()
{
if
(!
isset
(
$this
->
namespace
))
$this
->
namespace
=
$this
->
imap
->
folder_namespace
(
$this
->
name
);
return
$this
->
namespace
;
}
/**
* Get the display name value of this folder
*
* @return string Folder name
*/
public
function
get_name
()
{
return
kolab_storage
::
object_name
(
$this
->
name
);
}
/**
* Getter for the top-end folder name (not the entire path)
*
* @return string Name of this folder
*/
public
function
get_foldername
()
{
$parts
=
explode
(
'/'
,
$this
->
name
);
return
rcube_charset
::
convert
(
end
(
$parts
),
'UTF7-IMAP'
);
}
/**
* Getter for parent folder path
*
* @return string Full path to parent folder
*/
public
function
get_parent
()
{
$path
=
explode
(
'/'
,
$this
->
name
);
array_pop
(
$path
);
// don't list top-level namespace folder
if
(
count
(
$path
)
==
1
&&
in_array
(
$this
->
get_namespace
(),
array
(
'other'
,
'shared'
)))
{
$path
=
array
();
}
return
join
(
'/'
,
$path
);
}
/**
* Getter for the Cyrus mailbox identifier corresponding to this folder
* (e.g. user/john.doe/Calendar/Personal@example.org)
*
* @return string Mailbox ID
*/
public
function
get_mailbox_id
()
{
$info
=
$this
->
get_folder_info
();
$owner
=
$this
->
get_owner
();
list
(
$user
,
$domain
)
=
explode
(
'@'
,
$owner
);
switch
(
$info
[
'namespace'
])
{
case
'personal'
:
return
sprintf
(
'user/%s/%s@%s'
,
$user
,
$this
->
name
,
$domain
);
case
'shared'
:
$ns
=
$this
->
imap
->
get_namespace
(
'shared'
);
$prefix
=
is_array
(
$ns
)
?
$ns
[
0
][
0
]
:
''
;
list
(,
$domain
)
=
explode
(
'@'
,
rcube
::
get_instance
()->
get_user_name
());
return
substr
(
$this
->
name
,
strlen
(
$prefix
))
.
'@'
.
$domain
;
default
:
$ns
=
$this
->
imap
->
get_namespace
(
'other'
);
$prefix
=
is_array
(
$ns
)
?
$ns
[
0
][
0
]
:
''
;
list
(
$user
,
$folder
)
=
explode
(
$this
->
imap
->
get_hierarchy_delimiter
(),
substr
(
$info
[
'name'
],
strlen
(
$prefix
)),
2
);
if
(
strpos
(
$user
,
'@'
))
{
list
(
$user
,
$domain
)
=
explode
(
'@'
,
$user
);
}
return
sprintf
(
'user/%s/%s@%s'
,
$user
,
$folder
,
$domain
);
}
}
/**
* Get the color value stored in metadata
*
* @param string Default color value to return if not set
* @return mixed Color value from IMAP metadata or $default is not set
*/
public
function
get_color
(
$default
=
null
)
{
// color is defined in folder METADATA
$metadata
=
$this
->
get_metadata
();
if
((
$color
=
$metadata
[
kolab_storage
::
COLOR_KEY_PRIVATE
])
||
(
$color
=
$metadata
[
kolab_storage
::
COLOR_KEY_SHARED
]))
{
return
$color
;
}
return
$default
;
}
/**
* Returns IMAP metadata/annotations (GETMETADATA/GETANNOTATION)
* supported by kolab_storage
*
* @return array Metadata entry-value hash array on success, NULL on error
*/
public
function
get_metadata
()
{
if
(
$this
->
metadata
===
null
)
{
$this
->
metadata
=
kolab_storage
::
folder_metadata
(
$this
->
name
);
}
return
$this
->
metadata
;
}
/**
* Sets IMAP metadata/annotations (SETMETADATA/SETANNOTATION)
*
* @param array $entries Entry-value array (use NULL value as NIL)
* @return boolean True on success, False on failure
*/
public
function
set_metadata
(
$entries
)
{
$this
->
metadata
=
null
;
return
$this
->
imap
->
set_metadata
(
$this
->
name
,
$entries
);
}
/**
*
*/
public
function
get_folder_info
()
{
if
(!
isset
(
$this
->
info
))
$this
->
info
=
$this
->
imap
->
folder_info
(
$this
->
name
);
return
$this
->
info
;
}
/**
* Make IMAP folder data available for this folder
*/
public
function
get_imap_data
()
{
if
(!
isset
(
$this
->
idata
))
$this
->
idata
=
$this
->
imap
->
folder_data
(
$this
->
name
);
return
$this
->
idata
;
}
/**
* Returns (full) type of IMAP folder
*
* @return string Folder type
*/
public
function
get_type
()
{
$metadata
=
$this
->
get_metadata
();
if
(!
empty
(
$metadata
))
{
return
kolab_storage
::
folder_select_metadata
(
$metadata
);
}
return
$this
->
type
;
}
/**
* Get IMAP ACL information for this folder
*
* @return string Permissions as string
*/
public
function
get_myrights
()
{
$rights
=
$this
->
info
[
'rights'
];
if
(!
is_array
(
$rights
))
$rights
=
$this
->
imap
->
my_rights
(
$this
->
name
);
return
join
(
''
,
(
array
)
$rights
);
}
/**
* Helper method to extract folder UID metadata
*
* @return string Folder's UID
*/
public
function
get_uid
()
{
// To be implemented by extending classes
return
false
;
}
/**
* Check activation status of this folder
*
* @return boolean True if enabled, false if not
*/
public
function
is_active
()
{
return
kolab_storage
::
folder_is_active
(
$this
->
name
);
}
/**
* Change activation status of this folder
*
* @param boolean The desired subscription status: true = active, false = not active
*
* @return True on success, false on error
*/
public
function
activate
(
$active
)
{
return
$active
?
kolab_storage
::
folder_activate
(
$this
->
name
)
:
kolab_storage
::
folder_deactivate
(
$this
->
name
);
}
/**
* Check subscription status of this folder
*
* @return boolean True if subscribed, false if not
*/
public
function
is_subscribed
()
{
return
kolab_storage
::
folder_is_subscribed
(
$this
->
name
);
}
/**
* Change subscription status of this folder
*
* @param boolean The desired subscription status: true = subscribed, false = not subscribed
*
* @return True on success, false on error
*/
public
function
subscribe
(
$subscribed
)
{
return
$subscribed
?
kolab_storage
::
folder_subscribe
(
$this
->
name
)
:
kolab_storage
::
folder_unsubscribe
(
$this
->
name
);
}
/**
* Return folder name as string representation of this object
*
* @return string Full IMAP folder name
*/
public
function
__toString
()
{
return
$this
->
name
;
}
}
File Metadata
Details
Attached
Mime Type
text/x-php
Expires
Sat, Apr 4, 3:11 AM (1 d, 9 h)
Storage Engine
local-disk
Storage Format
Raw Data
Storage Handle
1e/85/6d2e5403e1af76cc42fe3be980c4
Default Alt Text
kolab_storage_folder_api.php (9 KB)
Attached To
Mode
rRPK roundcubemail-plugins-kolab
Attached
Detach File
Event Timeline