Get color_id from a Google Calendar using API [PHP]

For a project I needed to get the events from a Google Calendar, as well as the colors from it.

It’s been a pain, but after a couple of days I’ve been able to create a PHP page to do so. It will use the server-to-server auth mechanism.

I’ll try to provide the different steps (please note that my Google Console is in French so I tried to translate) :

  1. Go to https://console.developers.google.com/apis/api/calendar/overview and Activate the Calendar API (or create first a project if required)
  2. Once the API is activated you should be invited to go to the Identification part ; make sure you choose « Account Service Key » for the identification mode
  3. Then pick « New Service » and complete the fields (choose JSON for the file format)
  4. Download the JSON file and save it where your PHP file will stand on your web server
  5. Open the JSON file and search for the client_email
  6. Go to https://calendar.google.com/ and in the sharing parameters : make sure that you share your calendar in editing with the client_email address found in the previous step (the editing mode is required to get the Colors)
  7. Now you need to install the PHP library from Google … in my case I don’t have a console access on the server, so I transfered the files from Github to the web server, in the same directory as our PHP file will be (so I got a folder called google-api-php-client-1.1.7)
  8. Create your PHP file with the below content :
    <?php
    // make sure the include path got the Google API (please refer to https://developers.google.com/api-client-library/php/start/installation)
    set_include_path(get_include_path() . PATH_SEPARATOR . '/full/path/WordPress/wp-content/agenda/google-api-php-client-1.1.7/src/Google');
    require_once "autoload.php";
    
    // Connect to the Google Calendar Service
    $client = new Google_Client();
    $client->setApplicationName("Google Calendar");
    $data = json_decode(file_get_contents('YourKeyFile-xxxxx.json'));
    $client_id = $data->client_id;
    $client_email = $data->client_email;
    $cred = new Google_Auth_AssertionCredentials(
      $client_email,
      array(Google_Service_Calendar::CALENDAR),
      $data->private_key
    );
    
    // Remember to cache the access token locally if making multiple calls
    // and don't just use this function for each request!
    $client->getAuth()->refreshTokenWithAssertion($cred);
    $service = new Google_Service_Calendar($client);
    $optParams = array(
      "calendarId"   => "TheGoogleAccountForTheCalendar@gmail.com",
      "singleEvents" => true,
      "timeZone"     => "Europe/Paris",
      "maxResults"   => 250,
      "timeMin"      => date("c", strtotime("midnight")), /* to get events from today... */
      "timeMax"      => date("c",strtotime('+3 day')), /* ...to the 3 next days */
      "orderBy"      => "startTime"
    );
    $events = $service->events->listEvents('TheGoogleAccountForTheCalendar@gmail.com', $optParams);
    ?>
    <!DOCTYPE html>
    <html>
      <head>
        <meta charset="UTF-8">
        <meta http-equiv="Content-Language" content="fr" />
        <meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1">
      </head>
      <body>
    <?php
      while(true) {
        foreach ($events->getItems() as $event) {
          $endTime = new DateTime($event->getEnd()->getDateTime());
          echo $event->getSummary() ." [".$event->getColorId()."] (".$endTime->format('Y-m-d').")<br>";
        }
        $pageToken = $events->getNextPageToken();
        if ($pageToken) {
          $optParams['pageToken'] = $pageToken;
          $events = $service->events->listEvents('lgpmontpellier@gmail.com', $optParams);
        } else {
          break;
        }
      }
    ?>
      </body>
    </html>
    

    Finally you can refer to the Google Calendar API.

    FYI I retrieved the below colorId for the below available colors:

        // same order as the image above
        switch ($event->getColorId()) {
          case 9: $color="#5484ED"; break;
          case 1: $color="#A4BDFC"; break;
          case 7: $color="#46D6DB"; break;
          case 2: $color="#7AE7BF"; break;
          case 10: $color="#51B749"; break;
          case 5: $color="#FBD75B"; break;
          case 6: $color="#FFB878"; break;
          case 4: $color="#FF887C"; break;
          case 11: $color="#DC2127"; break;
          case 3: $color="#DBADFF"; break;
          case 8: $color="#E1E1E1"; break;
          default: $color="#AC725E"; // the first one in the picture, the one that is checked
        }
    

