1*40df464eSAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*40df464eSAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*40df464eSAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*40df464eSAndrew Rist  * distributed with this work for additional information
6*40df464eSAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*40df464eSAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*40df464eSAndrew Rist  * "License"); you may not use this file except in compliance
9*40df464eSAndrew Rist  * with the License.  You may obtain a copy of the License at
10*40df464eSAndrew Rist  *
11*40df464eSAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12*40df464eSAndrew Rist  *
13*40df464eSAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*40df464eSAndrew Rist  * software distributed under the License is distributed on an
15*40df464eSAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*40df464eSAndrew Rist  * KIND, either express or implied.  See the License for the
17*40df464eSAndrew Rist  * specific language governing permissions and limitations
18*40df464eSAndrew Rist  * under the License.
19*40df464eSAndrew Rist  *
20*40df464eSAndrew Rist  *************************************************************/
21*40df464eSAndrew Rist 
22*40df464eSAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir #include "syscreds.hxx"
25cdf0e10cSrcweir #include "com/sun/star/beans/PropertyValue.hpp"
26cdf0e10cSrcweir 
27cdf0e10cSrcweir using namespace com::sun::star;
28cdf0e10cSrcweir 
SysCredentialsConfigItem(SysCredentialsConfig * pOwner)29cdf0e10cSrcweir SysCredentialsConfigItem::SysCredentialsConfigItem(
30cdf0e10cSrcweir     SysCredentialsConfig * pOwner )
31cdf0e10cSrcweir : utl::ConfigItem( rtl::OUString::createFromAscii( "Office.Common/Passwords" ),
32cdf0e10cSrcweir                    CONFIG_MODE_IMMEDIATE_UPDATE ),
33cdf0e10cSrcweir   m_bInited( false ),
34cdf0e10cSrcweir   m_pOwner( pOwner )
35cdf0e10cSrcweir {
36cdf0e10cSrcweir     uno::Sequence< ::rtl::OUString > aNode( 1 );
37cdf0e10cSrcweir     aNode[ 0 ] = rtl::OUString::createFromAscii(
38cdf0e10cSrcweir         "Office.Common/Passwords/AuthenticateUsingSystemCredentials" );
39cdf0e10cSrcweir     EnableNotification( aNode );
40cdf0e10cSrcweir }
41cdf0e10cSrcweir 
42cdf0e10cSrcweir //virtual
Notify(const uno::Sequence<rtl::OUString> &)43cdf0e10cSrcweir void SysCredentialsConfigItem::Notify(
44cdf0e10cSrcweir     const uno::Sequence< rtl::OUString > & /*seqPropertyNames*/ )
45cdf0e10cSrcweir {
46cdf0e10cSrcweir     {
47cdf0e10cSrcweir         ::osl::MutexGuard aGuard( m_aMutex );
48cdf0e10cSrcweir         m_bInited = false;
49cdf0e10cSrcweir         // rebuild m_seqURLs
50cdf0e10cSrcweir         getSystemCredentialsURLs();
51cdf0e10cSrcweir     }
52cdf0e10cSrcweir     m_pOwner->persistentConfigChanged();
53cdf0e10cSrcweir }
54cdf0e10cSrcweir 
Commit()55cdf0e10cSrcweir void SysCredentialsConfigItem::Commit()
56cdf0e10cSrcweir {
57cdf0e10cSrcweir 	// does nothing
58cdf0e10cSrcweir }
59cdf0e10cSrcweir 
60cdf0e10cSrcweir uno::Sequence< rtl::OUString >
getSystemCredentialsURLs()61cdf0e10cSrcweir SysCredentialsConfigItem::getSystemCredentialsURLs()
62cdf0e10cSrcweir {
63cdf0e10cSrcweir     ::osl::MutexGuard aGuard( m_aMutex );
64cdf0e10cSrcweir     if ( !m_bInited )
65cdf0e10cSrcweir     {
66cdf0e10cSrcweir         // read config item
67cdf0e10cSrcweir         uno::Sequence< ::rtl::OUString > aPropNames( 1 );
68cdf0e10cSrcweir         aPropNames[ 0 ] = rtl::OUString::createFromAscii(
69cdf0e10cSrcweir             "AuthenticateUsingSystemCredentials" );
70cdf0e10cSrcweir         uno::Sequence< uno::Any > aAnyValues(
71cdf0e10cSrcweir             utl::ConfigItem::GetProperties( aPropNames ) );
72cdf0e10cSrcweir 
73cdf0e10cSrcweir         OSL_ENSURE(
74cdf0e10cSrcweir             aAnyValues.getLength() == 1,
75cdf0e10cSrcweir             "SysCredentialsConfigItem::getSystemCredentialsURLs: "
76cdf0e10cSrcweir             "Error reading config item!" );
77cdf0e10cSrcweir 
78cdf0e10cSrcweir         uno::Sequence< rtl::OUString > aValues;
79cdf0e10cSrcweir         if ( ( aAnyValues[ 0 ] >>= aValues ) ||
80cdf0e10cSrcweir              ( !aAnyValues[ 0 ].hasValue() ) )
81cdf0e10cSrcweir         {
82cdf0e10cSrcweir             m_seqURLs = aValues;
83cdf0e10cSrcweir             m_bInited = true;
84cdf0e10cSrcweir         }
85cdf0e10cSrcweir     }
86cdf0e10cSrcweir     return m_seqURLs;
87cdf0e10cSrcweir }
88cdf0e10cSrcweir 
setSystemCredentialsURLs(const uno::Sequence<rtl::OUString> & seqURLList)89cdf0e10cSrcweir void SysCredentialsConfigItem::setSystemCredentialsURLs(
90cdf0e10cSrcweir     const uno::Sequence< rtl::OUString > & seqURLList )
91cdf0e10cSrcweir {
92cdf0e10cSrcweir     ::osl::MutexGuard aGuard( m_aMutex );
93cdf0e10cSrcweir 
94cdf0e10cSrcweir     // write config item.
95cdf0e10cSrcweir     uno::Sequence< rtl::OUString > aPropNames( 1 );
96cdf0e10cSrcweir     uno::Sequence< uno::Any > aPropValues( 1 );
97cdf0e10cSrcweir     aPropNames[ 0 ]
98cdf0e10cSrcweir         = ::rtl::OUString::createFromAscii(
99cdf0e10cSrcweir             "AuthenticateUsingSystemCredentials" );
100cdf0e10cSrcweir     aPropValues[ 0 ] <<= seqURLList;
101cdf0e10cSrcweir 
102cdf0e10cSrcweir     utl::ConfigItem::SetModified();
103cdf0e10cSrcweir     utl::ConfigItem::PutProperties( aPropNames, aPropValues );
104cdf0e10cSrcweir 
105cdf0e10cSrcweir     m_seqURLs = seqURLList;
106cdf0e10cSrcweir     m_bInited = true;
107cdf0e10cSrcweir }
108cdf0e10cSrcweir 
109cdf0e10cSrcweir //============================================================================
110cdf0e10cSrcweir 
111cdf0e10cSrcweir namespace
112cdf0e10cSrcweir {
113cdf0e10cSrcweir     // TODO: This code is actually copied from svl/source/passwordcontainer.cxx
removeLastSegment(::rtl::OUString & aURL)114cdf0e10cSrcweir     bool removeLastSegment( ::rtl::OUString & aURL )
115cdf0e10cSrcweir     {
116cdf0e10cSrcweir         sal_Int32 aInd = aURL.lastIndexOf( sal_Unicode( '/' ) );
117cdf0e10cSrcweir 
118cdf0e10cSrcweir         if( aInd > 0  )
119cdf0e10cSrcweir         {
120cdf0e10cSrcweir             sal_Int32 aPrevInd = aURL.lastIndexOf( sal_Unicode( '/' ), aInd );
121cdf0e10cSrcweir             if ( aURL.indexOf( ::rtl::OUString::createFromAscii( "://" ) )
122cdf0e10cSrcweir                     != aPrevInd - 2 ||
123cdf0e10cSrcweir                  aInd != aURL.getLength() - 1 )
124cdf0e10cSrcweir             {
125cdf0e10cSrcweir                 aURL = aURL.copy( 0, aInd );
126cdf0e10cSrcweir                 return true;
127cdf0e10cSrcweir             }
128cdf0e10cSrcweir         }
129cdf0e10cSrcweir 
130cdf0e10cSrcweir         return false;
131cdf0e10cSrcweir     }
132cdf0e10cSrcweir 
findURL(StringSet const & rContainer,rtl::OUString const & aURL,rtl::OUString & aResult)133cdf0e10cSrcweir     bool findURL( StringSet const & rContainer, rtl::OUString const & aURL, rtl::OUString & aResult )
134cdf0e10cSrcweir     {
135cdf0e10cSrcweir         // TODO: This code is actually copied from svl/source/passwordcontainer.cxx
136cdf0e10cSrcweir         if( !rContainer.empty() && aURL.getLength() )
137cdf0e10cSrcweir         {
138cdf0e10cSrcweir             ::rtl::OUString aUrl( aURL );
139cdf0e10cSrcweir 
140cdf0e10cSrcweir             // each iteration remove last '/...' section from the aUrl
141cdf0e10cSrcweir             // while it's possible, up to the most left '://'
142cdf0e10cSrcweir             do
143cdf0e10cSrcweir             {
144cdf0e10cSrcweir                 // first look for <url>/somename and then look for <url>/somename/...
145cdf0e10cSrcweir                 StringSet::const_iterator aIter = rContainer.find( aUrl );
146cdf0e10cSrcweir                 if( aIter != rContainer.end() )
147cdf0e10cSrcweir                 {
148cdf0e10cSrcweir                     aResult = *aIter;
149cdf0e10cSrcweir                     return true;
150cdf0e10cSrcweir                 }
151cdf0e10cSrcweir                 else
152cdf0e10cSrcweir                 {
153cdf0e10cSrcweir                     ::rtl::OUString tmpUrl( aUrl );
154cdf0e10cSrcweir                     if ( tmpUrl.getStr()[tmpUrl.getLength() - 1] != (sal_Unicode)'/' )
155cdf0e10cSrcweir                       tmpUrl += ::rtl::OUString::createFromAscii( "/" );
156cdf0e10cSrcweir 
157cdf0e10cSrcweir                     aIter = rContainer.lower_bound( tmpUrl );
158cdf0e10cSrcweir                     if( aIter != rContainer.end() && aIter->match( tmpUrl ) )
159cdf0e10cSrcweir                     {
160cdf0e10cSrcweir                         aResult = *aIter;
161cdf0e10cSrcweir                         return true;
162cdf0e10cSrcweir                     }
163cdf0e10cSrcweir                 }
164cdf0e10cSrcweir             }
165cdf0e10cSrcweir             while( removeLastSegment( aUrl ) && aUrl.getLength() );
166cdf0e10cSrcweir         }
167cdf0e10cSrcweir         aResult = rtl::OUString();
168cdf0e10cSrcweir         return false;
169cdf0e10cSrcweir     }
170cdf0e10cSrcweir 
171cdf0e10cSrcweir } // namespace
172cdf0e10cSrcweir 
SysCredentialsConfig()173cdf0e10cSrcweir SysCredentialsConfig::SysCredentialsConfig()
174cdf0e10cSrcweir : m_aConfigItem( this ),
175cdf0e10cSrcweir   m_bCfgInited( false )
176cdf0e10cSrcweir {
177cdf0e10cSrcweir }
178cdf0e10cSrcweir 
initCfg()179cdf0e10cSrcweir void SysCredentialsConfig::initCfg()
180cdf0e10cSrcweir {
181cdf0e10cSrcweir     osl::MutexGuard aGuard( m_aMutex );
182cdf0e10cSrcweir     if ( !m_bCfgInited )
183cdf0e10cSrcweir     {
184cdf0e10cSrcweir         uno::Sequence< rtl::OUString > aURLs(
185cdf0e10cSrcweir             m_aConfigItem.getSystemCredentialsURLs() );
186cdf0e10cSrcweir         for ( sal_Int32 n = 0; n < aURLs.getLength(); ++n )
187cdf0e10cSrcweir             m_aCfgContainer.insert( aURLs[ n ] );
188cdf0e10cSrcweir 
189cdf0e10cSrcweir         m_bCfgInited = true;
190cdf0e10cSrcweir     }
191cdf0e10cSrcweir }
192cdf0e10cSrcweir 
writeCfg()193cdf0e10cSrcweir void SysCredentialsConfig::writeCfg()
194cdf0e10cSrcweir {
195cdf0e10cSrcweir     osl::MutexGuard aGuard( m_aMutex );
196cdf0e10cSrcweir 
197cdf0e10cSrcweir     OSL_ENSURE( m_bCfgInited, "SysCredentialsConfig::writeCfg : not initialized!" );
198cdf0e10cSrcweir 
199cdf0e10cSrcweir     uno::Sequence< rtl::OUString > aURLs( m_aCfgContainer.size() );
200cdf0e10cSrcweir     StringSet::const_iterator it = m_aCfgContainer.begin();
201cdf0e10cSrcweir     const StringSet::const_iterator end = m_aCfgContainer.end();
202cdf0e10cSrcweir     sal_Int32 n = 0;
203cdf0e10cSrcweir 
204cdf0e10cSrcweir     while ( it != end )
205cdf0e10cSrcweir     {
206cdf0e10cSrcweir         aURLs[ n ] = *it;
207cdf0e10cSrcweir         ++it;
208cdf0e10cSrcweir         ++n;
209cdf0e10cSrcweir     }
210cdf0e10cSrcweir 
211cdf0e10cSrcweir     m_aConfigItem.setSystemCredentialsURLs( aURLs );
212cdf0e10cSrcweir }
213cdf0e10cSrcweir 
find(rtl::OUString const & aURL)214cdf0e10cSrcweir rtl::OUString SysCredentialsConfig::find( rtl::OUString const & aURL )
215cdf0e10cSrcweir {
216cdf0e10cSrcweir     osl::MutexGuard aGuard( m_aMutex );
217cdf0e10cSrcweir     rtl::OUString aResult;
218cdf0e10cSrcweir     if ( findURL( m_aMemContainer, aURL, aResult ) )
219cdf0e10cSrcweir         return aResult;
220cdf0e10cSrcweir 
221cdf0e10cSrcweir     initCfg();
222cdf0e10cSrcweir     if ( findURL( m_aCfgContainer, aURL, aResult ) )
223cdf0e10cSrcweir         return aResult;
224cdf0e10cSrcweir 
225cdf0e10cSrcweir     return rtl::OUString();
226cdf0e10cSrcweir }
227cdf0e10cSrcweir 
add(rtl::OUString const & rURL,bool bPersistent)228cdf0e10cSrcweir void SysCredentialsConfig::add( rtl::OUString const & rURL, bool bPersistent )
229cdf0e10cSrcweir {
230cdf0e10cSrcweir     ::osl::MutexGuard aGuard( m_aMutex );
231cdf0e10cSrcweir 
232cdf0e10cSrcweir     if ( bPersistent )
233cdf0e10cSrcweir     {
234cdf0e10cSrcweir         m_aMemContainer.erase( rURL );
235cdf0e10cSrcweir 
236cdf0e10cSrcweir         initCfg();
237cdf0e10cSrcweir         m_aCfgContainer.insert( rURL );
238cdf0e10cSrcweir         writeCfg();
239cdf0e10cSrcweir     }
240cdf0e10cSrcweir     else
241cdf0e10cSrcweir     {
242cdf0e10cSrcweir         initCfg();
243cdf0e10cSrcweir         if ( m_aCfgContainer.erase( rURL ) > 0 )
244cdf0e10cSrcweir             writeCfg();
245cdf0e10cSrcweir 
246cdf0e10cSrcweir         m_aMemContainer.insert( rURL );
247cdf0e10cSrcweir     }
248cdf0e10cSrcweir }
249cdf0e10cSrcweir 
remove(rtl::OUString const & rURL)250cdf0e10cSrcweir void SysCredentialsConfig::remove( rtl::OUString const & rURL )
251cdf0e10cSrcweir {
252cdf0e10cSrcweir     m_aMemContainer.erase( rURL );
253cdf0e10cSrcweir 
254cdf0e10cSrcweir     initCfg();
255cdf0e10cSrcweir     if ( m_aCfgContainer.erase( rURL ) > 0 )
256cdf0e10cSrcweir         writeCfg();
257cdf0e10cSrcweir }
258cdf0e10cSrcweir 
list(bool bOnlyPersistent)259cdf0e10cSrcweir uno::Sequence< rtl::OUString > SysCredentialsConfig::list( bool bOnlyPersistent )
260cdf0e10cSrcweir {
261cdf0e10cSrcweir     initCfg();
262cdf0e10cSrcweir     sal_Int32 nCount = m_aCfgContainer.size()
263cdf0e10cSrcweir                      + ( bOnlyPersistent ? 0 : m_aMemContainer.size() );
264cdf0e10cSrcweir     uno::Sequence< rtl::OUString > aResult( nCount );
265cdf0e10cSrcweir 
266cdf0e10cSrcweir     StringSet::const_iterator it = m_aCfgContainer.begin();
267cdf0e10cSrcweir     StringSet::const_iterator end = m_aCfgContainer.end();
268cdf0e10cSrcweir     sal_Int32 n = 0;
269cdf0e10cSrcweir 
270cdf0e10cSrcweir     while ( it != end )
271cdf0e10cSrcweir     {
272cdf0e10cSrcweir         aResult[ n ] = *it;
273cdf0e10cSrcweir         ++it;
274cdf0e10cSrcweir         ++n;
275cdf0e10cSrcweir     }
276cdf0e10cSrcweir 
277cdf0e10cSrcweir     if ( !bOnlyPersistent )
278cdf0e10cSrcweir     {
279cdf0e10cSrcweir         it = m_aMemContainer.begin();
280cdf0e10cSrcweir         end = m_aMemContainer.end();
281cdf0e10cSrcweir 
282cdf0e10cSrcweir         while ( it != end )
283cdf0e10cSrcweir         {
284cdf0e10cSrcweir             aResult[ n ] = *it;
285cdf0e10cSrcweir             ++it;
286cdf0e10cSrcweir             ++n;
287cdf0e10cSrcweir         }
288cdf0e10cSrcweir     }
289cdf0e10cSrcweir     return aResult;
290cdf0e10cSrcweir }
291cdf0e10cSrcweir 
persistentConfigChanged()292cdf0e10cSrcweir void SysCredentialsConfig::persistentConfigChanged()
293cdf0e10cSrcweir {
294cdf0e10cSrcweir     ::osl::MutexGuard aGuard( m_aMutex );
295cdf0e10cSrcweir     m_bCfgInited = false; // re-init on demand.
296cdf0e10cSrcweir }
297