dpn_swagger_engine 2.0.0.rc

Sign up to get free protection for your applications and to get access to all the features.
Files changed (77) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +11 -0
  3. data/.travis.yml +5 -0
  4. data/Gemfile +14 -0
  5. data/LICENSE.txt +22 -0
  6. data/README.md +123 -0
  7. data/Rakefile +37 -0
  8. data/app/assets/fonts/swagger_engine/DroidSans-Bold.ttf +0 -0
  9. data/app/assets/fonts/swagger_engine/DroidSans.ttf +0 -0
  10. data/app/assets/images/swagger_engine/collapse.gif +0 -0
  11. data/app/assets/images/swagger_engine/expand.gif +0 -0
  12. data/app/assets/images/swagger_engine/explorer_icons.png +0 -0
  13. data/app/assets/images/swagger_engine/favicon-16x16.png +0 -0
  14. data/app/assets/images/swagger_engine/favicon-32x32.png +0 -0
  15. data/app/assets/images/swagger_engine/favicon.ico +0 -0
  16. data/app/assets/images/swagger_engine/logo_small.png +0 -0
  17. data/app/assets/images/swagger_engine/pet_store_api.png +0 -0
  18. data/app/assets/images/swagger_engine/throbber.gif +0 -0
  19. data/app/assets/images/swagger_engine/wordnik_api.png +0 -0
  20. data/app/assets/javascripts/swagger_engine/application.js +24 -0
  21. data/app/assets/javascripts/swagger_engine/lang/ca.js +53 -0
  22. data/app/assets/javascripts/swagger_engine/lang/en.js +56 -0
  23. data/app/assets/javascripts/swagger_engine/lang/es.js +53 -0
  24. data/app/assets/javascripts/swagger_engine/lang/fr.js +54 -0
  25. data/app/assets/javascripts/swagger_engine/lang/geo.js +56 -0
  26. data/app/assets/javascripts/swagger_engine/lang/it.js +52 -0
  27. data/app/assets/javascripts/swagger_engine/lang/ja.js +53 -0
  28. data/app/assets/javascripts/swagger_engine/lang/ko-kr.js +53 -0
  29. data/app/assets/javascripts/swagger_engine/lang/pl.js +53 -0
  30. data/app/assets/javascripts/swagger_engine/lang/pt.js +53 -0
  31. data/app/assets/javascripts/swagger_engine/lang/ru.js +56 -0
  32. data/app/assets/javascripts/swagger_engine/lang/tr.js +53 -0
  33. data/app/assets/javascripts/swagger_engine/lang/translator.js +39 -0
  34. data/app/assets/javascripts/swagger_engine/lang/zh-cn.js +53 -0
  35. data/app/assets/javascripts/swagger_engine/lib/backbone-min.js +15 -0
  36. data/app/assets/javascripts/swagger_engine/lib/es5-shim.js +2065 -0
  37. data/app/assets/javascripts/swagger_engine/lib/handlebars-4.0.5.js +4608 -0
  38. data/app/assets/javascripts/swagger_engine/lib/highlight.9.1.0.pack.js +2 -0
  39. data/app/assets/javascripts/swagger_engine/lib/highlight.9.1.0.pack_extended.js +34 -0
  40. data/app/assets/javascripts/swagger_engine/lib/jquery-1.8.0.min.js +2 -0
  41. data/app/assets/javascripts/swagger_engine/lib/jquery.ba-bbq.min.js +18 -0
  42. data/app/assets/javascripts/swagger_engine/lib/jquery.slideto.min.js +1 -0
  43. data/app/assets/javascripts/swagger_engine/lib/jquery.wiggle.min.js +8 -0
  44. data/app/assets/javascripts/swagger_engine/lib/js-yaml.min.js +3 -0
  45. data/app/assets/javascripts/swagger_engine/lib/jsoneditor.min.js +11 -0
  46. data/app/assets/javascripts/swagger_engine/lib/lodash.min.js +102 -0
  47. data/app/assets/javascripts/swagger_engine/lib/marked.js +1272 -0
  48. data/app/assets/javascripts/swagger_engine/lib/object-assign-pollyfill.js +23 -0
  49. data/app/assets/javascripts/swagger_engine/lib/sanitize-html.min.js +6 -0
  50. data/app/assets/javascripts/swagger_engine/lib/swagger-oauth.js +347 -0
  51. data/app/assets/javascripts/swagger_engine/o2c.html +20 -0
  52. data/app/assets/javascripts/swagger_engine/swagger-ui.js +24753 -0
  53. data/app/assets/javascripts/swagger_engine/swagger-ui.min.js +14 -0
  54. data/app/assets/javascripts/swagger_engine/swagger.json +18 -0
  55. data/app/assets/stylesheets/swagger_engine/application.css +12 -0
  56. data/app/assets/stylesheets/swagger_engine/print.css +1367 -0
  57. data/app/assets/stylesheets/swagger_engine/reset.css +125 -0
  58. data/app/assets/stylesheets/swagger_engine/screen.css +1494 -0
  59. data/app/assets/stylesheets/swagger_engine/style.css +250 -0
  60. data/app/assets/stylesheets/swagger_engine/typography.css +14 -0
  61. data/app/controllers/swagger_engine/application_controller.rb +16 -0
  62. data/app/controllers/swagger_engine/swaggers_controller.rb +29 -0
  63. data/app/helpers/swagger_engine/application_helper.rb +4 -0
  64. data/app/helpers/swagger_engine/swagger_helper.rb +4 -0
  65. data/app/views/layouts/swagger_engine/application.html.erb +14 -0
  66. data/app/views/swagger_engine/swaggers/index.html.erb +7 -0
  67. data/app/views/swagger_engine/swaggers/o2c.html +20 -0
  68. data/app/views/swagger_engine/swaggers/show.html.erb +121 -0
  69. data/bin/rails +12 -0
  70. data/bin/setup +8 -0
  71. data/config/routes.rb +4 -0
  72. data/dpn_swagger_engine.gemspec +36 -0
  73. data/lib/swagger_engine/engine.rb +37 -0
  74. data/lib/swagger_engine/version.rb +4 -0
  75. data/lib/swagger_engine.rb +7 -0
  76. data/lib/tasks/swagger_engine_tasks.rake +4 -0
  77. metadata +233 -0
