sasl.js 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. // wrapped by build app
  2. define("dojox/xmpp/sasl", ["dijit","dojo","dojox","dojo/require!dojox/xmpp/util,dojo/AdapterRegistry,dojox/encoding/digests/MD5"], function(dijit,dojo,dojox){
  3. dojo.provide("dojox.xmpp.sasl");
  4. dojo.require("dojox.xmpp.util");
  5. dojo.require("dojo.AdapterRegistry");
  6. dojo.require("dojox.encoding.digests.MD5");
  7. dojox.xmpp.sasl.saslNS = "urn:ietf:params:xml:ns:xmpp-sasl";
  8. dojo.declare("dojox.xmpp.sasl._Base", null, {
  9. mechanism: null,
  10. closeAuthTag: true,
  11. constructor: function(session){
  12. this.session = session;
  13. this.startAuth();
  14. },
  15. startAuth: function(){
  16. var auth = new dojox.string.Builder(dojox.xmpp.util.createElement("auth", {
  17. xmlns: dojox.xmpp.sasl.saslNS,
  18. mechanism: this.mechanism
  19. }, this.closeAuthTag));
  20. this.appendToAuth(auth);
  21. this.session.dispatchPacket(auth.toString());
  22. },
  23. appendToAuth: function(auth){},
  24. onChallenge: function(msg){
  25. if(!this.first_challenge){
  26. this.first_challenge = true;
  27. this.onFirstChallenge(msg);
  28. }else{
  29. this.onSecondChallenge(msg);
  30. }
  31. },
  32. onFirstChallenge: function(){},
  33. onSecondChallenge: function(){},
  34. onSuccess: function(){
  35. this.session.sendRestart();
  36. }
  37. });
  38. dojo.declare("dojox.xmpp.sasl.SunWebClientAuth", dojox.xmpp.sasl._Base, {
  39. mechanism: "SUN-COMMS-CLIENT-PROXY-AUTH"
  40. });
  41. dojo.declare("dojox.xmpp.sasl.Plain", dojox.xmpp.sasl._Base, {
  42. mechanism: "PLAIN",
  43. closeAuthTag: false,
  44. appendToAuth: function(auth){
  45. var id = this.session.jid;
  46. var index = this.session.jid.indexOf('@');
  47. if (index != -1){
  48. id = this.session.jid.substring(0, index);
  49. }
  50. var token = this.session.jid + '\u0000' + id + '\u0000' + this.session.password;
  51. token = dojox.xmpp.util.Base64.encode(token);
  52. auth.append(token);
  53. auth.append("</auth>");
  54. delete this.session.password;
  55. }
  56. });
  57. dojo.declare("dojox.xmpp.sasl.DigestMD5", dojox.xmpp.sasl._Base, {
  58. mechanism: "DIGEST-MD5",
  59. onFirstChallenge: function(msg){
  60. var dxed = dojox.encoding.digests;
  61. var dxedo = dojox.encoding.digests.outputTypes;
  62. var HEX = function(n){
  63. return dxed.MD5(n, dxedo.Hex);
  64. };
  65. var H = function(s){
  66. return dxed.MD5(s, dxedo.String);
  67. };
  68. var ch_str = dojox.xmpp.util.Base64.decode(msg.firstChild.nodeValue);
  69. var ch = {
  70. realm: "",
  71. nonce: "",
  72. qop: "auth",
  73. maxbuf: 65536
  74. };
  75. ch_str.replace(/([a-z]+)=([^,]+)/g, function(t,k,v){
  76. v = v.replace(/^"(.+)"$/, "$1");
  77. ch[k] = v;
  78. });
  79. var A2_append = '';
  80. switch(ch.qop){
  81. case 'auth-int':
  82. case 'auth-conf':
  83. A2_append = ':00000000000000000000000000000000';
  84. case 'auth':
  85. break;
  86. default:
  87. return false;
  88. }
  89. var cnonce = dxed.MD5(Math.random() * 1234567890, dxedo.Hex);
  90. var digest_uri = 'xmpp/' + this.session.domain;
  91. var username = this.session.jid;
  92. var index = this.session.jid.indexOf('@');
  93. if (index != -1){
  94. username = this.session.jid.substring(0, index);
  95. }
  96. username = dojox.xmpp.util.encodeJid(username);
  97. var A1 = new dojox.string.Builder();
  98. A1.append(H(username + ':' + ch.realm + ':' + this.session.password),
  99. ':', ch.nonce + ':' + cnonce);
  100. delete this.session.password;
  101. var A2_rspauth = ':' + digest_uri + A2_append;
  102. var A2 = 'AUTHENTICATE' + A2_rspauth;
  103. var response_value = new dojox.string.Builder();
  104. response_value.append(HEX(A1.toString()), ':', ch.nonce, ':00000001:', cnonce, ':',
  105. ch.qop, ':')
  106. var ret = new dojox.string.Builder();
  107. ret.append('username="', username, '",',
  108. 'realm="', ch.realm, '",',
  109. 'nonce=', ch.nonce, ',',
  110. 'cnonce="', cnonce, '",',
  111. 'nc="00000001",qop="', ch.qop, '",digest-uri="', digest_uri, '",',
  112. 'response="', HEX(response_value.toString() + HEX(A2)), '",charset="utf-8"');
  113. var response = new dojox.string.Builder(dojox.xmpp.util.createElement("response", {
  114. xmlns: dojox.xmpp.xmpp.SASL_NS
  115. }, false));
  116. response.append(dojox.xmpp.util.Base64.encode(ret.toString()));
  117. response.append('</response>');
  118. this.rspauth = HEX(response_value.toString() + HEX(A2_rspauth));
  119. this.session.dispatchPacket(response.toString());
  120. },
  121. onSecondChallenge: function(msg){
  122. var ch_str = dojox.xmpp.util.Base64.decode(msg.firstChild.nodeValue);
  123. if(this.rspauth == ch_str.substring(8)){
  124. var response = new dojox.string.Builder(dojox.xmpp.util.createElement("response", {
  125. xmlns: dojox.xmpp.xmpp.SASL_NS
  126. }, true));
  127. this.session.dispatchPacket(response.toString());
  128. }else{
  129. //FIXME
  130. }
  131. }
  132. });
  133. dojox.xmpp.sasl.registry = new dojo.AdapterRegistry();
  134. dojox.xmpp.sasl.registry.register(
  135. 'SUN-COMMS-CLIENT-PROXY-AUTH',
  136. function(mechanism){
  137. return mechanism == 'SUN-COMMS-CLIENT-PROXY-AUTH';
  138. },
  139. function(mechanism, session){
  140. return new dojox.xmpp.sasl.SunWebClientAuth(session);
  141. }
  142. );
  143. dojox.xmpp.sasl.registry.register(
  144. 'DIGEST-MD5',
  145. function(mechanism){
  146. return mechanism == 'DIGEST-MD5';
  147. },
  148. function(mechanism, session){
  149. return new dojox.xmpp.sasl.DigestMD5(session);
  150. }
  151. );
  152. dojox.xmpp.sasl.registry.register(
  153. 'PLAIN',
  154. function(mechanism){
  155. return mechanism == 'PLAIN';
  156. },
  157. function(mechanism, session){
  158. return new dojox.xmpp.sasl.Plain(session);
  159. }
  160. );
  161. });