GitHub Access Token became invalid

It seems like the GitHub access token used for retrieving details about this repository from GitHub became invalid. This might prevent certain types of inspections from being run (in particular, everything related to pull requests).
Please ask an admin of your repository to re-new the access token on this website.

Issues (149)

Security Analysis    no request data  

This project does not seem to handle request data directly as such no vulnerable execution paths were found.

  Cross-Site Scripting
Cross-Site Scripting enables an attacker to inject code into the response of a web-request that is viewed by other users. It can for example be used to bypass access controls, or even to take over other users' accounts.
  File Exposure
File Exposure allows an attacker to gain access to local files that he should not be able to access. These files can for example include database credentials, or other configuration files.
  File Manipulation
File Manipulation enables an attacker to write custom data to files. This potentially leads to injection of arbitrary code on the server.
  Object Injection
Object Injection enables an attacker to inject an object into PHP code, and can lead to arbitrary code execution, file exposure, or file manipulation attacks.
  Code Injection
Code Injection enables an attacker to execute arbitrary code on the server.
  Response Splitting
Response Splitting can be used to send arbitrary responses.
  File Inclusion
File Inclusion enables an attacker to inject custom files into PHP's file loading mechanism, either explicitly passed to include, or for example via PHP's auto-loading mechanism.
  Command Injection
Command Injection enables an attacker to inject a shell command that is execute with the privileges of the web-server. This can be used to expose sensitive data, or gain access of your server.
  SQL Injection
SQL Injection enables an attacker to execute arbitrary SQL code on your database server gaining access to user data, or manipulating user data.
  XPath Injection
XPath Injection enables an attacker to modify the parts of XML document that are read. If that XML document is for example used for authentication, this can lead to further vulnerabilities similar to SQL Injection.
  LDAP Injection
LDAP Injection enables an attacker to inject LDAP statements potentially granting permission to run unauthorized queries, or modify content inside the LDAP tree.
  Header Injection
  Other Vulnerability
This category comprises other attack vectors such as manipulating the PHP runtime, loading custom extensions, freezing the runtime, or similar.
  Regex Injection
Regex Injection enables an attacker to execute arbitrary code in your PHP process.
  XML Injection
XML Injection enables an attacker to read files on your local filesystem including configuration files, or can be abused to freeze your web-server process.
  Variable Injection
Variable Injection enables an attacker to overwrite program variables with custom data, and can lead to further vulnerabilities.
Unfortunately, the security analysis is currently not available for your project. If you are a non-commercial open-source project, please contact support to gain access.

carddav2fb.php (23 issues)

Upgrade to new PHP Analysis Engine

These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more

1
<?php
2
/**
3
 * CardDAV to FritzBox! XML (automatic upload)
4
 * inspired by http://www.wehavemorefun.de/fritzbox/Hochladen_eines_MySQL-Telefonbuchs
5
 * 
6
 * Requirements: 
7
 *   php5, php5-curl, php5-ftp
8
 * 
9
 * used libraries: 
10
 *  *  vCard-parser <https://github.com/nuovo/vCard-parser> (LICNECE: unknown)
11
 *  *  CardDAV-PHP <https://github.com/graviox/CardDAV-PHP>(LICENCE: AGPLv3)
12
 *  *  fritzbox_api_php <https://github.com/carlos22/fritzbox_api_php> (LICENCE: CC-by-SA 3.0)
13
 * 
14
 * LICENCE (of this file): MIT
15
 * 
16
 * Autors: Karl Glatz (original author)
17
 *         Martin Rost
18
 *         Jens Maus <[email protected]>
19
 *         Johannes Freiburger
20
 *
21
 */
22
error_reporting(E_ALL);
23
setlocale(LC_ALL, 'de_DE.UTF8');
24
25
// Version identifier for CardDAV2FB
26
$carddav2fb_version = '1.11 (2016-05-12)';
27
28
// check for the minimum php version
29
$php_min_version = '5.3.6';
30
if(version_compare(PHP_VERSION, $php_min_version) < 0)
31
{
32
  print 'ERROR: PHP version ' . $php_min_version . ' is required. Found version: ' . PHP_VERSION . PHP_EOL;
33
  exit(1);
34
}
35
36
require_once('lib/CardDAV-PHP/carddav.php');
37
require_once('lib/vCard-parser/vCard.php');
38
require_once('lib/fritzbox_api_php/fritzbox_api.class.php');
39
40
if($argc == 2)
41
  $config_file_name = $argv[1];
42
else
43
  $config_file_name = __DIR__ . '/config.php';
44
45
// default/fallback config options
46
$config['tmp_dir'] = sys_get_temp_dir();
47
$config['fritzbox_ip'] = 'fritz.box';
48
$config['fritzbox_ip_ftp'] = $config['fritzbox_ip'];
49
$config['fritzbox_force_local_login'] = false;
50
$config['phonebook_number'] = '0';
51
$config['phonebook_name'] = 'Telefonbuch';
52
$config['usb_disk'] = '';
53
$config['fritzbox_path'] = 'file:///var/media/ftp/';
54
$config['fullname_format'] = 0; // see config.example.php for options
55
$config['prefix'] = false;
56
$config['suffix'] = false;
57
$config['addnames'] = false;
58
$config['orgname'] = false;
59
$config['build_photos'] = true;
60
$config['quickdial_keyword'] = 'Quickdial:';
61
62
if(is_file($config_file_name))
63
  require($config_file_name);
