Désactiver la fonctionnalité de « Tagging » des contacts

Désactiver la fonctionnalité de « Tagging » des contacts

19 août 2016 Non Par Stefan Plizga

Dans Lync et Skype for Business, il est possible de tagguer des contacts pour être notifié à chaque changement de statut, par exemple du passage de Hors ligne à Disponible, ou de Occupé à Disponible, et ainsi de suite…

Il peut arriver dans certains contextes qu’il soit demandé que la fonctionnalité soit désactivée. Et bien cela n’est pas possible nativement !

Cela dit, Lync Server et Skype for Business Server offrent des possibilités d’extensibilité côté serveur, grâce au MSPL (Microsoft SIP Processing Language), un language qui permet d’intéragir au niveau du proxy SIP directement et donc d’intercepter, de modifier ou même de rejeter des requêtes SIP. C’est d’ailleurs sur ce principe que toute la brique Lync Server / Skype for Business Server est bâtie. Pour les connaissance, je parle des « Server Applications » qu’il est possible de lister avec Get-CsServerApplication, il y en a déjà plusieurs nativement.

L’idée de ce billet est de montrer comment on peut bloquer cette fonctionnalité en utilisant le language MSPL afin d’intercepter les requêtes de tagging et les rejeter, tout simplement. Cela aura pour effet que le tagging ne soit pas fonctionnel.

Je vais faire court, je fourni directement le script en attachement, ContactTagBlocker.am. Grosso modo, voici ce qu’il fait :

  1. Il intercepte toutes les requêtes « SERVICE » et vérifie si le content-type « est application/SOAP+xml »
  2. Il cherche si le contenu XML contient la balise « contactSettings », et si celle-ci contient l’élement « tag »
  3. Si la valeur de l’élément « tag » est « true », c’est qu’il s’agit d’une requête de tagging d’un utilisateur, dans ce cas le script répond au client par un 403 (Forbidden / Interdit) et un petit message pour faciliter l’analyse des messages SIP côté client si nécessaire
  4. Dans le cas où toutes les conditions ci-dessus ne sont pas satisfaites, la requête continue son chemin dans le proxy SIP de Lync Server / Skype for Business Server

Le seul point à faire, c’est ajouter ce script dans les Server Applications du pool. Pour cela, il faut utiliser une commande de ce type :

$Priority = ((Get-CsServerApplication | ? {$_.Identity -match "UserServices"})[0]).Priority

New-CsServerApplication -Name ContactTagBlocker -Uri "https://plizgawpbloglinux.azurewebsites.net/ContactTagBlocker" -Enabled $True -ScriptName C:\MSPL\ContactTagBlocker\ContactTagBlocker.am -Critical $False -Priority $Priority -Parent (Get-CsService -Registrar)[0]

apides explications de ces 2 lignes PowerShell :

  1. La première ligne permet de récupérer la priorité de l’application User Services. C’est très important car le script en attachement doit s’exécuter avant User Services.
  2. La seconde ligne crée le Server Application. Il faut conserver toutes les valeurs telles qu’indiquées, et juste changer le chemin du script, qui dans mon exemple est dans le répertoire C:\MSPL\ContactTagBlocker

La création de ce Server Application se fait « à chaud », c’est-à-dire qu’elle ne nécessite pas de redémarrage du service Front End, le chargement se fait au bout de 1 à 2 minutes. On peut d’ailleurs voir un événement dans le journal d’événements Lync Server qui indique si le chargement s’est bien passé.

Quelques points d’attention cependant :

  • Les commandes PowerShell marcheront du premier coup dans le cas d’une infrastructure avec un seul pool. Il faudra un minimum adapter les 2 lignes pour récupérer la priorité de User Service du pool concerné et de changer le chiffre [0] après le Get-Registrar pour récupérer le pool souhaité.
  • Evidemment, ce script MSPL peut être installé sur tous les pools, qu’ils soient Standard ou Enterprise, en version Lync Server (dès la version 2010) ou Skype for Business Server 2015
  • Il faut copier le fichier .am sur tous les serveurs Front End du ou des pools sur lesquels le Server Application est créé
  • Le script ne rejette que les demandes de tagging, il laisse passer les demandes de suppression de tagging.
  • Tous les taggings déjà configurés resteront actifs jusqu’à ce qu’ils soient désactivés par l’utilisateur
  • Cette fonctionnalité n’est pas disponible dans Office 365

— Stefan

Voici le fichier (à renommer en ContactTagBlocker.am) : 

<?xml version="1.0"?>
<r:applicationManifest r:appUri="https://plizgawpbloglinux.azurewebsites.net/ContactTagBlocker" xmlns:r="http://schemas.microsoft.com/lcs/2006/05">
  <r:allowRegistrationBeforeUserServices/>
  <r:serverFilter roles="ALL"/>
  <r:requestFilter methodNames="SERVICE" strictRoute="true" />
  <r:responseFilter reasonCodes="NONE"/>
  <r:proxyByDefault action="true" />
  <r:scriptOnly/>

/*
 Version: 1.0
 Date   : 2016-08-19
 Author : Stefan Plizga
 Blog   : https://plizgawpbloglinux.azurewebsites.net
 Information: http://msdn.microsoft.com/en-us/library/office/hh347468(v=office.14).aspx
*/

  <r:splScript>
    <![CDATA[

    if (sipRequest)
    {
      scriptName = "ContactTagBlocker";

      contentType = "";
      foreach(ct in GetHeaderValues(StandardHeader.ContentType))
      {
        contentType = ct;
        break;
      }

      if (contentType == "application/SOAP+xml")
      {
        posContactSettings = IndexOfString(sipMessage.Content, "<contactSettings");
        if (posContactSettings >= 0)
        {
          foreach(xmlPart in Split(SubString(sipMessage.Content, posContactSettings + 1), ">"))
          {
            if (ContainsString(xmlPart, "tag=\"true\"", true))
            {          
              Log("Debug", false, "");
              Log("Debug", false, scriptName);
              Log("Debug", false, "Tagging request detected and blocked!");
              Log("Debug", false, GetUri(sipRequest.From));
              Log("Debug", false, GetUri(sipRequest.To));
              Respond("403", "Tagging feature is disabled!");
            }
            break;
          }
        }
      }   
    }

    ]]>
  </r:splScript>
</r:applicationManifest>