xref: /aoo4110/main/ucb/source/ucp/gio/gio_mount.cxx (revision b1cdbd2c)
1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski #include "gio_mount.hxx"
25*b1cdbd2cSJim Jagielski #include <ucbhelper/simpleauthenticationrequest.hxx>
26*b1cdbd2cSJim Jagielski #include <stdio.h>
27*b1cdbd2cSJim Jagielski #include <string.h>
28*b1cdbd2cSJim Jagielski 
29*b1cdbd2cSJim Jagielski G_DEFINE_TYPE (OOoMountOperation, ooo_mount_operation, G_TYPE_MOUNT_OPERATION);
30*b1cdbd2cSJim Jagielski 
31*b1cdbd2cSJim Jagielski static void ooo_mount_operation_ask_password (GMountOperation   *op,
32*b1cdbd2cSJim Jagielski     const char *message, const char *default_user, const char *default_domain,
33*b1cdbd2cSJim Jagielski     GAskPasswordFlags flags);
34*b1cdbd2cSJim Jagielski 
ooo_mount_operation_init(OOoMountOperation * op)35*b1cdbd2cSJim Jagielski static void ooo_mount_operation_init (OOoMountOperation *op)
36*b1cdbd2cSJim Jagielski {
37*b1cdbd2cSJim Jagielski     op->m_pPrevPassword = NULL;
38*b1cdbd2cSJim Jagielski     op->m_pPrevUsername = NULL;
39*b1cdbd2cSJim Jagielski }
40*b1cdbd2cSJim Jagielski 
ooo_mount_operation_finalize(GObject * object)41*b1cdbd2cSJim Jagielski static void ooo_mount_operation_finalize (GObject *object)
42*b1cdbd2cSJim Jagielski {
43*b1cdbd2cSJim Jagielski     OOoMountOperation *mount_op = OOO_MOUNT_OPERATION (object);
44*b1cdbd2cSJim Jagielski     if (mount_op->m_pPrevUsername)
45*b1cdbd2cSJim Jagielski         free(mount_op->m_pPrevUsername);
46*b1cdbd2cSJim Jagielski     if (mount_op->m_pPrevPassword)
47*b1cdbd2cSJim Jagielski         free(mount_op->m_pPrevPassword);
48*b1cdbd2cSJim Jagielski 
49*b1cdbd2cSJim Jagielski     G_OBJECT_CLASS (ooo_mount_operation_parent_class)->finalize (object);
50*b1cdbd2cSJim Jagielski }
51*b1cdbd2cSJim Jagielski 
ooo_mount_operation_class_init(OOoMountOperationClass * klass)52*b1cdbd2cSJim Jagielski static void ooo_mount_operation_class_init (OOoMountOperationClass *klass)
53*b1cdbd2cSJim Jagielski {
54*b1cdbd2cSJim Jagielski     GObjectClass *object_class = G_OBJECT_CLASS (klass);
55*b1cdbd2cSJim Jagielski     object_class->finalize = ooo_mount_operation_finalize;
56*b1cdbd2cSJim Jagielski 
57*b1cdbd2cSJim Jagielski     GMountOperationClass *mount_op_class = G_MOUNT_OPERATION_CLASS (klass);
58*b1cdbd2cSJim Jagielski     mount_op_class->ask_password = ooo_mount_operation_ask_password;
59*b1cdbd2cSJim Jagielski }
60*b1cdbd2cSJim Jagielski 
61*b1cdbd2cSJim Jagielski using namespace com::sun::star;
62*b1cdbd2cSJim Jagielski 
ooo_mount_operation_ask_password(GMountOperation * op,const char *,const char * default_user,const char * default_domain,GAskPasswordFlags flags)63*b1cdbd2cSJim Jagielski static void ooo_mount_operation_ask_password (GMountOperation *op,
64*b1cdbd2cSJim Jagielski     const char * /*message*/, const char *default_user,
65*b1cdbd2cSJim Jagielski     const char *default_domain, GAskPasswordFlags flags)
66*b1cdbd2cSJim Jagielski {
67*b1cdbd2cSJim Jagielski     uno::Reference< task::XInteractionHandler > xIH;
68*b1cdbd2cSJim Jagielski 
69*b1cdbd2cSJim Jagielski     OOoMountOperation *pThis = (OOoMountOperation*)op;
70*b1cdbd2cSJim Jagielski 
71*b1cdbd2cSJim Jagielski     const com::sun::star::uno::Reference< com::sun::star::ucb::XCommandEnvironment > &xEnv = *(pThis->pEnv);
72*b1cdbd2cSJim Jagielski 
73*b1cdbd2cSJim Jagielski     if (xEnv.is())
74*b1cdbd2cSJim Jagielski       xIH = xEnv->getInteractionHandler();
75*b1cdbd2cSJim Jagielski 
76*b1cdbd2cSJim Jagielski     if (!xIH.is())
77*b1cdbd2cSJim Jagielski     {
78*b1cdbd2cSJim Jagielski         g_mount_operation_reply (op, G_MOUNT_OPERATION_ABORTED);
79*b1cdbd2cSJim Jagielski         return;
80*b1cdbd2cSJim Jagielski     }
81*b1cdbd2cSJim Jagielski 
82*b1cdbd2cSJim Jagielski     ::rtl::OUString aHostName, aDomain, aUserName, aPassword;
83*b1cdbd2cSJim Jagielski 
84*b1cdbd2cSJim Jagielski     ucbhelper::SimpleAuthenticationRequest::EntityType eUserName =
85*b1cdbd2cSJim Jagielski         (flags & G_ASK_PASSWORD_NEED_USERNAME)
86*b1cdbd2cSJim Jagielski           ? ucbhelper::SimpleAuthenticationRequest::ENTITY_MODIFY
87*b1cdbd2cSJim Jagielski           : ucbhelper::SimpleAuthenticationRequest::ENTITY_NA;
88*b1cdbd2cSJim Jagielski 
89*b1cdbd2cSJim Jagielski     if (default_user)
90*b1cdbd2cSJim Jagielski         aUserName = rtl::OUString(default_user, strlen(default_user), RTL_TEXTENCODING_UTF8);
91*b1cdbd2cSJim Jagielski 
92*b1cdbd2cSJim Jagielski     ucbhelper::SimpleAuthenticationRequest::EntityType ePassword =
93*b1cdbd2cSJim Jagielski         (flags & G_ASK_PASSWORD_NEED_PASSWORD)
94*b1cdbd2cSJim Jagielski           ? ucbhelper::SimpleAuthenticationRequest::ENTITY_MODIFY
95*b1cdbd2cSJim Jagielski           : ucbhelper::SimpleAuthenticationRequest::ENTITY_NA;
96*b1cdbd2cSJim Jagielski 
97*b1cdbd2cSJim Jagielski     rtl::OUString aPrevPassword, aPrevUsername;
98*b1cdbd2cSJim Jagielski     if (pThis->m_pPrevUsername)
99*b1cdbd2cSJim Jagielski         aPrevUsername = rtl::OUString(pThis->m_pPrevUsername, strlen(pThis->m_pPrevUsername), RTL_TEXTENCODING_UTF8);
100*b1cdbd2cSJim Jagielski     if (pThis->m_pPrevPassword)
101*b1cdbd2cSJim Jagielski         aPrevPassword = rtl::OUString(pThis->m_pPrevPassword, strlen(pThis->m_pPrevPassword), RTL_TEXTENCODING_UTF8);
102*b1cdbd2cSJim Jagielski 
103*b1cdbd2cSJim Jagielski     //The damn dialog is stupidly broken, so do like webdav, i.e. "#102871#"
104*b1cdbd2cSJim Jagielski     if ( aUserName.getLength() == 0 )
105*b1cdbd2cSJim Jagielski         aUserName = aPrevUsername;
106*b1cdbd2cSJim Jagielski 
107*b1cdbd2cSJim Jagielski     if ( aPassword.getLength() == 0 )
108*b1cdbd2cSJim Jagielski         aPassword = aPrevPassword;
109*b1cdbd2cSJim Jagielski 
110*b1cdbd2cSJim Jagielski     ucbhelper::SimpleAuthenticationRequest::EntityType eDomain =
111*b1cdbd2cSJim Jagielski         (flags & G_ASK_PASSWORD_NEED_DOMAIN)
112*b1cdbd2cSJim Jagielski           ? ucbhelper::SimpleAuthenticationRequest::ENTITY_MODIFY
113*b1cdbd2cSJim Jagielski           : ucbhelper::SimpleAuthenticationRequest::ENTITY_NA;
114*b1cdbd2cSJim Jagielski 
115*b1cdbd2cSJim Jagielski     if (default_domain)
116*b1cdbd2cSJim Jagielski         aDomain = rtl::OUString(default_domain, strlen(default_domain), RTL_TEXTENCODING_UTF8);
117*b1cdbd2cSJim Jagielski 
118*b1cdbd2cSJim Jagielski     uno::Reference< ucbhelper::SimpleAuthenticationRequest > xRequest
119*b1cdbd2cSJim Jagielski         = new ucbhelper::SimpleAuthenticationRequest (rtl::OUString() /* FIXME: provide URL here */, aHostName, eDomain, aDomain, eUserName, aUserName, ePassword, aPassword);
120*b1cdbd2cSJim Jagielski 
121*b1cdbd2cSJim Jagielski     xIH->handle( xRequest.get() );
122*b1cdbd2cSJim Jagielski 
123*b1cdbd2cSJim Jagielski     rtl::Reference< ucbhelper::InteractionContinuation > xSelection = xRequest->getSelection();
124*b1cdbd2cSJim Jagielski 
125*b1cdbd2cSJim Jagielski     if ( !xSelection.is() )
126*b1cdbd2cSJim Jagielski     {
127*b1cdbd2cSJim Jagielski         g_mount_operation_reply (op, G_MOUNT_OPERATION_ABORTED);
128*b1cdbd2cSJim Jagielski         return;
129*b1cdbd2cSJim Jagielski     }
130*b1cdbd2cSJim Jagielski 
131*b1cdbd2cSJim Jagielski     uno::Reference< task::XInteractionAbort > xAbort(xSelection.get(), uno::UNO_QUERY );
132*b1cdbd2cSJim Jagielski     if ( xAbort.is() )
133*b1cdbd2cSJim Jagielski     {
134*b1cdbd2cSJim Jagielski         g_mount_operation_reply (op, G_MOUNT_OPERATION_ABORTED);
135*b1cdbd2cSJim Jagielski         return;
136*b1cdbd2cSJim Jagielski     }
137*b1cdbd2cSJim Jagielski 
138*b1cdbd2cSJim Jagielski     const rtl::Reference< ucbhelper::InteractionSupplyAuthentication > & xSupp = xRequest->getAuthenticationSupplier();
139*b1cdbd2cSJim Jagielski     aUserName = xSupp->getUserName();
140*b1cdbd2cSJim Jagielski     aPassword = xSupp->getPassword();
141*b1cdbd2cSJim Jagielski 
142*b1cdbd2cSJim Jagielski     if (flags & G_ASK_PASSWORD_NEED_USERNAME)
143*b1cdbd2cSJim Jagielski         g_mount_operation_set_username(op, rtl::OUStringToOString(aUserName, RTL_TEXTENCODING_UTF8).getStr());
144*b1cdbd2cSJim Jagielski 
145*b1cdbd2cSJim Jagielski     if (flags & G_ASK_PASSWORD_NEED_PASSWORD)
146*b1cdbd2cSJim Jagielski         g_mount_operation_set_password(op, rtl::OUStringToOString(aPassword, RTL_TEXTENCODING_UTF8).getStr());
147*b1cdbd2cSJim Jagielski 
148*b1cdbd2cSJim Jagielski     if (flags & G_ASK_PASSWORD_NEED_DOMAIN)
149*b1cdbd2cSJim Jagielski         g_mount_operation_set_domain(op, rtl::OUStringToOString(xSupp->getRealm(), RTL_TEXTENCODING_UTF8).getStr());
150*b1cdbd2cSJim Jagielski 
151*b1cdbd2cSJim Jagielski     switch (xSupp->getRememberPasswordMode())
152*b1cdbd2cSJim Jagielski     {
153*b1cdbd2cSJim Jagielski 	default:
154*b1cdbd2cSJim Jagielski         case ucb::RememberAuthentication_NO:
155*b1cdbd2cSJim Jagielski             g_mount_operation_set_password_save(op, G_PASSWORD_SAVE_NEVER);
156*b1cdbd2cSJim Jagielski             break;
157*b1cdbd2cSJim Jagielski         case ucb::RememberAuthentication_SESSION:
158*b1cdbd2cSJim Jagielski             g_mount_operation_set_password_save(op, G_PASSWORD_SAVE_FOR_SESSION);
159*b1cdbd2cSJim Jagielski             break;
160*b1cdbd2cSJim Jagielski         case ucb::RememberAuthentication_PERSISTENT:
161*b1cdbd2cSJim Jagielski             g_mount_operation_set_password_save(op, G_PASSWORD_SAVE_PERMANENTLY);
162*b1cdbd2cSJim Jagielski             break;
163*b1cdbd2cSJim Jagielski     }
164*b1cdbd2cSJim Jagielski 
165*b1cdbd2cSJim Jagielski     if (pThis->m_pPrevPassword)
166*b1cdbd2cSJim Jagielski         free(pThis->m_pPrevPassword);
167*b1cdbd2cSJim Jagielski     pThis->m_pPrevPassword = strdup(rtl::OUStringToOString(aPassword, RTL_TEXTENCODING_UTF8).getStr());
168*b1cdbd2cSJim Jagielski     if (pThis->m_pPrevUsername)
169*b1cdbd2cSJim Jagielski         free(pThis->m_pPrevUsername);
170*b1cdbd2cSJim Jagielski     pThis->m_pPrevUsername = strdup(rtl::OUStringToOString(aUserName, RTL_TEXTENCODING_UTF8).getStr());
171*b1cdbd2cSJim Jagielski     g_mount_operation_reply (op, G_MOUNT_OPERATION_HANDLED);
172*b1cdbd2cSJim Jagielski }
173*b1cdbd2cSJim Jagielski 
ooo_mount_operation_new(const uno::Reference<ucb::XCommandEnvironment> & rEnv)174*b1cdbd2cSJim Jagielski GMountOperation *ooo_mount_operation_new(const uno::Reference< ucb::XCommandEnvironment >& rEnv)
175*b1cdbd2cSJim Jagielski {
176*b1cdbd2cSJim Jagielski     OOoMountOperation *pRet = (OOoMountOperation*)g_object_new (OOO_TYPE_MOUNT_OPERATION, NULL);
177*b1cdbd2cSJim Jagielski     pRet->pEnv = &rEnv;
178*b1cdbd2cSJim Jagielski     return (GMountOperation*)pRet;
179*b1cdbd2cSJim Jagielski }
180