64
else
65
{
66
  print 'ERROR: No ' . $config_file_name . ' found, please take a look at config.example.php and create a ' . $config_file_name . ' file!' . PHP_EOL;
67
  exit(1);
68
}
69
70
// ---------------------------------------------
71
// MAIN
72
print "carddav2fb.php " . $carddav2fb_version . " - CardDAV to FRITZ!Box phonebook conversion tool" . PHP_EOL;
73
print "Copyright (c) 2012-2016 Karl Glatz, Martin Rost, Jens Maus, Johannes Freiburger" . PHP_EOL . PHP_EOL;
74
75
$client = new CardDAV2FB($config);
76
77
// read vcards from webdav
78
print 'Retrieving VCards from all CardDAV server(s):' . PHP_EOL;
79
$client->get_carddav_entries();
80
print 'Done.' . PHP_EOL;
81
82
flush(); // in case this script runs by php-cgi
83
84
// transform them to a fritzbox compatible xml file
85
print 'Converting VCards to FritzBox XML format:' . PHP_EOL;
86
$client->build_fb_xml();
87
print 'Done.' . PHP_EOL;
88
89
flush(); // in case this script runs by php-cgi
90
91
// upload the XML-file to the FRITZ!Box (CAUTION: this will overwrite all current entries in the phone book!!)
92
print 'Upload data to FRITZ!Box @ ' . $config['fritzbox_ip'] . PHP_EOL;
93
if($client->upload_to_fb())
94
  print 'Done.' . PHP_EOL;
95
else
96
  exit(1);
