PluginProbe
WP-Stateless – Google Cloud Storage / 2.2.3
WP-Stateless – Google Cloud Storage v2.2.3
4.4.3 2.1.7 2.1.8 2.1.9 2.2.0 2.2.1 2.2.2 2.2.3 2.2.4 2.2.5 2.2.6 2.2.7 2.3.0 2.3.1 2.3.2 3.0 3.0.1 3.0.2 3.0.3 3.0.4 3.1.0 3.1.1 3.2.0 3.2.1 3.2.2 All 62 releases
wp-stateless / static / scripts / wp-stateless-setup.js

wp-stateless-setup.js in WP-Stateless – Google Cloud Storage 2.2.3, at static/scripts/wp-stateless-setup.js

674 lines 18.1 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 /**
2 * Extend the "wp" object; requires wp-api.
3 *
4 *
5 */
6
7 /**
8 * To do: Check regular expression before submit.
9 *
10 *
11 *
12 */
13
14 wp.stateless = {
15 access_token: '',
16 projects: {},
17 selectedSettings: {},
18
19
20 $_GET: function (name, url) {
21 if (!url) {
22 url = window.location.href;
23 }
24 name = name.replace(/[\[\]]/g, "\\$&");
25 var regex = new RegExp("[?&]" + name + "(=([^&#]*)|&|#|$)"),
26 results = regex.exec(url);
27 if (!results) return null;
28 if (!results[2]) return '';
29 return decodeURIComponent(results[2].replace(/\+/g, " "));
30 },
31
32 /**
33 * Returns Google API Auth token, either from sessionStorage or from URL, if on settings setup page.
34 *
35 * wp.stateless.getAccessToken()
36 *
37 */
38 clearAccessToken: function clearAccessToken() {
39 try {
40 var title = jQuery('head').find("title").text();
41 wp.stateless.access_token = null;
42 sessionStorage.removeItem( 'wp.stateless.token' );
43 sessionStorage.removeItem( 'wp.stateless.expiry_date' );
44 History.replaceState('', title, '?page=stateless-setup&step=google-login');
45 return true;
46 } catch( error ) {
47 console.error( error.message );
48 }
49
50 return false;
51
52 },
53 getAccessToken: function getAccessToken(options) {
54
55 if( 'string' !== typeof wp.stateless.$_GET('access_token') ) {
56 // There is no token in query string. Lets look in session.
57 var expiry_date = parseInt(sessionStorage.getItem( 'wp.stateless.expiry_date' ));
58 var isExpired = new Date().getTime() > expiry_date ? true : false;
59
60 if( sessionStorage.getItem( 'wp.stateless.token' ) && !isExpired) {
61 wp.stateless.access_token = sessionStorage.getItem( 'wp.stateless.token' );
62 }
63 else{
64 if(typeof options == 'undefined' || options.triggerEvent !== false){
65 jQuery(document).trigger('tokenExpired');
66 }
67 if(isExpired){
68 wp.stateless.clearAccessToken();
69 }
70 return false;
71 }
72 }
73
74 try {
75 // Checking for token in query string. If have save in session.
76 if(_token = wp.stateless.$_GET('access_token')){
77 var expiry_date = wp.stateless.$_GET('expiry_date');
78 var isExpired = new Date().getTime() > expiry_date ? true : false;
79 var title = jQuery('head').find("title").text();
80
81 if( _token && 'string' === typeof _token && !isExpired) {
82 wp.stateless.access_token = _token;
83 sessionStorage.setItem( 'wp.stateless.token', _token );
84 sessionStorage.setItem( 'wp.stateless.expiry_date', expiry_date );
85 History.replaceState('', title, '?page=stateless-setup&step=setup-project');
86 }
87 }
88
89 } catch( error ) {
90 //console.error( error.message );
91 return false;
92 }
93
94 jQuery.ajaxSetup({
95 method: "GET",
96 dataType: "json",
97 headers: {
98 "content-type": "application/json",
99 "Authorization": " Bearer " + wp.stateless.access_token
100 }
101 });
102
103 return wp.stateless.access_token;
104 },
105 /**
106 *
107 * wp.stateless.getProfile({project:'uds-io-154013'})
108 *
109 * @param options
110 * @returns {boolean}
111 */
112 getProfile: function getProfile() {
113
114 var defer = new jQuery.Deferred();
115 var getPrimaryData = function getPrimaryData(items){
116
117 var primaryItem = items && typeof items[0] != 'undefined'? items[0] : '';
118 jQuery.each(items, function(index, item){
119 if(item.metadata.primary == true){
120 primaryItem = item;
121 return false;
122 }
123 });
124 return primaryItem;
125 };
126
127 jQuery.ajax({
128 url: 'https://people.googleapis.com/v1/people/me',
129 }).done(function(responseData){
130 var name = getPrimaryData(responseData.names);
131 var email = getPrimaryData(responseData.emailAddresses);
132 var photo = getPrimaryData(responseData.photos);
133 var profile = {
134 name: name.displayName,
135 email: email.value,
136 photo: photo.url
137 }
138 defer.resolve(profile);
139 }).fail(function(xhr){
140 defer.reject();
141 });
142
143
144 return defer.promise();
145 },
146
147 /**
148 * Create Project
149 *
150 *
151 * wp.stateless.createProject( {"projectId": "uds-test-project-4","name": "uds-test-project-4"} );
152 *
153 *
154 * @todo After this is implemented we also need to assign the user to the project. - potanin@UD
155 * @param options
156 */
157 createProject: function createProject( options ) {
158 var defer = new jQuery.Deferred();
159
160 if(!wp.stateless.getAccessToken()){
161 defer.reject();
162 return defer.promise("In valid access token.");
163 }
164
165 jQuery.ajax({
166 url: 'https://cloudresourcemanager.googleapis.com/v1/projects',
167 method: "POST",
168 data: JSON.stringify( options ),
169 }).done(function( responseData ) {
170 defer.resolve(responseData);
171 }).fail(function(responseData) {
172 defer.reject(responseData);
173 });
174
175
176
177 return defer.promise();
178 },
179
180
181 createProjectProgress: function createProjectProgress(name){
182 var defer = new jQuery.Deferred();
183
184 if(!wp.stateless.getAccessToken() || !name){
185 defer.reject();
186 return defer.promise();
187 }
188
189 jQuery.ajax({
190 url: 'https://cloudresourcemanager.googleapis.com/v1/' + name,
191 }).done(function(responseData){
192 if(typeof responseData.done != 'undefined' && responseData.done == true && typeof responseData.error == 'undefined'){
193 defer.resolve(responseData);
194 }else{
195 defer.reject(responseData);
196 }
197 }).fail(function(responseData) {
198 defer.reject(responseData);
199 });
200 return defer.promise();
201 },
202
203 /**
204 * Get Projects
205 *
206 * wp.stateless.listProjects()
207 *
208 */
209 listProjects: function listProjects() {
210 var defer = new jQuery.Deferred();
211
212 if(!wp.stateless.getAccessToken()){
213 defer.reject();
214 return defer.promise();
215 }
216
217 jQuery.ajax({
218 url: 'https://cloudresourcemanager.googleapis.com/v1/projects',
219 }).done(function(responseData){
220 var projects = [];
221
222 if(typeof responseData.projects == 'undefined'){
223 responseData.projects = {};
224 }
225
226 responseData.projects = jQuery.grep(responseData.projects, function(project){
227 return project.lifecycleState == "ACTIVE";
228 });
229
230 jQuery.each(responseData.projects, function(index, item){
231 projects.push({id: item.projectId, name: item.name});
232 wp.stateless.projects[item.projectId] = item;
233 wp.stateless.projects[item.projectId]['buckets'] = {};
234 wp.stateless.projects[item.projectId]['serviceAccounts'] = {};
235 });
236
237 defer.resolve(projects);
238 }).fail(function(xhr){
239 defer.reject();
240 });
241 return defer.promise();
242 },
243
244 /**
245 * Get Projects
246 *
247 * wp.stateless.listProjects()
248 *
249 */
250 createBucket: function createBucket(options) {
251 if(!wp.stateless.getAccessToken() || !options)
252 return false;
253
254 var promis = jQuery.ajax({
255 url: 'https://www.googleapis.com/storage/v1/b/?project=' + options.projectId,
256 method: "POST",
257 data: JSON.stringify({
258 name: options.name,
259 storageClass: 'MULTI_REGIONAL',
260 location: options.location || 'us',
261 }),
262 });
263 return promis;
264 },
265
266 /**
267 * Get Projects
268 * https://cloud.google.com/service-management/enable-disable
269 * wp.stateless.listProjects()
270 *
271 */
272 enableAPI: function enableAPI(projectId) {
273 var defer = new jQuery.Deferred();
274
275 if(!wp.stateless.getAccessToken() || !projectId){
276 defer.reject();
277 return defer.promise();
278 }
279
280 jQuery.ajax({
281 url: 'https://servicemanagement.googleapis.com/v1/services/storage-api.googleapis.com:enable',
282 method: "POST",
283 data: JSON.stringify({consumerId: 'project:' + projectId}),
284 }).done(function(responseData){
285 wp.stateless.enableAPIStatus(responseData.name).done(function(operation){
286 defer.resolve();
287 }).fail(function(){
288 defer.reject();
289 });
290 }).fail(function(){
291 defer.reject();
292 });
293
294 return defer.promise();
295 },
296
297 /**
298 * Get Projects
299 *
300 * wp.stateless.listProjects()
301 *
302 */
303 enableAPIStatus: function enableAPIStatus(operation, defer) {
304 if (!defer) {
305 defer = new jQuery.Deferred();
306 }
307
308 if(!wp.stateless.getAccessToken() || !operation){
309 defer.reject();
310 return defer.promise();
311 }
312
313 jQuery.ajax({
314 url: 'https://servicemanagement.googleapis.com/v1/' + operation,
315 method: "GET",
316 }).done(function(responseData){
317 if(typeof responseData.done != 'undefined' && responseData.done == true && typeof responseData.error == 'undefined'){
318 defer.resolve();
319 }else if(typeof responseData.error != 'undefined'){
320 defer.reject();
321 }else{
322 setTimeout(function(argument) {
323 wp.stateless.enableAPIStatus(operation, defer);
324 }, 1000);
325 }
326 }).fail(function(responseData) {
327 defer.reject();
328 });
329
330 return defer.promise();
331 },
332 /**
333 * Get Projects
334 *
335 * wp.stateless.listProjects()
336 *
337 */
338 listBucket: function listBucket(projectId) {
339 var defer = new jQuery.Deferred();
340
341 if(!wp.stateless.getAccessToken() || !projectId){
342 defer.reject();
343 return defer.promise();
344 }
345
346 jQuery.ajax({
347 url: 'https://www.googleapis.com/storage/v1/b/',
348 data: {'project': projectId},
349 }).done(function(responseData){
350 var buckets = [];
351
352 jQuery.each(responseData.items, function(index, item){
353 var bucket = {name: item.name};
354 buckets.push(bucket);
355 wp.stateless.projects[projectId]['buckets'][item.id] = item;
356 });
357
358 defer.resolve(buckets);
359 }).fail(function(){
360 defer.reject();
361 });
362 return defer.promise();
363 },
364
365 /**
366 *
367 * wp.stateless.getServiceAccounts({project:'uds-io-154013'})
368 *
369 * @param options
370 * @returns {boolean}
371 */
372 getServiceAccounts: function getServiceAccounts(options) {
373
374 if(!wp.stateless.getAccessToken() || !options)
375 return false;
376
377 var _promis = jQuery.ajax({
378 url: 'https://iam.googleapis.com/v1/projects/' + options.projectId + '/serviceAccounts',
379 //data: JSON.stringify({name: options.name}),
380 });
381
382 _promis.done(function(responseData){
383 wp.stateless.projects[options.projectId]['serviceAccounts'] = responseData.accounts;
384
385 });
386
387 return _promis;
388
389 },
390
391 /**
392 *
393 * wp.stateless.createServiceAccount()
394 * Doc: https://cloud.google.com/iam/reference/rest/v1/projects.serviceAccounts/create
395 * @param options
396 * @returns {boolean}
397 */
398 createServiceAccount: function createServiceAccount(options) {
399
400 if(!wp.stateless.getAccessToken() || !options)
401 return false;
402
403 var promis = jQuery.ajax({
404 url: 'https://iam.googleapis.com/v1/projects/' + options.projectId + '/serviceAccounts',
405 method: "POST",
406 data: JSON.stringify({
407 accountId: options.accountId,
408 serviceAccount: {
409 displayName: options.name
410 }
411 }),
412 });
413 return promis;
414 },
415
416 /**
417 *
418 * wp.stateless.createServiceAccount()
419 *
420 * @param options
421 * @returns {boolean}
422 */
423 listServiceAccountKeys: function listServiceAccountKeys(options) {
424
425 if(!wp.stateless.getAccessToken() || !options)
426 return false;
427
428 var promis = jQuery.ajax({
429 url: 'https://iam.googleapis.com/v1/projects/' + options.project + '/serviceAccounts/' + options.account + "/keys",
430 });
431 return promis;
432 },
433
434 /**
435 *
436 * wp.stateless.createServiceAccount()
437 *
438 * @param options
439 * @returns {boolean}
440 */
441 createServiceAccountKeys: function createServiceAccountKeys(options) {
442
443 if(!wp.stateless.getAccessToken() || !options)
444 return false;
445 var promis = jQuery.ajax({
446 url: 'https://iam.googleapis.com/v1/projects/' + options.project + '/serviceAccounts/' + options.account + "/keys",
447 method: "POST",
448 data: JSON.stringify({
449 privateKeyType: options.privateKeyType || 'TYPE_GOOGLE_CREDENTIALS_FILE',
450 keyAlgorithm: options.keyAlgorithm || 'KEY_ALG_RSA_2048',
451 }),
452 });
453 return promis;
454 },
455
456 /**
457 * grantServiceAccountRole
458 * @param projectID
459 * @returns {jQuery.Deferred}
460 */
461 grantServiceAccountRole: function grantServiceAccountRole(account, projectID) {
462
463 if(!wp.stateless.getAccessToken() || !projectID || !account)
464 return false;
465
466 var promise = new jQuery.Deferred();
467
468 jQuery.post( 'https://cloudresourcemanager.googleapis.com/v1/projects/'+projectID+':getIamPolicy' )
469 .done(function(policy){
470 var existing = false;
471
472 policy.bindings.forEach(function(item, index){
473 if(item.role == "roles/storage.admin"){
474 existing = item.members.indexOf("serviceAccount:" + account);
475 if(existing == -1){
476 item.members.push("serviceAccount:" + account);
477 }
478 }
479 });
480
481 if(existing === false){
482 policy.bindings.push({
483 role: 'roles/storage.admin',
484 members: [ "serviceAccount:" + account ]
485 });
486 }
487
488 jQuery.post( 'https://cloudresourcemanager.googleapis.com/v1/projects/'+projectID+':setIamPolicy', JSON.stringify({policy:policy}) )
489 .done(function(response){
490 promise.resolve(response);
491 })
492 .fail(function(error) {
493 promise.reject(error);
494 });
495
496 })
497 .fail(function(error){
498 promise.reject(error);
499 });
500
501 return promise;
502 },
503
504 /**
505 *
506 * wp.stateless.createServiceAccount()
507 * Doc: https://cloud.google.com/storage/docs/json_api/v1/bucketAccessControls/insert
508 * Doc: https://cloud.google.com/storage/docs/json_api/v1/buckets/setIamPolicy
509 * @param options
510 * @returns {boolean}
511 */
512 insertBucketAccessControls: function insertBucketAccessControls(options) {
513 var promis = new jQuery.Deferred();
514
515 if(!wp.stateless.getAccessToken() || !options)
516 return false;
517
518 var legacyAccess = function(){
519 jQuery.ajax({
520 url: 'https://www.googleapis.com/storage/v1/b/' + options.bucket + '/acl',
521 method: "POST",
522 data: JSON.stringify({
523 entity: "user-" + options.user,
524 role: options.role || 'OWNER',
525 })
526 }).done(function(response){
527 promis.resolve(response);
528 }).fail(function(error) {
529 promis.reject(error);
530 });;
531 }
532
533 jQuery.get('https://www.googleapis.com/storage/v1/b/' + options.bucket + '/iam')
534 .done(function(iam){
535 var existing = false;
536 iam.bindings.forEach(function(item, index){
537 if(item.role == "roles/storage.admin"){
538 existing = item.members.indexOf("serviceAccount:" + options.user);
539 if(existing == -1){
540 item.members.push("serviceAccount:" + options.user);
541 }
542 }
543 });
544
545 if(existing === false){
546 iam.bindings.push({
547 role: options.role || 'roles/storage.admin',
548 members: [ "serviceAccount:" + options.user ]
549 });
550 }
551
552 jQuery.ajax({
553 url: 'https://www.googleapis.com/storage/v1/b/' + options.bucket + '/iam',
554 method: "PUT",
555 data: JSON.stringify(iam),
556 }).done(function(response){
557 promis.resolve(response);
558 }).fail(function(error) {
559 legacyAccess();
560 });
561 }).fail(function(error) {
562 legacyAccess();
563 });
564 return promis;
565 },
566
567 /**
568 *
569 * wp.stateless.createServiceAccount()
570 * Doc: https://cloud.google.com/storage/docs/json_api/v1/bucketAccessControls/insert
571 * @param options
572 * @returns {boolean}
573 *
574 */
575 getProjectBillingInfo: function getProjectBillingInfo(projectID) {
576 var defer = new jQuery.Deferred();
577
578 if(!wp.stateless.getAccessToken() || !projectID)
579 return false;
580
581 jQuery.ajax({
582 url: 'https://cloudbilling.googleapis.com/v1/projects/' + projectID + '/billingInfo',
583 }).done(function(responseData){
584 var billingInfo = {};
585
586 if(typeof responseData.billingAccountName != 'undefined'){
587 billingInfo.id = responseData.billingAccountName.replace('billingAccounts/', '');
588 }else{
589 defer.reject();
590 }
591
592 if(typeof responseData.billingEnabled != 'undefined' && responseData.billingEnabled == true){
593 wp.stateless.projects[projectID]['billingInfo'] = responseData;
594 billingInfo.billingEnabled = responseData.billingEnabled;
595 }
596
597 wp.stateless.getBillingAccount(responseData.billingAccountName).done(function(displayName) {
598 billingInfo.name = displayName;
599 defer.resolve(billingInfo);
600 }).fail(function(error) {
601 defer.resolve(billingInfo);
602 });
603
604 }).fail(function(responseData) {
605 defer.reject(responseData.responseJSON);
606 });
607 return defer.promise();
608 },
609
610 updateProjectBillingInfo: function updateProjectBillingInfo(options) {
611
612 if(!wp.stateless.getAccessToken() || !options.projectID)
613 return false;
614 var promis = jQuery.ajax({
615 method: 'PUT',
616 url: 'https://cloudbilling.googleapis.com/v1/projects/' + options.projectID + '/billingInfo',
617 data: JSON.stringify({
618 'billingAccountName': 'billingAccounts/' + options.accountName
619 })
620 });
621 return promis;
622 },
623
624 listBillingAccounts: function listBillingAccounts() {
625 var defer = new jQuery.Deferred();
626
627 if(!wp.stateless.getAccessToken()){
628 defer.reject();
629 return defer.promise();
630 }
631
632 jQuery.ajax({
633 url: 'https://cloudbilling.googleapis.com/v1/billingAccounts',
634 }).done(function(responseData){
635 var billingAccounts = [];
636 if(responseData.billingAccounts){
637 responseData.billingAccounts = jQuery.grep(responseData.billingAccounts, function(accounts){
638 return accounts.open == true;
639 });
640
641 jQuery.each(responseData.billingAccounts, function(index, item){
642 item.name = item.name.replace('billingAccounts/', '');
643 billingAccounts.push({id: item.name, name: item.displayName});
644 });
645
646 }
647 defer.resolve(billingAccounts);
648 }).fail(function(){
649 defer.reject();
650 });
651 return defer.promise();
652 },
653
654 getBillingAccount: function getBillingAccount(name) {
655 var defer = new jQuery.Deferred();
656
657 if(!wp.stateless.getAccessToken()){
658 defer.reject();
659 return defer.promise();
660 }
661
662 jQuery.ajax({
663 url: 'https://cloudbilling.googleapis.com/v1/' + name,
664 }).done(function(billingAccount){
665 defer.resolve(billingAccount.displayName);
666 }).fail(function(xhr){
667 defer.reject(xhr);
668 });
669 return defer.promise();
670 },
671
672 };
673
674