<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Stuff Yaron Finds Interesting &#187; Internet Protocols</title>
	<atom:link href="http://www.goland.org/category/technology/internet-protocols/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.goland.org</link>
	<description>Technology, Politics, Food, Finance, etc.</description>
	<lastBuildDate>Sat, 21 Aug 2010 23:18:30 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Why does OAuth need request tokens?</title>
		<link>http://www.goland.org/oauthnorequesttoken/</link>
		<comments>http://www.goland.org/oauthnorequesttoken/#comments</comments>
		<pubDate>Tue, 26 May 2009 00:00:00 +0000</pubDate>
		<dc:creator>Administrator</dc:creator>
				<category><![CDATA[Internet Protocols]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[OAuth&#39;s current access dance is based getting a request token that is later exchanged for an access token. Introducing the request token takes what could have been a 4 round trip protocol and makes it into a 6 round trip protocol. Couldn&#39;t we just simplify OAuth down to 4 round trips by getting rid of [...]]]></description>
			<content:encoded><![CDATA[<p>OAuth&#39;s current access dance is based getting a request  token that is later exchanged for an access token. Introducing  the request token takes what could have been a 4 round trip  protocol and makes it into a 6 round trip protocol. Couldn&#39;t  we just simplify OAuth down to 4 round trips by getting rid of  the request token all together? Or is there some critical use  case enabled by request tokens that makes all the complexity  worth the price?</p>
<p>[5/26/2009 - Updated with Q&amp;A on <a href="/oauthnorequesttoken#openredirector" shape="rect">open redirectors</a>]</p>
<p>[6/2/2009 - Updated with a note from Allen Tom on another way  to <a href="/oauthnorequesttoken#discovery" shape="rect">prevent open  redirector</a> attacks]</p>
<p>  <span id="more-632"></span>
<p>To set the stage for the conversation it&#39;s useful to first  review the newly proposed three legged OAuth message exchange  pattern. The picture below is based on <a href="http://oauth.googlecode.com/svn/spec/core/1.0a/drafts/3/oauth-core-1_0a.html" shape="rect">  OAuth Core 1.0 Rev A (Draft 3)</a>:</p>
<p><img align="bottom" border="0" height="704" id="graphics1" name="graphics1" src="OAuth10A3.gif" width="574"></img></p>
<p>There are several things that concern me about the current  OAuth pattern:</p>
<p><b>State</b> &#8211; This pattern forces both the consumer and  service provider to store someone else&#39;s state for a  potentially non-trivial period of time. That is always a messy  proposition at best. The service provider is forced to associate  a call back with a request token and the consumer is forced to  associate a verifier with a request token.</p>
<p><b>Performance</b> &#8211; The service provider better implement  messages 2/3 really quickly because the user is going to have to  swallow all the latency of messages 1-4 before anything useful  happens.</p>
<p><b>Complexity</b> &#8211; Having 2 extra round trips means extra  code, extra testing and extra chances for things to go wrong.</p>
<p>What if we instead use a pattern like:</p>
<p><img align="bottom" border="0" height="528" id="graphics2" name="graphics2" src="AlertnateOAuth.gif" width="510"></img></p>
<p>Now the only long term secret is the access token and only the  consumer has to record it. The request/response pairs go down to  four and the performance issue with requesting the request token  is gone.</p>
<p>I suspect there is a good reason that OAuth felt it had to  have the request token but I honestly am not clear what that  reason is and if its important enough to justify the  complications it introduces. Hopefully the article will set me on  the path to finding out.</p>
<h1>Q&amp;A</h1>
<h2><a id="phishing" name="phishing" shape="rect"></a>Isn&#39;t the newly  proposed pattern susceptible to phishing?</h2>
<p>Absolutely. The short answer is that the consumer will need to  associate a value with the callback URL that lets the consumer  make sure that the user coming back on the call back URL with an  authorization token is the same user the consumer sent out. This  can be trivially handled via random numbers or encrypted ID. See  below for details.</p>
<p>The attack is that a black hat user gets to message 2 (the  redirect) in the previous chart and then doesn&#39;t actually  execute the redirect but instead takes the call back URL and  publishes it on a web page. The black hat convinces a white hat  user to click on the link in a context where the white hat user  expects to grant permission to the service provider. The white  hat user grants permission and is redirected back to the call  back URL specified by the consumer originally for the black hat  user with the access token.</p>
<p>In theory the attack would be if the consumer somehow got  confused and thought that the access token returned by the white  hat user belonged to the black hat instead because the callback  URL that was used was the one that the consumer had originally  issued to the black hat.</p>
<p>It might seem trivial to prevent this attack &#8211; don&#39;t put  any user identifying information into the callback. This means  that when the callback arrives (e.g. message 7 in the picture  above) the consumer will validate who the user is by whatever  login method (if any) is being used and not via any values in the  callback URL. This prevents the phishing attack from working.</p>
<p>Unfortunately this approach also makes an even more insidious  attack possible. Let&#39;s assume the consumer doesn&#39;t put  any identifying information into its callback URL. Let&#39;s  further assume that the black hat goes through the entire  permissioning process but swallows message 6, this is the  redirect with the access token.</p>
<p>Let&#39;s further assume that the black hat fools the white  hat into clicking on a link that sends the black hat&#39;s access  token to the service provider. Assuming the white hat is logged  in the black hat will think the access token belongs to the white  hat user instead of to the black hat (remember, the redirect URL  has no user identifying information so there is no way for the  consumer to know who the token was issued for). Now when the  consumer wants to interact with the service provider on behalf of  the white hat they will actually use the black hat&#39;s access  token.</p>
<p>To see how bad this could be imagine that the consumer is a  service like Plaxo that handles address book synchronization and  the service provider is some service with an address book like  Live. In that case when the consumer wants to synch the white  hat&#39;s address book with Live they will actually push all the  address book information into the account the black hat set up  and got the access token for. So much for the white hat  user&#39;s private address book information.</p>
<p>To prevent this the consumer has to be able to associate an  access token from the service provider with the user that the  consumer had sent to get the access token in the first place.</p>
<p>There are a couple of ways the attack can be prevented.  Probably the easiest is for the consumer to generate a  cryptographically secure random number (can you say &#8211; verifier?)  and stick it as a cookie on the user&#39;s browser and then stick  that number into the callback URL. When the callback arrives the  consumer compares the ID in the cookie with the ID in the  callback and if they don&#39;t match then the access token is  rejected.</p>
<p>If cookies aren&#39;t available (and that situation is getting  increasingly less interesting) then the consumer can take the  user&#39;s ID (this only works if the user has authenticated to  the consumer) and encrypt it and put it on the callback URL. Then  when the call back comes in the consumer checks the encrypted ID  with the currently user ID and if they don&#39;t match rejects  the request.</p>
<p>It is also possible to make things work in the case that the  user is anonymous to the consumer and doesn&#39;t support cookies  but that will require the user to manually copy and paste the  authentication token back to the consumer.</p>
<h2>Can&#39;t someone falsely pretend to be a consumer?</h2>
<p>Sort of, but it won&#39;t help them.</p>
<p>The attack is that a black hat sets up a phishing site called  blackhat.contoso.com that looks like whitehat.example.com.  blackhat.contoso.com then fools a user into thinking its  whitehat.example.com and redirects the user over to the service  provider. What happens next depends on the relationship between  the service provider and its consumers.</p>
<p>Let&#39;s take the most open case, the service provider allows  a consumer to ask for user permission without requiring  pre-registration. I actually was the PM on a project that shipped  a system like this for Live and it worked fine. In that case the  service provider will need to prominently display the  consumer&#39;s DNS name from the callback to the user. So the  user will see &#39;blackhat.contoso.com&#39; and they thought  they were coming from &#39;whitehat.example.com&#39; and so the  user will know to reject the request.</p>
<p>But let&#39;s say the blackhat gets fancy and instead makes  the DNS in the redirect URL point to whitehat.example.com? In  that case the user will do what they intended to do, give  permission to whitehat, and the access token will be sent to  whitehat&#39;s domain as part of the redirect. So blackhat got  nothing for their efforts (other than maybe a thank you from  whitehat).</p>
<h2><a id="openredirector" name="openredirector" shape="rect"></a>Isn&#39;t  this design susceptible to open redirector attacks?</h2>
<p>The short answer is &#8211; yes.</p>
<p>The attack goes like this. Evil.com phishes the user into  thinking that evil.com is actually stupid.com. Evil.com, in  message 3 in the second picture above, then redirects the user to  the service provider with a callback URL of the form:  http://stupid.com/redirector?redirect=http://evil.com/dobadstuff.</p>
<p>As I pointed out in the previous question this attack is  generally useless because the response will go to stupid.com, not  evil.com. Unless, of course, stupid.com is criminally stupid. In  which case the previous URL points to what&#39;s known as an open  redirector. This is a web page on stupid.com&#39;s domain that  accepts a URL as a query argument and will blindly redirect the  user to that URL regardless of where it is.</p>
<p>There are at least two ways to secure the protocol as  described above against open redirector attacks.</p>
<p><b>Require SSL callback URLs</b> &#8211; Generally speaking open  redirectors don&#39;t run over SSL so if the SP requires SSL  callback URLs then the SP will have protected its users against  most (but certainly not all) incompetent websites.</p>
<p><b>Require an out of band secret</b> &#8211; The core of the attack  is that evil.com, thanks to the open redirector, gets a copy of  the authorization token which is what is known as a &#39;bearer  token&#39;. That is, mere possession of the token is proof that  one has the right to use the token. So another fix is to require  that the authorization token cannot be used on its own. Instead  the SP and the consumer have to provision a shared secret out of  band. In the simplest possible case (for the consumer) message 9  in the second picture requires that the shared secret be included  on the request. Because evil.com won&#39;t have the secret that  was provisioned for stupid.com any attempt to use the  authentication token will fail. An alternative approach (this is  preferable from a security perspective) is to sign the redirect  in message 3 with the shared secret.</p>
<p><a id="discovery" name="discovery" shape="rect"></a><b>Perform  Discovery</b> &#8211; (Thanks to <a href="http://allentom.com/" shape="rect">Allen  Tom</a> for pointing this one out) The SP can require that  consumers provide a way to discover what addresses a consumer  uses for callbacks. For example, the consumer, in message 3,  could pass in a URL that points to the same domain as the  callback URL. The SP would then do a GET on the passed in URL and  get back a file that lists the callback locations the consumer  supports. Obviously the SP wouldn&#39;t support redirects on that  GET. Equally presumably the consumer wouldn&#39;t list in that  location evil.com&#39;s address. So in theory that&#39;s  that.</p>
<p>This all having been said I do not believe we should do  anything about open redirectors. There are good reasons to want  to run redirectors but it&#39;s been known for many years now  that without canaries or some other form of protection these  redirectors are very insecure. Running an open redirector without  cross site attack protections is outrageously irresponsible. And  I just don&#39;t believe we should design protocols against  outrageously irresponsible behavior because no protocol can be  protected against all the idiotic things an irresponsible person  can do.</p>
<p>And, for what it&#39;s worth, Live&#39;s first delegated  authentication system worked exactly as this blog post describes.  You can see an overview <a href="http://martinparry.com/cs/blogs/mparry_software/archive/2007/05/09/1176.aspx" shape="rect">  here</a>. And yes, we were fully aware of the open redirector  problem and no, we didn&#39;t try to protect against it for  exactly the reasons described in this Q&amp;A.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.goland.org/oauthnorequesttoken/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Claims, Tickets and HTTP &#8211; Security protocols for
  services</title>
		<link>http://www.goland.org/rolesclaimsticketshttp/</link>
		<comments>http://www.goland.org/rolesclaimsticketshttp/#comments</comments>
		<pubDate>Fri, 15 May 2009 00:00:00 +0000</pubDate>
		<dc:creator>Administrator</dc:creator>
				<category><![CDATA[Internet Protocols]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[I&#39;m writing an enterprise service. A request comes in. Do I honor the request or reject it? Answering this apparently trivial access control question has spawned whole universes of interlocking protocols. Kerberos, Shibboleth, SAML, WS-*, Liberty, OAuth, OpenID and so on. Before I can pick which protocol to use I need to define my requirements. [...]]]></description>
			<content:encoded><![CDATA[<p>I&#39;m writing an enterprise service. A request comes in. Do  I honor the request or reject it? Answering this apparently  trivial access control question has spawned whole universes of  interlocking protocols. Kerberos, Shibboleth, SAML, WS-*,  Liberty, OAuth, OpenID and so on. Before I can pick which  protocol to use I need to define my requirements.</p>
<p><b>DISCLAIMER</b>: Although I am an architect on .NET  Services&#39; Access Control Service nothing said in this  document necessarily represents the opinions of my employer, my  friends, my enemies or my teddy bears. No warranty express or  implied. Your mileage may vary. Do not remove tag.</p>
<p>  <span id="more-631"></span>
<p><b>Claims</b> &#8211; I like claims based programming for handling  access control. In a claims based system a requester shows up  with a request and attached to that request is a set of claims  about the requester. The specific type of claim really isn&#39;t  that important but typical examples include claims that the  requester is person X, or is in role Y or is a member of group Z.  The service then decides what to allow the requester to do based  on those claims.</p>
<p>Validating that the claims submitted to a service are true  isn&#39;t exactly trivial. Whole protocol suites exist to  validate claims about identity, for example. And once identity is  validated, figuring out what roles or groups the caller is in  typically requires centralized logic. For example, my enterprise  service probably doesn&#39;t want to figure out if someone is an  employee of my company or not. I&#39;d rather leave that  determination to someone else and just get informed of the  answer. So what I need is a way to let someone else validate a  requester&#39;s claims and then just have my service informed of  the result.</p>
<p><b>Tickets</b> &#8211; So what I would really like is for the  requester to present me with a ticket (in the Kerberos sense)  that was signed by someone I trust attesting to what claims I  should believe about the requester. It&#39;s up to the ticket  issuer (called a Key Distribution Center in Kerberos, a STS in  WS-*, an Identity Provider in SAML and so on) to figure out who  the requester is and what claims I should believe about them. The  ticket issuer summarizes what it knows about the requester in a  signed (and/or encrypted) ticket that it gives the requester who  then hands the ticket to my service. My service then validates  the ticket (using shared trust with the ticket issuer, not the  requester), pulls out the claims and makes its access control  decision.</p>
<p><b>HTTP</b> &#8211; The services I&#39;m working with are native to  HTTP. I say native to distinguish from &quot;dig a tunnel through  HTTP&quot;. Lots of protocols out there claim to be based on HTTP  but in fact use HTTP as nothing more than a <a href="http://www.faqs.org/rfcs/rfc3093.html" shape="rect">really inefficient  implementation of TCP</a>, completely ignoring the HTTP resource  model, headers, etc. So I want a protocol that gives me claims  and tickets that are native to HTTP. That means I want to see  resources and authorization headers.</p>
<p><b>Less is more</b>- The enemy of interoperability is  optionality. The more options a protocol has the lower the  probability that two parties using that protocol will  successfully interoperate. As we used to say in the protocol  world &quot;the spec is done when there is nothing left to  cut&quot;. So I want the protocol to be embarrassingly simple. If  a protocol looks like a Chinese Menu then it isn&#39;t for  me.</p>
<p><b>Reach</b> &#8211; The services I need to work with are written in  every language for every platform so I can&#39;t assume that my  partners will just be able to grab some library to implement the  security protocol. Sure, some components, such as a HTTP stack or  hashing/encryption libraries are ubiquitous. But beyond that my  partners, for the foreseeable future, will need to write things  themselves. So I&#39;m looking for a protocol so trivial that  someone could whip together a basic implementation in a few  hours.</p>
<p>When I think about the protocol I would like to have I focus  on a few things. The claims format should be so trivial that it  uses name/value pairs not structured formats like XML/JSON/YAML.  I want tickets so small that in practice all the claims and the  ticket overhead can trivially fit into a HTTP header. And I want  the protocol/encryption process to be so simple that all the  claims handling/encryption code can be written in 100 or 200  lines of readable code. I also want a pony.</p>
<p>So what do you think? Is there a protocol that meets my needs  today? Is there a protocol that is close and I should just adapt  it? Feel free to respond in comments or, if you are going to be  at the <a href="http://www.internetidentityworkshop.com/" shape="rect">Internet Identity  Workshop 2009A</a> in Mountain View May 18-20th we can talk  there!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.goland.org/rolesclaimsticketshttp/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Two Phase Commit Need Have Nothing To Do With ACID or Any
  Other Kind of Transaction!</title>
		<link>http://www.goland.org/nonacidtwophase/</link>
		<comments>http://www.goland.org/nonacidtwophase/#comments</comments>
		<pubDate>Mon, 03 Oct 2005 00:00:00 +0000</pubDate>
		<dc:creator>Administrator</dc:creator>
				<category><![CDATA[Internet Protocols]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[O.k., it&#39;s pet peeve time. Otherwise intelligent people seem to get really confused whenever they hear &#34;two phase commit&#34;. They immediately assume that if one is using two phase commits then one must be implementing an ACID or at least Atomic transaction. Nonsense! A two phase commit is nothing more than a coordination mechanism. It [...]]]></description>
			<content:encoded><![CDATA[<p>O.k., it&#39;s pet peeve time. Otherwise intelligent people  seem to get really confused whenever they hear &quot;<a href="http://en.wikipedia.org/wiki/Two-phase-commit_protocol" shape="rect">two  phase commit</a>&quot;. They immediately assume that if one is  using two phase commits then one must be implementing an <a href="http://en.wikipedia.org/wiki/ACID" shape="rect">ACID</a> or at least <a href="http://en.wikipedia.org/wiki/Atomic_operation" shape="rect">Atomic</a>  transaction. Nonsense! A two phase commit is nothing more than a  coordination mechanism. It allows one to guarantee that a group  of independent systems will either all perform or all not perform  a particular action. Historically the &#39;action&#39; was  usually some kind of ACID or at least Atomic transaction. But  there is nothing in two phase commits that requires or even  implies any particular action, atomic, ACID or otherwise.</p>
<p>  <span id="more-549"></span>
<p>In fact, two phase commits are incredibly useful for the  ultimate in non-ACID transactions &#8211; compensating transactions. In  an ACID transaction if the attempted transaction fails then  everything gets nicely cleaned up, no muss, no fuss. In a  compensating transaction, on the other hand, if the action fails  then an attempt is made to undo the action but with no ACID  semantics. For example, if I book a flight with a travel agency  and it turns out they couldn&#39;t book the flight they said they  would then instead of just canceling the whole ticket (and losing  their booking fee) they might rebook me on another flight that I  may or may not prefer. The point being, that the &#39;failed&#39;  transaction (booking the agreed flight) is &#39;compensated&#39;  (by buying another flight) rather than rolled back in an ACID  sense (by canceling the ticket and refunding the fees).</p>
<p>Now imagine that I want to book a whole trip myself involving  a hotel, a rental car, a plane flight, etc. I could use a two  phase commit protocol to allow me to first send reservation  requests to each of the companies and then if I can&#39;t get  reservation confirmations from everyone the two phase commit  coordinator would automatically trigger a compensate command to  each of the companies. Of course the compensation may not be what  I like, i.e. the airline may charge me a re-booking fee, but  them&#39;s the breaks in the real world.</p>
<p>The point is that two phase commit protocols are nothing more  or less than a coordination mechanism and what they are  coordinating may or may not be an ACID or Atomic transaction.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.goland.org/nonacidtwophase/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Rights Not Exercised are Lost &#8211; Tibco, BPEL &amp;
  Rendezvous</title>
		<link>http://www.goland.org/rightslost/</link>
		<comments>http://www.goland.org/rightslost/#comments</comments>
		<pubDate>Wed, 04 May 2005 00:00:00 +0000</pubDate>
		<dc:creator>Administrator</dc:creator>
				<category><![CDATA[Internet Protocols]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Our rights only exist to the extent that we defend them in our daily lives. The right to free speech, for example, would quickly drain away if we didn&#39;t frequently exercise it and by so doing kept the knowledge of the rights importance and the mechanisms to protect it alive and well. But too often [...]]]></description>
			<content:encoded><![CDATA[<p>Our rights only exist to the extent that we defend them in our  daily lives. The right to free speech, for example, would quickly  drain away if we didn&#39;t frequently exercise it and by so  doing kept the knowledge of the rights importance and the  mechanisms to protect it alive and well. But too often people  believe that the need to defend our rights doesn&#39;t apply to  them because they are just a single individual. Who cares what a  single person does? But when each individual believes their  actions don&#39;t matter then they significantly reduce the work  required by those who would take our rights away.</p>
<p>  <span id="more-510"></span>
<p>An example of this situation came up in the BPEL TC today. As  I discussed <a href="/Tech/bpeltibcoenglish.htm" shape="rect">previously</a>  the Tibco corporation has decided that the BPEL TC&#39;s use of  the term rendezvous, even though we explicitly use it in its  common English usage, is violating their trademark. To this end  the Tibco corporation has demanded that the BPEL group desist in  its use of the word rendezvous as the value of an attribute in  BPEL. Mind you, what Tibco hasn&#39;t even attempted to do in the  group is to actually demonstrate that our use is, in any way, a  violation of their trademark.</p>
<p>To make matters worse today&#39;s discussion of the issue on  the group phone call focused on the possibility of Tibco suing  people. The assumption of the group was that if we didn&#39;t  change the term then Tibco would start suing us. An assumption, I  would add, that the Tibco representative neither encouraged nor  attempted to dispel. So under the cloud of the implicit threat of  a lawsuit the group voted. 11 people voted to open the issue and  implicitly to change the term. 6 people voted to not open the  issue and thus reject Tibco&#39;s claim. 13 people had so  disassociated themselves from the proceedings that they  abstained.</p>
<p>What hope do our freedoms have if 24 out of 30 people are  willing to throw those freedoms away without any evidence of an  actual infraction? What hope do our freedoms have when 24 out of  30 people hold those freedoms so cheap they would discard them at  the slightest whiff of a threat? As things now stand the Tibco  corporations has successfully removed the word rendezvous from  the BPEL TC&#39;s dictionary without having to spend a dime on  legal proceedings or providing any proof that our use is  infringing.</p>
<p>There is still, however, some hope. We will have a vote in the  group on what term to replace &#39;rendezvous&#39; with. The  group could still choose to not replace it at all. There is still  a chance left for people to realize their mistake and stand up  for all of our liberties. Our individual actions do matter. Our  collective freedoms only exist to the extent that we exercise  them. Let&#39;s hope that the group decides that our rights to  use our own language without corporations like Tibco taking the  very words from our mouths is a right worth defending.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.goland.org/rightslost/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>BPEL, TIBCO and trademarking the English language</title>
		<link>http://www.goland.org/bpeltibcoenglish/</link>
		<comments>http://www.goland.org/bpeltibcoenglish/#comments</comments>
		<pubDate>Wed, 13 Apr 2005 00:00:00 +0000</pubDate>
		<dc:creator>Administrator</dc:creator>
				<category><![CDATA[Internet Protocols]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Issue 202 in the BPEL TC is a demand from Tibco that the BPEL TC change the word &#39;rendezvous&#39; that is used as the value of an attribute in the BPEL programming language because Tibco has trademarked the word &#39;rendezvous&#39;. To be clear, trademarks do not apply to &#39;descriptive&#39; uses and that is exactly how [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.choreology.com/external/WS_BPEL_issues_list.html#Issue202" shape="rect">  Issue 202</a> in the BPEL TC is a demand from Tibco that the BPEL  TC change the word &#39;rendezvous&#39; that is used as the value  of an attribute in the BPEL programming language because Tibco  has trademarked the word &#39;rendezvous&#39;. To be clear,  trademarks do not apply to &#39;descriptive&#39; uses and that is  exactly how BPEL uses the term &#39;rendezvous&#39;. So legally  speaking Tibco most likely doesn&#39;t have a leg to stand on. I  do have sympathy for Tibco because one is required to  &#39;vigorously&#39; enforce a trademark in order to keep it. So  to protect their trademark they need to be seen to be defending  it, hence issue 202. But now people in the group are scared that  Tibco will sue them (or their employer) if we don&#39;t change  the term. Hopefully the group will stand up for the freedom to  use the English language and reject issue 202 on next week&#39;s  call. An even better outcome would be a change in the law that  would make it illegal to get a Trademark on a common English  word. The fact that Tibco could trademark the word  &#39;rendezvous&#39; and then try to banish its use from  technical efforts is insane.<br clear="none"/></p>
<p><br clear="none"/></p>
]]></content:encoded>
			<wfw:commentRss>http://www.goland.org/bpeltibcoenglish/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The Importance of Humility in Extensibility Design</title>
		<link>http://www.goland.org/extensions/</link>
		<comments>http://www.goland.org/extensions/#comments</comments>
		<pubDate>Sat, 29 Jan 2005 00:00:00 +0000</pubDate>
		<dc:creator>Administrator</dc:creator>
				<category><![CDATA[Internet Protocols]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[When designing a protocol or programming language the inclusion of extensibility is essentially an act of humility. One is minimally admitting that one&#39;s design is not complete and more generally one is admitting that one&#39;s design is not perfect. By providing for extensibility one is enabling others to improve and in many cases fix one&#39;s [...]]]></description>
			<content:encoded><![CDATA[<p>When designing a protocol or programming language the  inclusion of extensibility is essentially an act of humility. One  is minimally admitting that one&#39;s design is not complete and  more generally one is admitting that one&#39;s design is not  perfect. By providing for extensibility one is enabling others to  improve and in many cases fix one&#39;s design.</p>
<p>Unfortunately it&#39;s easy to get extensibility design wrong.  Typically such design errors result from assuming oneself or  others to be perfect and in that assumption one fails to provide  for sufficient extensibility. A rather subtle example of this  problem recently came up in the Web Services &#8211; Business Process  Execution Language Technical Committee (<a href="http://www.oasis-open.org/committees/tc_home.php?wg_abbrev=wsbpel" shape="rect">WS-BPEL  TC</a>).</p>
<p>  <span id="more-484"></span>
<p>The BPEL TC is trying to agree on how to <a href="http://www.oasis-open.org/committees/download.php/10868/wsbpel_issues_list.html#Issue92" shape="rect">  enable extensions to BPEL and its execution environment</a>. The  working assumption of the TC is that extensions will have IDs and  those IDs will be URIs and those URIs will be included in each  BPEL file that makes use of the identified extension. Each URI  can then be tagged with a mustUnderstand attribute that indicates  if the BPEL engine must support that extension or not. When  processing a BPEL program file a BPEL engine will check the list  of extensions and if it doesn&#39;t recognize any extension  marked &quot;must understand&quot; then the engine will refuse to  run the file.</p>
<p>Where things get interesting is a proposal to overload the  extension ID, which is a URI, to also have it be the XML  namespace for any XML attributes or elements associated with that  extension. The attraction of doing this is that a BPEL engine can  collect together all the XML attributes/elements in a BPEL  program instance and determine if those elements/attributes come  from the BPEL namespace or one of the extension namespaces. If  the answer is neither then the element/attribute must be  illegal.</p>
<p>The benefit of this trick is that it can automatically catch  certain typos. If someone misspells a namespace name then this  trick would automatically catch it. Of course the trick is  useless if someone gets the namespace right but misspells an  element or attribute local name as the only information  automatically available to the BPEL engine about an extension as  a result of this trick is just its namespace. This trick also  can&#39;t catch when elements or attributes are used with the  wrong syntax or in the wrong locations, again, that information  is not encoded in the extension declaration. In fact the value of  this trick is so minimal one wonders why it&#39;s worth having at  all? Still, I&#39;ve seen variants of this design pattern  attempted so many times that I think it&#39;s worth cataloging  what the problems are.</p>
<p>In theory there is nothing wrong with the trick, so long as  all extensions are perfectly designed for every possible use. In  other words this design assumes extension writers are  infallible.<br clear="none"/></p>
<p>For example, let&#39;s say that Company A comes up with two  extension XML elements to BPEL, &lt;EXT1&gt; and &lt;EXT2&gt;. It  puts these two elements into the http://companya.com/ext  namespace which, according to the previous design, must also be  the extension ID for any BPEL process that uses these two  elements.</p>
<p>Now along comes Company B. Company B has invented its own new  elements but it turns out that company A&#39;s &lt;EXT1&gt;  extension element would perfectly complete Company B&#39;s  extension set. However Company A&#39;s other extension element,  &lt;EXT2&gt;, doesn&#39;t fit in at all so Company B doesn&#39;t  want to have to support it. Naively enough Company B creates a  new extension called http://Bcompany.com/bpel which includes all  the new Company B extensions as well as implicitly referencing  the &lt;EXT1&gt; extension element from Company A&#39;s  namespace.</p>
<p>Of course as soon as a programmer creates a BPEL program that  uses &lt;a:EXT1 xmlns:a=&quot;http://companya.com/ext&quot;/&gt;  but only declares the extension http://Bcompany.com/bpel, the  BPEL engine will throw an error. It will say &quot;your program  is in error because you use an element from the namespace  http://companya.com/ext but you don&#39;t declare that as an  extension.&quot;</p>
<p>Company B can work around this problem by telling everyone who  uses Company B&#39;s extension to make sure to include an  extension declaration for http://companya.com/ext but to mark it  as &quot;Must Understand = NO&quot;. Now the automatic validator  won&#39;t fail on the element from Company A&#39;s namespace but  by making the extension declaration optional engines won&#39;t  actually have to support all of Company A&#39;s namespace, only  the &lt;EXT1&gt; element that the Company B extension implicitly  requires.<br clear="none"/></p>
<p>An immediate complication of this trick is that it reduces the  utility of the typo prevention system. Notice what happens if a  programmer using Company B&#39;s extension accidentally types in  &lt;EXT2&gt; instead of &lt;EXT1&gt;. Since &lt;EXT2&gt; is from  the same namespace as &lt;EXT1&gt; the automatic validator will  think it&#39;s legitimate. In a funny way the more re-use  extensions make of other people&#39;s work the less valuable the  typo prevention mechanism is because the more extraneous  namespaces will be declared and so the larger the room for  error.<br clear="none"/></p>
<p>Also note how complicated the automatic  validation logic will have to be. A really simple validator would  go through the optional extensions, identify any that aren&#39;t  supported and delete any elements or attributes in the BPEL file  from the unsupported extension&#39;s namespace. But that  won&#39;t be possible because extensions like Company B&#39;s may  have implicit requirements for specific elements from other  namespaces. So in this case there would have to be some kind of  exception list that an engine that supported Company B&#39;s  extension but didn&#39;t support Company A&#39;s exception would  have to have that told it that it was o.k. to delete all elements  and attributes from Company A&#39;s namespace except for  &lt;EXT1&gt;.<br clear="none"/>
<p>But wait, the fun&#39;s not over yet! Throwing in an optional  reference to http://companya.com/ext can cause additional  complications because an extension doesn&#39;t just define new  attributes and elements, it can also define new behavioral  requirements for the BPEL engine. For example, Company A&#39;s  extension might include the implicit requirement that any BPEL  engine that supports the extension must use weak cryptography for  web service communications in order to make Company A&#39;s  extension exportable. So when someone just wanting to use Company  B&#39;s extension, which neither needs nor wants the weak  cryptography limitation, is forced to include  http://companya.com/ext as an optional extension (to subvert the  &#39;typo&#39; protection) and if the BPEL engine that the  program is running on actually supports Company A&#39;s extension  then they will find their program inadvertently only using weak  cryptography. This is a great example of the law of unintended  consequences.</p>
<p>To dig out of this mess Company B will have to explicitly  define as part of its mandatory semantics that if Company A&#39;s  extension is used but is marked as optional then the weak  cryptography requirement required by Company A&#39;s extension  must be ignored.</p>
<p>To review, the problems with overloading the extension ID to  also be the namespace name are:</p>
<ol>
<li><span class="c1">Makes Re-Use Painful</span> &#8211; One    can&#39;t just declare a single extension and be done. Rather,    one has to declare the extension and then declare extensions    for each and every namespace that the first extension draws    elements or attributes from. In addition the extension designer    has to review the implied semantics of all the extensions that    it re-uses elements or attributes from and determine which of    their implicit engine semantics to de-activate.</li>
<li><span class="c1">Doesn&#39;t Actually Catch Many    Typos</span> &#8211; Because the typo system only works at the    namespace level it already can&#39;t catch errors in typing    element or attribute local names and because of the requirement    to throw in namespace declarations for each and every namespace    one borrows so much as one attribute or element from the typo    validator will become even less useful.<br clear="none"/></li>
</ol>
<p>The core of all of these problems is the underlying  assumption that people who design extensions are infallible. That  extension designers will exactly nail the semantics, attributes  and elements that everyone else will want to re-use so there will  never be a need to borrow just part of the attributes or elements  in an extension or to override any of the extension&#39;s  implicit engine semantics.. A humbler approach admits to both the  possibility and indeed probability of mistakes in the granularity  of extensions and so doesn&#39;t overload extension IDs with  namespace functionality.<br clear="none"/></p>
]]></content:encoded>
			<wfw:commentRss>http://www.goland.org/extensions/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Innovation, Premature Standardization and Caveat
  Emptor</title>
		<link>http://www.goland.org/innovationandstandards/</link>
		<comments>http://www.goland.org/innovationandstandards/#comments</comments>
		<pubDate>Sat, 13 Nov 2004 00:00:00 +0000</pubDate>
		<dc:creator>Administrator</dc:creator>
				<category><![CDATA[Internet Protocols]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Adam Bosworth&#39;s blog had a pointer to an interesting entry in another blog on innovation and standards which itself pointed to another good blog entry on the subject. All three came to the same conclusion &#8211; Standards shouldn&#39;t innovate. As anyone who has read my rule&#39;s of standardization knows, I agree wholeheartedly. And yet, premature [...]]]></description>
			<content:encoded><![CDATA[<p>Adam Bosworth&#39;s <a href="http://www.adambosworth.net/" shape="rect">blog</a> had a <a href="http://www.adambosworth.net/archives/000030.html" shape="rect">pointer</a> to  an interesting <a href="http://www.looselycoupled.com/blog/lc00aa00071.html" shape="rect">entry</a>  in another blog on innovation and standards which itself pointed  to another good <a href="http://www.tbray.org/ongoing/When/200x/2004/11/11/AtomInnovation" shape="rect">  blog entry</a> on the subject. All three came to the same  conclusion &#8211; Standards shouldn&#39;t innovate. As anyone who has  read my <a href="http://www.goland.org/Tech/YaronRulesStandardization.htm" shape="rect">rule&#39;s  of standardization</a> knows, I agree wholeheartedly. And yet,  premature standards, standards in areas that are not well  understood, keep getting churned out. Why?<br/></p>
<p>  <span id="more-489"></span>
<p>The answer is devastatingly simple &#8211; money.<br/></p>
<p>Customers love technologies that have the word standard, no  matter how disingenuously used, applied to them. Customer  reactions to the word &#39;standard&#39; are so strong that it  causes vendors who are dread enemies to get together in back  rooms and cook up something they can slap the &#39;standard&#39;  label on. Sure the technologies are typical examples of design by  committee, sure they are badly thought through, have no real  world experience and more or less fail to work as soon as they  are tried in the real world. And of course they are never  actually standardized in any useful sense of the term. But hey,  the word &#39;standards&#39; is applied to them, so they must be  good!<br/></p>
<p>You&#39;d think that eventually customers would clue in. That  they would learn the sort of things I talk about in my <a href="http://www.goland.org/Tech/buyingopenstandards.htm" shape="rect">buyer&#39;s  guide to standards</a> and refuse to touch the stuff. But quite  the opposite, everyone, everywhere, customers, analysts,  journalists, etc. declare these messes to be the greatest thing  since sliced bread. Everyone says &quot;well sure, we know it has  problems but &#39;they&#39; will fix it.&quot; Personally,  I&#39;m still waiting for &#39;they&#39; to show up.<br/></p>
<p>Customer interest in standards is understandable. A true  standard, that is, a specification that is based on long  experience that has been through extensive review with clear  intellectual property rights (IPR) and solid change processes  provide customers with investment protection. It makes sure that  no single vendor or even small group of vendors can screw a  customer over. As long as the customer sticks to the standard  they can mix and match vendors at will. Standards are good stuff.  So who can blame customers for being excited when one is  available and for preferring standardized technologies to  non-standardized ones?<br/></p>
<p>But the cruel reality is that real standards come at the end  of a technology&#39;s innovation period, not the beginning. By  the time a real standard shows up the technology isn&#39;t new or  inventive. This is inherent to the process. Standards come after  a technology is fully understood. Premature standardization  results in badly constructed, difficult to use, non  interoperable, non portable messes. But so long as the word  &#39;standard&#39; can be said next to these toxic spills, at  least with a more or less straight face, customers will lap it  up.<br/></p>
<p>In the end premature standards fail. They collapse under their  own ill considered, untested, badly understood incoherent  designs. But who is hurt? Certainly not the vendors. They will  just sell the next snake oil. The ones who get really hurt are  the customers who are now stuck with sludge. The ultimate irony  is that customers will end up paying the vendors tons of cash to  figure out how to get the old snake oil to work with the  new.<br/></p>
<p>So who can blame the vendors? If customers won&#39;t get  educated enough to protect themselves you can&#39;t blame the  vendors for taking advantage of customer ignorance. Capitalism  only works when both the buyer and the seller are vigorous in  defending their own interests. If buyers let down their side of  the bargain no one should be surprised if the sellers take  advantage. Caveat emptor indeed.<br/></p>
]]></content:encoded>
			<wfw:commentRss>http://www.goland.org/innovationandstandards/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>WebDAV, DASL, XQUERY and XPATH 2.0</title>
		<link>http://www.goland.org/dasl/</link>
		<comments>http://www.goland.org/dasl/#comments</comments>
		<pubDate>Sun, 18 Apr 2004 00:00:00 +0000</pubDate>
		<dc:creator>Administrator</dc:creator>
				<category><![CDATA[Internet Protocols]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[The Web&#39;s slow but inexorable movement from a read only to a collaborative environment is increasing WebDAV&#39;s success. But WebDAV still has a serious functional outage &#8211; search. The DASL community has been keeping hope alive by continuing to work on a search grammar for WebDAV. But much as WebDAV adopted XML both to solve [...]]]></description>
			<content:encoded><![CDATA[<p>    The Web&#39;s slow but inexorable movement  from a read only to a collaborative environment is increasing  <a href="/Tech/webdav.htm" shape="rect">WebDAV</a>&#39;s success. But WebDAV  still has a serious functional outage &#8211; search. The <a href="http://www.webdav.org/dasl/" shape="rect">DASL</a> community has been keeping  hope alive by continuing to work on a search grammar for WebDAV.  But much as WebDAV adopted XML both to solve real problems and to  ride on the coat tails of XML&#39;s success, so DASL could solve  a number of serious technical issues and increase its own  visibility and leverage the excitement and investment in the  XPATH/XQUERY community if it adopted a profile of XPATH 2.0 as  its basic search grammar. In the article below I discuss some of  the details of how DASL could use XPATH.<br clear="none"/>  <span id="more-480"></span><br />
<h2>The Background</h2>
<p><a href="http://www.webdav.org" shape="rect">WebDAV</a>  is a very cool technology that I provided a nice, short, summary  of in an <a href="/Tech/webdav.htm" shape="rect">article</a> I wrote a while  back. But, to quickly recap the article, WebDAV is a HTTP based  protocol for accessing data. It defines how to surf the  data&#39;s hierarchy, how to add/edit/copy/move/delete both  folders and files in that hierarchy and how to set/get properties  belonging to folders/files in the hierarchy. It works great for  accessing e-mail, file systems, directories, databases, whatever.  It&#39;s a standard, it&#39;s widely adopted and it&#39;s very  nifty.<br clear="none"/><br />
<h2>The Problem</h2>
<p>WebDAV has a weakness that has been causing  me some problems as I promote its use &#8211; Search.<br clear="none"/>  <br clear="none"/>  The <a href="http://www.webdav.org/dasl/" shape="rect">DASL</a> effort, to add  search to WebDAV, has been going on for some time now and the  latest <a href="http://greenbytes.de/tech/webdav/draft-reschke-webdav-search-latest.html" shape="rect">  draft</a>, dated January of this year, is keeping hope alive. But  there is a technique that was used to outstanding effect with  WebDAV that I think could really help DASL get a lot of community  interest and support &#8211; ride on someone else&#39;s coat tails. In  the case of WebDAV the coat tails we rode on were XML&#39;s  itself. WebDAV was the first protocol I&#39;m aware of to use XML  and this got us tons of free interest and publicity. Thankfully  XML added real value to WebDAV so the standards committee can be  proud of its pioneering efforts.<br clear="none"/><br />
<h2>The Pitch</h2>
<p>Today there are new coat tails that I think  DASL could ride on &#8211; XPATH/XQUERY. After more years than anyone  cares to count it looks like XPATH/XQUERY will finally finish  sometime this decade. Meanwhile everyone is already investing in  XQUERY. At last count there were 29 or so <a href="http://www.w3.org/XML/Query#products" shape="rect">implementations</a>,  several of which are open source. JSR 225, which will standardize  an API for XQUERY, was founded by Oracle and IBM and is supported  by BEA and Sun. BEA, Microsoft and Oracle all have XPATH/XQUERY  implementations. The XPATH/XQUERY band wagon is clearly one worth  being on and one that could really help pump up interest in DASL.  And, much as with XML&#39;s contribution to WebDAV, XPATH/XQUERY  has a ton of real value to add to DASL.<br clear="none"/>  <br clear="none"/>  I realize that XPATH/XQUERY is significantly more complex than  DASL&#39;s current basic query, but given the enormous number of  existing implementations , including open source ones, I do not  believe that the complexity of XPATH/XQUERY need be a burden on  the WebDAV community. Equally importantly, XPATH/XQUERY has  already figured out a lot of very hard problems regarding how to  search XML. By using XPATH/XQUERY, the DASL community would avail  itself of the enormous experience built right into  XPATH/XQUERY.<br clear="none"/><br />
<h2>The Details</h2>
<p>What I am suggesting is that DASL make one  big change, replace its basic grammar with some profile of XPATH  2.0. This, of course, begs the question of exactly what a XPATH  2.0 expression submitted in a WebDAV SEARCH method would be  querying. After all, XPATH expects to be applied against  something, what is the &#39;something&#39; that is would be  searching?<br clear="none"/>  <br clear="none"/>  I propose that what XPATH be applied against is a representation  of the WebDAV resource space as a XML <a href="http://www.w3.org/TR/xml-infoset/" shape="rect">infoset</a>. A XML infoset is  essentially an abstract representation of the XML object model,  it consists of a hierarchy whose entries are elements,  attributes, text, etc. It allows one to model XML data  independent of the actual XML serialization.<br clear="none"/>  <br clear="none"/>  So what my proposal boils down to is creating a virtual XML  document, represented by the infoset, whose contents are the  names, properties and URIs of the resources within a WebDAV  search space. The XPATH would then be applied against that  virtual document. A XML serialization of the virtual document,  something which would never be created in the real world and is  only included here to make it easier for the reader to visualize  what I&#39;m talking about, could look like:<br clear="none"/>  <br clear="none"/>
<pre xml:space="preserve">&lt;<span class="c2">root</span> xmlns=&quot;dav:infoset&quot;&gt;<br clear="none"/>   &lt;<span class="c2">resource</span>&gt;<br clear="none"/>      &lt;<span class="c2">name</span>&gt;http://example.com/&lt;/name&gt;<br clear="none"/>      &lt;<span class="c2">properties</span>&gt;<br clear="none"/>         &lt;<span class="c2">displayName</span>&gt;example.com root&lt;/displayName&gt;<br clear="none"/>         &lt;<span class="c2">resourcetype</span>&gt;&lt;collection/&gt;&lt;/resourcetype&gt;<br clear="none"/>      &lt;/properties&gt;<br clear="none"/>      &lt;<span class="c2">children</span>&gt;<br clear="none"/>         &lt;<span class="c2">name</span>&gt;http://example.com/index.html&lt;/name&gt;<br clear="none"/>      &lt;/children&gt;<br clear="none"/>   &lt;/resource&gt;<br clear="none"/>   &lt;<span class="c2">resource</span>&gt;<br clear="none"/>      &lt;<span class="c2">name</span>&gt;http://example.com/index.html&lt;/name&gt;<br clear="none"/>      &lt;<span class="c2">properties</span>&gt;<br clear="none"/>         &lt;<span class="c2">getContentType</span>&gt;text/html&lt;/getContentType&gt;<br clear="none"/>         &lt;<span class="c2">resourcetype</span>/&gt;<br clear="none"/>      &lt;/properties&gt;<br clear="none"/>      &lt;<span class="c2">representation</span>&gt;<br clear="none"/>         &lt;<span class="c2">properties</span>&gt;<br clear="none"/>            &lt;<span class="c2">getcontentType</span>&gt;text/html&lt;/getcontentType&gt;<br clear="none"/>            &lt;<span class="c2">getcontentLanguage</span>&gt;en&lt;/getcontentLanguage&gt;<br clear="none"/>         &lt;/properties&gt;<br clear="none"/>         &lt;<span class="c2">bodyURI</span>&gt;http://example.com/index.html;lang=en&lt;/bodyURI&gt;<br clear="none"/>      &lt;/representation&gt;<br clear="none"/>      &lt;<span class="c2">representation</span>&gt;<br clear="none"/>         &lt;<span class="c2">properties</span>&gt;<br clear="none"/>            &lt;<span class="c2">getcontentType</span>&gt;text/html&lt;/getcontentType&gt;<br clear="none"/>            &lt;<span class="c2">getcontentLanguage</span>&gt;de&lt;/getcontentLanguage&gt;<br clear="none"/>         &lt;/properties&gt;<br clear="none"/>         &lt;<span class="c2">bodyURI</span>&gt;http://example.com/index.html;lang=de&lt;/bodyURI&gt;<br clear="none"/>      &lt;/representation&gt;<br clear="none"/>   &lt;/resource&gt;<br clear="none"/>&lt;/root&gt;<br clear="none"/></pre>
<p>Queries would be executed against this infoset as if itreally existed. In reality the WebDAV server would take theincoming query and translate it into a form that matched how thesystem actually stored information. It bears repeating that theinfoset is a conceptual not an actual entity. I&#39;m notsuggesting that WebDAV servers go create a huge XML document withall their data in it and then run XQUERY against it.<br clear="none"/>  <br clear="none"/>  Queries that wanted to query both the values of the name/property  space as well as the contents of actual resources could use the  document-uri function. This function returns the contents of a  resource it is pointed at and makes it available for querying.  See the Q&amp;A in the appendix for a discussion of why I choose  this approach.<br clear="none"/>  <br clear="none"/>  At some point full XQUERY support would be needed but I would  remind the reader of an old design rule &#8211; The spec is done where  there is nothing left to cut. A standardized DASL specification  with the current query language negotiation features and a  &#39;basic grammar&#39; based on XPATH 2.0 would be very useful  and well worth standardizing. One could then have a later  extension spec that added in full XQUERY support as a new  pluggable query language option.<br clear="none"/><br />
<h2>The Conclusion</h2>
<p>As the Web is finally, slowly, moving from  a read only to a truly collaborative environment WebDAV is more  and more finding an audience who realize that WebDAV solves real  problems. Unfortunately search is still a chink in WebDAV&#39;s  armor. But DASL can turn this problem into an opportunity if it  adopts XPATH as its basic grammar and so allows itself to  leverage the excitement and investment available via the  XPATH/XQUERY community.<br clear="none"/><br />
<h2>Appendix &#8211; Some thoughts on the WebDAV Infoset</h2>
<p>Below is a  RelaxNG compact schema that describes what an infoset for the  WebDAV resource space could look like:<br clear="none"/>
<pre xml:space="preserve">namespace dav = &quot;dav:infoset&quot;<br clear="none"/>start = element dav:root { Contents* }<br clear="none"/>Contents = Collection | Resource<br clear="none"/><br clear="none"/>Resource = element dav:resource { Name+, Properties, Representation* }<br clear="none"/>Name = element dav:name { xsd:anyURI }<br clear="none"/>Properties = element dav:properties { RTNoCol &amp; AnyButRT* }<br clear="none"/>RTNoCol = element dav:resourcetype { (element * - dav:collection { any* })* }<br clear="none"/>Representation = element dav:representation { RepProperties, BodyUri+ }<br clear="none"/>RepProperties = element dav:properties { anyElement* }<br clear="none"/>BodyUri = element dav:bodyURI { xsd:anyURI }<br clear="none"/><br clear="none"/>Collection = element dav:resource { Name+, ColProperties, Representation*, Children }<br clear="none"/>ColProperties = element dav:properties { TypeCol &amp; AnyButRT* }<br clear="none"/>TypeCol = element dav:resourcetype { element dav:collection { anyElement* } }<br clear="none"/>Children = element dav:children { Name+ }<br clear="none"/><br clear="none"/>AnyButRT = element * - dav:resourcetype { any* }<br clear="none"/><br clear="none"/>any = anyAttribute | text | anyElement<br clear="none"/>anyAttribute = attribute * { text }<br clear="none"/>anyElement = element * { (anyAttribute | text | anyElement)* }<br clear="none"/></pre>
<h3>Q&amp;A about the Infoset Idea</h3>
<p><span class="c2"><span class="c2">Q. Why is the infoset so  flat?<br clear="none"/></span></span>A. My original design was hierarchical  where resource elements could be contained inside of collections.  But the HTTP URL hierarchy is just one particular view on a  WebDAV space. There are lots of other possible views, as the  <a href="http://ftp.ics.uci.edu/pub/ietf/webdav/collection/draft-ietf-webdav-binding-protocol-02.txt" shape="rect">  bindings</a> spec enables. So rather than get into the question  of &#39;whose view&#39; is being seen I though it easier to just  make the whole thing flat. I also suspect that the flat hierarchy  will make it easier for implementers to map between queries and  implementation. But I could be completely wrong in which case  perhaps the structure should be hierarchical.<br clear="none"/>  <br clear="none"/>  <span class="c2">Q. How do I search on the content of a  resource?</span><br clear="none"/>  A. XPATH includes a document-uri function call whose response is  the data recorded at that URI which themselves become part of the  data available to XPATH to examine. So if one wants to search on  the contents of the body one just uses the document-uri function  call. Originally I had thought of just including the content of  the resources directly into the infoset model but this is  probably a bad idea. As Michael Rowley pointed out to me, it  makes simple queries about names and properties more complex as  one has to explicitly exclude the body content. Perhaps even more  importantly it will probably lead to people making really  expensive queries. Someone looking for a resource named foo.htm  is quite likely to do a search on &quot;//foo.htm&quot;. The  results of this query on an infoset that directly includes the  contents of each and every resource is left as an exercise for  the reader.<br clear="none"/>  <br clear="none"/>  <span class="c2">Q. Why is the bodyURI element&#39;s value  different than the name element&#39;s?<br clear="none"/></span>A. A single  resource can have multiple representations in various languages,  encodings, etc. In that case we need unique URIs for each and  every representation so it can be uniquely addressed. Keep in  mind that the URI can be completely bogus. For example, the URI  could be &quot;data:id239428390432&quot; which is some unique  identifier. The point is that the URI is only meant to be used in  the document-uri XQUERY function although it is good hygiene to  use a URI like &#39;data&#39; if the URI is not normally  resolvable. I suspect, btw, that in the majority of cases the  bodyURI will never actually be generated and instead will only be  implicitly used in a query.<span class="c2"><br clear="none"/>  <br clear="none"/>  Q. Isn&#39;t the Children element unnecessary?<br clear="none"/></span>A. In  theory one can reverse engineer the contents of collections by  searching through the names in the infoset. E.g. all the children  of foo should have names that match foo/*. But specs like  <a href="http://ftp.ics.uci.edu/pub/ietf/webdav/collection/draft-ietf-webdav-binding-protocol-02.txt" shape="rect">  bindings</a>, which enables one to make arbitrary URIs members of  collections or <a href="http://ftp.ics.uci.edu/pub/ietf/webdav/collection/draft-ietf-webdav-ordering-protocol-02.txt" shape="rect">  ordering</a>, which allows one to specify an ordering for the  children of a collection, illustrate the need for an explicit  membership list.<br clear="none"/>  <br clear="none"/>  <span class="c2">Q. What if a resource has multiple  names?</span><br clear="none"/>  A. That&#39;s why the name element is allowed to show up more  than once.<br clear="none"/>  <br clear="none"/>  <span class="c2">Q. Why did you use properties in the  representation element instead of just using HTTP  headers?</span><br clear="none"/>  A. I have an agenda to see WebDAV made available via web  services. It would take no great effort to turn WebDAV methods  into WSDL operations that could then be mapped to SOAP. So this  motivates me to stay away from explicit HTTP headers. Since  WebDAV already provides mappings of the major HTTP headers into  the WebDAV property space, e.g. getcontenttype, I decided to just  leverage that existing mapping.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.goland.org/dasl/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Yaron&#039;s Rules of Standardization</title>
		<link>http://www.goland.org/YaronRulesStandardization/</link>
		<comments>http://www.goland.org/YaronRulesStandardization/#comments</comments>
		<pubDate>Sat, 26 Jul 2003 00:00:00 +0000</pubDate>
		<dc:creator>Administrator</dc:creator>
				<category><![CDATA[Internet Protocols]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Most of my job for the last few years has been working on standards. In that time I noticed a fairly obvious pattern for technologies that tend to make successful standards, they meet three criteria: Yaron&#39;s rules of standardization: The technology must be very old and very well understood 20 years is a good rule [...]]]></description>
			<content:encoded><![CDATA[<p>    Most of my job for the last few years has been  working on standards. In that time I noticed a fairly obvious  pattern for technologies that tend to make successful standards,  they meet three criteria:<br clear="none"/>
<p class="c1">Yaron&#39;s rules of standardization:</p>
<ul>
<li>The technology must be very old and very well understood
<ul>
<li>20 years is a good rule of thumb</li>
</ul>
</li>
<li>Everyone must implement the technologies in essentially the    same way
<ul>
<li>A good rule of thumb is, how hard would it be to build        a bi-directional proxy between the various players        implementation of the technology?</li>
</ul>
</li>
<li>Standardizing the technology must provide greater advantage    to the software writing community then keeping the technology    incompatible
<ul>
<li>Even in the open source world standards can fail if        there isn&#39;t enough advantage in it, just look at the        fights over RSS.</li>
</ul>
</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.goland.org/YaronRulesStandardization/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Patents, Open Source and GPL</title>
		<link>http://www.goland.org/opensourcegpl/</link>
		<comments>http://www.goland.org/opensourcegpl/#comments</comments>
		<pubDate>Sat, 15 Feb 2003 00:00:00 +0000</pubDate>
		<dc:creator>Administrator</dc:creator>
				<category><![CDATA[Internet Protocols]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Lots of commercial companies are getting very worried about Open Source. They view Open Source as a direct threat to their success. After all, how do you compete with free? I think these companies are missing the point, Open Source is just another commoditizer and anyone who has succeeded in the technology business long ago [...]]]></description>
			<content:encoded><![CDATA[<p>Lots of commercial companies are getting very worried about  Open Source. They view Open Source as a direct threat to their  success. After all, how do you compete with free? I think these  companies are missing the point, Open Source is just another  commoditizer and anyone who has succeeded in the technology  business long ago learned how to deal with being commoditized. In  fact, as commoditizers go Open Source is not a bad way to go. In  the old days when a technology became commoditized it would  disappear into some dominant platform that no one could access.  With Open Source when a technology is commoditized it instantly  becomes available to everyone which is to everyone&#39;s benefit,  except of course to the dominant platform owners.</p>
<p>  <span id="more-502"></span>
<p>Regardless, many companies are still afraid and want to stop  Open Source. Unlike previous commoditizers who were companies,  with lawyers and marketing departments who could step in if  unfair things were done there is no similar protector for Open  Source. So it is very tempting to create legal barriers to Open  Source rather than just competing with it.</p>
<p>One of the easiest ways to create those legal barriers is  through patent licensing terms. After all patents are legal  monopolies and one is allowed to apply a legal monopoly in any  way one wants, including ways that stop or hinder Open Source. A  hot area for patents these days are the patent licenses being  offered for Web Services protocols. Software companies have made  it clear that they won&#39;t implement a Web Service protocol if  it isn&#39;t royalty free, in other words, they won&#39;t  implement it if they have to pay someone money. However a simple  technique allows one to write a royalty free license in such a  way that it will not hurt a typical commercial software company  but will hurt Open Source. This technique is called &#39;a  non-transferable license&#39;.</p>
<p>Imagine that Company A files for a bunch of patents for its  new Web Services Protocol WS-FooBar. Company B files for a  WS-FooBar royalty free patent license with Company A which  Company A grants. Generally speaking the way non-transferable  licenses work is that Company B is free to implement WS-FooBar  and sell product to its customers which includes the WS-FooBar  code. The customers don&#39;t have to get their own WS-FooBar  licenses so long as they use Company B&#39;s binaries. Where  things get interesting is if Company B decides to make its  WS-FooBar program Open Source.</p>
<p>Now company C enters the picture. Company C is creating an  internal program based on company B&#39;s source code. However,  because Company C is using Company B&#39;s source code and not  its binaries it will be necessary for Company C to file for a  WS-FooBar royalty free patent license with Company A.</p>
<p>This doesn&#39;t sound too bad until you think about what it  actually takes to get a license. Let&#39;s say that the average  piece of non-trivial Open Source software supports 5 &quot;open  standards&quot; technologies and that each technology was  authored by 5 companies. That means just to use one piece of  software Company C will have to file 25 license applications.[1]  Imagine some engineer at Company C downloading some Open Source  and then having to go to their legal department and saying  &quot;um&#8230; I need you to approve us filing these 25  licenses&quot;. Keep in mind that this process will have to be  repeated for each and every Open Source program whose source code  is being used since most non-transferable licenses are granted on  a per-application basis.</p>
<p>Non-transferable licenses are actually a knock out blow to  <a href="http://www.gnu.org/copyleft/gpl.html" shape="rect">GPL</a> . Section  6 of GPL requires that anyone who downloads GPL source code is  free to change/use it in any way they want without having to ask  anyone&#39;s permission. Company B&#39;s source code can&#39;t  meet this requirement because of its dependence on the WS-FooBar  patent license. In other words, because Company C has to ask  Company A&#39;s permission to use Company B&#39;s source code it  isn&#39;t possible for Company B&#39;s source code to be licensed  under the GPL. Therefore any source code that involves a  non-transferable patent license cannot be implemented under a GPL  license.</p>
<p><a href="RoyaltyFreeReciprocal.htm" shape="rect">Previously</a> I had  argued that customers needed to demand Royalty Free/Reciprocal  (RFR) licenses. Now apparently the demand has to be extended to  Royalty Free, Reciprocal and Transferable (RFRT).</p>
<p>In the end it will be up to customers to decide if they want  to benefit from Open Source. If they believe Open Source is in  their interest then they have to refuse to use Web Service  protocols that are not RFRT.</p>
<p>[1] For example, if SOAP &amp; WSDL had been licensed under  non-transferable licenses then anyone using software that  including SOAP and WSDL would have to file 26 licenses.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.goland.org/opensourcegpl/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
