1*859212d1SAndrew Rist /**************************************************************
2cdf0e10cSrcweir *
3*859212d1SAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one
4*859212d1SAndrew Rist * or more contributor license agreements. See the NOTICE file
5*859212d1SAndrew Rist * distributed with this work for additional information
6*859212d1SAndrew Rist * regarding copyright ownership. The ASF licenses this file
7*859212d1SAndrew Rist * to you under the Apache License, Version 2.0 (the
8*859212d1SAndrew Rist * "License"); you may not use this file except in compliance
9*859212d1SAndrew Rist * with the License. You may obtain a copy of the License at
10*859212d1SAndrew Rist *
11*859212d1SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0
12*859212d1SAndrew Rist *
13*859212d1SAndrew Rist * Unless required by applicable law or agreed to in writing,
14*859212d1SAndrew Rist * software distributed under the License is distributed on an
15*859212d1SAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*859212d1SAndrew Rist * KIND, either express or implied. See the License for the
17*859212d1SAndrew Rist * specific language governing permissions and limitations
18*859212d1SAndrew Rist * under the License.
19*859212d1SAndrew Rist *
20*859212d1SAndrew Rist *************************************************************/
21*859212d1SAndrew Rist
22*859212d1SAndrew Rist
23cdf0e10cSrcweir
24cdf0e10cSrcweir #include "com/sun/star/ucb/HandleCookiesRequest.hpp"
25cdf0e10cSrcweir #include "com/sun/star/ucb/XInteractionCookieHandling.hpp"
26cdf0e10cSrcweir #include "com/sun/star/task/XInteractionRequest.hpp"
27cdf0e10cSrcweir
28cdf0e10cSrcweir #include "vos/mutex.hxx"
29cdf0e10cSrcweir #include "tools/list.hxx"
30cdf0e10cSrcweir #include "svl/httpcook.hxx"
31cdf0e10cSrcweir #include "vcl/svapp.hxx"
32cdf0e10cSrcweir
33cdf0e10cSrcweir #include "cookiedg.hxx"
34cdf0e10cSrcweir
35cdf0e10cSrcweir #include "iahndl.hxx"
36cdf0e10cSrcweir
37cdf0e10cSrcweir using namespace com::sun::star;
38cdf0e10cSrcweir
39cdf0e10cSrcweir namespace {
40cdf0e10cSrcweir
41cdf0e10cSrcweir class CookieList: public List
42cdf0e10cSrcweir {
43cdf0e10cSrcweir public:
44cdf0e10cSrcweir ~CookieList() SAL_THROW(());
45cdf0e10cSrcweir };
46cdf0e10cSrcweir
~CookieList()47cdf0e10cSrcweir CookieList::~CookieList() SAL_THROW(())
48cdf0e10cSrcweir {
49cdf0e10cSrcweir while (Count() != 0)
50cdf0e10cSrcweir delete static_cast< CntHTTPCookie * >(Remove(Count() - 1));
51cdf0e10cSrcweir }
52cdf0e10cSrcweir
53cdf0e10cSrcweir void
executeCookieDialog(Window * pParent,CntHTTPCookieRequest & rRequest)54cdf0e10cSrcweir executeCookieDialog(Window * pParent, CntHTTPCookieRequest & rRequest)
55cdf0e10cSrcweir SAL_THROW((uno::RuntimeException))
56cdf0e10cSrcweir {
57cdf0e10cSrcweir try
58cdf0e10cSrcweir {
59cdf0e10cSrcweir vos::OGuard aGuard(Application::GetSolarMutex());
60cdf0e10cSrcweir
61cdf0e10cSrcweir std::auto_ptr< ResMgr > xManager(
62cdf0e10cSrcweir ResMgr::CreateResMgr(CREATEVERSIONRESMGR_NAME(uui)));
63cdf0e10cSrcweir std::auto_ptr< CookiesDialog > xDialog(
64cdf0e10cSrcweir new CookiesDialog(pParent, &rRequest, xManager.get()));
65cdf0e10cSrcweir xDialog->Execute();
66cdf0e10cSrcweir }
67cdf0e10cSrcweir catch (std::bad_alloc const &)
68cdf0e10cSrcweir {
69cdf0e10cSrcweir throw uno::RuntimeException(
70cdf0e10cSrcweir rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("out of memory")),
71cdf0e10cSrcweir uno::Reference< uno::XInterface>());
72cdf0e10cSrcweir }
73cdf0e10cSrcweir }
74cdf0e10cSrcweir
75cdf0e10cSrcweir void
handleCookiesRequest_(Window * pParent,ucb::HandleCookiesRequest const & rRequest,uno::Sequence<uno::Reference<task::XInteractionContinuation>> const & rContinuations)76cdf0e10cSrcweir handleCookiesRequest_(
77cdf0e10cSrcweir Window * pParent,
78cdf0e10cSrcweir ucb::HandleCookiesRequest const & rRequest,
79cdf0e10cSrcweir uno::Sequence< uno::Reference< task::XInteractionContinuation > > const &
80cdf0e10cSrcweir rContinuations)
81cdf0e10cSrcweir SAL_THROW((uno::RuntimeException))
82cdf0e10cSrcweir {
83cdf0e10cSrcweir CookieList aCookies;
84cdf0e10cSrcweir for (sal_Int32 i = 0; i < rRequest.Cookies.getLength(); ++i)
85cdf0e10cSrcweir {
86cdf0e10cSrcweir try
87cdf0e10cSrcweir {
88cdf0e10cSrcweir std::auto_ptr< CntHTTPCookie > xCookie(new CntHTTPCookie);
89cdf0e10cSrcweir xCookie->m_aName = UniString(rRequest.Cookies[i].Name);
90cdf0e10cSrcweir xCookie->m_aValue = UniString(rRequest.Cookies[i].Value);
91cdf0e10cSrcweir xCookie->m_aDomain = UniString(rRequest.Cookies[i].Domain);
92cdf0e10cSrcweir xCookie->m_aPath = UniString(rRequest.Cookies[i].Path);
93cdf0e10cSrcweir xCookie->m_aExpires
94cdf0e10cSrcweir = DateTime(Date(rRequest.Cookies[i].Expires.Day,
95cdf0e10cSrcweir rRequest.Cookies[i].Expires.Month,
96cdf0e10cSrcweir rRequest.Cookies[i].Expires.Year),
97cdf0e10cSrcweir Time(rRequest.Cookies[i].Expires.Hours,
98cdf0e10cSrcweir rRequest.Cookies[i].Expires.Minutes,
99cdf0e10cSrcweir rRequest.Cookies[i].Expires.Seconds,
100cdf0e10cSrcweir rRequest.Cookies[i].Expires.HundredthSeconds));
101cdf0e10cSrcweir xCookie->m_nFlags
102cdf0e10cSrcweir = rRequest.Cookies[i].Secure ? CNTHTTP_COOKIE_FLAG_SECURE : 0;
103cdf0e10cSrcweir switch (rRequest.Cookies[i].Policy)
104cdf0e10cSrcweir {
105cdf0e10cSrcweir case ucb::CookiePolicy_CONFIRM:
106cdf0e10cSrcweir xCookie->m_nPolicy = CNTHTTP_COOKIE_POLICY_INTERACTIVE;
107cdf0e10cSrcweir break;
108cdf0e10cSrcweir
109cdf0e10cSrcweir case ucb::CookiePolicy_ACCEPT:
110cdf0e10cSrcweir xCookie->m_nPolicy = CNTHTTP_COOKIE_POLICY_ACCEPTED;
111cdf0e10cSrcweir break;
112cdf0e10cSrcweir
113cdf0e10cSrcweir case ucb::CookiePolicy_IGNORE:
114cdf0e10cSrcweir xCookie->m_nPolicy = CNTHTTP_COOKIE_POLICY_BANNED;
115cdf0e10cSrcweir break;
116cdf0e10cSrcweir
117cdf0e10cSrcweir default:
118cdf0e10cSrcweir OSL_ASSERT(false);
119cdf0e10cSrcweir break;
120cdf0e10cSrcweir }
121cdf0e10cSrcweir aCookies.Insert(xCookie.get(), LIST_APPEND);
122cdf0e10cSrcweir xCookie.release();
123cdf0e10cSrcweir }
124cdf0e10cSrcweir catch (std::bad_alloc const &)
125cdf0e10cSrcweir {
126cdf0e10cSrcweir throw uno::RuntimeException(
127cdf0e10cSrcweir rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(
128cdf0e10cSrcweir "out of memory")),
129cdf0e10cSrcweir uno::Reference< uno::XInterface >());
130cdf0e10cSrcweir }
131cdf0e10cSrcweir }
132cdf0e10cSrcweir
133cdf0e10cSrcweir CntHTTPCookieRequest
134cdf0e10cSrcweir aRequest(rRequest.URL,
135cdf0e10cSrcweir aCookies,
136cdf0e10cSrcweir rRequest.Request == ucb::CookieRequest_RECEIVE
137cdf0e10cSrcweir ? CNTHTTP_COOKIE_REQUEST_RECV
138cdf0e10cSrcweir : CNTHTTP_COOKIE_REQUEST_SEND);
139cdf0e10cSrcweir executeCookieDialog(pParent, aRequest);
140cdf0e10cSrcweir for (sal_Int32 i = 0; i < rContinuations.getLength(); ++i)
141cdf0e10cSrcweir {
142cdf0e10cSrcweir uno::Reference< ucb::XInteractionCookieHandling >
143cdf0e10cSrcweir xCookieHandling(rContinuations[i], uno::UNO_QUERY);
144cdf0e10cSrcweir if (xCookieHandling.is())
145cdf0e10cSrcweir {
146cdf0e10cSrcweir switch (aRequest.m_nRet)
147cdf0e10cSrcweir {
148cdf0e10cSrcweir case CNTHTTP_COOKIE_POLICY_INTERACTIVE:
149cdf0e10cSrcweir xCookieHandling->
150cdf0e10cSrcweir setGeneralPolicy(ucb::CookiePolicy_CONFIRM);
151cdf0e10cSrcweir break;
152cdf0e10cSrcweir
153cdf0e10cSrcweir case CNTHTTP_COOKIE_POLICY_ACCEPTED:
154cdf0e10cSrcweir xCookieHandling->
155cdf0e10cSrcweir setGeneralPolicy(ucb::CookiePolicy_ACCEPT);
156cdf0e10cSrcweir break;
157cdf0e10cSrcweir
158cdf0e10cSrcweir case CNTHTTP_COOKIE_POLICY_BANNED:
159cdf0e10cSrcweir xCookieHandling->
160cdf0e10cSrcweir setGeneralPolicy(ucb::CookiePolicy_IGNORE);
161cdf0e10cSrcweir break;
162cdf0e10cSrcweir }
163cdf0e10cSrcweir for (sal_Int32 j = 0; j < rRequest.Cookies.getLength(); ++j)
164cdf0e10cSrcweir if (rRequest.Cookies[j].Policy
165cdf0e10cSrcweir == ucb::CookiePolicy_CONFIRM)
166cdf0e10cSrcweir switch (static_cast< CntHTTPCookie * >(aCookies.
167cdf0e10cSrcweir GetObject(j))->
168cdf0e10cSrcweir m_nPolicy)
169cdf0e10cSrcweir {
170cdf0e10cSrcweir case CNTHTTP_COOKIE_POLICY_ACCEPTED:
171cdf0e10cSrcweir xCookieHandling->
172cdf0e10cSrcweir setSpecificPolicy(rRequest.Cookies[j], true);
173cdf0e10cSrcweir break;
174cdf0e10cSrcweir
175cdf0e10cSrcweir case CNTHTTP_COOKIE_POLICY_BANNED:
176cdf0e10cSrcweir xCookieHandling->
177cdf0e10cSrcweir setSpecificPolicy(rRequest.Cookies[j], false);
178cdf0e10cSrcweir break;
179cdf0e10cSrcweir }
180cdf0e10cSrcweir xCookieHandling->select();
181cdf0e10cSrcweir break;
182cdf0e10cSrcweir }
183cdf0e10cSrcweir }
184cdf0e10cSrcweir }
185cdf0e10cSrcweir
186cdf0e10cSrcweir } // namespace
187cdf0e10cSrcweir
188cdf0e10cSrcweir bool
handleCookiesRequest(uno::Reference<task::XInteractionRequest> const & rRequest)189cdf0e10cSrcweir UUIInteractionHelper::handleCookiesRequest(
190cdf0e10cSrcweir uno::Reference< task::XInteractionRequest > const & rRequest)
191cdf0e10cSrcweir SAL_THROW((uno::RuntimeException))
192cdf0e10cSrcweir {
193cdf0e10cSrcweir uno::Any aAnyRequest(rRequest->getRequest());
194cdf0e10cSrcweir
195cdf0e10cSrcweir ucb::HandleCookiesRequest aCookiesRequest;
196cdf0e10cSrcweir if (aAnyRequest >>= aCookiesRequest)
197cdf0e10cSrcweir {
198cdf0e10cSrcweir handleCookiesRequest_(getParentProperty(),
199cdf0e10cSrcweir aCookiesRequest,
200cdf0e10cSrcweir rRequest->getContinuations());
201cdf0e10cSrcweir return true;
202cdf0e10cSrcweir }
203cdf0e10cSrcweir return false;
204cdf0e10cSrcweir }
205cdf0e10cSrcweir
206