Ever wanted to stop another company your federated with seeing your presence but still wanted to do IM and all other UC functions. Well there is a way. As with all the scripts I post on VoIPNorm someone much smarter than me came up with the script. Thanks to Brad, I owe you a beer.
The script is in two parts.First part is the MSPL script which you install on the Lync Edge server and the second part is a text document which you could post on accessible file share to the Edge or straight on the Edge Servers themselves. The text document contains a list of domains your blocking presence for.
MSPL script text:
<?xml version="1.0"?>
<r:applicationManifest xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" r:appUri="http://sip.yourdomain.com/BlockFederatedPresence" xmlns:r="http://schemas.microsoft.com/lcs/2006/05">
<r:allowRegistrationBeforeUserServices/>
<r:serverFilter roles="ALL"/>
<!-- handle NOTIFY, BENOTIFY, SUBSCRIBE requests -->
<r:requestFilter methodNames="NOTIFY,BENOTIFY,SUBSCRIBE" strictRoute="true"/>
<!-- Script-only application -->
<r:scriptOnly/>
<!-- Text file containing allowed domains -->
<r:file name="AllowedPresenceDomains"
path="C:\MSPLScripts\PresenceFilter\AllowedPresenceDomains.txt" delimitedBy="comma"
keyColumnName="Domain" static="false">
<r:column name="Domain" />
<r:column name="Action" />
</r:file>
<r:splScript><![CDATA[
function AllowedDomain(strURI) {
bolIsAllowed = false;
arrStrURI = Split(strURI, "@");
foreach(strValue in arrStrURI) {
strDomain = strValue;
}
if (strDomain == "yourdomain.com") {
bolIsAllowed = true;
}
else {
if(AllowedPresenceDomains[strDomain].Action == "allow") {
bolIsAllowed = true;
}
}
return bolIsAllowed;
}
skipScan = true;
foreach(s in GetHeaderValues(StandardHeader.Event)) {
skipScan = !EqualString(s, "presence", true);
break;
}
if (!skipScan) {
if (sipRequest) {
fromUser = GetUri(sipRequest.From);
toUser = GetUri(sipRequest.To);
}
if (sipResponse) {
fromUser = GetUri(sipResponse.From);
toUser = GetUri(sipResponse.To);
}
}
if (!skipScan && ContainsString(sipMessage.Content, "<category name=\"state\"/>", true)) {
if (!AllowedDomain(fromUser)) {
newContent = "";
foreach (element in Split(sipMessage.Content, "<")) {
if (element!= "") {
if(!ContainsString(element, "category name=\"state\"/>", true)) {
newContent = Concatenate(newContent, Concatenate("<", element));
}
}
}
sipMessage.Content = newContent;
}
}
if (!skipScan && ContainsString(sipMessage.Content, "<availability>", true)) {
if (!AllowedDomain(toUser)) {
newContent = "";
foreach (element in Split(sipMessage.Content, "<")) {
if (element!= "") {
if(!ContainsString(element, "availability>", true)) {
newContent = Concatenate(newContent, Concatenate("<", element));
}
if(ContainsString(element, "/availability>", true)) {
newContent = Concatenate(newContent, "<availability>1800</availability>");
}
}
}
sipMessage.Content = newContent;
}
}
if (sipRequest) {
ProxyRequest("");
}
else if (sipResponse) {
ProxyResponse();
}
]]></r:splScript>
</r:applicationManifest>
Format for text file:
domain1.com,allow
domain2.com,allow
Download both from here.
VoIPNorm
You are missing a good part of the script here. The download is complete though.
ReplyDeleteThanks for the heads up Brad. Should be fixed now.
DeleteCoolest and most under-used, misunderstood, and least known feature in Lync Server. Thanks for a good article, Chris!
ReplyDeleteCould you provide the information how to install it?
ReplyDeleteHi, thanks for the script, works liek a charm! Is it possible though, to extend the scripts functionality so that the presence status is blocked for all 'external contacts'?
ReplyDelete