| # Licensed to the Apache Software Foundation (ASF) under one or more |
| # contributor license agreements. See the NOTICE file distributed with |
| # this work for additional information regarding copyright ownership. |
| # The ASF licenses this file to You under the Apache License, Version 2.0 |
| # (the "License"); you may not use this file except in compliance with |
| # the License. You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, software |
| # distributed under the License is distributed on an "AS IS" BASIS, |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| # See the License for the specific language governing permissions and |
| # limitations under the License. |
| |
| MCPermissions SharePoint Web Service |
| ============================= |
| |
| I. SharePoint Web Services Model |
| |
| The ManifoldCF SharePoint Connector only communicates with SharePoint |
| through web services. SharePoint has a well-developed web services API, |
| along with a very convenient deployment model which allows additional, |
| custom web services to be easily deployed, even across entire SharePoint |
| server farms (their notion of a cluster). The intention by Microsoft was clearly |
| to make it straightforward for third parties to develop and sell and/or distribute |
| custom web services which augment the capabilities of the SharePoint system. |
| |
| SharePoint WebServices are usually written in C#. SharePoint itself runs on the |
| .NET platform, so the language choice is not technically limited; however, I |
| believe that the primary internal API's for SharePoint are all in C#, which does |
| tend to push writers of SharePoint web services towards that language. |
| |
| |
| II. SharePoint Hierarchy |
| |
| SharePoint defines objects in a hierarchical manner, based on http or https urls |
| served by IIS. SharePoint hooks into IIS by taking over an |
| IIS "website", and serving all paths for that port. There is always a primary "root site", |
| which has an empty path, and there can be (optionally) a number of "virtual paths" |
| as well, each one of which functions like a root site in everything but name. |
| The path of a virtual path root typically has the form: "sites/xxx", but you can define |
| virtual paths with any prefix you want. |
| |
| Beneath the primary root site and each virtual path root you can find subsites |
| (nested as deep as you like, so there are subsites of subsites etc.), libraries, lists, |
| and a bunch of other entities we don't really care about. Documents are found only |
| in libraries (as far as we know to date). Within a library you can also have folders, |
| which grant further structure to the library. |
| |
| Here a simple example of a potential SharePoint url: |
| |
| http://servername.domain:port/sites/virtualrootname1/subsitelevel1/subsitelevel2/library/folderlevel1/folderlevel2/document.xls |
| |
| In this case, the url describes a document within a folder within an enclosing folder |
| within a library that is part of a subsite that is a child of a parent subsite that is the |
| child of a virtual path root. |
| |
| SharePoint web service .aspx files are always deployed under the "_vti_bin" path |
| underneath each root site and subsite. |
| |
| |
| III. SharePoint Security Model |
| |
| SharePoint uses Active Directory security exclusively. People with appropriate |
| rights can attach AD users or groups to various objects in SharePoint. Rights are |
| always additive in SharePoint; there is no "deny" tokens. In general, access rights are |
| inherited down the hierarchy, unless a user explicitly chooses to break the |
| inheritance and set access rights directly for a particular object (and potentially, |
| for its children too.) |
| |
| A. SharePoint 2.0 Security Model |
| |
| In SharePoint 2.0, sometimes called SharePoint 2003, one can attach AD users or |
| groups to the following: The SharePoint website as a whole, sites (subsites too), and |
| libraries. You cannot set security on folders or files ("items") directly, however. |
| |
| B. SharePoint 3.0+ Security Model |
| |
| In SharePoint 3.0, sometimes called SharePoint 2007, and in SharePoint 4.0, sometimes |
| called SharePoint 2010, one can attach AD users or groups to folders and files in, |
| addition to the functionality provided in SharePoint 2.0. |
| |
| IV. SharePoint Connector security |
| |
| In order for the SharePoint Connector to ingest documents with the proper security, |
| it must obtain the list of AD SIDs that apply to each document, and ingest those along |
| with the document. This list must take into account SharePoint's notion of access |
| inheritance and override. |
| |
| Luckily, SharePoint provides, out of the box, a web service that does precisely that for |
| the web site, sites, and libraries, called the "Permissions" web service. You use this |
| service by providing an identifier (basically, a path) and a type ("web", "site", or "library"), |
| and the web service obtains the SIDs of the users and groups for you. Each acl query |
| automatically handled the inheritance of SIDs properly also - so if you asked for the |
| SIDs for a library, it would take into account inheritance from sites and the global website. |
| |
| This web service was sufficient for the SharePoint Connector's security queries in SharePoint 2.0, |
| because there was no ability in that release to set permissions directly on folders or files. |
| When SharePoint 3.0 was released, and new folder and item security levels were permitted, |
| one would have thought that Microsoft would have augmented the Permissions web |
| service accordingly. Unfortunately, however, they did not. Nor has the Permissions web |
| service been augmented in SharePoint 40.0 No other out-of-the-box |
| web services which performed this necessary functionality were available either. We did |
| inquire (through Magenic, MetaCarta's SharePoint contractor) whether Microsoft would be willing to |
| release an augmented Permissions service as a patch, but they declined to do so. |
| |
| As a result, MetaCarta Inc. asked Magenic to provide a web service that did what was needed: give |
| access to item and folder level security information. What they eventually provided |
| was a web service that looks identical to the Permissions web service, except that it |
| understands the types "folder" and "item" as well as the other types. The MCPermissions |
| web service also performs the necessary inheritance so that the SharePoint Connector |
| could simply ask for the SIDs for an item, and it would get all the inherited SIDs, as appropriate. |
| |
| This web service was granted to the Apache Software Foundation by MetaCarta, Inc. as part of |
| the entire ManifoldCF software grant. |