97
98
flush(); // in case this script runs by php-cgi
99
100
// ---------------------------------------------
101
// Class definition
102
class CardDAV2FB
103
{
104
  protected $entries = array();
105
  protected $fbxml = "";
106
  protected $config = null;
107
  protected $tmpdir = null;
108
109
  public function __construct($config)
110
  {
111
    $this->config = $config;
112
113
    // create a temp directory where we store photos
114
    $this->tmpdir = $this->mktemp($this->config['tmp_dir']);
115
  }
116
117
  public function __destruct()
118
  {
119
    // remote temp directory
120
    $this->rmtemp($this->tmpdir);
121
  }
122
123
  // Source: https://php.net/manual/de/function.tempnam.php#61436
124
  public function mktemp($dir, $prefix = '', $mode = 0700)
125
  {
126
    if(substr($dir, -1) != '/')
127
      $dir .= '/';
128
129
    do
130
    {
131
      $path = $dir . $prefix . mt_rand(0, 9999999);
132
    }
133
    while(!mkdir($path, $mode));
134
135
    return $path;
136
  }
137
138
  public function rmtemp($dir)
139
  {
140
    if(is_dir($dir))
141
    {
142
      $objects = scandir($dir);
143
      foreach($objects as $object)
144
      {
145
        if($object != "." && $object != "..")
146
        {
147
          if(filetype($dir . "/" . $object) == "dir")
148
            rrmdir($dir . "/" . $object); else unlink($dir . "/" . $object);
149
        }
150
      }
151
      reset($objects);
152
      rmdir($dir);
153
    }
154
  }
155
156
  public function is_base64($str)
157
  {
158
    try
159
    {
160
      // Check if there are valid base64 characters
161
      if(!preg_match('/^[a-zA-Z0-9\/\r\n+]*={0,2}$/', $str))
162
        return false;
163
164
      // Decode the string in strict mode and check the results
165
      $decoded = base64_decode($str, true);
166
      if($decoded === false)
167
        return false;
168
169
      // Encode the string again
170
      if(base64_encode($decoded) === $str)
171
        return true;
172
      else
173
        return false;
174
    }
175
    catch(Exception $e)
176
    {
177
      // If exception is caught, then it is not a base64 encoded string
178
      return false;
179
    }
180
  }
181
182
  public function base64_to_jpeg($inputfile, $outputfile)
183
  {
184
    // read data (binary)
185
    $ifp = fopen($inputfile, "rb");
186
    $imageData = fread($ifp, filesize($inputfile));
187
    fclose($ifp);
188
189
    // encode & write data (binary)
190
    $ifp = fopen($outputfile, "wb");
191
    fwrite($ifp, base64_decode($imageData));
192
    fclose($ifp);
193
194
    // return output filename
195
    return($outputfile);
196
  }
197
198
  public function get_carddav_entries()
199
  {
200
    $entries = array();
201
    $snum = 0;
202
203
    if(is_array($this->config['carddav']))
204
    {
205
      foreach($this->config['carddav'] as $conf)
206
      {
207
        print " [" . $snum . "]: " . $conf['url'] . " ";
208
        $carddav = new CardDavPHP\CardDavBackend($conf['url']);
209
        $carddav->setAuth($conf['user'], $conf['pw']);
210
211
        // set the vcard extension in case the user
212
        // defined it in the config
213
        if(isset($conf['extension']))
214
          $carddav->setVcardExtension($conf['extension']);
215
216
        // retrieve data from the CardDAV server now
217
        $xmldata = $carddav->get();
218
219
        // identify if we received UTF-8 encoded data from the
220
        // CardDAV server and if not reencode it since the FRITZ!Box
221
        // requires UTF-8 encoded data
222
        if(iconv('utf-8', 'utf-8//IGNORE', $xmldata) != $xmldata)
223
          $xmldata = utf8_encode($xmldata);
224
225
        // read raw_vcard data from xml response
226
        $raw_vcards = array();
227
        $xmlvcard = new SimpleXMLElement($xmldata);
228
229
        foreach($xmlvcard->element as $vcard_element)
230
        {
231
          $id = $vcard_element->id->__toString();
232
          $value = (string)$vcard_element->vcard->__toString();
233
          $raw_vcards[$id] = $value;
234
        }
235
236
        print " " . count($raw_vcards) . " VCards retrieved." . PHP_EOL;
237
238
        // parse raw_vcards
239
        $quick_dial_arr = array();
240
        foreach($raw_vcards as $v)
241
        {
242
          $vcard_obj = new vCard(false, $v);
243
          $name_arr = null;
244
          if(isset($vcard_obj->n[0]))
0 ignored issues
show
The property n does not exist on object<vCard>. Since you implemented __get, maybe consider adding a @property annotation.

Since your code implements the magic getter _get, this function will be called for any read access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

If the property has read access only, you can use the @property-read annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
245
            $name_arr = $vcard_obj->n[0];
0 ignored issues
show
The property n does not exist on object<vCard>. Since you implemented __get, maybe consider adding a @property annotation.

Since your code implements the magic getter _get, this function will be called for any read access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

If the property has read access only, you can use the @property-read annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
246
          $org_arr = null;
247
          if(isset($vcard_obj->org[0]))
0 ignored issues
show
The property org does not exist on object<vCard>. Since you implemented __get, maybe consider adding a @property annotation.

Since your code implements the magic getter _get, this function will be called for any read access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

If the property has read access only, you can use the @property-read annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
248
            $org_arr = $vcard_obj->org[0];
0 ignored issues
show
The property org does not exist on object<vCard>. Since you implemented __get, maybe consider adding a @property annotation.

Since your code implements the magic getter _get, this function will be called for any read access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

If the property has read access only, you can use the @property-read annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
249
          $addnames = '';
250
          $prefix = '';
251
          $suffix = '';
252
          $orgname = '';
253
          $formattedname = '';
254
255
          // Build name Parts if existing ans switch to true in config
256
          if(isset($name_arr['prefixes']) and $this->config['prefix'])
257
            $prefix = trim($name_arr['prefixes']);
258
259
          if(isset($name_arr['suffixes']) and $this->config['suffix'])
260
            $suffix = trim($name_arr['suffixes']);
261
262
          if(isset($name_arr['additionalnames']) and $this->config['addnames'])
263
            $addnames = trim($name_arr['additionalnames']);
264
265
          if(isset($org_arr['name']) and $this->config['orgname'])
266
            $orgname = trim($org_arr['name']);
267
268
          if (isset($vcard_obj->fn[0]))
0 ignored issues
show
The property fn does not exist on object<vCard>. Since you implemented __get, maybe consider adding a @property annotation.

Since your code implements the magic getter _get, this function will be called for any read access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

If the property has read access only, you can use the @property-read annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
269
            $formattedname = $vcard_obj->fn[0];
0 ignored issues
show
The property fn does not exist on object<vCard>. Since you implemented __get, maybe consider adding a @property annotation.

Since your code implements the magic getter _get, this function will be called for any read access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

If the property has read access only, you can use the @property-read annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
270
271
          $firstname = trim($name_arr['firstname']);
272
          $lastname = trim($name_arr['lastname']);
273
274
          // the following section implemented different ways of constructing the
275
          // final phonebook name entry depending on user preferred settings
276
          // selectable in the config file. Possible options are:
277
          //
278
          // $this->config['fullname_format']:
0 ignored issues
show
Unused Code Comprehensibility introduced by
75% of this comment could be valid code. Did you maybe forget this after debugging?

Sometimes obsolete code just ends up commented out instead of removed. In this case it is better to remove the code once you have checked you do not need it.

The code might also have been commented out for debugging purposes. In this case it is vital that someone uncomments it again or your project may behave in very unexpected ways in production.

This check looks for comments that seem to be mostly valid code and reports them.

Loading history...
279
          //
280
          // 0: "Prefix Lastname, Firstname AdditionalNames Suffix (orgname)"
281
          // 1: "Prefix Firstname Lastname AdditionalNames Suffix (orgname)"
282
          // 2: "Prefix Firstname AdditionalNames Lastname Suffix (orgname)"
283
          //
284
          $name = '';
285
          $format = $this->config['fullname_format'];
286
287
          // Prefix
288
          if(!empty($prefix))
289
            $name .= $prefix;
290
291 View Code Duplication
          if($format == 0)
0 ignored issues
show
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
292
          {
293
            // Lastname
294
            if(!empty($name) and !empty($lastname))
295
              $name .= ' ' . $lastname;
296
            else
297
              $name .= $lastname;
298
          }
299
          else
300
          {
301
            // Firstname
302
            if(!empty($name) and !empty($firstname))
303
              $name .= ' ' . $firstname;
304
            else
305
              $name .= $firstname;
306
          }
307
308 View Code Duplication
          if($format == 2)
0 ignored issues
show
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
309
          {
310
            // AdditionalNames
311
            if(!empty($name) and !empty($addnames))
312
              $name .= ' ' . $addnames;
313
            else
314
              $name .= $addnames;
315
          }
316
317 View Code Duplication
          if($format == 0)
0 ignored issues
show
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
318
          {
319
            // Firstname
320
            if(!empty($name) and !empty($firstname))
321
              $name .= ', ' . $firstname;
322
            else
323
              $name .= $firstname;
324
          }
325
          else
326
          {
327
            // Lastname
328
            if(!empty($name) and !empty($lastname))
329
              $name .= ' ' . $lastname;
330
            else
331
              $name .= $lastname;
332
          }
333
334 View Code Duplication
          if($format != 2)
0 ignored issues
show
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
335
          {
336
            // AdditionalNames
337
            if(!empty($name) and !empty($addnames))
338
              $name .= ' ' . $addnames;
339
            else
340
              $name .= $addnames;
341
          }
342
343
          // Suffix
344
          if(!empty($name) and !empty($suffix))
345
            $name .= ' ' . $suffix;
346
          else
347
            $name .= $suffix;
348
349
          // OrgName
350
          if(!empty($name) and !empty($orgname))
351
            $name .= ' (' . $orgname . ')';
352
          else
353
            $name .= $orgname;
354
355
          // make sure to trim whitespaces and double spaces
356
          $name = trim(str_replace('  ', ' ', $name));
357
358
          // perform a fallback to formatted name, if we don't have any name and formatted name is available
359
          if(empty($name) and !empty($formattedname))
360
            $name = $formattedname;
361
362
          if(empty($name))
363
          {
364
            print '  WARNING: No fullname, lastname, orgname or formatted name found!' . PHP_EOL;
365
            $name = 'UNKNOWN';
366
          }
367
368
          // format filename of contact photo; remove special letters
369
          if($vcard_obj->photo)
0 ignored issues
show
The property photo does not exist on object<vCard>. Since you implemented __get, maybe consider adding a @property annotation.

Since your code implements the magic getter _get, this function will be called for any read access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

If the property has read access only, you can use the @property-read annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
370
          {
371
            $photo = str_replace(array(',', '&', ' ', '/', 'ä', 'ö', 'ü', 'Ä', 'Ö', 'Ü', 'ß', 'á', 'à', 'ó', 'ò', 'ú', 'ù', 'í', 'ø'),
372
            array('', '_', '_', '_', 'ae', 'oe', 'ue', 'Ae', 'Oe', 'Ue', 'ss', 'a', 'a', 'o', 'o', 'u', 'u', 'i', 'oe'), $name);
373
          }
374
          else
375
            $photo = '';
376
377
          // phone
378
          $phone_no = array();
379
          if($vcard_obj->categories)
0 ignored issues
show
The property categories does not exist on object<vCard>. Since you implemented __get, maybe consider adding a @property annotation.

Since your code implements the magic getter _get, this function will be called for any read access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

If the property has read access only, you can use the @property-read annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
380
            $categories = $vcard_obj->categories[0];
0 ignored issues
show
The property categories does not exist on object<vCard>. Since you implemented __get, maybe consider adding a @property annotation.

Since your code implements the magic getter _get, this function will be called for any read access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

If the property has read access only, you can use the @property-read annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
381
          else
382
            $categories = array();
383
384
          // check for quickdial entry
385
          if(isset($vcard_obj->note[0]))
0 ignored issues
show
The property note does not exist on object<vCard>. Since you implemented __get, maybe consider adding a @property annotation.

Since your code implements the magic getter _get, this function will be called for any read access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

If the property has read access only, you can use the @property-read annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
386
          {
387
            $note = $vcard_obj->note[0];
0 ignored issues
show
The property note does not exist on object<vCard>. Since you implemented __get, maybe consider adding a @property annotation.

Since your code implements the magic getter _get, this function will be called for any read access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

If the property has read access only, you can use the @property-read annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
388
            $notes = explode($this->config['quickdial_keyword'], $note);
389
            foreach($notes as $linenr => $linecontent)
390
            {
391
              $found = strrpos($linecontent, ":**7");
392
              if($found > 0)
393
              {
394
                $pos_qd_start = strrpos($linecontent, ":**7");
395
                $quick_dial_for_nr = preg_replace("/[^0-9+]/", "", substr($linecontent, 0, $pos_qd_start));
396
                $quick_dial_nr = intval(substr($linecontent, $pos_qd_start + 4, 3));
397
                $quick_dial_arr[$quick_dial_for_nr] = $quick_dial_nr;
398
              }
399
            }
400
          }
401
402
          // e-mail addresses
403
          $email_add = array();
404
          $vip = isset($this->config['group_vip']) && in_array((string)$this->config['group_vip'], $categories);
405
406
          if(array_key_exists('group_filter', $this->config) && is_array($this->config['group_filter']))
407
          {
408
            $add_entry = 0;
409
            foreach($this->config['group_filter'] as $group_filter)
410
            {
411
              if(in_array($group_filter, $categories))
412
              {
413
                $add_entry = 1;
414
                break;
415
              }
416
            }
417
          } 
418
          else
419
            $add_entry = 1;
420
421
          if($add_entry == 1)
422
          {
423
            foreach($vcard_obj->tel as $t)
0 ignored issues
show
The property tel does not exist on object<vCard>. Since you implemented __get, maybe consider adding a @property annotation.

Since your code implements the magic getter _get, this function will be called for any read access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

If the property has read access only, you can use the @property-read annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
424
            {
425
              $prio = 0;
426
              $quickdial = null;
427
              
428
              if(!is_array($t) || empty($t['type']))
429
              {
430
                $type = "mobile";
431
                $phone_number = $t;
432
              }
433
              else
434
              {
435
                $phone_number = $t['value'];
436
                
437
                $phone_number_clean = preg_replace("/[^0-9+]/", "", $phone_number);
438
                foreach($quick_dial_arr as $qd_phone_nr => $value)
439
                {
440
                  if($qd_phone_nr == $phone_number_clean)
441
                  {
442
                    //Set quickdial
443
                    if($value == 1)
444
                      print "\nWARNING: Quickdial value 1 (**701) is not possible but used! \n";
445
                    elseif($value >= 100)
446
                      print "\nWARNING: Quickdial value bigger than 99 (**799) is not possible but used! \n";
447
448
                    $quickdial = $value;
449
                  }
450
                }
451
452
                $typearr_lower = unserialize(strtolower(serialize($t['type'])));
453
454
                // find out priority
455
                if(in_array("pref", $typearr_lower))
456
                  $prio = 1;
457
458
                // set the proper type
459
                if(in_array("cell", $typearr_lower))
460
                  $type = "mobile";
461
                elseif(in_array("home", $typearr_lower))
462
                  $type = "home";
463
                elseif(in_array("fax", $typearr_lower))
464
                  $type = "fax_work";
465
                elseif(in_array("work", $typearr_lower))
466
                  $type = "work";
467
                elseif(in_array("other", $typearr_lower))
468
                  $type = "other";
469
                elseif(in_array("dom", $typearr_lower))
470
                  $type = "other";
471
                else
472
                  continue;
473
              }
474
              $phone_no[] = array("type"=>$type, "prio"=>$prio, "quickdial"=>$quickdial, "value" => $this->_clear_phone_number($phone_number));
475
            }
476
477
            // request email address and type
478
            if($vcard_obj->email)
0 ignored issues
show
The property email does not exist on object<vCard>. Since you implemented __get, maybe consider adding a @property annotation.

Since your code implements the magic getter _get, this function will be called for any read access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

If the property has read access only, you can use the @property-read annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
479
            {
480
              foreach($vcard_obj->email as $e)
0 ignored issues
show
The property email does not exist on object<vCard>. Since you implemented __get, maybe consider adding a @property annotation.

Since your code implements the magic getter _get, this function will be called for any read access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

If the property has read access only, you can use the @property-read annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
481
              {
482
                if(empty($e['type']))
483
                {
484
                  $type_email = "work";
485
                  $email = $e;
486
                }
487
                else
488
                {
489
                  $email = $e['value'];
490
                  $typearr_lower = unserialize(strtolower(serialize($e['type'])));
491
                  if(in_array("work", $typearr_lower))
492
                    $type_email = "work";
493
                  elseif(in_array("home", $typearr_lower))
494
                    $type_email = "home";
495
                  elseif(in_array("other", $typearr_lower))
496
                    $type_email = "other";
497
                  else
498
                    continue;
499
                }
500
501
                // DEBUG: print out the email address on the console
502
                //print $type_email.": ".$email."\n";
0 ignored issues
show
Unused Code Comprehensibility introduced by
60% of this comment could be valid code. Did you maybe forget this after debugging?

Sometimes obsolete code just ends up commented out instead of removed. In this case it is better to remove the code once you have checked you do not need it.

The code might also have been commented out for debugging purposes. In this case it is vital that someone uncomments it again or your project may behave in very unexpected ways in production.

This check looks for comments that seem to be mostly valid code and reports them.

Loading history...
503
504
                $email_add[] = array("type"=>$type_email, "value" => $email);
505
              }
506
            }
507
            $entries[] = array("realName" => $name, "telephony" => $phone_no, "email" => $email_add, "vip" => $vip, "photo" => $photo, "photo_data" => $vcard_obj->photo);
0 ignored issues
show
The property photo does not exist on object<vCard>. Since you implemented __get, maybe consider adding a @property annotation.

Since your code implements the magic getter _get, this function will be called for any read access on an undefined variable. You can add the @property annotation to your class or interface to document the existence of this variable.

<?php

/**
 * @property int $x
 * @property int $y
 * @property string $text
 */
class MyLabel
{
    private $properties;

    private $allowedProperties = array('x', 'y', 'text');

    public function __get($name)
    {
        if (isset($properties[$name]) && in_array($name, $this->allowedProperties)) {
            return $properties[$name];
        } else {
            return null;
        }
    }

    public function __set($name, $value)
    {
        if (in_array($name, $this->allowedProperties)) {
            $properties[$name] = $value;
        } else {
            throw new \LogicException("Property $name is not defined.");
        }
    }

}

If the property has read access only, you can use the @property-read annotation instead.

Of course, you may also just have mistyped another name, in which case you should fix the error.

See also the PhpDoc documentation for @property.

Loading history...
508
          }
509
        }
510
511
        $snum++;
512
      }
513
    }
514
515
    $this->entries = $entries;
516
  }
517
518
  private function _clear_phone_number($number)
519
  {
520
    return preg_replace("/[^0-9+]/", "", $number);
521
  }
522
523
  public function build_fb_xml()
524
  {
525
    if(empty($this->entries))
526
      throw new Exception('No entries available! Call get_carddav_entries or set $this->entries manually!');
527
528
    // create FB XML in utf-8 format
529
    $root = new SimpleXMLElement('<?xml version="1.0" encoding="UTF-8"?><phonebooks><phonebook></phonebook></phonebooks>');
530
    $pb = $root->phonebook;
531
    $pb->addAttribute("name", $this->config['phonebook_name']);
532
533
    foreach($this->entries as $entry)
534
    {
535
      $contact = $pb->addChild("contact");
536
      $contact->addChild("category", $entry['vip']);
537
      $person = $contact->addChild("person");
538
      $person->addChild("realName", $this->_convert_text($entry['realName']));
539
540
      echo " VCard: '" . utf8_decode($entry['realName']) . "'" . PHP_EOL;
541
542
      // telephone: put the phonenumbers into the fritzbox xml file
543
      $telephony = $contact->addChild("telephony");
544
      $id = 0;
545
      foreach($entry['telephony'] as $tel)
546
      {
547
        $num = $telephony->addChild("number", $tel['value']);
548
        $num->addAttribute("type", $tel['type']);
549
        $num->addAttribute("vanity", "");
550
        $num->addAttribute("prio", $tel['prio']);
551
        $num->addAttribute("id", $id);
552
553
        if(isset($tel['quickdial']))
554
        {
555
          $num->addAttribute("quickdial", $tel['quickdial']);
556
          print "  Added quickdial: " . $tel['quickdial'] . " for: " . $tel['value'] . " (" . $tel['type'] . ")" . PHP_EOL;
557
        }
558
559
        $id++;
560
        print "  Added phone: " . $tel['value'] . " (" . $tel['type'] . ")" . PHP_EOL;
561
      }
562
563
      // output a warning if no telephone number was found
564
      if($id == 0)
565
        print "  WARNING: no phone entry found. VCard will be ignored." . PHP_EOL;
566
567
      // email: put the email addresses into the fritzbox xml file
568
      $email = $contact->addChild("services");
569
      $id = 0;
570
      foreach($entry['email'] as $mail)
571
      {
572
        $mail_adr = $email->addChild("email", $mail['value']);
573
        $mail_adr->addAttribute("classifier", $mail['type']);
574
        $mail_adr->addAttribute("id", $id);
575
        $id++;
576
577
        print "  Added email: " . $mail['value'] . " (" . $mail['type'] . ")" . PHP_EOL;
578
      }
579
580
      // check for a photo being part of the VCard
581
      if(($entry['photo']) and ($entry['photo_data']) and (is_array($entry['photo_data'])) and ($entry['photo_data'][0]))
582
      {
583
        // check if 'photo_data'[0] is an array as well because then
584
        // we have to extract ['value'] and friends.
585
        if(is_array($entry['photo_data'][0]) and (array_key_exists('value', $entry['photo_data'][0])))
586
        {
587
          // check if photo_data really contains JPEG data
588
          if((array_key_exists('type', $entry['photo_data'][0])) and (is_array($entry['photo_data'][0]['type'])) and
589
             ($entry['photo_data'][0]['type'][0] == 'jpeg' or $entry['photo_data'][0]['type'][0] == 'jpg' or $entry['photo_data'][0]['type'][0] == 'image/jpeg'))
590
          {
591
            // get photo, rename, base64 convert and save as jpg
592
            $photo_data = $entry['photo_data'][0]['value'];
593
            $photo_version = substr(sha1($photo_data), 0, 5);
594
            $photo_file = $this->tmpdir . '/' . "{$entry['photo']}_{$photo_version}.jpg";
595
596
            // check for base64 encoding of the photo data and convert it
597
            // accordingly.
598
            if(((array_key_exists('encoding', $entry['photo_data'][0])) and ($entry['photo_data'][0]['encoding'] == 'b')) or $this->is_base64($photo_data))
599
            {
600
              file_put_contents($photo_file . ".b64", $photo_data);
601
              $this->base64_to_jpeg($photo_file . ".b64", $photo_file);
602
              unlink($photo_file . ".b64");
603
            }
604
            else
605
            {
606
              print "  WARNING: non-base64 encoded photo data found and used." . PHP_EOL;
607
              file_put_contents($photo_file, $photo_data);
608
            }
609
610
            // add contact photo to xml
611
            $person->addChild("imageURL", $this->config['fritzbox_path'] . $this->config['usb_disk'] . "FRITZ/fonpix/" . basename($photo_file));
612
613
            print "  Added photo: " . basename($photo_file) . PHP_EOL;
614
          }
615
          else
616
           print "  WARNING: Only jpg contact photos are currently supported." . PHP_EOL;
617
        }
618
        elseif(substr($entry['photo_data'][0], 0, 4) == 'http')
619
        {
620
          // add contact photo to xml
621
          $person->addChild("imageURL", $entry['photo_data'][0]);
622
623
          print "  Added photo: " . $entry['photo_data'][0] . PHP_EOL;
624
        }
625
        else
626
          print "  WARNING: Only VCard embedded photo data or a reference URL is currently supported." . PHP_EOL;
627
      }
628
629
      $contact->addChild("services");
630
      $contact->addChild("setup");
631
      $contact->addChild("mod_time", (string)time());
632
    }
633
634
    if($root->asXML() !== false)
635
      $this->fbxml = $root->asXML();
636
    else
637
    {
638
      print "  ERROR: created XML data isn't well-formed." . PHP_EOL;
639
      exit(1);
640
    }
641
  }
642
643
  public function _convert_text($text)
644
  {
645
    $text = htmlspecialchars($text);
646
    return $text;
647
  }
648
649
  public function _concat($text1, $text2)
650
  {
651
    if($text1 == '')
652
      return $text2;
653
    elseif($text2 == '')
654
      return $text1;
655
    else
656
      return $text1 . ", " . $text2;
657
  }
658
659
  public function _parse_fb_result($text)
660
  {
661
    if(preg_match("/\<h2\>([^\<]+)\<\/h2\>/", $text, $matches) == 1 && !empty($matches))
662
      return $matches[1];
663
    else
664
      return "Error while uploading xml to fritzbox";
665
  }
666
667
  public function upload_to_fb()
668
  {
669
    // if the user wants to save the xml to a separate file, we do so now
670
    if(array_key_exists('output_file', $this->config))
671
    {
672
      // build md5 hash of previous stored xml without <mod_time> Elements
673
      $oldphonebhash = md5(preg_replace("/<mod_time>(\\d{10})/","",file_get_contents($this->config['output_file'],'r'),-1,$debugoldtsreplace));
674
      $output = fopen($this->config['output_file'], 'w');
675
      if($output)
676
      {
677
        fwrite($output, $this->fbxml);
678
        fclose($output);
679
        print " Saved to file " . $this->config['output_file'] . PHP_EOL;
680
      }
681
	  if (array_key_exists('output_and_upload', $this->config) and $this->config['output_and_upload'])
682
	  {
683
	  	$newphonebhash = md5(preg_replace("/<mod_time>(\\d{10})/","",file_get_contents($this->config['output_file'],'r'),-1,$debugnewtsreplace));
684
	  	print " INFO: Compare old and new phonebook file versions." . PHP_EOL . " INFO: old version: " . $oldphonebhash . PHP_EOL . " INFO: new version: " . $newphonebhash . PHP_EOL;
685
	  	if($oldphonebhash === $newphonebhash)
686
      	{
687
      	print " INFO: Same versions ==> No changes in phonebook or images" . PHP_EOL . " EXIT: No need to upload phonebook to the FRITZ!Box.". PHP_EOL;
688
      	return 0;
689
      	}
690
      	else
691
      	print " INFO: Different versions ==> Changes in phonebook." . PHP_EOL . " INFO: Changes dedected! Continue with upload." . PHP_EOL;
692
      }
693
	  else
694
      return 0;  
695
    }
696
    // now we upload the photo jpgs first being stored in the
697
    // temp directory.
698
699
    // perform an ftps-connection to copy over the photos to a specified directory
700
    $ftp_server = $this->config['fritzbox_ip_ftp'];
701
    $conn_id = ftp_ssl_connect($ftp_server);
702 View Code Duplication
    if($conn_id == false)
0 ignored issues
show
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
703
    {
704
      print " WARNING: Secure connection to FTP-server '" . $ftp_server . "' failed, retrying without SSL." . PHP_EOL;
705
      $conn_id = ftp_connect($ftp_server);
706
    }
707
708
    if($conn_id != false)
709
    {
710
      ftp_set_option($conn_id, FTP_TIMEOUT_SEC, 60);
711
      $login_result = ftp_login($conn_id, $this->config['fritzbox_user'], $this->config['fritzbox_pw']);
712
      if($login_result === true)
713
      {
714
        ftp_pasv($conn_id, true);
715
716
        // create remote photo path on FRITZ!Box if it doesn't exist
717
        $remote_path = $this->config['usb_disk'] . "/FRITZ/fonpix";
718
        $all_existing_files = ftp_nlist($conn_id, $remote_path);
719
        if($all_existing_files == false)
720
        {
721
          ftp_mkdir($conn_id, $remote_path);
722
          $all_existing_files = array();
723
        }
724
725
        // now iterate through all jpg files in tempdir and upload them if necessary
726
        $dir = new DirectoryIterator($this->tmpdir);
727
        foreach($dir as $fileinfo)
728
        {
729
          if(!$fileinfo->isDot())
730
          {
731
            if($fileinfo->getExtension() == "jpg")
732
            {
733
              $file = $fileinfo->getFilename();
734
735
              print " FTP-Upload '" . $file . "'...";
736
              if(!in_array($remote_path . "/" . $file, $all_existing_files))
737
              {
738
                if(!ftp_put($conn_id, $remote_path . "/" . $file, $fileinfo->getPathname(), FTP_BINARY))
739
                {
740
                  // retry when a fault occurs.
741
                  print " retrying... ";
742
                  $conn_id = ftp_ssl_connect($ftp_server);
743 View Code Duplication
                  if($conn_id == false)
0 ignored issues
show
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
744
                  {
745
                    print " WARNING: Secure re-connection to FTP-server '" . $ftp_server . "' failed, retrying without SSL." . PHP_EOL;
746
                    $conn_id = ftp_connect($ftp_server);
747
                  }
748
749
                  if($conn_id == false)
750
                  {
751
                    print " ERROR: couldn't re-connect to FTP server '" . $ftp_server . "', abortіng." . PHP_EOL;
752
                    break;
753
                  }
754
755
                  $login_result = ftp_login($conn_id, $this->config['fritzbox_user'], $this->config['fritzbox_pw']);
756
                  if($login_result === false)
757
                  {
758
                    print " ERROR: couldn't re-login to FTP-server '" . $ftp_server . "' with provided username/password settings." . PHP_EOL;
759
                    break;
760
                  }
761
762
                  ftp_pasv($conn_id, true);
763
                  if(!ftp_put($conn_id, $remote_path . "/" . $file, $fileinfo->getPathname(), FTP_BINARY))
764
                    print " ERROR: while uploading file " . $fileinfo->getFilename() . PHP_EOL;
765
                  else
766
                    print " ok." . PHP_EOL;
767
                }
768
                else
769
                  print " ok." . PHP_EOL;
770
771
                // cleanup old files
772
                foreach($all_existing_files as $existing_file)
773
                {
774
                  if(strpos($existing_file, $remote_path . "/" . substr($file, 0, -10)) !== false)
775
                  {
776
                    print " FTP-Delete: " . $existing_file . PHP_EOL;
777
                    ftp_delete($conn_id, $remote_path . "/" . basename($existing_file));
778
                  }
779
                }
780
              }
781
              else
782
                print " already exists." . PHP_EOL;
783
            }
784
          }
785
        }
786
      }
787
      else
788
        print " ERROR: couldn't login to FTP-server '" . $ftp_server . "' with provided username/password settings." . PHP_EOL;
789
790
      // close ftp connection
791
      ftp_close($conn_id);
792
    }
793
    else
794
      print " ERROR: couldn't connect to FTP server '" . $ftp_server . "'." . PHP_EOL;
795
    
796
    // lets post the phonebook xml to the FRITZ!Box
797
    print " Uploading Phonebook XML to " . $this->config['fritzbox_ip'] . PHP_EOL;
798
    try
799
    {
800
      $fritz = new fritzbox_api($this->config['fritzbox_pw'],
801
        $this->config['fritzbox_user'],
802
        $this->config['fritzbox_ip'],
803
        $this->config['fritzbox_force_local_login']);
804
805
      $formfields = array(
806
        'PhonebookId' => $this->config['phonebook_number']
807
      );
808
809
      $filefileds = array('PhonebookImportFile' => array(
810
       'type' => 'text/xml',
811
       'filename' => 'updatepb.xml',
812
       'content' => $this->fbxml,
813
       )
814
      );
815
816
      $raw_result = $fritz->doPostFile($formfields, $filefileds); // send the command
817
      $msg = $this->_parse_fb_result($raw_result);
818
      unset($fritz); // destroy the object to log out
819
820
      print "  FRITZ!Box returned message: '" . $msg . "'" . PHP_EOL;
821
    }
822
    catch(Exception $e)
823
    {
824
      print "  ERROR: " . $e->getMessage() . PHP_EOL; // show the error message in anything failed
825
      return false;
826
    }
827
    return true;
828
  }
829
}
830