mirror of
https://gitlab.com/davical-project/davical.git
synced 2026-05-27 02:54:27 +00:00
Compare commits
6 Commits
657694c7e2
...
506451c11e
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
506451c11e | ||
|
|
c3591225c5 | ||
|
|
d4dc174543 | ||
|
|
85c61ad601 | ||
|
|
f233432838 | ||
|
|
3fecb0908a |
2
Makefile
2
Makefile
@ -75,7 +75,7 @@ test:
|
|||||||
exit 0; \
|
exit 0; \
|
||||||
fi
|
fi
|
||||||
# run phpunit tests
|
# run phpunit tests
|
||||||
phpunit testing/phpunit
|
phpunit --do-not-cache-result testing/phpunit
|
||||||
|
|
||||||
|
|
||||||
.PHONY: clean
|
.PHONY: clean
|
||||||
|
|||||||
26
debian/changelog
vendored
26
debian/changelog
vendored
@ -1,3 +1,21 @@
|
|||||||
|
davical (1.1.13-1) unstable; urgency=medium
|
||||||
|
|
||||||
|
[ Andrew Ruthven ]
|
||||||
|
* New upstream release (Closes: #1040996, #1054143)
|
||||||
|
|
||||||
|
[ Florian Schlichting ]
|
||||||
|
* Acknowledge NMUs by David Prévot - thank you! (closes: #1121419)
|
||||||
|
* Depend on AWL 0.65
|
||||||
|
* Update copyright years
|
||||||
|
* Drop redundant "Priority: optional" and "Rules-Requires-Root: no" fields
|
||||||
|
in debian/control
|
||||||
|
* Update Doxyfile using "doxygen -u"
|
||||||
|
* Add graphviz to Build-Depends, our doxygen config needs "dot"
|
||||||
|
* Update debian/watch to version 5 (Gitlab template)
|
||||||
|
* Declare compliance with Debian Policy 4.7.4
|
||||||
|
|
||||||
|
-- Florian Schlichting <fsfs@debian.org> Mon, 11 May 2026 23:00:17 +0200
|
||||||
|
|
||||||
davical (1.1.12-2.3) unstable; urgency=medium
|
davical (1.1.12-2.3) unstable; urgency=medium
|
||||||
|
|
||||||
* Non-maintainer upload
|
* Non-maintainer upload
|
||||||
@ -19,11 +37,13 @@ davical (1.1.12-2.1) unstable; urgency=medium
|
|||||||
|
|
||||||
-- David Prévot <taffit@debian.org> Tue, 14 Jan 2025 13:45:14 +0100
|
-- David Prévot <taffit@debian.org> Tue, 14 Jan 2025 13:45:14 +0100
|
||||||
|
|
||||||
davical (1.1.13-1) UNRELEASED; urgency=medium
|
davical (1.1.12-2) unstable; urgency=medium
|
||||||
|
|
||||||
* New upstream release (Closes: #1040996)
|
* Cherry-pick two bug fixes from upstream:
|
||||||
|
+ use "." to concatenate strings, not "+" (gitlab #288)
|
||||||
|
+ Add a missing space to a SQL statement to fix adding groups (gitlab #294)
|
||||||
|
|
||||||
-- Andrew Ruthven <andrew@etc.gen.nz> Mon, 23 Oct 2023 17:57:01 +1300
|
-- Florian Schlichting <fsfs@debian.org> Mon, 01 May 2023 00:29:20 +0200
|
||||||
|
|
||||||
davical (1.1.12-1) unstable; urgency=medium
|
davical (1.1.12-1) unstable; urgency=medium
|
||||||
|
|
||||||
|
|||||||
9
debian/control
vendored
9
debian/control
vendored
@ -1,27 +1,26 @@
|
|||||||
Source: davical
|
Source: davical
|
||||||
Section: web
|
Section: web
|
||||||
Priority: optional
|
|
||||||
Maintainer: Davical Development Team <davical-devel@lists.sourceforge.net>
|
Maintainer: Davical Development Team <davical-devel@lists.sourceforge.net>
|
||||||
Uploaders: Andrew McMillan <awm@debian.org>,
|
Uploaders: Andrew McMillan <awm@debian.org>,
|
||||||
Florian Schlichting <fsfs@debian.org>
|
Florian Schlichting <fsfs@debian.org>
|
||||||
Standards-Version: 4.6.2
|
Standards-Version: 4.7.4
|
||||||
Build-Depends: debhelper-compat (= 13),
|
Build-Depends: debhelper-compat (= 13),
|
||||||
dh-exec,
|
dh-exec,
|
||||||
jdupes,
|
jdupes,
|
||||||
libawl-php (>= 0.64-1~), libawl-php (<< 0.65),
|
libawl-php (>= 0.65-1~), libawl-php (<< 0.66),
|
||||||
gettext,
|
gettext,
|
||||||
doxygen,
|
doxygen,
|
||||||
|
graphviz,
|
||||||
php-cli | php5-cli,
|
php-cli | php5-cli,
|
||||||
phpunit
|
phpunit
|
||||||
Vcs-Git: https://gitlab.com/davical-project/davical.git
|
Vcs-Git: https://gitlab.com/davical-project/davical.git
|
||||||
Vcs-Browser: https://gitlab.com/davical-project/davical
|
Vcs-Browser: https://gitlab.com/davical-project/davical
|
||||||
Homepage: https://www.davical.org/
|
Homepage: https://www.davical.org/
|
||||||
Rules-Requires-Root: no
|
|
||||||
|
|
||||||
Package: davical
|
Package: davical
|
||||||
Architecture: all
|
Architecture: all
|
||||||
Depends: ${misc:Depends}, ${perl:Depends},
|
Depends: ${misc:Depends}, ${perl:Depends},
|
||||||
libawl-php (>= 0.64-1~), libawl-php (<< 0.65),
|
libawl-php (>= 0.65-1~), libawl-php (<< 0.66),
|
||||||
libdbd-pg-perl,
|
libdbd-pg-perl,
|
||||||
libyaml-perl,
|
libyaml-perl,
|
||||||
php | php5,
|
php | php5,
|
||||||
|
|||||||
10
debian/copyright
vendored
10
debian/copyright
vendored
@ -7,7 +7,7 @@ Files: *
|
|||||||
Copyright: 2006 - 2013, Andrew McMillan <andrew@mcmillan.net.nz>
|
Copyright: 2006 - 2013, Andrew McMillan <andrew@mcmillan.net.nz>
|
||||||
2006 - 2008, Catalyst IT Ltd
|
2006 - 2008, Catalyst IT Ltd
|
||||||
2008 - 2013, Morphoss Ltd
|
2008 - 2013, Morphoss Ltd
|
||||||
2007 - 2023, Davical contributors (see CREDITS for details)
|
2007 - 2026, Davical contributors (see CREDITS for details)
|
||||||
License: GPL-2+
|
License: GPL-2+
|
||||||
|
|
||||||
Files: dba/caldav_functions.sql htdocs/public.php htdocs/tools.php
|
Files: dba/caldav_functions.sql htdocs/public.php htdocs/tools.php
|
||||||
@ -18,7 +18,7 @@ Files: dba/caldav_functions.sql htdocs/public.php htdocs/tools.php
|
|||||||
Copyright: 2006 - 2013, Andrew McMillan <andrew@mcmillan.net.nz>
|
Copyright: 2006 - 2013, Andrew McMillan <andrew@mcmillan.net.nz>
|
||||||
2006 - 2008, Catalyst IT Ltd
|
2006 - 2008, Catalyst IT Ltd
|
||||||
2008 - 2013, Morphoss Ltd
|
2008 - 2013, Morphoss Ltd
|
||||||
2007 - 2023, Davical contributors (see CREDITS for details)
|
2007 - 2026, Davical contributors (see CREDITS for details)
|
||||||
License: GPL-2
|
License: GPL-2
|
||||||
|
|
||||||
Files: htdocs/tz.php inc/CalDAVRequest.php inc/iSchedule-POST.php
|
Files: htdocs/tz.php inc/CalDAVRequest.php inc/iSchedule-POST.php
|
||||||
@ -28,14 +28,14 @@ Files: htdocs/tz.php inc/CalDAVRequest.php inc/iSchedule-POST.php
|
|||||||
Copyright: 2006 - 2013, Andrew McMillan <andrew@mcmillan.net.nz>
|
Copyright: 2006 - 2013, Andrew McMillan <andrew@mcmillan.net.nz>
|
||||||
2006 - 2008, Catalyst IT Ltd
|
2006 - 2008, Catalyst IT Ltd
|
||||||
2008 - 2013, Morphoss Ltd
|
2008 - 2013, Morphoss Ltd
|
||||||
2007 - 2023, Davical contributors (see CREDITS for details)
|
2007 - 2026, Davical contributors (see CREDITS for details)
|
||||||
License: GPL-3+
|
License: GPL-3+
|
||||||
|
|
||||||
Files: inc/caldav-client-v2.php
|
Files: inc/caldav-client-v2.php
|
||||||
Copyright: 2006 - 2013, Andrew McMillan <andrew@mcmillan.net.nz>
|
Copyright: 2006 - 2013, Andrew McMillan <andrew@mcmillan.net.nz>
|
||||||
2006 - 2008, Catalyst IT Ltd
|
2006 - 2008, Catalyst IT Ltd
|
||||||
2008 - 2013, Morphoss Ltd
|
2008 - 2013, Morphoss Ltd
|
||||||
2007 - 2023, Davical contributors (see CREDITS for details)
|
2007 - 2026, Davical contributors (see CREDITS for details)
|
||||||
License: LGPL-3+
|
License: LGPL-3+
|
||||||
|
|
||||||
Files: inc/check_UTF8.php
|
Files: inc/check_UTF8.php
|
||||||
@ -93,7 +93,7 @@ License: 3-clause-bsd
|
|||||||
|
|
||||||
Files: debian/*
|
Files: debian/*
|
||||||
Copyright: 2006-2012, Andrew McMillan <awm@debian.org>
|
Copyright: 2006-2012, Andrew McMillan <awm@debian.org>
|
||||||
2014-2023, Florian Schlichting <fsfs@debian.org>
|
2014-2026, Florian Schlichting <fsfs@debian.org>
|
||||||
License: GPL-2+
|
License: GPL-2+
|
||||||
|
|
||||||
License: GPL-2+
|
License: GPL-2+
|
||||||
|
|||||||
7
debian/watch
vendored
7
debian/watch
vendored
@ -1,2 +1,5 @@
|
|||||||
version=4
|
Version: 5
|
||||||
https://gitlab.com/davical-project/davical/tags?sort=updated_desc \/davical-project\/davical\/-\/archive\/r([\d.]+)\/davical-r[\d.]+\.tar\.gz
|
|
||||||
|
Template: GitLab
|
||||||
|
Dist: https://gitlab.com/davical-project/davical
|
||||||
|
Matching-Pattern: r(\d[\-+\.:\~\da-zA-Z]*)
|
||||||
|
|||||||
1448
docs/Doxyfile
1448
docs/Doxyfile
File diff suppressed because it is too large
Load Diff
@ -161,10 +161,6 @@ $c->template_usr = array( 'active' => true,
|
|||||||
$c->hide_TODO = true; // VTODO only visible to collection owner
|
$c->hide_TODO = true; // VTODO only visible to collection owner
|
||||||
$c->readonly_webdav_collections = true; // WebDAV access is readonly
|
$c->readonly_webdav_collections = true; // WebDAV access is readonly
|
||||||
|
|
||||||
// Any many times GetMoreInstances in inc/RRule.php should loop trying to
|
|
||||||
// find more instances.
|
|
||||||
$c->rrule_loop_limit = 100;
|
|
||||||
|
|
||||||
// Authentication caching details
|
// Authentication caching details
|
||||||
$c->auth_cache = false; // Default to off
|
$c->auth_cache = false; // Default to off
|
||||||
$c->auth_cache_pass = 0; // Default to off
|
$c->auth_cache_pass = 0; // Default to off
|
||||||
@ -173,6 +169,13 @@ $c->auth_cache_fail = 0; // Default to off
|
|||||||
// Kind of private configuration values
|
// Kind of private configuration values
|
||||||
$c->total_query_time = 0;
|
$c->total_query_time = 0;
|
||||||
|
|
||||||
|
// How many times GetMoreInstances in inc/RRule.php should loop trying to
|
||||||
|
// find more instances.
|
||||||
|
$c->rrule_loop_limit = 100;
|
||||||
|
|
||||||
|
// Kind of private configuration values
|
||||||
|
$c->total_query_time = 0;
|
||||||
|
|
||||||
// Are we in test mode?
|
// Are we in test mode?
|
||||||
$c->test_mode = false;
|
$c->test_mode = false;
|
||||||
|
|
||||||
@ -308,7 +311,7 @@ if ( function_exists('awl_set_locale') ) {
|
|||||||
*/
|
*/
|
||||||
$c->code_version = 0;
|
$c->code_version = 0;
|
||||||
$c->want_awl_version = '0.65';
|
$c->want_awl_version = '0.65';
|
||||||
$c->version_string = '1.1.12'; // The actual version # is replaced into that during the build /release process
|
$c->version_string = '1.1.13'; // The actual version # is replaced into that during the build /release process
|
||||||
if ( isset($c->version_string) && preg_match( '/(\d+)\.(\d+)\.(\d+)(.*)/', $c->version_string, $matches) ) {
|
if ( isset($c->version_string) && preg_match( '/(\d+)\.(\d+)\.(\d+)(.*)/', $c->version_string, $matches) ) {
|
||||||
$c->code_major = $matches[1];
|
$c->code_major = $matches[1];
|
||||||
$c->code_minor = $matches[2];
|
$c->code_minor = $matches[2];
|
||||||
|
|||||||
@ -169,7 +169,7 @@ $c->auth_cache_fail = 0; // Default to off
|
|||||||
// Kind of private configuration values
|
// Kind of private configuration values
|
||||||
$c->total_query_time = 0;
|
$c->total_query_time = 0;
|
||||||
|
|
||||||
// Any many times GetMoreInstances in inc/RRule.php should loop trying to
|
// How many times GetMoreInstances in inc/RRule.php should loop trying to
|
||||||
// find more instances.
|
// find more instances.
|
||||||
$c->rrule_loop_limit = 100;
|
$c->rrule_loop_limit = 100;
|
||||||
|
|
||||||
|
|||||||
@ -92,13 +92,13 @@ function CreateHomeCollections( $username, $default_timezone = null ) {
|
|||||||
);
|
);
|
||||||
if( !empty($c->home_out_calendar_name) )
|
if( !empty($c->home_out_calendar_name) )
|
||||||
$c->default_collections[] = array(
|
$c->default_collections[] = array(
|
||||||
'type' => 'calendar',
|
'type' => 'schedule-outbox',
|
||||||
'name' => $c->home_out_calendar_name,
|
'name' => $c->home_out_calendar_name,
|
||||||
'displayname_suffix' => ' Outbox'
|
'displayname_suffix' => ' Outbox'
|
||||||
);
|
);
|
||||||
if( !empty($c->home_in_calendar_name) )
|
if( !empty($c->home_in_calendar_name) )
|
||||||
$c->default_collections[] = array(
|
$c->default_collections[] = array(
|
||||||
'type' => 'calendar',
|
'type' => 'schedule-inbox',
|
||||||
'name' => $c->home_in_calendar_name,
|
'name' => $c->home_in_calendar_name,
|
||||||
'displayname_suffix' => ' Inbox'
|
'displayname_suffix' => ' Inbox'
|
||||||
);
|
);
|
||||||
@ -113,7 +113,7 @@ function CreateHomeCollections( $username, $default_timezone = null ) {
|
|||||||
|
|
||||||
if ( !is_array($c->default_collections) || !count($c->default_collections) ) return true;
|
if ( !is_array($c->default_collections) || !count($c->default_collections) ) return true;
|
||||||
|
|
||||||
$principal = new Principal('username',$username);
|
$principal = new Principal('username', $username);
|
||||||
|
|
||||||
$user_fullname = $principal->fullname; // user fullname
|
$user_fullname = $principal->fullname; // user fullname
|
||||||
$user_rfullname = implode(' ', array_reverse(explode(' ', $principal->fullname))); // user fullname in reverse order
|
$user_rfullname = implode(' ', array_reverse(explode(' ', $principal->fullname))); // user fullname in reverse order
|
||||||
@ -122,16 +122,22 @@ function CreateHomeCollections( $username, $default_timezone = null ) {
|
|||||||
$sql .= 'VALUES( :user_no, :parent_container, :collection_path, :dav_etag, :displayname, :is_calendar, :is_addressbook, :privileges::BIT(24), current_timestamp, current_timestamp, :resourcetypes );';
|
$sql .= 'VALUES( :user_no, :parent_container, :collection_path, :dav_etag, :displayname, :is_calendar, :is_addressbook, :privileges::BIT(24), current_timestamp, current_timestamp, :resourcetypes );';
|
||||||
|
|
||||||
foreach( $c->default_collections as $v ) {
|
foreach( $c->default_collections as $v ) {
|
||||||
if ( $v['type'] == 'calendar' || $v['type']=='addressbook' ) {
|
if ( $v['type'] == 'calendar' || $v['type']=='addressbook' || $v['type']=='schedule-outbox' || $v['type']=='schedule-inbox' ) {
|
||||||
if ( !empty($v['name']) ) {
|
if ( !empty($v['name']) ) {
|
||||||
$qry = new AwlQuery( 'SELECT 1 FROM collection WHERE dav_name = :dav_name', array( ':dav_name' => $principal->dav_name().$v['name'].'/') );
|
$qry = new AwlQuery(
|
||||||
|
'SELECT 1 FROM collection WHERE dav_name = :dav_name AND resourcetypes LIKE :type',
|
||||||
|
array(
|
||||||
|
':dav_name' => $principal->dav_name().$v['name'].'/',
|
||||||
|
':type' => '%'.$v['type'].'%'
|
||||||
|
)
|
||||||
|
);
|
||||||
if ( !$qry->Exec() ) {
|
if ( !$qry->Exec() ) {
|
||||||
$c->messages[] = i18n('There was an error reading from the database.');
|
$c->messages[] = i18n('There was an error reading from the database.');
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if ( $qry->rows() > 0 ) {
|
if ( $qry->rows() > 0 ) {
|
||||||
$c->messages[] = i18n('Home '.( $v['type']=='calendar' ? 'calendar' : 'addressbook' ).' already exists.');
|
$c->messages[] = i18n('Home ') . $v['type'] . i18n(' already exists');
|
||||||
return true;
|
continue;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
$params[':user_no'] = $principal->user_no();
|
$params[':user_no'] = $principal->user_no();
|
||||||
@ -143,21 +149,28 @@ function CreateHomeCollections( $username, $default_timezone = null ) {
|
|||||||
} elseif ( isset($v['displayname_suffix']) && ! empty($v['displayname_suffix']) ) {
|
} elseif ( isset($v['displayname_suffix']) && ! empty($v['displayname_suffix']) ) {
|
||||||
$params[':displayname'] = $user_fullname . $v['displayname_suffix'];
|
$params[':displayname'] = $user_fullname . $v['displayname_suffix'];
|
||||||
} else {
|
} else {
|
||||||
$params[':displayname'] = $user_fullname . ($v['type']=='calendar' ? ' calendar' : ' addressbook');
|
$typeLabels = [
|
||||||
|
'calendar' => ' calendar',
|
||||||
|
'addressbook' => ' addressbook',
|
||||||
|
'schedule-outbox' => ' Outbox', // capitalized for consistency with CalDAVRequest (line 396)
|
||||||
|
'schedule-inbox' => ' Inbox'
|
||||||
|
];
|
||||||
|
$suffix = isset($typeLabels[$v['type']]) ? $typeLabels[$v['type']] : '';
|
||||||
|
$params[':displayname'] = $user_fullname . $suffix;
|
||||||
}
|
}
|
||||||
$params[':resourcetypes'] = ( $v['type']=='calendar' ? '<DAV::collection/><urn:ietf:params:xml:ns:caldav:calendar/>' : '<DAV::collection/><urn:ietf:params:xml:ns:carddav:addressbook/>' );
|
$params[':resourcetypes'] = "<DAV::collection/><urn:ietf:params:xml:ns:caldav:{$v['type']}/>";
|
||||||
$params[':is_calendar'] = ( $v['type']=='calendar' ? true : false );
|
$params[':is_calendar'] = ( $v['type'] === 'calendar' );
|
||||||
$params[':is_addressbook'] = ( $v['type']=='addressbook' ? true : false );
|
$params[':is_addressbook'] = ( $v['type'] === 'addressbook' );
|
||||||
$params[':privileges'] = ( !isset($v['privileges']) || $v['privileges']===null ? null : privilege_to_bits($v['privileges']) );
|
$params[':privileges'] = ( !isset($v['privileges']) || $v['privileges']===null ? null : privilege_to_bits($v['privileges']) );
|
||||||
|
|
||||||
$qry = new AwlQuery( $sql, $params );
|
$qry = new AwlQuery( $sql, $params );
|
||||||
if ( $qry->Exec() ) {
|
if ( $qry->Exec() ) {
|
||||||
$c->messages[] = i18n('Home '.( $v['type']=='calendar' ? 'calendar' : 'addressbook' ).' added.') . " " . $v['name'];
|
$c->messages[] = i18n('Home ') . $v['type'] . i18n(' added. ') . $v['name'];
|
||||||
dbg_error_log("User",":Write: Created user's home ".( $v['type']=='calendar' ? 'calendar' : 'addressbook' )." at '%s'", $params[':collection_path'] );
|
dbg_error_log("User", ":Write: Created user's home '%s' at '%s'", $v['type'], $params[':collection_path']);
|
||||||
|
|
||||||
// create value for urn:ietf:params:xml:ns:caldav:supported-calendar-component-set property
|
// create value for urn:ietf:params:xml:ns:caldav:supported-calendar-component-set property
|
||||||
if($v['type'] == 'calendar' && isset($v['calendar_components']) && $v['calendar_components'] != null && is_array($v['calendar_components']) && count($v['calendar_components'])) {
|
if($v['type'] == 'calendar' && isset($v['calendar_components']) && $v['calendar_components'] != null && is_array($v['calendar_components']) && count($v['calendar_components'])) {
|
||||||
// convert the array to uppercase and allow only real calendar compontents
|
// convert the array to uppercase and allow only real calendar components
|
||||||
$components_clean=array_intersect(array_map("strtoupper", $v['calendar_components']), array('VEVENT', 'VTODO', 'VJOURNAL', 'VTIMEZONE', 'VFREEBUSY', 'VPOLL', 'VAVAILABILITY'));
|
$components_clean=array_intersect(array_map("strtoupper", $v['calendar_components']), array('VEVENT', 'VTODO', 'VJOURNAL', 'VTIMEZONE', 'VFREEBUSY', 'VPOLL', 'VAVAILABILITY'));
|
||||||
|
|
||||||
// convert the $components_clean array to XML string
|
// convert the $components_clean array to XML string
|
||||||
@ -183,7 +196,7 @@ function CreateHomeCollections( $username, $default_timezone = null ) {
|
|||||||
|
|
||||||
$qry2 = new AwlQuery( $sql2, $params2 );
|
$qry2 = new AwlQuery( $sql2, $params2 );
|
||||||
if ( $qry2->Exec() ) {
|
if ( $qry2->Exec() ) {
|
||||||
dbg_error_log("User",":Write: Created property '%s' for ".( $v['type']=='calendar' ? 'calendar' : 'addressbook' )." at '%s'", $params2[':property_name'], $params2[':collection_path'] );
|
dbg_error_log("User", ":Write: Created property '%s' for '%s' at '%s'", $params2[':property_name'], $v['type'], $params2[':collection_path']);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
$c->messages[] = i18n("There was an error writing to the database.");
|
$c->messages[] = i18n("There was an error writing to the database.");
|
||||||
|
|||||||
@ -887,7 +887,7 @@ function sync_LDAP(){
|
|||||||
$$k = substr($ldap_timestamp,$v[0],$v[1]);
|
$$k = substr($ldap_timestamp,$v[0],$v[1]);
|
||||||
$ldap_timestamp = $Y.$m.$d.$H.$M.$S;
|
$ldap_timestamp = $Y.$m.$d.$H.$M.$S;
|
||||||
}
|
}
|
||||||
else if ( preg_match('{^(\d{8})(\d{6})(Z)?$', $ldap_timestamp, $matches ) ) {
|
else if ( preg_match('{^(\d{8})(\d{6})(Z)?$}', $ldap_timestamp, $matches ) ) {
|
||||||
$ldap_timestamp = $matches[1].'T'.$matches[2].$matches[3];
|
$ldap_timestamp = $matches[1].'T'.$matches[2].$matches[3];
|
||||||
}
|
}
|
||||||
else if ( empty($ldap_timestamp) ) {
|
else if ( empty($ldap_timestamp) ) {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user