XCAP Tutorial Jonathan Rosenberg Ground Rules • This is a session for level setting – People are at different points – We will start from the beginning • NO QUESTION IS TOO STUPID • Disrespect will not be tolerated • Please interrupt and ask – PLEASE! Agenda • Understanding XML – – – – Basic XML Concepts Namespaces Schema XPath in Brief • HTTP Concepts of Note – Etags • XCAP Problem Definition • XCAP Basics XML Basics • XML is a mechanism for <?xml version="1.0" encoding="UTF-8"?> representing structured <address-book> <!—This guy is a bozo -data <entry> <name>Jonathan Rosenberg</name> • Data is represented by a <email>jdrosen@dynamicsoft.com</email> tree <postal> <street paved=“true”>600 Lanidex Pl</street> • Each node in the tree is <city>Parsippany</city> <state>NJ</state> an element <country>USA</country> • Elements have attributes </postal> – Attributes qualify the data • “Leaf” Elements can contain text content <ietf-participant/> </entry> </address-book> XML Basics • XML Comments • Elements can be empty – <el-name/> <?xml version="1.0" encoding="UTF-8"?> <address-book> <!—This guy is a bozo -<entry> <name>Jonathan Rosenberg</name> shorthand <email>jdrosen@dynamicsoft.com</email> <postal> <street paved=“true”>600 Lanidex Pl</street> <city>Parsippany</city> <state>NJ</state> <country>USA</country> </postal> <ietf-participant/> UTF-8 </entry> </address-book> • XML Declaration – Version – Encoding • IETF uses XML Terms • Well-formed – Meets basic constraints for all XML documents – Each open tag has a matching close – Unique attribute names • Valid – Meets the constraints defined by a schema or DTD XML Namespaces • Problem • <?xml version="1.0" encoding="UTF-8"?> – Want to combine content <address-book> from different systems into <!—This guy is a bozo -one document <entry> – What if both sources define <name>Jonathan Rosenberg</name> <email>jdrosen@dynamicsoft.com</email> the same name? <postal> <street paved=“true”>600 Lanidex Pl</street> Example <city>Parsippany</city> – Add information to address <state>NJ</state> book on whether data is <country>USA</country> synced with PC </postal> – <state>synchronized</state <ietf-participant/> </entry> > </address-book> – Which state is it? XML Namespaces <?xml version="1.0" encoding="UTF-8"? • Solution: XML xmlns:post=“http://www.post.com” Namespace xmlns:sync=“http://www.sync.com”> • Elements and attributes <post:address-book> <!—This guy is a bozo -are bound to a namespace when defined <post:entry> <post:name>Jonathan Rosenberg</post:name> • Namespace is identified <post:email>jdrosen@dynamicsoft.com</post:email> with a unique URI <post:postal> <post:street paved=“true”>600 Lanidex Pl</post:street> • A prefix is bound to that <post:city>Parsippany</post:city> URI through a declaration <post:state>NJ</post:state> in the document <post:country>USA</post:country> • Each element is named </post:postal> <post:ietf-participant/> with its qualified name – The prefix, followed by a <sync:state>synchronized</sync:state> </entry> colon, followed by the </address-book> local-name Importance of Namespaces • Namespaces are like option tags in SIP – Group a bunch of things together and give it a name – Are useful for talking about extensibility – Are useful for negotiating extensibility • Provide a generic grouping facility XML Schema • Need a way to define the constraints on an XML document – Analagous to a database schema – Similar to a grammar • W3C has specified two ways – DTD • Original method • Not an XML document • Limited expressiveness – Schema • • • • • Newer XML-based Much more expressive Much more complex Works well with namespaces • Trend is towards schema Schema Example <?xml version="1.0" encoding="UTF-8"?> <xs:schema targetNamespace="http://www.post.com" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="http://www.post.com" elementFormDefault="qualified" attributeFormDefault="unqualified"> <xs:element name="address-book"> <xs:complexType> <xs:sequence> <xs:element name="entry" minOccurs="0" maxOccurs="unbounded"> <xs:complexType> <xs:sequence> <xs:element name="name" type="xs:string"/> <xs:element name="email" type="xs:string"/> <xs:element name="postal"> <xs:complexType> <xs:sequence> <xs:element name="street" type="xs:string"/> <xs:element name="city" type="xs:string"/> <xs:element name="state"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:enumeration value="NJ"/> <xs:enumeration value="NY"/> </xs:restriction> </xs:simpleType> </xs:element> <xs:element name="country" type="xs:string"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="ietf-participant"/> </xs:sequence> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> </xs:schema> XPath • XCAP selection is based on XPath – Happens to be a subset – Not a normative usage • XPath problem statement – How to point to specific pieces of an XML document – Example: “The third element named entry” – Example: “All of the elements in a document that have the attribute paved equal to true.” • XPath = XML Addressing Basic Example • Want to point to the email element • XPath expression address-book/entry/email • Just like a unix filesystem path • Each “directory” identifies an element name <?xml version="1.0" encoding="UTF-8"? xmlns:post=“http://www.post.com” xmlns:sync=http://www.sync.com xmlns=“http://www.post.com”> <address-book> <!—This guy is a bozo -<entry> <name>Jonathan R<name> <email>jr@dsoft.com</email> <postal> <street paved=“true”>600 Lx Pl</street> <city>Parsippany</city> <state>NJ</state> <country>USA</country> </postal> <ietf-participant/> <sync:state>synchronized</sync:state> </entry> </address-book> Positional Selectors • What if there are multiple elements with that name? – Can supply predicates which select one of the matching ones – Predicates appear in square brackets • One such predicate is position – Indicates which one by its place in the ordered sequence of matching elements • Select second bar: foo/bar[2] • Select first bar: foo/bar[1] <foo> <bar>Hello</bar> <bar>There</bar> </foo> Select by Attribute Name • You can select elements that have attributes with specific values element[@name=“value”] • foo/bar[@attr=“1”] • foo/bar[@attr=“2”] • foo/bar[@stuff=“LOTR”] <foo> <bar attr=“1”>Hi</bar> <bar attr=“2”>How</bar> <bar stuff=“LOTR”>Are</bar> </foo> Selecting Elements • The result of selecting an element includes – – – – The element Its children Its attributes Everything between open bracket of open element to close bracket of close element • XPath allows selecting multiple elements – XCAP does not use this feature Selecting Attributes • An attribute is selected by prefixing its name with an “@” • foo/bar[1]/@attr • foo/bar[@attr=“2”]/ @bool • foo/movie/@stuff • The selected object is JUST the value – Different from elements – Name would be redundant <foo> <bar attr=“1”>Hi</bar> <bar attr=“2” bool=“y”>How</bar> <movie stuff=“LOTR”>Are</bar> </foo> XCAP Problem Space • Motivating use cases – Buddy Lists – Authorization Policies – Hard state presence data Buddy List Use Case Subscribe List • Client wants to subscribe to a list of users • Send SUBSCRIBE to server using SIP event list extension • Server retrieves list associated with buddylist URI – Generates SUBSCRIBEs to them • Client can manage that list – Add, remove, modify entries Subscribe Joe Subscribe Bob Subscribe Mary Read List Write List Data Manipulation Server Standard Ifaces Client Authorization Use Case Subscribe Petri • User Hiroshi subscribes to Petri • No auth policy in place, generates a winfo NOTIFY to Petri • Petri needs to be able to set authorization decision for Hiroshi • Want to be able to set such policies outside of a subscription as well Read List Write List winfo Data Manipulation Server Standard Ifaces Client Hard State Presence Management Subscribe Petri • Hiroshi subscribes to Petri – Petri has been offline for weeks • Server sends NOTIFY with current presence state • Petri wants to control default state when offline • Set it to <activity>vacation</activit y> Notify Read PIDF Write PIDF Data Manipulation Server Standard Ifaces Client Functional Requirements • Create resource list/auth policies/default presence doc • Associate resource list/auth policies/default presence doc with URI • Have client define URI • Have server assign URI • Modify contents of resource list/auth policies/default presence doc • Extend resource list/auth policies/default presence doc in hierarchical way • Delete a piece of resource doc list/auth policies/default presence • Fetch current resource list/auth policies/default • Allow multiple clients to access and modify a shared list/auth policies/default presence doc presence doc resource Performance Requirements • Protocol will be used on wireless air interfaces • Means that it is – unacceptable to push the entire resource list/auth policies/default presence doc when a change is needed – Unacceptable to get the entire resource list/auth policies/default presence doc when the client needs to look at it • Implies local cache • Pushing and pulling partial pieces of the data is essential • Invalidation of cached data • Synchronization of data Key Observations • Clearly a general problem here – Allowing a user to managed provisioned data that is accessed by a network application • Apply some basic design principles – – – – Separate protocol machinery from data schema Don’t box yourself into a corner with the data schema Bandwidth efficiency important Lower the deployment bar • This is a well-trod space – LDAP, ACAP, SNMP, relational DB cover related spaces, none successfully deployed to broad end client bases XCAP Architecture Network App • Same as previous pictures • Scope limited to client to XCAP server • Access from Network App could be XCAP Not Standardized Not Standardized – Acts as a client • There may be no network app – XCAP server is repository for client data XCAP Server XCAP Client The Big “Aha” • XCAP is about clients getting, deleting and putting pieces of hierarchically organized data • Ideally XCAP should leverage technologies widely found in phones, PCs and other client devices • XCAP can just BE HTTP, by defining the URI hierarchy to extend into “web documents” • HTTP URIs can represent any resource – Don’t need to exist on a disk – Interpretation is up to the server • XCAP defines that interpretation HTTP in Brief • Clients invoke methods on server – GET – retrieve content – PUT – place content – POST – pass data to a process – HEAD – get meta-data, not content – OPTIONS – query server for capabilities – DELETE – remove a resource from a server • Requests and responses contain bodies Fetch a document GET http://server.com/dir/foo HTTP/1.1 HTTP/1.1 200 OK Content-Type: application/xml Content-Length: … <foo> <bar attr=“1”>Hi</bar> <bar attr=“2” bool=“y”>How</bar> <movie stuff=“LOTR”>Are</bar> </foo> <foo> <bar attr=“1”>Hi</bar> <bar attr=“2” bool=“y”>How</bar> <movie stuff=“LOTR”>Are</bar> </foo> XCAP Scope • Application Usages – Details how you use XCAP for a new app (i.e., CPCP) – Server assigned data • Naming convention for URIs – Document selector – picks the “XML Document” based on a defined document hierarchy – Component selector – picks an element or attribute within the document • Using GET, PUT and DELETE for management of elements and attributes • Error content • Extensibility of data • Etag advice Application Usage • Defines what an application needs to do to be used with XCAP – – – – Define an Application Unique ID Define the XML Schema for the data Define data semantics Specify naming conventions – binding between application and XCAP – Data interdependencies (aka server computed data) – Authorization policies AUID • Unique Identifier for each application • Two sub-namespaces – IETF tree: tokens in RFC documents • IANA Registry – Vendor tree: proprietary data • Start with reverse DNS name of enterprise • Examples – IETF Tree • “resource-lists” draft-ietf-simple-xcap-list-usage • “pidf-manipulation” draft-isomaki-simple-xcap-pidf-manipulationusage-00 • “rules” draft-rosenberg-simple-rules – Vendor Tree • “com.example.customer-list” AUID Grammar AUID = global-auid / vendor-auid global-auid = auid auid = alphanum / mark vendor-auid = rev-hostname "." auid rev-hostname = toplabel *( "." domainlabel ) domainlabel = alphanum / alphanum *( alphanum / "-" ) alphanum toplabel = ALPHA / ALPHA *( alphanum / "-" ) alphanum Naming Conventions • An app will have “hooks” into XCAP – Points of operation of application when XCAP is used – Need to define how that is done • Example: Presence List – Fetch document whose uri attribute of <resource-list> is equal to request URI of SUBSCRIBE • Example: Authorization – Fetch authorization policy documents underneath http://server.com/rules/users/<username> where username identifies the presentity Data Interdependencies • In many cases a user defines all of their own data – PIDF manipulation usage – Authorization policies • In some cases a few pieces of it are “filled in” by the server – Resource list URIs for lists – need to be unique, can be server assigned – Client can also define them • Application usage specifies what pieces server fills in, and how Modeling Server Computed Data • Think of the application usage as a client of XCAP • Handset puts a new resource list, URI not present (1) • Application learns of change (4) • Acting as a client, application modifies data, setting URI (5) • This is a model, not an implementation requirement – Impacts Etag usage (later) Authorization Policies • Who is allowed to access (R/W) XCAP data? – Application specific • Policies are specified by application usage • XCAP defines a “default” – A user can read and write their own data – A user can only access their own data – Global data is readable by everyone, writeable by no one except privileged users Definition Example • Basic address book from before • Would author an RFC structured as follows Document Contents • AUID – Want this to be global – Pick an appropriate AUID • address-book – Add an IANA Considerations section registering the AUID • XML Schema – Include it – IANA registry for schema and namespace • Naming Conventions – No server app – No naming conventions • No data interdependencies • Default authorization policy Semantics • An address book is a series of <entry> elements • Each <entry> is information about an entry in the address book – It has a <name>, which is the use persons first and last name – It has an <email> element, which contains the email address of the person – It has a <postal> element that has the postal address The Document Hierarchy • XCAP defines URIs as two parts – Document selector – chooses the XML document – Node selector – chooses the XML component (element, attribute) • XPath subset discussed previously • XML documents organized into a mandatory hierarchy – Borrows from ACAP concepts Hierarchy Structure • Top is the Root Services URI – Identifies start of XCAP tree • http://server.example.com/xcap-root • http://www.example.com/docs/xml/ietf/xcap/root • Next is the AUID • Next is “users” or “global” – “users” are for per-user documents – “global” are for data that is not user specific – for reading by all users of the app • Within users, next is username • Underneath username is anything • Eventually leads to document The Hierarchy Root services AUID 1 users petri AUID 2 global hiroshi doc1 dir1 Example 1 • http://xcap.example.com/addressbook/users/petri/adbook1/address-book/entry/name adbook1 <?xml version="1.0" encoding="UTF-8"?> <address-book> <!—This guy is a bozo -<entry> <name>Jonathan Rosenberg</name> <email>jdrosen@dynamicsoft.com</email> <postal> <street paved=“true”>600 Lanidex Pl</street> <city>Parsippany</city> <state>NJ</state> <country>USA</country> </postal> <ietf-participant/> </entry> </address-book> Client Operations • Retrieving – Document – Element – Attribute • Deleting – Document – Element – Attribute • Modifying – Document – Element – Attribute • Adding – Document – Element – Attribute KEY CONSTRAINT Can only affect one element, attribute or document at a time Fetching a Document GET http://xcap.example.com/address-book/users/petri/adbook1 HTTP/1.1 adbook1 HTTP/1.1 200 OK Content-Type: application/adbook+xml Content-Length: … <?xml version="1.0" encoding="UTF-8"?> <address-book> <!—This guy is a bozo -<entry> <name>Jonathan Rosenberg</name> <email>jdrosen@dynamicsoft.com</email> <postal> <street paved=“true”>600 Lanidex Pl</street> <city>Parsippany</city> <state>NJ</state> <country>USA</country> </postal> <ietf-participant/> </entry> </address-book> <?xml version="1.0" encoding="UTF-8"?> <address-book> <!—This guy is a bozo -<entry> <name>Jonathan Rosenberg</name> <email>jdrosen@dynamicsoft.com</email> <postal> <street paved=“true”>600 Lanidex Pl</street> <city>Parsippany</city> <state>NJ</state> <country>USA</country> </postal> <ietf-participant/> </entry> </address-book> Fetching an Element GET http://xcap.example.com/address-book/users/petri/adbook1/ address-book/entry/name HTTP/1.1 HTTP/1.1 200 OK Content-Type: application/xml-fragment-body Content-Length: … <name>Jonathan Rosenberg</name> adbook1 <?xml version="1.0" encoding="UTF-8"?> <address-book> <!—This guy is a bozo -<entry> <name>Jonathan Rosenberg</name> <email>jdrosen@dynamicsoft.com</email> <postal> <street paved=“true”>600 Lanidex Pl</street> <city>Parsippany</city> <state>NJ</state> <country>USA</country> </postal> <ietf-participant/> </entry> </address-book> Fetching an Attribute GET http://xcap.example.com/address-book/users/petri/adbook1/ address-book/entry/street/@paved HTTP/1.1 HTTP/1.1 200 OK Content-Type: application/xml-attribute-value Content-Length: … true adbook1 <?xml version="1.0" encoding="UTF-8"?> <address-book> <!—This guy is a bozo -<entry> <name>Jonathan Rosenberg</name> <email>jdrosen@dynamicsoft.com</email> <postal> <street paved=“true”>600 Lanidex Pl</street> <city>Parsippany</city> <state>NJ</state> <country>USA</country> </postal> <ietf-participant/> </entry> </address-book> Delete a Document DELETE http://xcap.example.com/address-book/users/petri/adbook1 HTTP/1.1 adbook1 HTTP/1.1 200 OK <?xml version="1.0" encoding="UTF-8"?> <address-book> <!—This guy is a bozo -<entry> <name>Jonathan Rosenberg</name> <email>jdrosen@dynamicsoft.com</email> <postal> <street paved=“true”>600 Lanidex Pl</street> <city>Parsippany</city> <state>NJ</state> <country>USA</country> </postal> <ietf-participant/> </entry> </address-book> NULL Deleting an Element DELETE http://xcap.example.com/addressbook/users/petri/adbook1/ address-book/entry/name/email HTTP/1.1 HTTP/1.1 200 OK adbook1 <?xml version="1.0" encoding="UTF-8"?> <address-book> <!—This guy is a bozo -<entry> <name>Jonathan Rosenberg</name> <email>jdrosen@dynamicsoft.com</email> <postal> <street paved=“true”>600 Lanidex Pl</street> <city>Parsippany</city> <state>NJ</state> <country>USA</country> </postal> <ietf-participant/> </entry> </address-book> <?xml version="1.0" encoding="UTF-8"?> <address-book> <!—This guy is a bozo -<entry> <name>Jonathan Rosenberg</name> <postal> <street paved=“true”>600 Lanidex Pl</street> <city>Parsippany</city> <state>NJ</state> <country>USA</country> </postal> <ietf-participant/> </entry> </address-book> Deleting an Attribute DELETE http://xcap.example.com/addressbook/users/petri/adbook1/ addressbook/entry/name/postal/street/@paved HTTP/1.1 HTTP/1.1 200 OK adbook1 <?xml version="1.0" encoding="UTF-8"?> <address-book> <!—This guy is a bozo -<entry> <name>Jonathan Rosenberg</name> <email>jdrosen@dynamicsoft.com</email> <postal> <street paved=“true”>600 Lanidex Pl</street> <city>Parsippany</city> <state>NJ</state> <country>USA</country> </postal> <ietf-participant/> </entry> </address-book> <?xml version="1.0" encoding="UTF-8"?> <address-book> <!—This guy is a bozo -<entry> <name>Jonathan Rosenberg</name> <postal> <street>600 Lanidex Pl</street> <city>Parsippany</city> <state>NJ</state> <country>USA</country> </postal> <ietf-participant/> </entry> </address-book> Modify vs. Add • Modify and Add look the same – PUT Request – Body contains content • Behavior depends on URI – Server checks if resource exist • URI resolves to an existing doc, element in a doc, or attribute in an element – If not, the operation is add • New content is added such that – URI now resolves to the content in the body – Schema constraints are obeyed – Otherwise inserted after all siblings – If so, the operation is modify • New content replaces the content selected by the URI Insert an Element PUT http://xcap.example.com/addressbook/users/petri/adbook1/ address-book/entry/phone HTTP/1.1 Content-Type: application/xml-fragment-body <phone>+19739525000</phone> HTTP/1.1 200 OK adbook1 <?xml version="1.0" encoding="UTF-8"?> <address-book> <!—This guy is a bozo -<entry> <name>Jonathan Rosenberg</name> <email>jdrosen@dynamicsoft.com</email> <postal> <street paved=“true”>600 Lanidex Pl</street> <city>Parsippany</city> <state>NJ</state> <country>USA</country> </postal> <ietf-participant/> </entry> </address-book> <?xml version="1.0" encoding="UTF-8"?> <address-book> <!—This guy is a bozo -<entry> <name>Jonathan Rosenberg</name> <phone>+19739525000</phone> <email>jdrosen@dynamicsoft.com</email> <postal> <street paved=“true”>600 Lanidex Pl</street> <city>Parsippany</city> <state>NJ</state> <country>USA</country> </postal> <ietf-participant/> </entry> </address-book> Modify an Element PUT http://xcap.example.com/addressbook/users/petri/adbook1/ address-book/entry/name HTTP/1.1 Content-Type: application/xml-fragment-body <name>Jonathan D. Rosenberg</name> HTTP/1.1 200 OK adbook1 <?xml version="1.0" encoding="UTF-8"?> <address-book> <!—This guy is a bozo -<entry> <name>Jonathan Rosenberg</name> <email>jdrosen@dynamicsoft.com</email> <postal> <street paved=“true”>600 Lanidex Pl</street> <city>Parsippany</city> <state>NJ</state> <country>USA</country> </postal> <ietf-participant/> </entry> </address-book> <?xml version="1.0" encoding="UTF-8"?> <address-book> <!—This guy is a bozo -<entry> <name>Jonathan D. Rosenberg</name> <email>jdrosen@dynamicsoft.com</email> <postal> <street paved=“true”>600 Lanidex Pl</street> <city>Parsippany</city> <state>NJ</state> <country>USA</country> </postal> <ietf-participant/> </entry> </address-book> Server Error Handling • Server error handling is specified in HTTP specification • Most XCAP-specific cases are details within 404 or 409 – 409 (Conflict) The request could not be completed due to a conflict with the current state of the resource. – 404 (Not Found) The server has not found anything matching the Request-URI. • XCAP Specific error cases – Result of operation results an a document that is not well-formed or valid (409) – Resource identified in a request corresponds to multiple elements or attributes (409) – Application usage not understood (409) – Document, element or attribute does not exist (404) – Client provided data that violates a uniqueness requirement (409) – Request did not contain valid xml-frag-body (409?) Conveying Conflict Details • HTTP recommends including a 409 body detailing problem so client can retry • XCAP defines an XML body format for response – application/xcap-error+xml MIME type – Root element <xcap-error> – Child is specific to the error • Detailed error information can be dependent on the error • Defined errors match ones on previous slide URI Exists Error • Client attempts to set a URI with a uniqueness <?xml version="1.0" encoding="UTF-8"?> constraint, and the value <xcap-error xmlns="urn:ietf:params:xml:ns:xcap-error"> exists already <uri-exists> • Happens in resource lists <exists uri="sip:friends@example.com"> <alt-uri>sip:friends2@example.com</alt-uri> • Server error response </exists> indicates </uri-exists> – URI(s) which had this problem – Optional suggested alternates </xcap-error> Handling Multiple Writers • Synchronization problems occur when multiple clients can manipulate the same document • Especially true when a client needs to do multiple HTTP operations to affect a change – XCAP provides no lock – But we want to detect this condition and recover • Common problem Solution: Etags • ETag from HTTP – Entity tags are used for comparing two or more entities from the same requested resource. – An entity tag MUST be unique across all versions of all entities associated with a particular resource. • What does this mean? – ETag is a version identifier for a resource – Server assigns the etag – It changes every time the resource changes How are they used? • HTTP defines several conditional headers – If-Match: only process this request if the entity tag matches that held by the server – If-None-Match: only process this request if the entity tag does not match – If-Range: asks for the byte range that has changed • Server returns 412 if condition fails Example Revisited • User A has version ABC • Adds buddy, adds IfMatch: ABC • Buddy added, new version DEF • User B also has version ABC • Tries to modify it, but it fails • B can now fetch it and make its diff against the current version Data Extensibility • XCAP servers MUST understand the application usages they manage • They don’t need to understand any namespaces but the root ones – Document extensions don’t need to be understood • Sometimes, an extension requires the server to understand – Setting a URI – Guaranteeing Uniqueness Current Solution • Defines a “mandatory-ns” element • This attribute is present as a child of the root element in any document • Indicates what namespaces are mandatory <?xml version="1.0" encoding="UTF-8"?> <address-book xmlns:conf=“urn:ietf:2233”> <mandatory-ns> <ns>urn:ietf:2233</ns> </mandatory-ns> <!—This guy is a bozo --> <entry> <name>Jonathan Rosenberg</name> <email>jdrosen@dynamicsoft.com</email> <postal> <street paved=“true”>600 Lanidex Pl</street> <city>Parsippany</city> <state>NJ</state> <country>USA</country> </postal> <conference-uri/> <ietf-participant/> </entry> </address-book> Presence Authorization • Specified as a ruleset • Each ruleset is a series of rules • Each rule has three parts – Condition – does this rule apply? – Action – what do you do if it does? – Transformation – how do you restrict the data seen by a requestor? Permission Model • Each action or transformation is called a permission • A permission is a positive grant of information – There can never be negative grants, i.e., “don’t send information X” • If there is no permission for something, you get nothing • Implication is that the system is privacy safe Privacy Safe • If a server doesn’t understand a permission, less information is sent than desired, never more • If a server cannot obtain a rule from a remote source, less information is sent than desired, never more • No network failures or other transient problems can result in more information being sent than is desired Common Policy • draft-ietf-geopriv-common-policy • Defines framework • Defines common elements in all systems – <identity> - condition matching based on user identity – <sphere> - condition based on your presence status – <validity> - time range Current Presence Authorization Elements • Extends the set defined in common-policy with presence-specific data • New conditions – <anonymous> - is the subscription anonymous • Actions – <accept-subscription> - accept the presence subscription – <provide-presence> - polite blocking or not • Transformations – <show-namespace> - provide elements from a specific namespace – <show-tuple> - provide elements from specified tuples – <show-element> - provide elements with a specific name <?xml version="1.0" encoding="UTF-8"?> <cr:ruleset xmlns="urn:ietf:params:xml:ns:pres-rules" xmlns:cr="urn:ietf:params:xml:ns:common-policy" xmlns:rpid="urn:ietf:params:xml:ns:rpid" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <cr:rule id="1"> <cr:conditions> <cr:identity> <cr:uri>user@example.com</cr:uri> </cr:identity> </cr:conditions> <cr:actions> <accept-subscription>true</accept-subscription> <provide-presence>true</provide-presence> </cr:actions> <cr:transformations> <show-namespace> <ns>urn:ietf:params:xml:ns:rpid</ns> </show-namespace> <show-element> <basic-elements/> <el>rpid:placetype</el> </show-element> </cr:transformations> </cr:rule> </cr:ruleset>