Mise à jour d’un serveur Kimsufi (OVH) depuis Debian 7.10 (Wheezy) vers Debian 8 (Jessie) [Linux]

Il faut régulièrement penser à mettre à jour son serveur Kimsufi.

Je vais essayer d’expliquer brièvement les étapes à suivre pour cela.

  1. On va d’abord sauvegarder les données :
    mkdir /root/svg_special; cp -R /var/lib/dpkg /root/svg_special/; cp /var/lib/apt/extended_states /root/svg_special/; dpkg --get-selections "*" > /root/svg_special/dpkg_get_selection; cp -R /etc /root/svg_special/etc
  2. Ensuite il est conseillé d’utiliser screen pour pouvoir se reconnecter (avec screen -r) à en cas de déconnexion :
    screen
  3. On peut lancer la commande dpkg --audit pour s’assurer que tout est bon avant la migration. On peut également taper dpkg --get-selections "*" | more et vérifier qu’aucun paquet n’est en on hold
  4. Maintenant il faut remplacer tous les « wheezy » de /etc/apt/sources.list par des « jessie », ce qui va donner chez moi :
    deb http://ftp.fr.debian.org/debian jessie main non-free
    
    deb http://debian.mirrors.ovh.net/debian/ jessie main
    deb-src http://debian.mirrors.ovh.net/debian/ jessie main
    
    deb http://security.debian.org/ jessie/updates main
    deb-src http://security.debian.org/ jessie/updates main
    
  5. Il est recommandé d’utiliser le programme /usr/bin/script pour enregistrer une transcription de la session de mise à niveau. Ainsi, quand un problème survient, on a un enregistrement de ce qui s’est passé. Pour démarrer un enregistrement, taper :
    script -t 2>~/upgrade-jessie.time -a ~/upgrade-jessie.script
  6. On passe aux choses sérieuses, en commençant par mettre à jour les listes des paquets :
    apt-get update
  7. On va vérifier qu’on a la place suffisante (un message explicite apparait sinon) :
    apt-get -o APT::Get::Trivial-Only=true dist-upgrade
  8. On va maintenant faire une mise à jour minimale :
    apt-get upgrade
  9. Et à partir de là le système va vous questionner… en général choisir l’option par défaut si vous ne savez pas quoi répondre
  10. Puis on continue avec
    apt-get dist-upgrade

Cette dernière étape va durer un certain temps. Une fois terminé, vous pouvez redémarrer le serveur pour s’assurer que tout va bien.

Après tout ça j’ai rencontré un problème avec la version 2.4 d’Apache, en ayant l’erreur :

AH01630: client denied by server configuration

En cherchant j’ai trouvé des modifications au niveau de la configuration, à savoir qu’il faut mettre Require all granted dans tous les <Directory> des virtual hosts :

<Directory />
  Options FollowSymLinks
  Require all granted
</Directory>

De même, concernant phpmyadmin, il faut modifier /etc/phpmyadmin/apache.conf (avec Require all denied par exemple).

Avec phpmyadmin vous pourriez recevoir l’erreur suivante :

PHP Fatal error: require_once(): Failed opening required ‘./libraries/php-gettext/gettext.inc’ (include_path=’.’) in /usr/share/phpmyadmin/libraries/select_lang.lib.php

Dans ce cas là, il faut rajouter /usr/share/php/php-gettext/ dans le fichier /etc/phpmyadmin/apache.conf sur la ligne open_base_dir (voir superuser.com). Ce qui va donner la ligne : php_admin_value open_basedir /usr/share/phpmyadmin/:/etc/phpmyadmin/:/var/lib/phpmyadmin/:/usr/share/php/php-gettext/

