This file is indexed.

/usr/share/davical/inc/vcard.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
167
168
169
170
171
172
173
174
<?php
/**
* Extend the vComponent to specifically handle VCARD resources
*/

require_once('AwlQuery.php');
require_once('vComponent.php');

class VCard extends vComponent {

  /**
CREATE TABLE addressbook_resource (
  dav_id INT8 NOT NULL REFERENCES caldav_data(dav_id) ON UPDATE CASCADE ON DELETE CASCADE PRIMARY KEY,
  version TEXT,
  uid TEXT,
  nickname TEXT,
  fn TEXT, -- fullname
  n TEXT, -- Name Surname;First names
  note TEXT,
  org TEXT,
  url TEXT,
  fburl TEXT,
  caluri TEXT
);
  */
  function Write( $dav_id, $exists = true ) {
    $qry = new AwlQuery();

    // Only run a local transaction if we're not in one already.
    $in_transaction = ($qry->TransactionState() == 1);
    if ( ! $in_transaction ) $qry->Begin();

    if ( $exists ) {
      $sql = 'UPDATE addressbook_resource SET version=:version, uid=:uid, nickname=:nickname, fn=:fn, n=:name,
note=:note, org=:org, url=:url, fburl=:fburl, caladruri=:caladruri, caluri=:caluri WHERE dav_id=:dav_id';
    }
    else {
      $sql = 'INSERT INTO addressbook_resource ( dav_id, version, uid, nickname, fn, n, note, org, url, fburl, caladruri, caluri )
VALUES( :dav_id, :version, :uid, :nickname, :fn, :name, :note, :org, :url, :fburl, :caladruri, :caluri )';
    }

    $params = array( ':dav_id' => $dav_id );

    $wanted = array('VERSION' => true, 'UID' => true, 'NICKNAME' => true, 'FN' => true, 'N' => true,
                    'NOTE'=> true, 'ORG' => true, 'URL' => true, 'FBURL' => true, 'CALADRURI' => true, 'CALURI' => true);
    $properties = $this->GetProperties( $wanted );
    foreach( $wanted AS $k => $v ) {
      $pname = ':' . strtolower($k);
      if ( $pname == ':n' ) $pname = ':name';
      $params[$pname] = null;
    }
    foreach( $properties AS $k => $v ) {
      $pname = ':' . strtolower($v->Name());
      if ( $pname == ':n' ) $pname = ':name';
      if ( !isset($params[$pname]) /** @todo or this is one is in the user's language */ ) $params[$pname] = $v->Value();
    }

    $qry->QDo( $sql, $params );

    $this->WriteAddresses($dav_id);
    $this->WritePhones($dav_id);
    $this->WriteEmails($dav_id);

    if ( ! $in_transaction ) $qry->Commit();
  }


  /**
CREATE TABLE addressbook_address_adr (
  dav_id INT8 NOT NULL REFERENCES caldav_data(dav_id) ON UPDATE CASCADE ON DELETE CASCADE,
  type TEXT,
  box_no TEXT,
  unit_no TEXT,
  street_address TEXT,
  locality TEXT,
  region TEXT,
  postcode TEXT,
  country TEXT,
  property TEXT -- The full text of the property
);
  */
  function WriteAddresses( $dav_id ) {
    $addresses = $this->GetProperties('ADR');
    $qry = new AwlQuery();

    // Only run a local transaction if we're not in one already.
    $in_transaction = ($qry->TransactionState() == 1);
    if ( ! $in_transaction ) $qry->Begin();

    $params = array( ':dav_id' => $dav_id );
    $qry->QDo('DELETE FROM addressbook_address_adr WHERE dav_id = :dav_id', $params );
    foreach( $addresses AS $adr ) {
      $type = $adr->GetParameterValue('TYPE');
      if ( is_array($type) ) $type = implode('~|~',$type);
      $params[':type'] = $type;
      $address = explode(';',$adr->Value());

      // We use @ to suppress the warnings here, because the NULL in the database suits us well.
      @$params[':box_no']   = $address[0];
      @$params[':unit_no']  = $address[1];
      @$params[':street_address'] = $address[2];
      @$params[':locality'] = $address[3];
      @$params[':region']   = $address[4];
      @$params[':postcode'] = $address[5];
      @$params[':country']  = $address[6];
      $params[':property'] = $adr->Render();
      $qry->QDo( 'INSERT INTO addressbook_address_adr (dav_id, type, box_no, unit_no, street_address, locality, region, postcode, country, property)
VALUES( :dav_id, :type, :box_no, :unit_no, :street_address, :locality, :region, :postcode, :country, :property)', $params );
    }
    if ( ! $in_transaction ) $qry->Commit();
  }


  /**
CREATE TABLE addressbook_address_tel (
  dav_id INT8 NOT NULL REFERENCES caldav_data(dav_id) ON UPDATE CASCADE ON DELETE CASCADE,
  type TEXT,
  tel TEXT,
  property TEXT -- The full text of the property
);
  */
  function WritePhones( $dav_id ) {
    $telephones = $this->GetProperties('TEL');
    $qry = new AwlQuery();

    // Only run a local transaction if we're not in one already.
    $in_transaction = ($qry->TransactionState() == 1);
    if ( ! $in_transaction ) $qry->Begin();

    $params = array( ':dav_id' => $dav_id );
    $qry->QDo('DELETE FROM addressbook_address_tel WHERE dav_id = :dav_id', $params );
    foreach( $telephones AS $tel ) {
      $type = $tel->GetParameterValue('TYPE');
      if ( is_array($type) ) $type = implode('~|~',$type);
      $params[':type'] = $type;
      if ( ! isset($params[':type']) ) $params[':type'] = 'voice';
      $params[':tel'] = $tel->Value();
      $params[':property'] = $tel->Render();
      $qry->QDo( 'INSERT INTO addressbook_address_tel (dav_id, type, tel, property) VALUES( :dav_id, :type, :tel, :property)', $params );
    }
    if ( ! $in_transaction ) $qry->Commit();
  }


  /**
CREATE TABLE addressbook_address_email (
  dav_id INT8 NOT NULL REFERENCES caldav_data(dav_id) ON UPDATE CASCADE ON DELETE CASCADE,
  type TEXT,
  email TEXT,
  property TEXT -- The full text of the property
);
  */
  function WriteEmails( $dav_id ) {
    $emails = $this->GetProperties('EMAIL');
    $qry = new AwlQuery();

    // Only run a local transaction if we're not in one already.
    $in_transaction = ($qry->TransactionState() == 1);
    if ( ! $in_transaction ) $qry->Begin();

    $params = array( ':dav_id' => $dav_id );
    $qry->QDo('DELETE FROM addressbook_address_email WHERE dav_id = :dav_id', $params );
    foreach( $emails AS $email ) {
      $type = $email->GetParameterValue('TYPE');
      if ( is_array($type) ) $type = implode('~|~',$type);
      $params[':type'] = $type;
      $params[':email'] = $email->Value();
      $params[':property'] = $email->Render();
      $qry->QDo( 'INSERT INTO addressbook_address_email (dav_id, type, email, property) VALUES( :dav_id, :type, :email, :property)', $params );
    }
    if ( ! $in_transaction ) $qry->Commit();
  }

}