This file is indexed.

/usr/share/davical/htdocs/tools.php is in davical 1.1.1-1.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
<?php
/**
* Tools for manipulating calendars
*
* @package   davical
* @subpackage   DAViCalSession
* @author    Maxime Delorme <mdelorme@tennaxia.com>
* @copyright Maxime Delorme
* @license   http://gnu.org/copyleft/gpl.html GNU GPL v2
*/

require_once("./always.php");
require_once("DAViCalSession.php");
$session->LoginRequired();

require_once("DataEntry.php");
require_once("interactive-page.php");
require_once("classBrowser.php");

require_once("caldav-PUT-functions.php");
include_once('check_UTF8.php');

if ( !$session->AllowedTo("Admin" ) ) {
  @ob_flush(); exit(0);
}
if( function_exists("sync_LDAP") && isset($_POST['Sync_LDAP'])){
  sync_LDAP();
}

if( function_exists("sync_LDAP_groups") && isset($_POST['Sync_LDAP_groups'])){
  sync_LDAP_groups();
}

if(isset($_POST['import_from_directory'])){
  Tools::importFromDirectory();
}


class Tools {

  function render(){
    global $c;
    echo  $this->renderImportFromDirectory();
    if ( isset($c->authenticate_hook['call']) && $c->authenticate_hook['call'] == 'LDAP_check' && function_exists("sync_LDAP") ) {
      echo $this->renderSyncLDAP();
    }
  }

  static function renderSyncLDAP(){
    $html = '<div id="entryform">';
    $html .= '<h1>'.translate('Sync LDAP with DAViCal') .'</h1>';

    $data = (object) array('directory_path' => '/path/to/your/ics/files','calendar_path' => 'home');
    $ef = new EntryForm( $_SERVER['REQUEST_URI'],$data , true,true );
    $html .= "<table width=\"100%\" class=\"data\">\n";
    $html .= $ef->StartForm( array("autocomplete" => "off" ) );
    $html .= sprintf( "<tr><td style=\"text-align:left\" colspan=\"2\" >%s</td></tr>\n",
    translate("This operation does the following: <ul><li>check valid users in LDAP directory</li> <li>check users in DAViCal</li></ul> then <ul><li>if a user is present in DAViCal but not in LDAP set him as inactive in DAViCal</li> <li>if a user is present in LDAP but not in DAViCal create the user in DAViCal</li> <li>if a user in present in LDAP and DAViCal then update information in DAViCal</li> </ul>"));
    $html .= "</table>\n";

    $html .= $ef->SubmitButton( "Sync_LDAP", translate('Submit'));

    $html .= '<h1>'.translate('Sync LDAP Groups with DAViCal') .'</h1>';
    $html .= "<table width=\"100%\" class=\"data\">\n";
    $html .= $ef->StartForm( array("autocomplete" => "off" ) );
    $html .= sprintf( "<tr><td style=\"text-align:left\" colspan=\"2\" >%s</td></tr>\n",
    translate("This operation does the following: <ul><li>check valid groups in LDAP directory</li> <li>check groups in DAViCal</li></ul> then <ul><li>if a group is present in DAViCal but not in LDAP set as inactive in DAViCal</li> <li>if a group is present in LDAP but not in DAViCal create the group in DAViCal</li> <li>if a group in present in LDAP and DAViCal then update information in DAViCal</li> </ul>"));
    $html .= "</table>\n";

    $html .= $ef->SubmitButton( "Sync_LDAP_groups", translate('Submit'));
    $html .= $ef->EndForm();

    $html .= "</div>";
    return $html;
  }

  static function renderImportFromDirectory(){
      $html = '<div id="entryform">';
      $html .= '<h1>'.translate('Import all .ics files of a directory') .'</h1>';
      $html .= '<p>'.translate('This process will import each file in a directory named "username.ics" and create a user and calendar for each file to import.') .'</p>';
      
      $data = (object) array('directory_path' => '/path/to/your/ics/files','calendar_path' => 'calendar');
      $ef = new EntryForm( $_SERVER['REQUEST_URI'],$data , true,true );
      $html .= "<table width=\"100%\" class=\"data\">\n";
      $html .= $ef->StartForm( array("autocomplete" => "off" ) );

      $html .= $ef->DataEntryLine( translate("path to store your ics"), "%s", "text", "calendar_path",
                array( "size" => 20,
                        "title" => translate("Set the path to store your ics e.g. 'calendar' will be referenced as /caldav.php/username/calendar/"),
                        "help" => translate("<b>WARNING: all events in this path will be deleted before inserting allof the ics file</b>")
                      )
                      , '' );

      $html .= $ef->DataEntryLine( translate("Directory on the server"), "%s", "text", "directory_path",
                array( "size" => 20, "title" => translate("The path on the server where your .ics files are.")));

      $html .= "</table>\n";
      $html .= $ef->SubmitButton( "import_from_directory", translate('Submit'));
      $html .= $ef->EndForm();

      $html .= "</div>";
      return $html;
  }

  static function importFromDirectory(){
    global $c;
    if(empty($_POST["calendar_path"])){
      dbg_error_log( "importFromDirectory", "calendar path not given");
      return ;
    }
    $path_ics = $_POST["calendar_path"];
    if ( substr($path_ics,-1,1) != '/' ) $path_ics .= '/';          // ensure that we target a collection
    if ( substr($path_ics,0,1) != '/' )  $path_ics = '/'.$path_ics; // ensure that we target a collection

    if(empty($_POST["directory_path"])){
      dbg_error_log( "importFromDirectory", "directory path not given");
      return ;
    }
    $dir = $_POST["directory_path"];
    if(!is_readable($dir)){
      $c->messages[] = sprintf(i18n('directory %s is not readable'),htmlspecialchars($dir));
      dbg_error_log( "importFromDirectory", "directory is not readable");
      return ;
    }
    if ($handle = opendir($dir)) {
      $c->readonly_webdav_collections = false;  // Override this setting so we can create collections/events on import.
      while (false !== ($file = readdir($handle))) {
        if ($file == "." || $file == ".." || substr($file,-4) != '.ics') continue;
        if ( !is_readable($dir.'/'.$file) ) {
          dbg_error_log( "importFromDirectory", "ics file '%s' is not readable",$dir .'/'.$file);
          continue;
        }
        $ics = file_get_contents($dir.'/'.$file);
        $ics = trim($ics);


        if ( $ics != '' ) {
          if ( ! check_string($ics) ) {
            $c->messages[] = sprintf(translate('The file "%s" is not UTF-8 encoded, please check error for more details'),$dir.'/'.$file);
            continue;
          }
          $username = substr($file,0,-4);
          $principal = new Principal('username',$username);
          if ( !$principal->Exists() ) {
            $c->messages[] = sprintf(translate('The principal "%s" does not exist'),$username);
            continue;
          }
          $path = "/".$username.$path_ics;
          $user_no = $principal->user_no();
          if ( controlRequestContainer($username, $user_no, $path, false) === -1)
            continue;
          dbg_error_log( "importFromDirectory", "importing to $path");
          import_collection($ics,$user_no,$path,1);
          $c->messages[] = sprintf(translate('All events of user "%s" were deleted and replaced by those from file %s'),substr($file,0,-4),$dir.'/'.$file);
        }
      }
      closedir($handle);
    }
  }
}

$Tools = new Tools();

include("page-header.php");
$Tools->render();
include("page-footer.php");