Mon fichier apache2.conf avait été aussi modifié et certains fichiers de configuration n’étaient plus lus (ceux dans le répertoire /etc/apache2/conf.d/). De même il faudra renommer les fichiers présents dans /etc/apache2/sites-available/ en y ajoutant l’extension .conf (et relancer la commande a2ensite sur vos fichiers renommés).

Si vous utilisez des fichiers .htaccess (par exemple avec WordPress), alors assurez vous d’utiliser la balise AllowOverride All … par exemple dans un de vos fichiers de configuration d’Apache il faudra mettre (pour indiquer que tous les .htaccess dans /home/websites/www sont autorisés) :

<Directory /home/websites/www>
   AllowOverride All
</Directory>

Sur un des serveurs il y avait un problème d'encodage avec les fichiers en PHP alors que les HTML n'avaient pas de soucis. Après avoir cherché j'ai découvert que dans le cas de ce serveur je devais modifier /etc/php5/apache2/php.ini pour y mettre default_charset = Off.

Et finalement on va nettoyer tous les paquets avec

apt-get autoremove

Passer son serveur Apache en HTTPS avec Let’s Encrypt

Je vais expliquer les différentes étapes pour passer un serveur Apache en HTTPS grâce à Let’s Encrypt.

Toutes les opérations vont se passer dans une console sur le serveur Linux en mode root. J’utilise ici une Debian 7.10 « Wheezy ».

Je me suis aidé de cet article en anglais.

  1. Commencer par nettoyer le contenu de /etc/apache2/sites-available/ en supprimant tous les fichiers inutiles
  2. Aller dans /root
  3. Installer git (s’il n’est pas déjà installer) : $ apt-get install git
  4. Ensuite on tape les commandes suivantes :
    • $ git clone https://github.com/letsencrypt/letsencrypt
    • $ cd letsencrypt
    • $ ./letsencrypt-auto --help
  5. Plusieurs programmes vont s’installer.
  6. Maintenant on tape : $ ./letsencrypt-auto --apache
  7. Si vous obtenez l’erreur Apache plugin support requires libaugeas0 and augeas-lenses version 1.2.0 or higher, please make sure you have you have those installed. alors il va falloir utiliser un backport debian repositories :
    • On commence par éditer le fichier /etc/apt/sources.list en y ajoutant la ligne deb http://ftp.debian.org/debian wheezy-backports main
    • Puis on tape $ apt-get update
    • Et ensuite $ apt-get install -t wheezy-backports libaugeas0 augeas-lenses
    • On peut maintenant refaire $ ./letsencrypt-auto --verbose --apache
  8. Une boite de dialogue s’ouvre vous indiquant les domaines trouvés sur votre machine. Par défaut ils sont tous cochés. Suivez les instructions
  9. Une fois fait, si vous avez l’erreur urn:acme:error:connection :: The server could not connect to the client to verify the domain :: Failed to connect to host for DVSNI challenge il peut y avoir plusieurs raisons… Pour ma part c’était le firewall qui bloquait le port 443
  10. Ou si vous avez une erreur liée à un domaine, assurez-vous que celui-ci pointe bien vers votre box en utilisant la commande nslookup -debug blog.kodono.info 8.8.8.8

Vous devriez maintenant avoir accès à votre site web avec https.

Attention car le certificat Let’s Encrypt expire après 90 jours. Il va donc falloir mettre en place un cron job. On peut prendre celui de https://thealphanerd.io/blog/securing-apache-and-znc-with-letsencrypt/ :

#!/bin/sh
if ! /path/to/letsencrypt/letsencrypt-auto renew > /var/log/letsencrypt/renew.log 2>&1 ; then
  echo Automated renewal failed:
  cat /var/log/letsencrypt/renew.log
  exit 1
fi

On va le placer dans /etc/cron.daily/update-certs (avec les droits 755), et le cron va s’en occuper tout seul.

