1d07b560e9
Signed-off-by: Joseph Powers <jpowers27@cox.net>
196 lines
6.8 KiB
C++
196 lines
6.8 KiB
C++
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
|
/*************************************************************************
|
|
*
|
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
|
*
|
|
* Copyright 2000, 2010 Oracle and/or its affiliates.
|
|
*
|
|
* OpenOffice.org - a multi-platform office productivity suite
|
|
*
|
|
* This file is part of OpenOffice.org.
|
|
*
|
|
* OpenOffice.org is free software: you can redistribute it and/or modify
|
|
* it under the terms of the GNU Lesser General Public License version 3
|
|
* only, as published by the Free Software Foundation.
|
|
*
|
|
* OpenOffice.org is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU Lesser General Public License version 3 for more details
|
|
* (a copy is included in the LICENSE file that accompanied this code).
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public License
|
|
* version 3 along with OpenOffice.org. If not, see
|
|
* <http://www.openoffice.org/license.html>
|
|
* for a copy of the LGPLv3 License.
|
|
*
|
|
************************************************************************/
|
|
|
|
#include "com/sun/star/ucb/HandleCookiesRequest.hpp"
|
|
#include "com/sun/star/ucb/XInteractionCookieHandling.hpp"
|
|
#include "com/sun/star/task/XInteractionRequest.hpp"
|
|
|
|
#include "osl/mutex.hxx"
|
|
#include "svl/httpcook.hxx"
|
|
#include "vcl/svapp.hxx"
|
|
|
|
#include "cookiedg.hxx"
|
|
|
|
#include "iahndl.hxx"
|
|
|
|
using namespace com::sun::star;
|
|
|
|
namespace {
|
|
|
|
void
|
|
executeCookieDialog(Window * pParent, CntHTTPCookieRequest & rRequest)
|
|
SAL_THROW((uno::RuntimeException))
|
|
{
|
|
try
|
|
{
|
|
SolarMutexGuard aGuard;
|
|
|
|
std::auto_ptr< ResMgr > xManager(
|
|
ResMgr::CreateResMgr(CREATEVERSIONRESMGR_NAME(uui)));
|
|
std::auto_ptr< CookiesDialog > xDialog(
|
|
new CookiesDialog(pParent, &rRequest, xManager.get()));
|
|
xDialog->Execute();
|
|
}
|
|
catch (std::bad_alloc const &)
|
|
{
|
|
throw uno::RuntimeException(
|
|
rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("out of memory")),
|
|
uno::Reference< uno::XInterface>());
|
|
}
|
|
}
|
|
|
|
void
|
|
handleCookiesRequest_(
|
|
Window * pParent,
|
|
ucb::HandleCookiesRequest const & rRequest,
|
|
uno::Sequence< uno::Reference< task::XInteractionContinuation > > const &
|
|
rContinuations)
|
|
SAL_THROW((uno::RuntimeException))
|
|
{
|
|
CntHTTPCookieList_impl* pCookies = new CntHTTPCookieList_impl();
|
|
for (sal_Int32 i = 0; i < rRequest.Cookies.getLength(); ++i)
|
|
{
|
|
try
|
|
{
|
|
std::auto_ptr< CntHTTPCookie > xCookie(new CntHTTPCookie);
|
|
xCookie->m_aName = UniString(rRequest.Cookies[i].Name);
|
|
xCookie->m_aValue = UniString(rRequest.Cookies[i].Value);
|
|
xCookie->m_aDomain = UniString(rRequest.Cookies[i].Domain);
|
|
xCookie->m_aPath = UniString(rRequest.Cookies[i].Path);
|
|
xCookie->m_aExpires
|
|
= DateTime(Date(rRequest.Cookies[i].Expires.Day,
|
|
rRequest.Cookies[i].Expires.Month,
|
|
rRequest.Cookies[i].Expires.Year),
|
|
Time(rRequest.Cookies[i].Expires.Hours,
|
|
rRequest.Cookies[i].Expires.Minutes,
|
|
rRequest.Cookies[i].Expires.Seconds,
|
|
rRequest.Cookies[i].Expires.HundredthSeconds));
|
|
xCookie->m_nFlags
|
|
= rRequest.Cookies[i].Secure ? CNTHTTP_COOKIE_FLAG_SECURE : 0;
|
|
switch (rRequest.Cookies[i].Policy)
|
|
{
|
|
case ucb::CookiePolicy_CONFIRM:
|
|
xCookie->m_nPolicy = CNTHTTP_COOKIE_POLICY_INTERACTIVE;
|
|
break;
|
|
|
|
case ucb::CookiePolicy_ACCEPT:
|
|
xCookie->m_nPolicy = CNTHTTP_COOKIE_POLICY_ACCEPTED;
|
|
break;
|
|
|
|
case ucb::CookiePolicy_IGNORE:
|
|
xCookie->m_nPolicy = CNTHTTP_COOKIE_POLICY_BANNED;
|
|
break;
|
|
|
|
default:
|
|
OSL_ASSERT(false);
|
|
break;
|
|
}
|
|
pCookies->push_back( xCookie.get() );
|
|
xCookie.release();
|
|
}
|
|
catch (std::bad_alloc const &)
|
|
{
|
|
throw uno::RuntimeException(
|
|
rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(
|
|
"out of memory")),
|
|
uno::Reference< uno::XInterface >());
|
|
}
|
|
}
|
|
|
|
CntHTTPCookieRequest
|
|
aRequest(rRequest.URL,
|
|
*pCookies,
|
|
rRequest.Request == ucb::CookieRequest_RECEIVE
|
|
? CNTHTTP_COOKIE_REQUEST_RECV
|
|
: CNTHTTP_COOKIE_REQUEST_SEND);
|
|
executeCookieDialog(pParent, aRequest);
|
|
for (sal_Int32 i = 0; i < rContinuations.getLength(); ++i)
|
|
{
|
|
uno::Reference< ucb::XInteractionCookieHandling >
|
|
xCookieHandling(rContinuations[i], uno::UNO_QUERY);
|
|
if (xCookieHandling.is())
|
|
{
|
|
switch (aRequest.m_nRet)
|
|
{
|
|
case CNTHTTP_COOKIE_POLICY_INTERACTIVE:
|
|
xCookieHandling->
|
|
setGeneralPolicy(ucb::CookiePolicy_CONFIRM);
|
|
break;
|
|
|
|
case CNTHTTP_COOKIE_POLICY_ACCEPTED:
|
|
xCookieHandling->
|
|
setGeneralPolicy(ucb::CookiePolicy_ACCEPT);
|
|
break;
|
|
|
|
case CNTHTTP_COOKIE_POLICY_BANNED:
|
|
xCookieHandling->
|
|
setGeneralPolicy(ucb::CookiePolicy_IGNORE);
|
|
break;
|
|
}
|
|
for (sal_Int32 j = 0; j < rRequest.Cookies.getLength(); ++j)
|
|
if (rRequest.Cookies[j].Policy
|
|
== ucb::CookiePolicy_CONFIRM)
|
|
switch ( (*pCookies)[ j ]->m_nPolicy )
|
|
{
|
|
case CNTHTTP_COOKIE_POLICY_ACCEPTED:
|
|
xCookieHandling->
|
|
setSpecificPolicy(rRequest.Cookies[j], true);
|
|
break;
|
|
|
|
case CNTHTTP_COOKIE_POLICY_BANNED:
|
|
xCookieHandling->
|
|
setSpecificPolicy(rRequest.Cookies[j], false);
|
|
break;
|
|
}
|
|
xCookieHandling->select();
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
} // namespace
|
|
|
|
bool
|
|
UUIInteractionHelper::handleCookiesRequest(
|
|
uno::Reference< task::XInteractionRequest > const & rRequest)
|
|
SAL_THROW((uno::RuntimeException))
|
|
{
|
|
uno::Any aAnyRequest(rRequest->getRequest());
|
|
|
|
ucb::HandleCookiesRequest aCookiesRequest;
|
|
if (aAnyRequest >>= aCookiesRequest)
|
|
{
|
|
handleCookiesRequest_(getParentProperty(),
|
|
aCookiesRequest,
|
|
rRequest->getContinuations());
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|