# wp-stateless/2.2.6/static/scripts/wp-stateless-setup.js

WP-Stateless – Google Cloud Storage, version 2.2.6. 674 lines.

- Page: https://pluginprobe.com/plugins/wp-stateless/2.2.6/code/static/scripts/wp-stateless-setup.js
- Raw: https://pluginprobe.com/plugins/wp-stateless/2.2.6/raw/static/scripts/wp-stateless-setup.js
- Modified: 2019-04-09T12:09:24+00:00

Line numbers below start at 1. Link to a line or a range by appending a fragment to the
page URL, for example `https://pluginprobe.com/plugins/wp-stateless/2.2.6/code/static/scripts/wp-stateless-setup.js#L10-L20`.

```javascript
/**
 * Extend the "wp" object; requires wp-api.
 *
 *
 */

/**
 * To do: Check regular expression before submit.
 *
 *
 *
 */

wp.stateless = {
  access_token: '',
  projects: {},
  selectedSettings: {},


  $_GET: function (name, url) {
    if (!url) {
      url = window.location.href;
    }
    name = name.replace(/[\[\]]/g, "\\$&");
    var regex = new RegExp("[?&]" + name + "(=([^&#]*)|&|#|$)"),
        results = regex.exec(url);
    if (!results) return null;
    if (!results[2]) return '';
    return decodeURIComponent(results[2].replace(/\+/g, " "));
  },

  /**
   * Returns Google API Auth token, either from sessionStorage or from URL, if on settings setup page.
   *
   * wp.stateless.getAccessToken()
   *
   */
  clearAccessToken: function clearAccessToken() {
    try {
        var title = jQuery('head').find("title").text();
        wp.stateless.access_token = null;
        sessionStorage.removeItem( 'wp.stateless.token' );
        sessionStorage.removeItem( 'wp.stateless.expiry_date' );
        History.replaceState('', title, '?page=stateless-setup&step=google-login');
        return true;
    } catch( error ) {
      console.error( error.message );
    }

    return false;

  },
  getAccessToken: function getAccessToken(options) {

    if( 'string' !== typeof wp.stateless.$_GET('access_token') ) {
      // There is no token in query string. Lets look in session.
      var expiry_date = parseInt(sessionStorage.getItem( 'wp.stateless.expiry_date' ));
      var isExpired = new Date().getTime() > expiry_date ? true : false;

      if( sessionStorage.getItem( 'wp.stateless.token' ) && !isExpired) {
        wp.stateless.access_token = sessionStorage.getItem( 'wp.stateless.token' );
      }
      else{
        if(typeof options == 'undefined' || options.triggerEvent !== false){
          jQuery(document).trigger('tokenExpired');
        }
        if(isExpired){
          wp.stateless.clearAccessToken();
        }
        return false;
      }
    }

    try {
      // Checking for token in query string. If have save in session.
      if(_token = wp.stateless.$_GET('access_token')){
        var expiry_date = wp.stateless.$_GET('expiry_date');
        var isExpired = new Date().getTime() > expiry_date ? true : false;
        var title = jQuery('head').find("title").text();

        if( _token && 'string' === typeof _token  && !isExpired) {
          wp.stateless.access_token = _token;
          sessionStorage.setItem( 'wp.stateless.token', _token );
          sessionStorage.setItem( 'wp.stateless.expiry_date', expiry_date );
          History.replaceState('', title, '?page=stateless-setup&step=setup-project');
        }
      }

    } catch( error ) {
      //console.error( error.message );
      return false;
    }

    jQuery.ajaxSetup({
      method: "GET",
      dataType: "json",
      headers: {
        "content-type": "application/json",
        "Authorization": " Bearer " + wp.stateless.access_token
      }
    });

    return wp.stateless.access_token;
  },
  /**
   *
   * wp.stateless.getProfile({project:'uds-io-154013'})
   *
   * @param options
   * @returns {boolean}
   */
  getProfile: function getProfile() {

    var defer = new jQuery.Deferred();
    var getPrimaryData = function getPrimaryData(items){

      var primaryItem = items && typeof items[0] != 'undefined'? items[0] : '';
      jQuery.each(items, function(index, item){
        if(item.metadata.primary == true){
          primaryItem = item;
          return false;
        }
      });
      return primaryItem;
    };
    
    jQuery.ajax({
      url: 'https://people.googleapis.com/v1/people/me',
    }).done(function(responseData){
      var name = getPrimaryData(responseData.names);
      var email = getPrimaryData(responseData.emailAddresses);
      var photo = getPrimaryData(responseData.photos);
      var profile = {
        name: name.displayName,
        email: email.value,
        photo: photo.url
      }
      defer.resolve(profile);
    }).fail(function(xhr){
      defer.reject();
    });
    

    return defer.promise();
  },

  /**
   * Create Project
   *
   *
   *  wp.stateless.createProject( {"projectId": "uds-test-project-4","name": "uds-test-project-4"} );
   *
   *
   * @todo After this is implemented we also need to assign the user to the project. - potanin@UD
   * @param options
   */
  createProject: function createProject( options ) {
    var defer = new jQuery.Deferred();
    
    if(!wp.stateless.getAccessToken()){
      defer.reject();
      return defer.promise("In valid access token.");
    }

    jQuery.ajax({
      url: 'https://cloudresourcemanager.googleapis.com/v1/projects',
      method: "POST",
      data: JSON.stringify( options ),
    }).done(function( responseData  ) {
      defer.resolve(responseData);
    }).fail(function(responseData) {
      defer.reject(responseData);
    });



    return defer.promise();
  },


  createProjectProgress: function createProjectProgress(name){
    var defer = new jQuery.Deferred();
  
    if(!wp.stateless.getAccessToken() || !name){
      defer.reject();
      return defer.promise();
    }

    jQuery.ajax({
      url: 'https://cloudresourcemanager.googleapis.com/v1/' + name,
    }).done(function(responseData){
      if(typeof responseData.done != 'undefined' && responseData.done == true && typeof responseData.error == 'undefined'){
        defer.resolve(responseData);
      }else{
        defer.reject(responseData);
      }
    }).fail(function(responseData) {
      defer.reject(responseData);
    });
    return defer.promise();
  },

  /**
   * Get Projects
   *
   * wp.stateless.listProjects()
   *
   */
  listProjects: function listProjects() {
    var defer = new jQuery.Deferred();
    
    if(!wp.stateless.getAccessToken()){
      defer.reject();
      return defer.promise();
    }

    jQuery.ajax({
      url: 'https://cloudresourcemanager.googleapis.com/v1/projects',
    }).done(function(responseData){
      var projects = [];

      if(typeof responseData.projects == 'undefined'){
        responseData.projects = {};
      }

      responseData.projects = jQuery.grep(responseData.projects, function(project){
        return project.lifecycleState == "ACTIVE";
      });

      jQuery.each(responseData.projects, function(index, item){
        projects.push({id: item.projectId, name: item.name});
        wp.stateless.projects[item.projectId] = item;
        wp.stateless.projects[item.projectId]['buckets'] = {};
        wp.stateless.projects[item.projectId]['serviceAccounts'] = {};
      });

      defer.resolve(projects);
    }).fail(function(xhr){
      defer.reject();
    });
    return defer.promise();
  },

  /**
   * Get Projects
   *
   * wp.stateless.listProjects()
   *
   */
  createBucket: function createBucket(options) {
    if(!wp.stateless.getAccessToken() || !options)
      return false;

    var promis = jQuery.ajax({
      url: 'https://www.googleapis.com/storage/v1/b/?project=' + options.projectId,
      method: "POST",
      data: JSON.stringify({
        name: options.name,
        storageClass: 'MULTI_REGIONAL',
        location: options.location || 'us',
      }),
    });
    return promis;
  },

  /**
   * Get Projects
   * https://cloud.google.com/service-management/enable-disable
   * wp.stateless.listProjects()
   *
   */
  enableAPI: function enableAPI(projectId) {
    var defer = new jQuery.Deferred();

    if(!wp.stateless.getAccessToken() || !projectId){
      defer.reject();
      return defer.promise();
    }

    jQuery.ajax({
      url: 'https://servicemanagement.googleapis.com/v1/services/storage-api.googleapis.com:enable',
      method: "POST",
      data: JSON.stringify({consumerId: 'project:' + projectId}),
    }).done(function(responseData){
      wp.stateless.enableAPIStatus(responseData.name).done(function(operation){
        defer.resolve();
      }).fail(function(){
        defer.reject();
      });
    }).fail(function(){
      defer.reject();
    });

    return defer.promise();
  },

  /**
   * Get Projects
   *
   * wp.stateless.listProjects()
   *
   */
  enableAPIStatus: function enableAPIStatus(operation, defer) {
    if (!defer) {
      defer = new jQuery.Deferred();
    }
  
    if(!wp.stateless.getAccessToken() || !operation){
      defer.reject();
      return defer.promise();
    }

    jQuery.ajax({
      url: 'https://servicemanagement.googleapis.com/v1/' + operation,
      method: "GET",
    }).done(function(responseData){
      if(typeof responseData.done != 'undefined' && responseData.done == true && typeof responseData.error == 'undefined'){
        defer.resolve();
      }else if(typeof responseData.error != 'undefined'){
        defer.reject();
      }else{
        setTimeout(function(argument) {
          wp.stateless.enableAPIStatus(operation, defer);
        }, 1000);
      }
    }).fail(function(responseData) {
      defer.reject();
    });

    return defer.promise();
  },
  /**
   * Get Projects
   *
   * wp.stateless.listProjects()
   *
   */
  listBucket: function listBucket(projectId) {
    var defer = new jQuery.Deferred();

    if(!wp.stateless.getAccessToken() || !projectId){
      defer.reject();
      return defer.promise();
    }

    jQuery.ajax({
      url: 'https://www.googleapis.com/storage/v1/b/',
      data: {'project': projectId},
    }).done(function(responseData){
      var buckets = [];

      jQuery.each(responseData.items, function(index, item){
        var bucket = {name: item.name};
        buckets.push(bucket);
        wp.stateless.projects[projectId]['buckets'][item.id] = item;
      });

      defer.resolve(buckets);
    }).fail(function(){
      defer.reject();
    });
    return defer.promise();
  },

  /**
   *
   * wp.stateless.getServiceAccounts({project:'uds-io-154013'})
   *
   * @param options
   * @returns {boolean}
   */
  getServiceAccounts: function getServiceAccounts(options) {

    if(!wp.stateless.getAccessToken() || !options)
      return false;

    var _promis = jQuery.ajax({
      url: 'https://iam.googleapis.com/v1/projects/' + options.projectId + '/serviceAccounts',
      //data: JSON.stringify({name: options.name}),
    });

    _promis.done(function(responseData){
      wp.stateless.projects[options.projectId]['serviceAccounts'] = responseData.accounts;

    });

    return _promis;

  },

  /**
   *
   * wp.stateless.createServiceAccount()
   * Doc: https://cloud.google.com/iam/reference/rest/v1/projects.serviceAccounts/create
   * @param options
   * @returns {boolean}
   */
  createServiceAccount: function createServiceAccount(options) {

    if(!wp.stateless.getAccessToken() || !options)
      return false;

    var promis = jQuery.ajax({
      url: 'https://iam.googleapis.com/v1/projects/' + options.projectId + '/serviceAccounts',
      method: "POST",
      data: JSON.stringify({
        accountId: options.accountId,
        serviceAccount: {
          displayName: options.name
        }
      }),
    });
    return promis;
  },

  /**
   *
   * wp.stateless.createServiceAccount()
   *
   * @param options
   * @returns {boolean}
   */
  listServiceAccountKeys: function listServiceAccountKeys(options) {

    if(!wp.stateless.getAccessToken() || !options)
      return false;

    var promis = jQuery.ajax({
      url: 'https://iam.googleapis.com/v1/projects/' + options.project + '/serviceAccounts/' + options.account + "/keys",
    });
    return promis;
  },

  /**
   *
   * wp.stateless.createServiceAccount()
   *
   * @param options
   * @returns {boolean}
   */
  createServiceAccountKeys: function createServiceAccountKeys(options) {

    if(!wp.stateless.getAccessToken() || !options)
      return false;
    var promis = jQuery.ajax({
      url: 'https://iam.googleapis.com/v1/projects/' + options.project + '/serviceAccounts/' + options.account + "/keys",
      method: "POST",
      data: JSON.stringify({
        privateKeyType: options.privateKeyType || 'TYPE_GOOGLE_CREDENTIALS_FILE',
        keyAlgorithm: options.keyAlgorithm || 'KEY_ALG_RSA_2048',
      }),
    });
    return promis;
  },

  /**
   * grantServiceAccountRole
   * @param projectID
   * @returns {jQuery.Deferred}
   */
  grantServiceAccountRole: function grantServiceAccountRole(account, projectID) {

    if(!wp.stateless.getAccessToken() || !projectID || !account)
      return false;

    var promise = new jQuery.Deferred();

    jQuery.post( 'https://cloudresourcemanager.googleapis.com/v1/projects/'+projectID+':getIamPolicy' )
      .done(function(policy){
        var existing = false;

        policy.bindings.forEach(function(item, index){
          if(item.role == "roles/storage.admin"){
            existing = item.members.indexOf("serviceAccount:" + account);
            if(existing == -1){
              item.members.push("serviceAccount:" + account);
            }
          }
        });

        if(existing === false){
          policy.bindings.push({
            role: 'roles/storage.admin',
            members: [ "serviceAccount:" + account ]
          });
        }

        jQuery.post( 'https://cloudresourcemanager.googleapis.com/v1/projects/'+projectID+':setIamPolicy', JSON.stringify({policy:policy}) )
          .done(function(response){
            promise.resolve(response);
          })
          .fail(function(error) {
            promise.reject(error);
          });

      })
      .fail(function(error){
        promise.reject(error);
      });

    return promise;
  },

  /**
   *
   * wp.stateless.createServiceAccount()
   * Doc: https://cloud.google.com/storage/docs/json_api/v1/bucketAccessControls/insert
   * Doc: https://cloud.google.com/storage/docs/json_api/v1/buckets/setIamPolicy
   * @param options
   * @returns {boolean}
   */
  insertBucketAccessControls: function insertBucketAccessControls(options) {
    var promis = new jQuery.Deferred();

    if(!wp.stateless.getAccessToken() || !options)
      return false;

    var legacyAccess = function(){
      jQuery.ajax({
        url: 'https://www.googleapis.com/storage/v1/b/' + options.bucket + '/acl',
        method: "POST",
        data: JSON.stringify({
          entity: "user-" + options.user,
          role: options.role || 'OWNER',
        })
      }).done(function(response){
        promis.resolve(response);
      }).fail(function(error) {
        promis.reject(error);
      });;
    }

    jQuery.get('https://www.googleapis.com/storage/v1/b/' + options.bucket + '/iam')
    .done(function(iam){
      var existing = false;
      iam.bindings.forEach(function(item, index){
        if(item.role == "roles/storage.admin"){
          existing = item.members.indexOf("serviceAccount:" + options.user);
          if(existing == -1){
            item.members.push("serviceAccount:" + options.user);
          }
        }
      });

      if(existing === false){
        iam.bindings.push({
          role: options.role || 'roles/storage.admin',
          members: [ "serviceAccount:" + options.user ]
        });
      }

      jQuery.ajax({
        url: 'https://www.googleapis.com/storage/v1/b/' + options.bucket + '/iam',
        method: "PUT",
        data: JSON.stringify(iam),
      }).done(function(response){
        promis.resolve(response);
      }).fail(function(error) {
        legacyAccess();
      });
    }).fail(function(error) {
      legacyAccess();
    });
    return promis;
  },

  /**
   *
   * wp.stateless.createServiceAccount()
   * Doc: https://cloud.google.com/storage/docs/json_api/v1/bucketAccessControls/insert
   * @param options
   * @returns {boolean}
   * 
   */
  getProjectBillingInfo: function getProjectBillingInfo(projectID) {
    var defer = new jQuery.Deferred();

    if(!wp.stateless.getAccessToken() || !projectID)
      return false;

    jQuery.ajax({
      url: 'https://cloudbilling.googleapis.com/v1/projects/' + projectID + '/billingInfo',
    }).done(function(responseData){
      var billingInfo = {};

      if(typeof responseData.billingAccountName != 'undefined'){
        billingInfo.id = responseData.billingAccountName.replace('billingAccounts/', '');
      }else{
        defer.reject();
      }

      if(typeof responseData.billingEnabled != 'undefined' && responseData.billingEnabled == true){
        wp.stateless.projects[projectID]['billingInfo'] = responseData;
        billingInfo.billingEnabled = responseData.billingEnabled;
      }

      wp.stateless.getBillingAccount(responseData.billingAccountName).done(function(displayName) {
        billingInfo.name = displayName;
        defer.resolve(billingInfo);
      }).fail(function(error) {
        defer.resolve(billingInfo);
      });

    }).fail(function(responseData) {
      defer.reject(responseData.responseJSON);
    });
    return defer.promise();
  },

  updateProjectBillingInfo: function updateProjectBillingInfo(options) {

    if(!wp.stateless.getAccessToken() || !options.projectID)
      return false;
    var promis = jQuery.ajax({
      method: 'PUT',
      url: 'https://cloudbilling.googleapis.com/v1/projects/' + options.projectID + '/billingInfo',
      data: JSON.stringify({
        'billingAccountName': 'billingAccounts/' + options.accountName
      })
    });
    return promis;
  },

  listBillingAccounts: function listBillingAccounts() {
    var defer = new jQuery.Deferred();

    if(!wp.stateless.getAccessToken()){
      defer.reject();
      return defer.promise();
    }

    jQuery.ajax({
      url: 'https://cloudbilling.googleapis.com/v1/billingAccounts',
    }).done(function(responseData){
      var billingAccounts = [];
      if(responseData.billingAccounts){
        responseData.billingAccounts = jQuery.grep(responseData.billingAccounts, function(accounts){
          return accounts.open == true;
        });

        jQuery.each(responseData.billingAccounts, function(index, item){
          item.name = item.name.replace('billingAccounts/', '');
          billingAccounts.push({id: item.name, name: item.displayName});
        });

      }
      defer.resolve(billingAccounts);
    }).fail(function(){
      defer.reject();
    });
    return defer.promise();
  },

  getBillingAccount: function getBillingAccount(name) {
    var defer = new jQuery.Deferred();

    if(!wp.stateless.getAccessToken()){
      defer.reject();
      return defer.promise();
    }

    jQuery.ajax({
      url: 'https://cloudbilling.googleapis.com/v1/' + name,
    }).done(function(billingAccount){
      defer.resolve(billingAccount.displayName);
    }).fail(function(xhr){
      defer.reject(xhr);
    });
    return defer.promise();
  },

};


```
