xref: /aoo42x/main/uui/source/iahndl-cookies.cxx (revision 859212d1)
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