Si vous continuez à autoriser le HTTP et le HTTPS, alors, pour éviter le mixed content (c’est-à-dire du contenu http qui est appelé sur votre site https) on peut se la jouer brut-force en utilisant un module d’Apache qui va modifier le contenu des pages avant de les renvoyer. À mon sens cela devrait être temporaire, le temps de modifier tous vos fichiers.

  1. On va commencer par installer le module substitude: a2enmod substitute
  2. Ensuite on utilise le nouveau module pour remplacer les http://notresite en https://notresite, ainsi que les liens extérieurs de http:// en //. Pour cela on modifie nos fichiers .conf dans /etc/apache2/sites-available/ en y ajoutant :
 <Location />
 <If "%{SERVER_PORT} == 443">
 AddOutputFilterByType INFLATE;SUBSTITUTE;DEFLATE text/html text/plain text/xml
 Substitute "s|action=\"http:|action=\"|"
 Substitute "s|action='http:|action='|"
 Substitute "s|src=\"http:|src=\"|"
 Substitute "s|src='http:|src='|"
 Substitute "s|href=\"http:|href=\"|"
 Substitute "s|href='http:|href='|"
 <If>
</Location>

J’utilise <If "%{SERVER_PORT} == 443"> pour n’enclencher la substitution que lorsqu’on demande de l’HTTPS.
Et on oubliera pas de faire un apache2ctl configtest pour vérifier que tout est bon, puis un service apache2 reload pour prendre en compte les modifications !

Play with ribbon on Sharepoint

In Sharepoint 2010 and 2013, there are some existing functions to deal with the ribbon.

Below an example of what we can do:

// we need the file "sp.ribbon.js"
SP.SOD.executeOrDelayUntilScriptLoaded(function () {
  // use PageManager
  var pm = SP.Ribbon.PageManager.get_instance();

  // define a function to call when the ribbon is loaded
  var DoSomethingWithRibbon=function(ribbon) {
    // For example, we can select the "Browse" tab
    ribbon.selectTabById("Ribbon.ListForm.Display", true);
    // Note: You can explore the DOM to find the related IDs
    // other example "Edit" tab is "Ribbon.ListForm.Edit"
  
    // We can now remove the "Edit" tab
    ribbon.removeChild("Ribbon.ListForm.Edit");
  }

  // perform an action when the ribbon has been inited
  pm.add_ribbonInited(function () {
    DoSomethingWithRibbon(pm.get_ribbon())
  });

  // if the ribbon is already loaded
  var ribbon = null;
  try {
    // get an instance of the ribbon
    ribbon = pm.get_ribbon();
  } catch (e) {}
  if (!ribbon) {
    if (typeof(_ribbonStartInit) == "function")
      _ribbonStartInit(_ribbon.initialTabId, false, null);
  } else {
    DoSomethingWithRibbon(ribbon);
  }

}, "sp.ribbon.js");

And there are also solutions to add stuff to the ribbon. I have to dig into these solutions… In the meantime you can try this blog post, or this one.

Mise à jour mysql 5.5 vers 5.6, sur Debian Wheezy

1) Nouveau repo

On crée d’abord le fichier /etc/apt/sources.list.d/mysql.list avec les deux lignes ci-dessous :
deb http://repo.mysql.com/apt/debian/ wheezy mysql-5.6
deb-src http://repo.mysql.com/apt/debian/ wheezy mysql-5.6

2) Clé publique du repo

On crée un fichier mysql.key dans lequel on copie/colle la clé publique de mysql.

Puis on l’ajoute à apt :
apt-key add mysql.key

3) Export / Backup

On va faire une sauvegarde de la base de données et de la configuration de mysql :
mysqldump -u root -pPASSWORD --add-drop-table --routines --events --add-drop-table --all-databases --force > data-for-upgrade.sql
tar cvfvz /root/mysql_conf.tgz /etc/mysql

4) Arrêt du serveur

On stoppe mysql :
mysqladmin -u root -pPASSWORD shutdown

5) On met à jour apt

apt-get update

6) On installe

On installe la nouvelle version :
apt-get install mysql-server-5.6