@@ -0,0 +1,347 @@
1
+ var appName;
2
+ var popupMask;
3
+ var popupDialog;
4
+ var clientId;
5
+ var realm;
6
+ var redirect_uri;
7
+ var clientSecret;
8
+ var scopeSeparator;
9
+ var additionalQueryStringParams;
10
+
11
+ function handleLogin() {
12
+ var scopes = [];
13
+
14
+ var auths = window.swaggerUi.api.authSchemes || window.swaggerUi.api.securityDefinitions;
15
+ if(auths) {
16
+ var key;
17
+ var defs = auths;
18
+ for(key in defs) {
19
+ var auth = defs[key];
20
+ if(auth.type === 'oauth2' && auth.scopes) {
21
+ var scope;
22
+ if(Array.isArray(auth.scopes)) {
23
+ // 1.2 support
24
+ var i;
25
+ for(i = 0; i < auth.scopes.length; i++) {
26
+ scopes.push(auth.scopes[i]);
27
+ }
28
+ }
29
+ else {
30
+ // 2.0 support
31
+ for(scope in auth.scopes) {
32
+ scopes.push({scope: scope, description: auth.scopes[scope], OAuthSchemeKey: key});
33
+ }
34
+ }
35
+ }
36
+ }
37
+ }
38
+
39
+ if(window.swaggerUi.api
40
+ && window.swaggerUi.api.info) {
41
+ appName = window.swaggerUi.api.info.title;
42
+ }
43
+
44
+ $('.api-popup-dialog').remove();
45
+ popupDialog = $(
46
+ [
47
+ '<div class="api-popup-dialog">',
48
+ '<div class="api-popup-title">Select OAuth2.0 Scopes</div>',
49
+ '<div class="api-popup-content">',
50
+ '<p>Scopes are used to grant an application different levels of access to data on behalf of the end user. Each API may declare one or more scopes.',
51
+ '<a href="#">Learn how to use</a>',
52
+ '</p>',
53
+ '<p><strong>' + appName + '</strong> API requires the following scopes. Select which ones you want to grant to Swagger UI.</p>',
54
+ '<ul class="api-popup-scopes">',
55
+ '</ul>',
56
+ '<p class="error-msg"></p>',
57
+ '<div class="api-popup-actions"><button class="api-popup-authbtn api-button green" type="button">Authorize</button><button class="api-popup-cancel api-button gray" type="button">Cancel</button></div>',
58
+ '</div>',
59
+ '</div>'].join(''));
60
+ $(document.body).append(popupDialog);
61
+
62
+ //TODO: only display applicable scopes (will need to pass them into handleLogin)
63
+ popup = popupDialog.find('ul.api-popup-scopes').empty();
64
+ for (i = 0; i < scopes.length; i ++) {
65
+ scope = scopes[i];
66
+ str = '<li><input type="checkbox" id="scope_' + i + '" scope="' + scope.scope + '"' +'" oauthtype="' + scope.OAuthSchemeKey +'"/>' + '<label for="scope_' + i + '">' + scope.scope ;
67
+ if (scope.description) {
68
+ if ($.map(auths, function(n, i) { return i; }).length > 1) //if we have more than one scheme, display schemes
69
+ str += '<br/><span class="api-scope-desc">' + scope.description + ' ('+ scope.OAuthSchemeKey+')' +'</span>';
70
+ else
71
+ str += '<br/><span class="api-scope-desc">' + scope.description + '</span>';
72
+ }
73
+ str += '</label></li>';
74
+ popup.append(str);
75
+ }
76
+
77
+ var $win = $(window),
78
+ dw = $win.width(),
79
+ dh = $win.height(),
80
+ st = $win.scrollTop(),
81
+ dlgWd = popupDialog.outerWidth(),
82
+ dlgHt = popupDialog.outerHeight(),
83
+ top = (dh -dlgHt)/2 + st,
84
+ left = (dw - dlgWd)/2;
85
+
86
+ popupDialog.css({
87
+ top: (top < 0? 0 : top) + 'px',
88
+ left: (left < 0? 0 : left) + 'px'
89
+ });
90
+
91
+ popupDialog.find('button.api-popup-cancel').click(function() {
92
+ popupMask.hide();
93
+ popupDialog.hide();
94
+ popupDialog.empty();
95
+ popupDialog = [];
96
+ });
97
+
98
+ $('button.api-popup-authbtn').unbind();
99
+ popupDialog.find('button.api-popup-authbtn').click(function() {
100
+ popupMask.hide();
101
+ popupDialog.hide();
102
+
103
+ var authSchemes = window.swaggerUi.api.authSchemes;
104
+ var host = window.location;
105
+ var pathname = location.pathname.substring(0, location.pathname.lastIndexOf("/"));
106
+ var defaultRedirectUrl = host.protocol + '//' + host.host + pathname + '/o2c.html';
107
+ var redirectUrl = window.oAuthRedirectUrl || defaultRedirectUrl;
108
+ var url = null;
109
+ var scopes = []
110
+ var o = popup.find('input:checked');
111
+ var OAuthSchemeKeys = [];
112
+ var state;
113
+ for(k =0; k < o.length; k++) {
114
+ var scope = $(o[k]).attr('scope');
115
+ if (scopes.indexOf(scope) === -1)
116
+ scopes.push(scope);
117
+ var OAuthSchemeKey = $(o[k]).attr('oauthtype');
118
+ if (OAuthSchemeKeys.indexOf(OAuthSchemeKey) === -1)
119
+ OAuthSchemeKeys.push(OAuthSchemeKey);
120
+ }
121
+
122
+ //TODO: merge not replace if scheme is different from any existing
123
+ //(needs to be aware of schemes to do so correctly)
124
+ window.enabledScopes=scopes;
125
+
126
+ for (var key in authSchemes) {
127
+ if (authSchemes.hasOwnProperty(key) && OAuthSchemeKeys.indexOf(key) != -1) { //only look at keys that match this scope.
128
+ var flow = authSchemes[key].flow;
129
+
130
+ if(authSchemes[key].type === 'oauth2' && flow && (flow === 'implicit' || flow === 'accessCode')) {
131
+ var dets = authSchemes[key];
132
+ url = dets.authorizationUrl + '?response_type=' + (flow === 'implicit' ? 'token' : 'code');
133
+ window.swaggerUi.tokenName = dets.tokenName || 'access_token';
134
+ window.swaggerUi.tokenUrl = (flow === 'accessCode' ? dets.tokenUrl : null);
135
+ state = key;
136
+ }
137
+ else if(authSchemes[key].type === 'oauth2' && flow && (flow === 'application')) {
138
+ var dets = authSchemes[key];
139
+ window.swaggerUi.tokenName = dets.tokenName || 'access_token';
140
+ clientCredentialsFlow(scopes, dets.tokenUrl, key);
141
+ return;
142
+ }
143
+ else if(authSchemes[key].grantTypes) {
144
+ // 1.2 support
145
+ var o = authSchemes[key].grantTypes;
146
+ for(var t in o) {
147
+ if(o.hasOwnProperty(t) && t === 'implicit') {
148
+ var dets = o[t];
149
+ var ep = dets.loginEndpoint.url;
150
+ url = dets.loginEndpoint.url + '?response_type=token';
151
+ window.swaggerUi.tokenName = dets.tokenName;
152
+ }
153
+ else if (o.hasOwnProperty(t) && t === 'accessCode') {
154
+ var dets = o[t];
155
+ var ep = dets.tokenRequestEndpoint.url;
156
+ url = dets.tokenRequestEndpoint.url + '?response_type=code';
157
+ window.swaggerUi.tokenName = dets.tokenName;
158
+ }
159
+ }
160
+ }
161
+ }
162
+ }
163
+
164
+ redirect_uri = redirectUrl;
165
+
166
+ url += '&redirect_uri=' + encodeURIComponent(redirectUrl);
167
+ url += '&realm=' + encodeURIComponent(realm);
168
+ url += '&client_id=' + encodeURIComponent(clientId);
169
+ url += '&scope=' + encodeURIComponent(scopes.join(scopeSeparator));
170
+ url += '&state=' + encodeURIComponent(state);
171
+ for (var key in additionalQueryStringParams) {
172
+ url += '&' + key + '=' + encodeURIComponent(additionalQueryStringParams[key]);
173
+ }
174
+
175
+ window.open(url);
176
+ });
177
+
178
+ popupMask.show();
179
+ popupDialog.show();
180
+ return;
181
+ }
182
+
183
+
184
+ function handleLogout() {
185
+ for(key in window.swaggerUi.api.clientAuthorizations.authz){
186
+ window.swaggerUi.api.clientAuthorizations.remove(key)
187
+ }
188
+ window.enabledScopes = null;
189
+ $('.api-ic.ic-on').addClass('ic-off');
190
+ $('.api-ic.ic-on').removeClass('ic-on');
191
+
192
+ // set the info box
193
+ $('.api-ic.ic-warning').addClass('ic-error');
194
+ $('.api-ic.ic-warning').removeClass('ic-warning');
195
+ }
196
+
197
+ function initOAuth(opts) {
198
+ var o = (opts||{});
199
+ var errors = [];
200
+
201
+ appName = (o.appName||errors.push('missing appName'));
202
+ popupMask = (o.popupMask||$('#api-common-mask'));
203
+ popupDialog = (o.popupDialog||$('.api-popup-dialog'));
204
+ clientId = (o.clientId||errors.push('missing client id'));
205
+ clientSecret = (o.clientSecret||null);
206
+ realm = (o.realm||errors.push('missing realm'));
207
+ scopeSeparator = (o.scopeSeparator||' ');
208
+ additionalQueryStringParams = (o.additionalQueryStringParams||{});
209
+
210
+ if(errors.length > 0){
211
+ log('auth unable initialize oauth: ' + errors);
212
+ return;
213
+ }
214
+
215
+ $('pre code').each(function(i, e) {hljs.highlightBlock(e)});
216
+ $('.api-ic').unbind();
217
+ $('.api-ic').click(function(s) {
218
+ if($(s.target).hasClass('ic-off'))
219
+ handleLogin();
220
+ else {
221
+ handleLogout();
222
+ }
223
+ false;
224
+ });
225
+ }
226
+
227
+ function clientCredentialsFlow(scopes, tokenUrl, OAuthSchemeKey) {
228
+ var params = {
229
+ 'client_id': clientId,
230
+ 'client_secret': clientSecret,
231
+ 'scope': scopes.join(' '),
232
+ 'grant_type': 'client_credentials'
233
+ }
234
+ $.ajax(
235
+ {
236
+ url : tokenUrl,
237
+ type: "POST",
238
+ data: params,
239
+ success:function(data, textStatus, jqXHR)
240
+ {
241
+ onOAuthComplete(data,OAuthSchemeKey);
242
+ },
243
+ error: function(jqXHR, textStatus, errorThrown)
244
+ {
245
+ onOAuthComplete("");
246
+ }
247
+ });
248
+
249
+ }
250
+
251
+ window.processOAuthCode = function processOAuthCode(data) {
252
+ var OAuthSchemeKey = data.state;
253
+
254
+ // redirect_uri is required in auth code flow
255
+ // see https://tools.ietf.org/html/draft-ietf-oauth-v2-31#section-4.1.3
256
+ var host = window.location;
257
+ var pathname = location.pathname.substring(0, location.pathname.lastIndexOf("/"));
258
+ var defaultRedirectUrl = host.protocol + '//' + host.host + pathname + '/o2c.html';
259
+ var redirectUrl = window.oAuthRedirectUrl || defaultRedirectUrl;
260
+
261
+ var params = {
262
+ 'client_id': clientId,
263
+ 'code': data.code,
264
+ 'grant_type': 'authorization_code',
265
+ 'redirect_uri': redirectUrl
266
+ };
267
+
268
+ if (clientSecret) {
269
+ params.client_secret = clientSecret;
270
+ }
271
+
272
+ $.ajax(
273
+ {
274
+ url : window.swaggerUi.tokenUrl,
275
+ type: "POST",
276
+ data: params,
277
+ success:function(data, textStatus, jqXHR)
278
+ {
279
+ onOAuthComplete(data, OAuthSchemeKey);
280
+ },
281
+ error: function(jqXHR, textStatus, errorThrown)
282
+ {
283
+ onOAuthComplete("");
284
+ }
285
+ });
286
+ };
287
+
288
+ window.onOAuthComplete = function onOAuthComplete(token,OAuthSchemeKey) {
289
+ if(token) {
290
+ if(token.error) {
291
+ var checkbox = $('input[type=checkbox],.secured')
292
+ checkbox.each(function(pos){
293
+ checkbox[pos].checked = false;
294
+ });
295
+ alert(token.error);
296
+ }
297
+ else {
298
+ var b = token[window.swaggerUi.tokenName];
299
+ if (!OAuthSchemeKey){
300
+ OAuthSchemeKey = token.state;
301
+ }
302
+ if(b){
303
+ // if all roles are satisfied
304
+ var o = null;
305
+ $.each($('.auth .api-ic .api_information_panel'), function(k, v) {
306
+ var children = v;
307
+ if(children && children.childNodes) {
308
+ var requiredScopes = [];
309
+ $.each((children.childNodes), function (k1, v1){
310
+ var inner = v1.innerHTML;
311
+ if(inner)
312
+ requiredScopes.push(inner);
313
+ });
314
+ var diff = [];
315
+ for(var i=0; i < requiredScopes.length; i++) {
316
+ var s = requiredScopes[i];
317
+ if(window.enabledScopes && window.enabledScopes.indexOf(s) == -1) {
318
+ diff.push(s);
319
+ }
320
+ }
321
+ if(diff.length > 0){
322
+ o = v.parentNode.parentNode;
323
+ $(o.parentNode).find('.api-ic.ic-on').addClass('ic-off');
324
+ $(o.parentNode).find('.api-ic.ic-on').removeClass('ic-on');
325
+
326
+ // sorry, not all scopes are satisfied
327
+ $(o).find('.api-ic').addClass('ic-warning');
328
+ $(o).find('.api-ic').removeClass('ic-error');
329
+ }
330
+ else {
331
+ o = v.parentNode.parentNode;
332
+ $(o.parentNode).find('.api-ic.ic-off').addClass('ic-on');
333
+ $(o.parentNode).find('.api-ic.ic-off').removeClass('ic-off');
334
+
335
+ // all scopes are satisfied
336
+ $(o).find('.api-ic').addClass('ic-info');
337
+ $(o).find('.api-ic').removeClass('ic-warning');
338
+ $(o).find('.api-ic').removeClass('ic-error');
339
+ }
340
+ }
341
+ });
342
+ window.swaggerUi.api.clientAuthorizations.add(window.OAuthSchemeKey, new SwaggerClient.ApiKeyAuthorization('Authorization', 'Bearer ' + b, 'header'));
343
+ window.swaggerUi.load();
344
+ }
345
+ }
346
+ }
347
+ };
@@ -0,0 +1,20 @@
1
+ <script>
2
+ var qp = null;
3
+ if(window.location.hash) {
4
+ qp = location.hash.substring(1);
5
+ }
6
+ else {
7
+ qp = location.search.substring(1);
8
+ }
9
+ qp = qp ? JSON.parse('{"' + qp.replace(/&/g, '","').replace(/=/g,'":"') + '"}',
10
+ function(key, value) {
11
+ return key===""?value:decodeURIComponent(value) }
12
+ ):{}
13
+
14
+ if (window.opener.swaggerUi.tokenUrl)
15
+ window.opener.processOAuthCode(qp);
16
+ else
17
+ window.opener.onOAuthComplete(qp);
18
+
19
+ window.close();
20
+ </script>