[ Web Proxy ]
URL:
Viewing: https://raw.githubusercontent.com/pearsonca/rstudio/master/src/cpp/desktop/DesktopWebProfile.cpp [Back]  [Original]

/*
 * DesktopWebProfile.cpp
 *
 * Copyright (C) 2009-18 by RStudio, PBC
 *
 * Unless you have received this program directly from RStudio pursuant
 * to the terms of a commercial license agreement with RStudio, then
 * this program is licensed to you under the terms of version 3 of the
 * GNU Affero General Public License. This program is distributed WITHOUT
 * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,
 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the
 * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.
 *
 */

#include "DesktopWebProfile.hpp"

#include 

#include 

namespace rstudio {
namespace desktop {

namespace {

class Interceptor : public QWebEngineUrlRequestInterceptor
{
public:
   explicit Interceptor(
         WebProfile* parent,
         const QUrl& baseUrl,
         const std::string& sharedSecret)
      : QWebEngineUrlRequestInterceptor(parent),
        parent_(parent),
        sharedSecret_(sharedSecret),
        baseUrl_(baseUrl)
   {
   }

   void interceptRequest(QWebEngineUrlRequestInfo& info) override
   {
      // notify the parent of the intercept -- this is primarily done to
      // communicate some extra information about the incoming request
      // to WebPage, for use in acceptNavigationRequest()
      parent_->onInterceptRequest(info);
      
      if (info.requestUrl().authority() == baseUrl_.authority())
      {
         // The shared secret helps the session authenticate that the request actually came from the
         // desktop frame and not from some other application. To reduce the odds of the shared
         // secret leaking out by tagging along on other HTTP requests (which are not destined for
         // the R session), we only set the header when communicating with the authority established
         // for the R session. 
         info.setHttpHeader(
                  QByteArrayLiteral("X-Shared-Secret"),
                  QByteArray::fromStdString(sharedSecret_));
      }
   }

private:
   WebProfile* parent_;
   std::string sharedSecret_;
   QUrl baseUrl_;
};

} // end anonymous namespace

WebProfile::WebProfile(const QUrl& baseUrl, QObject* parent)
   : QWebEngineProfile(QString::fromUtf8("rstudio-desktop"), parent)
{
   sharedSecret_ = core::system::getenv("RS_SHARED_SECRET");
   setBaseUrl(baseUrl);
}

void WebProfile::setBaseUrl(const QUrl& baseUrl)
{
   interceptor_.reset(new Interceptor(this, baseUrl, sharedSecret_));
   setRequestInterceptor(interceptor_.data());
}

void WebProfile::onInterceptRequest(QWebEngineUrlRequestInfo& info)
{
   emit urlIntercepted(info.requestUrl(), info.resourceType());
}

} // end namespace desktop
} // end namespace rstudio

Web Proxy Viewer  |  New URL  |  Original Page