7) On vérifie

Une fois fait, on lance :
mysql_upgrade -v -u root -pPASSWORD

8) Dernier upgrade

On lance l’upgrade pour que tout soit à jour :
apt-get upgrade

9) Mise à jour de PHP-Mysql

Si vous avez l’erreur mysql_connect(): Headers and client library minor version mismatch, il est recommandé d’installer php5-mysqlnd :
apt-get install php5-mysqlnd

How to change the default logon name on Windows 7

On a remote PC it was another logon name that appeared by default… In that case I had to click on « Switch User », then « Other User », and finally enter my username and password. Very frustrating.

After a few searches I found we can change the default name using the registry and with the below commands (to enter into a cmd console in admin mode) :
call reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Authentication\LogonUI" /v LastLoggedOnSAMUser /t REG_SZ /d "The_Default_Domain\The_Default_Username" /f
call reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Authentication\LogonUI" /v LastLoggedOnUser /t REG_SZ /d "The_Default_Domain\The_Default_Username" /f

Log off and The_Default_Domain\The_Default_Username should prompt!

VirtualBox qui utilise le VPN de la machine hôte

Dans le cadre de mon travail j’ai dû utiliser VirtualBox afin de pouvoir tester différentes versions d’IE. Mon problème est que mon PC utilise normalement un VPN pour accéder au réseau de l’entreprise et que ma VM n’arrive pas à y accéder de base….

Pour y remédier il faut d’abord définir deux adaptateurs dans l’onglet Network de la VM :

  1. NAT (s’assurer que « Cable Connected » est coché)
  2. Bridged Adapter (avec « Promiscous Mode »: Allow All, et « Cable Connected » de coché)

Ensuite, au niveau de la machine virtuelle, il devrait y avoir deux connexions :

  1. Une qui doit avoir une IP en 10.x.x.x (réseau du VPN)
  2. La deuxième qui doit avoir une IP de notre réseau local (192.168.0.x chez moi) … IP Local à définir manuellement si nécessaire, et à noter qu’il faut aussi définir les DNS manuellement (j’utilise ceux de Google) si on veut que ça fonctionne bien

A partir d’ici votre système devrait être en mesure d’accéder au réseau VPN.

(ci-dessous une configuration que je dois faire pour réussir à avoir un semblant d’accès au reste du Net … à noter que ça rend les choses instables)

Dans l’exemple qui suit on va supposer que ma gateway pour le VPN est 10.0.2.2 et pour le réseau local 192.168.0.254

Ensuite j’ai modifié les routes en ouvrant une console cmd en tant qu’administrateur puis je tape :
route print (pour trouver le numéro des interfaces, on va dire que #13 est pour 10.x.x.x et #15 pour l’interface en 192.168.0.x)
route -f (on flush les règles existantes)
route add 0.0.0.0 mask 0.0.0.0 192.168.0.254 IF 15 (par défaut tout le trafic passe par le réseau normal)
route add 10.0.0.0 mask 255.0.0.0 10.0.2.2 IF 13 (et tout ce qui concerne le réseau du VPN on l’envoie vers celui-ci)

Change screen saver timeout [Windows]

Let’s say your network admin blocked the default screensaver timeout to 15 minutes, but you want more…. You can change this timeout by running as an administrator the regedit then use the « Find… » command to look for « ScreenSaveTimeOut ».

It should be under Computer\HKEY_CURRENT_USER\Software\Policies\Microsoft\Windows\Control Panel\Desktop

The timeout is defined in seconds. Just change the value and reboot.

http://www.iegallery.com/addonsie7/ is returned when trying to change the default search engine for Internet Explorer

I have IE11 on my pro laptop, with Bing, while I want to use Google as my default search engine. However it keeps returning me the page http://www.iegallery.com/addonsie7/ with no way to install another search provider…

After looking for a solution, I found you can use the direct link http://www.iegallery.com/addonsie7/Detail?resourceId=13555 to be able to install Google on Internet Explorer.