Files
Facilitor/APPL/API2/plugins/scimusers.wsc
Jos Groot Lipman 22e5a3fa63 Merge 2017.2 Gold A patches
svn path=/Website/trunk/; revision=35796
2017-10-24 09:30:37 +00:00

290 lines
8.4 KiB
XML

<?xml version="1.0"?>
<component>
<?component error="true" debug="true"?>
<registration
description="scimusers"
progid="scimusers.WSC"
version="1.00"
classid="{6D817B6F-9D08-4636-AAD9-8BD7C5EFF56A}"
>
</registration>
<public>
<!-- properties -->
<!-- methods -->
<method name="initialize">
<PARAMETER name="params"/>
</method>
<method name="error_handler">
<PARAMETER name="code"/>
<PARAMETER name="msg"/>
<PARAMETER name="orgHandler"/>
</method>
<method name="transform_filter">
<PARAMETER name="filter"/>
</method>
<method name="transform_outgoing">
<PARAMETER name="params"/>
<PARAMETER name="data"/>
</method>
<method name="transform_incoming">
<PARAMETER name="params"/>
<PARAMETER name="data"/>
</method>
<method name="get_eTag">
<PARAMETER name="params"/>
<PARAMETER name="data"/>
</method>
</public>
<script language="javascript">
<![CDATA[
/* properties */
/* methods */
/*
/*
$Id$
File: scimusers.wsc
*/
/* Globals */
var FCLT;
function initialize(params)
{
FCLT = params;
}
function error_handler(code, msg, orgHandler)
{
code = code || 500;
var data = {
"schemas" : ["urn:ietf:params:scim:api:messages:2.0:Error"],
"scimType": "invalidValue",
"detail" : msg,
"status" : code
};
FCLT.DEZE.Response.ContentType = "application/json";
FCLT.DEZE.Response.Write(FCLT.DEZE.JSON.stringify(data, null, 2));
var codestr = String(code);
if (typeof code == "number")
{
var codestr = { 400: "Bad request",
403: "Forbidden",
404: "Not Found",
422: "Unprocessable Entity" }[code];
if (codestr)
code = code + " " + codestr;
}
FCLT.DEZE.Response.Status = code;
FCLT.DEZE.Response.End;
}
function transform_filter(filter)
{
if ("count" in filter)
filter.limit = filter.count;
if ("startIndex" in filter)
filter.offset = filter.startIndex - 1;
if ("filter" in filter)
{
// Ontvangen filter: "filter": "id eq \"KFSG_person_703\""
var v_filter = filter.filter.replace ("id eq \"" + FCLT.DEZE.customerId + "_person_", "");
v_filter = v_filter.replace("\"", "");
filter.id = v_filter;
}
return filter;
}
function get_eTag(params, data)
{
if (data && typeof data == "object" && "meta" in data)
return data.meta.version;
return null;
}
function get_element(data)
{
if (data == undefined) data = "";
return data;
}
function transform_incoming(params, data)
{
var enterprise = data["urn:ietf:params:scim:schemas:extension:enterprise:2.0:User"];
var facilitor = data["urn:ietf:params:scim:schemas:extension:facilitor:2.0:User"];
var person =
{
login : get_element(data["userName"]),
externallogin: get_element(data["userName"]),
externalid : get_element(data["externalId"]),
lastname : get_element(data["name"]["familyName"]),
middlename : get_element(data["name"]["middleName"]),
firstname : get_element(data["name"]["givenName"]),
deactivated : data["active"]?null:new Date(),
employeenumber : get_element(enterprise["employeeNumber"])
};
person["function"] = { name: "Onbekend" }; // geen onderdeel van de interface
var dep_id = "";
if (facilitor["orgUnit"] && facilitor["orgUnit"]["value"] )
dep_id = facilitor["orgUnit"]["value"].replace (FCLT.DEZE.customerId + "_department_", "");
else
dep_id = 1; // bij het aanmaken van een nieuwe persoon is de afdeling nog leeg. Dan tijdelijke even onder onbekend hangen.
if (facilitor["initials"])
person.initials = get_element(facilitor["initials"]);
person["department"] = { id: dep_id };
if (data["emails"] && data["emails"][0])
{
person.email = get_element(data["emails"][0].value); // type:work/primary:true opzoeken ?
}
person.mobile = "";
person.phone = "";
if (data.phoneNumbers)
{
for (var j = 0; j < data["phoneNumbers"].length; j++)
{ if (data["phoneNumbers"][j]["type"] == 'mobile')
{
person.mobile = get_element(data["phoneNumbers"][j].value);
}
if (data["phoneNumbers"][j]["type"] == 'work')
{
person.phone = get_element(data["phoneNumbers"][j].value);
}
}
}
return { person: person };
}
function transform_one_person(params, person)
{
var unique = FCLT.DEZE.customerId + "_person_" + String(person.id);
var oneuser = {
"userName":person.externallogin || person.login,
"id":unique,
"name":{
"formatted":person.name,
"familyName":person.lastname
},
"schemas":[
"urn:ietf:params:scim:schemas:core:2.0:User",
"urn:ietf:params:scim:schemas:extension:enterprise:2.0:User"
],
"displayName":person.name,
"active": !person.deactivated,
"meta":{
"created":person.created,
"lastModified":person.lastchange?person.lastchange:person.created,
"location":FCLT.DEZE.HTTP.urlzelf() + "/appl/SCIM/Users/" + unique,
"resourceType":"User"
},
"groups":[],
"urn:ietf:params:scim:schemas:extension:enterprise:2.0:User" :
{
"employeeNumber":person.employeenumber
},
"urn:ietf:params:scim:schemas:extension:facilitor:2.0:User" :
{
"orgunit":
{
"value":FCLT.DEZE.customerId + "_department_" + String(person.department.id),
"$ref":FCLT.DEZE.HTTP.urlzelf() + "/appl/SCIM/OrgUnits/" + FCLT.DEZE.customerId + "_department_" + String(person.department.id)
},
"initials":person.initials
}
}
if (person.middlename) oneuser.name.middleName = person.middlename;
if (person.firstname) oneuser.name.givenName = person.firstname;
if (person.externalid) oneuser.externalId =person.externalid;
if (person.email)
{
oneuser.emails = [
{
"value":person.email,
"type":"work",
"primary":true
}];
}
var phoneNumbers = [];
if (person.mobile)
phoneNumbers.push(
{
"value":person.mobile,
"type":"mobile",
"primary":true
});
if (person.phone)
phoneNumbers.push(
{
"value":person.phone,
"type":"work",
"primary":false
});
oneuser.phoneNumbers = phoneNumbers;
var allgroups = [];
for (var j = 0; j < person.authorization.length; j++)
{
var group = person.authorization[j];
var unique = FCLT.DEZE.customerId + "_authorizationgroup_" + String(group.authorizationgroup.id);
oneuser.groups.push({
"value":unique,
"$ref":FCLT.DEZE.HTTP.urlzelf() + "/appl/SCIM/Groups/" + unique,
"display":group.authorizationgroup.name
})
}
var oCrypto = new ActiveXObject("SLNKDWF.Crypto");
var eTag = '"' + oCrypto.hex_sha1(FCLT.DEZE.JSON.stringify(oneuser)).toLowerCase() + '"';
oneuser.meta["version"] = "W/" + eTag; // Weak eTag?
return oneuser;
}
function transform_outgoing(params, data)
{
if ("person" in data)
{
var oneperson = transform_one_person(params, data.person);
return oneperson;
}
if ("persons" in data)
{
var allusers = [];
for (var i = 0; i < data.persons.length; i++)
{
var person = data.persons[i]; // _ users zijn er al wel uitgefiltert
allusers.push(transform_one_person(params, person));
}
return {
"totalResults": data.total_count,
"itemsPerPage": allusers.length,
"startIndex": (data.offset || 0) + 1,
"schemas": ["urn:ietf:params:scim:api:messages:2.0:ListResponse"],
"Resources": allusers
};
}
}
]]>
</script>
</component>