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 // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_stoc.hxx"
26*b1cdbd2cSJim Jagielski 
27*b1cdbd2cSJim Jagielski #include <stdio.h>
28*b1cdbd2cSJim Jagielski 
29*b1cdbd2cSJim Jagielski #include <sal/main.h>
30*b1cdbd2cSJim Jagielski #include <osl/diagnose.h>
31*b1cdbd2cSJim Jagielski #include <osl/socket.hxx>
32*b1cdbd2cSJim Jagielski #include <rtl/string.hxx>
33*b1cdbd2cSJim Jagielski #include <rtl/ustrbuf.hxx>
34*b1cdbd2cSJim Jagielski #include <uno/current_context.hxx>
35*b1cdbd2cSJim Jagielski 
36*b1cdbd2cSJim Jagielski #include <cppuhelper/implbase1.hxx>
37*b1cdbd2cSJim Jagielski #include <cppuhelper/bootstrap.hxx>
38*b1cdbd2cSJim Jagielski #include <cppuhelper/access_control.hxx>
39*b1cdbd2cSJim Jagielski 
40*b1cdbd2cSJim Jagielski #include <com/sun/star/lang/XComponent.hpp>
41*b1cdbd2cSJim Jagielski #include <com/sun/star/uno/XCurrentContext.hpp>
42*b1cdbd2cSJim Jagielski 
43*b1cdbd2cSJim Jagielski #include <com/sun/star/io/FilePermission.hpp>
44*b1cdbd2cSJim Jagielski 
45*b1cdbd2cSJim Jagielski #define USER_CREDS "access-control.user-credentials"
46*b1cdbd2cSJim Jagielski #define OUSTR(x) ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM(x) )
47*b1cdbd2cSJim Jagielski 
48*b1cdbd2cSJim Jagielski 
49*b1cdbd2cSJim Jagielski using namespace ::osl;
50*b1cdbd2cSJim Jagielski using namespace ::rtl;
51*b1cdbd2cSJim Jagielski using namespace ::cppu;
52*b1cdbd2cSJim Jagielski using namespace ::com::sun::star;
53*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::uno;
54*b1cdbd2cSJim Jagielski 
55*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------------------------------------
localhost(OUString const & addition)56*b1cdbd2cSJim Jagielski static OUString localhost( OUString const & addition ) SAL_THROW( () )
57*b1cdbd2cSJim Jagielski {
58*b1cdbd2cSJim Jagielski     static OUString ip;
59*b1cdbd2cSJim Jagielski     if (! ip.getLength())
60*b1cdbd2cSJim Jagielski     {
61*b1cdbd2cSJim Jagielski         // dns lookup
62*b1cdbd2cSJim Jagielski         SocketAddr addr;
63*b1cdbd2cSJim Jagielski         SocketAddr::resolveHostname( OUSTR("localhost"), addr );
64*b1cdbd2cSJim Jagielski         ::oslSocketResult rc = ::osl_getDottedInetAddrOfSocketAddr( addr.getHandle(), &ip.pData );
65*b1cdbd2cSJim Jagielski         if (::osl_Socket_Ok != rc)
66*b1cdbd2cSJim Jagielski             fprintf(stdout, "### cannot resolve localhost!" );
67*b1cdbd2cSJim Jagielski     }
68*b1cdbd2cSJim Jagielski     OUStringBuffer buf( 48 );
69*b1cdbd2cSJim Jagielski     buf.append( ip );
70*b1cdbd2cSJim Jagielski     buf.append( addition );
71*b1cdbd2cSJim Jagielski     return buf.makeStringAndClear();
72*b1cdbd2cSJim Jagielski }
73*b1cdbd2cSJim Jagielski 
74*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------------------------------------
dispose(Reference<XInterface> const & x)75*b1cdbd2cSJim Jagielski static inline void dispose( Reference< XInterface > const & x )
76*b1cdbd2cSJim Jagielski     SAL_THROW( (RuntimeException) )
77*b1cdbd2cSJim Jagielski {
78*b1cdbd2cSJim Jagielski     Reference< lang::XComponent > xComp( x, UNO_QUERY );
79*b1cdbd2cSJim Jagielski     if (xComp.is())
80*b1cdbd2cSJim Jagielski     {
81*b1cdbd2cSJim Jagielski         xComp->dispose();
82*b1cdbd2cSJim Jagielski     }
83*b1cdbd2cSJim Jagielski }
84*b1cdbd2cSJim Jagielski //==================================================================================================
85*b1cdbd2cSJim Jagielski class user_CurrentContext
86*b1cdbd2cSJim Jagielski     : public ImplHelper1< XCurrentContext >
87*b1cdbd2cSJim Jagielski {
88*b1cdbd2cSJim Jagielski     oslInterlockedCount m_refcount;
89*b1cdbd2cSJim Jagielski 
90*b1cdbd2cSJim Jagielski     Reference< XCurrentContext > m_xDelegate;
91*b1cdbd2cSJim Jagielski     Any m_userId;
92*b1cdbd2cSJim Jagielski 
93*b1cdbd2cSJim Jagielski public:
user_CurrentContext(Reference<XCurrentContext> const & xDelegate,OUString const & userId)94*b1cdbd2cSJim Jagielski     inline user_CurrentContext(
95*b1cdbd2cSJim Jagielski         Reference< XCurrentContext > const & xDelegate,
96*b1cdbd2cSJim Jagielski         OUString const & userId )
97*b1cdbd2cSJim Jagielski         SAL_THROW( () )
98*b1cdbd2cSJim Jagielski         : m_refcount( 0 )
99*b1cdbd2cSJim Jagielski         , m_xDelegate( xDelegate )
100*b1cdbd2cSJim Jagielski         , m_userId( makeAny( userId ) )
101*b1cdbd2cSJim Jagielski         {}
102*b1cdbd2cSJim Jagielski 
103*b1cdbd2cSJim Jagielski     // XInterface impl
104*b1cdbd2cSJim Jagielski     virtual void SAL_CALL acquire()
105*b1cdbd2cSJim Jagielski         throw ();
106*b1cdbd2cSJim Jagielski     virtual void SAL_CALL release()
107*b1cdbd2cSJim Jagielski         throw ();
108*b1cdbd2cSJim Jagielski 
109*b1cdbd2cSJim Jagielski     // XCurrentContext impl
110*b1cdbd2cSJim Jagielski     virtual Any SAL_CALL getValueByName( OUString const & name )
111*b1cdbd2cSJim Jagielski         throw (RuntimeException);
112*b1cdbd2cSJim Jagielski };
113*b1cdbd2cSJim Jagielski //__________________________________________________________________________________________________
acquire()114*b1cdbd2cSJim Jagielski void user_CurrentContext::acquire()
115*b1cdbd2cSJim Jagielski     throw ()
116*b1cdbd2cSJim Jagielski {
117*b1cdbd2cSJim Jagielski     ::osl_incrementInterlockedCount( &m_refcount );
118*b1cdbd2cSJim Jagielski }
119*b1cdbd2cSJim Jagielski //__________________________________________________________________________________________________
release()120*b1cdbd2cSJim Jagielski void user_CurrentContext::release()
121*b1cdbd2cSJim Jagielski     throw ()
122*b1cdbd2cSJim Jagielski {
123*b1cdbd2cSJim Jagielski     if (! ::osl_decrementInterlockedCount( &m_refcount ))
124*b1cdbd2cSJim Jagielski     {
125*b1cdbd2cSJim Jagielski         delete this;
126*b1cdbd2cSJim Jagielski     }
127*b1cdbd2cSJim Jagielski }
128*b1cdbd2cSJim Jagielski //__________________________________________________________________________________________________
getValueByName(OUString const & name)129*b1cdbd2cSJim Jagielski Any user_CurrentContext::getValueByName( OUString const & name )
130*b1cdbd2cSJim Jagielski     throw (RuntimeException)
131*b1cdbd2cSJim Jagielski {
132*b1cdbd2cSJim Jagielski     if (name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM(USER_CREDS ".id") ))
133*b1cdbd2cSJim Jagielski     {
134*b1cdbd2cSJim Jagielski         return m_userId;
135*b1cdbd2cSJim Jagielski     }
136*b1cdbd2cSJim Jagielski     else if (m_xDelegate.is())
137*b1cdbd2cSJim Jagielski     {
138*b1cdbd2cSJim Jagielski         return m_xDelegate->getValueByName( name );
139*b1cdbd2cSJim Jagielski     }
140*b1cdbd2cSJim Jagielski     else
141*b1cdbd2cSJim Jagielski     {
142*b1cdbd2cSJim Jagielski         return Any();
143*b1cdbd2cSJim Jagielski     }
144*b1cdbd2cSJim Jagielski }
145*b1cdbd2cSJim Jagielski 
146*b1cdbd2cSJim Jagielski // prepends line number
147*b1cdbd2cSJim Jagielski #define CHECK( check, negative_test ) \
148*b1cdbd2cSJim Jagielski { \
149*b1cdbd2cSJim Jagielski     try \
150*b1cdbd2cSJim Jagielski     { \
151*b1cdbd2cSJim Jagielski         if (negative_test) \
152*b1cdbd2cSJim Jagielski         { \
153*b1cdbd2cSJim Jagielski             bool thrown = true; \
154*b1cdbd2cSJim Jagielski             try \
155*b1cdbd2cSJim Jagielski             { \
156*b1cdbd2cSJim Jagielski                 check; \
157*b1cdbd2cSJim Jagielski                 thrown = false; \
158*b1cdbd2cSJim Jagielski             } \
159*b1cdbd2cSJim Jagielski             catch (RuntimeException &) \
160*b1cdbd2cSJim Jagielski             { \
161*b1cdbd2cSJim Jagielski             } \
162*b1cdbd2cSJim Jagielski             if (! thrown) \
163*b1cdbd2cSJim Jagielski             { \
164*b1cdbd2cSJim Jagielski                 throw RuntimeException( \
165*b1cdbd2cSJim Jagielski                     OUSTR("expected RuntimeException upon check!"), Reference< XInterface >() ); \
166*b1cdbd2cSJim Jagielski             } \
167*b1cdbd2cSJim Jagielski         } \
168*b1cdbd2cSJim Jagielski         else \
169*b1cdbd2cSJim Jagielski         { \
170*b1cdbd2cSJim Jagielski             check; \
171*b1cdbd2cSJim Jagielski         } \
172*b1cdbd2cSJim Jagielski     } \
173*b1cdbd2cSJim Jagielski     catch (RuntimeException & exc) \
174*b1cdbd2cSJim Jagielski     { \
175*b1cdbd2cSJim Jagielski         OUStringBuffer buf( 64 ); \
176*b1cdbd2cSJim Jagielski         buf.appendAscii( RTL_CONSTASCII_STRINGPARAM("[line ") ); \
177*b1cdbd2cSJim Jagielski         buf.append( (sal_Int32)__LINE__ ); \
178*b1cdbd2cSJim Jagielski         buf.appendAscii( RTL_CONSTASCII_STRINGPARAM("] ") ); \
179*b1cdbd2cSJim Jagielski         buf.append( exc.Message ); \
180*b1cdbd2cSJim Jagielski         throw RuntimeException( buf.makeStringAndClear(), Reference< XInterface >() ); \
181*b1cdbd2cSJim Jagielski     } \
182*b1cdbd2cSJim Jagielski }
183*b1cdbd2cSJim Jagielski 
184*b1cdbd2cSJim Jagielski /*
185*b1cdbd2cSJim Jagielski grant
186*b1cdbd2cSJim Jagielski {
187*b1cdbd2cSJim Jagielski permission com.sun.star.io.FilePermission "file:///usr/bin/ *", "read";
188*b1cdbd2cSJim Jagielski permission com.sun.star.io.FilePermission "file:///tmp/-", "read,write";
189*b1cdbd2cSJim Jagielski permission com.sun.star.io.FilePermission "file:///etc/profile", "read";
190*b1cdbd2cSJim Jagielski 
191*b1cdbd2cSJim Jagielski permission com.sun.star.security.RuntimePermission "DEF";
192*b1cdbd2cSJim Jagielski 
193*b1cdbd2cSJim Jagielski permission com.sun.star.connection.SocketPermission "127.0.0.1:-1023", "resolve, connect, listen";
194*b1cdbd2cSJim Jagielski permission com.sun.star.connection.SocketPermission "localhost:1024-", "accept, connect, listen, resolve,";
195*b1cdbd2cSJim Jagielski permission com.sun.star.connection.SocketPermission "*.sun.com:1024-", "resolve";
196*b1cdbd2cSJim Jagielski };
197*b1cdbd2cSJim Jagielski */
check_defaults_pos(AccessControl & ac,bool invert=false)198*b1cdbd2cSJim Jagielski static void check_defaults_pos( AccessControl & ac, bool invert = false )
199*b1cdbd2cSJim Jagielski {
200*b1cdbd2cSJim Jagielski     // positive tests
201*b1cdbd2cSJim Jagielski     CHECK( ac.checkFilePermission( OUSTR("file:///usr/bin/bla"), OUSTR("read") ), invert );
202*b1cdbd2cSJim Jagielski     CHECK( ac.checkFilePermission( OUSTR("file:///tmp/bla"), OUSTR("read,write") ), invert );
203*b1cdbd2cSJim Jagielski     CHECK( ac.checkFilePermission( OUSTR("file:///tmp/path/path/bla"), OUSTR("write") ), invert );
204*b1cdbd2cSJim Jagielski     CHECK( ac.checkFilePermission( OUSTR("file:///etc/profile"), OUSTR("read") ), invert );
205*b1cdbd2cSJim Jagielski     CHECK( ac.checkRuntimePermission( OUSTR("DEF") ), invert );
206*b1cdbd2cSJim Jagielski     CHECK( ac.checkSocketPermission( OUSTR("localhost:1024"), OUSTR("connect") ), invert );
207*b1cdbd2cSJim Jagielski     CHECK( ac.checkSocketPermission( OUSTR("localhost:65535"), OUSTR("resolve") ), invert );
208*b1cdbd2cSJim Jagielski     CHECK( ac.checkSocketPermission( localhost(OUSTR(":2048")), OUSTR("accept,listen") ), invert );
209*b1cdbd2cSJim Jagielski     CHECK( ac.checkSocketPermission( localhost(OUSTR(":1024-")), OUSTR("accept,connect,listen,resolve") ), invert );
210*b1cdbd2cSJim Jagielski     CHECK( ac.checkSocketPermission( OUSTR("localhost:-1023"), OUSTR("resolve,listen,connect") ), invert );
211*b1cdbd2cSJim Jagielski     CHECK( ac.checkSocketPermission( OUSTR("jl-1036.germany.sun.com:1024-"), OUSTR("resolve") ), invert );
212*b1cdbd2cSJim Jagielski }
check_defaults_neg(AccessControl & ac,bool invert=false)213*b1cdbd2cSJim Jagielski static void check_defaults_neg( AccessControl & ac, bool invert = false )
214*b1cdbd2cSJim Jagielski {
215*b1cdbd2cSJim Jagielski     // negative tests
216*b1cdbd2cSJim Jagielski     CHECK( ac.checkFilePermission( OUSTR("file:///usr/tmp"), OUSTR("read") ), !invert );
217*b1cdbd2cSJim Jagielski     CHECK( ac.checkFilePermission( OUSTR("file:///"), OUSTR("read") ), !invert );
218*b1cdbd2cSJim Jagielski     CHECK( ac.checkFilePermission( OUSTR("file:///usr/bin"), OUSTR("read") ), !invert );
219*b1cdbd2cSJim Jagielski     CHECK( ac.checkFilePermission( OUSTR("file:///usr/bin/bla"), OUSTR("write") ), !invert );
220*b1cdbd2cSJim Jagielski     CHECK( ac.checkFilePermission( OUSTR("file:///usr/bin/bla"), OUSTR("execute") ), !invert );
221*b1cdbd2cSJim Jagielski     CHECK( ac.checkFilePermission( OUSTR("file:///usr/bin/path/bla"), OUSTR("read") ), !invert );
222*b1cdbd2cSJim Jagielski     CHECK( ac.checkFilePermission( OUSTR("file:///tmp"), OUSTR("read") ), !invert );
223*b1cdbd2cSJim Jagielski     CHECK( ac.checkFilePermission( OUSTR("file:///tmp/"), OUSTR("read") ), !invert );
224*b1cdbd2cSJim Jagielski     CHECK( ac.checkFilePermission( OUSTR("file:///tm"), OUSTR("read") ), !invert );
225*b1cdbd2cSJim Jagielski     CHECK( ac.checkFilePermission( OUSTR("file:///etc/profile"), OUSTR("write") ), !invert );
226*b1cdbd2cSJim Jagielski     CHECK( ac.checkFilePermission( OUSTR("file:///etc/profile/bla"), OUSTR("read") ), !invert );
227*b1cdbd2cSJim Jagielski     CHECK( ac.checkFilePermission( OUSTR("file:///etc/blabla"), OUSTR("read,write,execute") ), !invert );
228*b1cdbd2cSJim Jagielski     CHECK( ac.checkFilePermission( OUSTR("file:///home/root"), OUSTR("read,write,execute") ), !invert );
229*b1cdbd2cSJim Jagielski     CHECK( ac.checkFilePermission( OUSTR("file:///root"), OUSTR("read,write,execute") ), !invert );
230*b1cdbd2cSJim Jagielski     CHECK( ac.checkFilePermission( OUSTR("file:///root"), OUSTR("delete") ), !invert );
231*b1cdbd2cSJim Jagielski     CHECK( ac.checkFilePermission( OUSTR("file:///root"), OUString() ), !invert );
232*b1cdbd2cSJim Jagielski     CHECK( ac.checkRuntimePermission( OUSTR("ROOT") ), !invert );
233*b1cdbd2cSJim Jagielski     CHECK( ac.checkSocketPermission( OUSTR("localhost:1023"), OUSTR("accept") ), !invert );
234*b1cdbd2cSJim Jagielski     CHECK( ac.checkSocketPermission( OUSTR("localhost:123-"), OUSTR("accept") ), !invert );
235*b1cdbd2cSJim Jagielski     CHECK( ac.checkSocketPermission( localhost(OUSTR(":-1023")), OUSTR("accept") ), !invert );
236*b1cdbd2cSJim Jagielski     CHECK( ac.checkSocketPermission( OUSTR("localhost:-1023"), OUSTR("accept,resolve") ), !invert );
237*b1cdbd2cSJim Jagielski     CHECK( ac.checkSocketPermission( OUSTR("sun.com:1024-"), OUSTR("resolve") ), !invert );
238*b1cdbd2cSJim Jagielski }
239*b1cdbd2cSJim Jagielski 
240*b1cdbd2cSJim Jagielski /*
241*b1cdbd2cSJim Jagielski grant user "dbo"
242*b1cdbd2cSJim Jagielski {
243*b1cdbd2cSJim Jagielski permission com.sun.star.io.FilePermission "file:///home/dbo/-", "read,write";
244*b1cdbd2cSJim Jagielski permission com.sun.star.io.FilePermission "-", "read,write";
245*b1cdbd2cSJim Jagielski permission com.sun.star.io.FilePermission "file:///usr/local/dbo/ *", "read";
246*b1cdbd2cSJim Jagielski 
247*b1cdbd2cSJim Jagielski permission com.sun.star.security.RuntimePermission "DBO";
248*b1cdbd2cSJim Jagielski 
249*b1cdbd2cSJim Jagielski permission com.sun.star.connection.SocketPermission "dbo-1:1024-", "listen";
250*b1cdbd2cSJim Jagielski permission com.sun.star.connection.SocketPermission "dbo-11081:-1023", "resolve";
251*b1cdbd2cSJim Jagielski permission com.sun.star.connection.SocketPermission "dbo-11081:18", "listen";
252*b1cdbd2cSJim Jagielski permission com.sun.star.connection.SocketPermission "dbo-11081:20-24", "listen";
253*b1cdbd2cSJim Jagielski permission com.sun.star.connection.SocketPermission "dbo-11081", "connect";
254*b1cdbd2cSJim Jagielski };
255*b1cdbd2cSJim Jagielski */
check_dbo_pos(AccessControl & ac,bool invert=false)256*b1cdbd2cSJim Jagielski static void check_dbo_pos( AccessControl & ac, bool invert = false )
257*b1cdbd2cSJim Jagielski {
258*b1cdbd2cSJim Jagielski     check_defaults_pos( ac, invert );
259*b1cdbd2cSJim Jagielski     // positive tests
260*b1cdbd2cSJim Jagielski     CHECK( ac.checkFilePermission( OUSTR("file:///home/dbo/bla"), OUSTR("read") ), invert );
261*b1cdbd2cSJim Jagielski     CHECK( ac.checkFilePermission( OUSTR("file:///home/dbo/bla"), OUSTR("write") ), invert );
262*b1cdbd2cSJim Jagielski     CHECK( ac.checkFilePermission( OUSTR("file:///home/dbo/bla"), OUSTR("read,write") ), invert );
263*b1cdbd2cSJim Jagielski     CHECK( ac.checkFilePermission( OUSTR("file:///home/dbo/path/bla"), OUSTR("read,write") ), invert );
264*b1cdbd2cSJim Jagielski     CHECK( ac.checkFilePermission( OUSTR("file:///home/dbo/path/path/bla"), OUSTR("read,write") ), invert );
265*b1cdbd2cSJim Jagielski     CHECK( ac.checkFilePermission( OUSTR("file:///usr/local/dbo/*"), OUSTR("read") ), invert );
266*b1cdbd2cSJim Jagielski     CHECK( ac.checkFilePermission( OUSTR("file:///usr/local/dbo/bla"), OUSTR("read") ), invert );
267*b1cdbd2cSJim Jagielski     CHECK( ac.checkRuntimePermission( OUSTR("DBO") ), invert );
268*b1cdbd2cSJim Jagielski     CHECK( ac.checkSocketPermission( OUSTR("dbo-1:1024-"), OUSTR("listen") ), invert );
269*b1cdbd2cSJim Jagielski     CHECK( ac.checkSocketPermission( OUSTR("dbo-1:2048-3122"), OUSTR("listen") ), invert );
270*b1cdbd2cSJim Jagielski     CHECK( ac.checkSocketPermission( OUSTR("dbo-1:2048-"), OUSTR("listen") ), invert );
271*b1cdbd2cSJim Jagielski     CHECK( ac.checkSocketPermission( OUSTR("dbo-11081:-1023"), OUSTR("resolve") ), invert );
272*b1cdbd2cSJim Jagielski     CHECK( ac.checkSocketPermission( OUSTR("dbo-11081:20-1023"), OUSTR("resolve") ), invert );
273*b1cdbd2cSJim Jagielski     CHECK( ac.checkSocketPermission( OUSTR("dbo-11081:18"), OUSTR("listen") ), invert );
274*b1cdbd2cSJim Jagielski     CHECK( ac.checkSocketPermission( OUSTR("dbo-11081:20-24"), OUSTR("listen") ), invert );
275*b1cdbd2cSJim Jagielski     CHECK( ac.checkSocketPermission( OUSTR("dbo-11081:22"), OUSTR("listen") ), invert );
276*b1cdbd2cSJim Jagielski     CHECK( ac.checkSocketPermission( OUSTR("dbo-11081"), OUSTR("connect") ), invert );
277*b1cdbd2cSJim Jagielski     CHECK( ac.checkSocketPermission( OUSTR("dbo-11081:22"), OUSTR("connect") ), invert );
278*b1cdbd2cSJim Jagielski }
check_dbo_neg(AccessControl & ac,bool invert=false)279*b1cdbd2cSJim Jagielski static void check_dbo_neg( AccessControl & ac, bool invert = false )
280*b1cdbd2cSJim Jagielski {
281*b1cdbd2cSJim Jagielski     check_defaults_neg( ac, invert );
282*b1cdbd2cSJim Jagielski     // negative tests
283*b1cdbd2cSJim Jagielski     CHECK( ac.checkFilePermission( OUSTR("file:///home/-"), OUSTR("read") ), !invert );
284*b1cdbd2cSJim Jagielski     CHECK( ac.checkFilePermission( OUSTR("file:///home/jbu/bla"), OUSTR("read") ), !invert );
285*b1cdbd2cSJim Jagielski     CHECK( ac.checkFilePermission( OUSTR("file:///home/jbu/bla"), OUSTR("write") ), !invert );
286*b1cdbd2cSJim Jagielski     CHECK( ac.checkFilePermission( OUSTR("file:///home/jbu/bla"), OUSTR("read,write") ), !invert );
287*b1cdbd2cSJim Jagielski     CHECK( ac.checkFilePermission( OUSTR("file:///home/jbu/path/bla"), OUSTR("read") ), !invert );
288*b1cdbd2cSJim Jagielski     CHECK( ac.checkFilePermission( OUSTR("file:///home/dbo/path/path/bla"), OUSTR("read,execute") ), !invert );
289*b1cdbd2cSJim Jagielski     CHECK( ac.checkFilePermission( OUSTR("file:///usr/local/-"), OUSTR("read") ), !invert );
290*b1cdbd2cSJim Jagielski     CHECK( ac.checkFilePermission( OUSTR("file:///usr/local/dbo/path/bla"), OUSTR("read") ), !invert );
291*b1cdbd2cSJim Jagielski     CHECK( ac.checkFilePermission( OUSTR("file:///usr/local/dbo/path/path/bla"), OUSTR("read") ), !invert );
292*b1cdbd2cSJim Jagielski     CHECK( ac.checkRuntimePermission( OUSTR("JBU") ), !invert );
293*b1cdbd2cSJim Jagielski     CHECK( ac.checkSocketPermission( OUSTR("dbo-11081"), OUSTR("listen") ), !invert );
294*b1cdbd2cSJim Jagielski     CHECK( ac.checkSocketPermission( OUSTR("dbo-11081:22"), OUSTR("accept") ), !invert );
295*b1cdbd2cSJim Jagielski     CHECK( ac.checkSocketPermission( OUSTR("jbu-11096:22"), OUSTR("resolve") ), !invert );
296*b1cdbd2cSJim Jagielski }
297*b1cdbd2cSJim Jagielski 
298*b1cdbd2cSJim Jagielski /*
299*b1cdbd2cSJim Jagielski grant user "jbu"
300*b1cdbd2cSJim Jagielski {
301*b1cdbd2cSJim Jagielski permission com.sun.star.io.FilePermission  "file:///home/jbu/-", "read,write";
302*b1cdbd2cSJim Jagielski permission com.sun.star.io.FilePermission "*", "read,write";
303*b1cdbd2cSJim Jagielski 
304*b1cdbd2cSJim Jagielski permission com.sun.star.security.RuntimePermission "JBU";
305*b1cdbd2cSJim Jagielski 
306*b1cdbd2cSJim Jagielski permission com.sun.star.connection.SocketPermission "jbu-11096","resolve";
307*b1cdbd2cSJim Jagielski };
308*b1cdbd2cSJim Jagielski */
check_jbu_pos(AccessControl & ac,bool invert=false)309*b1cdbd2cSJim Jagielski static void check_jbu_pos( AccessControl & ac, bool invert = false )
310*b1cdbd2cSJim Jagielski {
311*b1cdbd2cSJim Jagielski     check_defaults_pos( ac, invert );
312*b1cdbd2cSJim Jagielski     // positive tests
313*b1cdbd2cSJim Jagielski     CHECK( ac.checkFilePermission( OUSTR("file:///home/jbu/bla"), OUSTR("read") ), invert );
314*b1cdbd2cSJim Jagielski     CHECK( ac.checkFilePermission( OUSTR("file:///home/jbu/bla"), OUSTR("write") ), invert );
315*b1cdbd2cSJim Jagielski     CHECK( ac.checkFilePermission( OUSTR("file:///home/jbu/bla"), OUSTR("read,write") ), invert );
316*b1cdbd2cSJim Jagielski     CHECK( ac.checkFilePermission( OUSTR("file:///home/jbu/path/bla"), OUSTR("read,write") ), invert );
317*b1cdbd2cSJim Jagielski     CHECK( ac.checkFilePermission( OUSTR("file:///home/jbu/path/path/bla"), OUSTR("read,write") ), invert );
318*b1cdbd2cSJim Jagielski     CHECK( ac.checkRuntimePermission( OUSTR("JBU") ), invert );
319*b1cdbd2cSJim Jagielski     CHECK( ac.checkSocketPermission( OUSTR("jbu-11096"), OUSTR("resolve") ), invert );
320*b1cdbd2cSJim Jagielski     CHECK( ac.checkSocketPermission( OUSTR("jbu-11096:20-24"), OUSTR("resolve") ), invert );
321*b1cdbd2cSJim Jagielski     CHECK( ac.checkSocketPermission( OUSTR("dbo-11081.germany.sun.com:2048"), OUSTR("resolve") ), invert );
322*b1cdbd2cSJim Jagielski }
check_jbu_neg(AccessControl & ac,bool invert=false)323*b1cdbd2cSJim Jagielski static void check_jbu_neg( AccessControl & ac, bool invert = false )
324*b1cdbd2cSJim Jagielski {
325*b1cdbd2cSJim Jagielski     check_defaults_neg( ac, invert );
326*b1cdbd2cSJim Jagielski     // negative tests
327*b1cdbd2cSJim Jagielski     CHECK( ac.checkFilePermission( OUSTR("file:///home/-"), OUSTR("read") ), !invert );
328*b1cdbd2cSJim Jagielski     CHECK( ac.checkFilePermission( OUSTR("file:///home/dbo/path/bla"), OUSTR("read") ), !invert );
329*b1cdbd2cSJim Jagielski     CHECK( ac.checkFilePermission( OUSTR("file:///home/dbo/path/path/bla"), OUSTR("read") ), !invert );
330*b1cdbd2cSJim Jagielski     CHECK( ac.checkFilePermission( OUSTR("file:///home/dbo/bla"), OUSTR("read") ), !invert );
331*b1cdbd2cSJim Jagielski     CHECK( ac.checkFilePermission( OUSTR("file:///home/dbo/bla"), OUSTR("write") ), !invert );
332*b1cdbd2cSJim Jagielski     CHECK( ac.checkFilePermission( OUSTR("file:///home/dbo/bla"), OUSTR("read,write") ), !invert );
333*b1cdbd2cSJim Jagielski     CHECK( ac.checkFilePermission( OUSTR("file:///usr/local/-"), OUSTR("read") ), !invert );
334*b1cdbd2cSJim Jagielski     CHECK( ac.checkFilePermission( OUSTR("file:///usr/local/dbo/bla"), OUSTR("read") ), !invert );
335*b1cdbd2cSJim Jagielski     CHECK( ac.checkFilePermission( OUSTR("file:///usr/local/dbo/path/path/bla"), OUSTR("read") ), !invert );
336*b1cdbd2cSJim Jagielski     CHECK( ac.checkRuntimePermission( OUSTR("DBO") ), !invert );
337*b1cdbd2cSJim Jagielski     CHECK( ac.checkSocketPermission( OUSTR("jbu-11096:20-24"), OUSTR("accept") ), !invert );
338*b1cdbd2cSJim Jagielski     CHECK( ac.checkSocketPermission( OUSTR("dbo-11081"), OUSTR("connect") ), !invert );
339*b1cdbd2cSJim Jagielski     CHECK( ac.checkSocketPermission( OUSTR("dbo-11081.germany.sun.com"), OUSTR("connect") ), !invert );
340*b1cdbd2cSJim Jagielski }
341*b1cdbd2cSJim Jagielski 
342*b1cdbd2cSJim Jagielski /*
343*b1cdbd2cSJim Jagielski grant principal "root"
344*b1cdbd2cSJim Jagielski {
345*b1cdbd2cSJim Jagielski permission com.sun.star.security.AllPermission;
346*b1cdbd2cSJim Jagielski };
347*b1cdbd2cSJim Jagielski */
348*b1cdbd2cSJim Jagielski //==================================================================================================
check_root_pos(AccessControl & ac,bool invert=false)349*b1cdbd2cSJim Jagielski static void check_root_pos( AccessControl & ac, bool invert = false )
350*b1cdbd2cSJim Jagielski {
351*b1cdbd2cSJim Jagielski     check_defaults_pos( ac, invert );
352*b1cdbd2cSJim Jagielski     check_defaults_neg( ac, !invert );
353*b1cdbd2cSJim Jagielski     check_dbo_pos( ac, invert );
354*b1cdbd2cSJim Jagielski     check_dbo_neg( ac, !invert );
355*b1cdbd2cSJim Jagielski     check_jbu_pos( ac, invert );
356*b1cdbd2cSJim Jagielski     check_jbu_neg( ac, !invert );
357*b1cdbd2cSJim Jagielski     // some more root positive
358*b1cdbd2cSJim Jagielski     CHECK( ac.checkFilePermission( OUSTR("file:///etc/blabla"), OUSTR("read,write,execute") ), invert );
359*b1cdbd2cSJim Jagielski     CHECK( ac.checkFilePermission( OUSTR("file:///home/root"), OUSTR("read,write,execute") ), invert );
360*b1cdbd2cSJim Jagielski     CHECK( ac.checkFilePermission( OUSTR("file:///root"), OUSTR("read,write,execute") ), invert );
361*b1cdbd2cSJim Jagielski     CHECK( ac.checkRuntimePermission( OUSTR("ROOT") ), invert );
362*b1cdbd2cSJim Jagielski }
363*b1cdbd2cSJim Jagielski 
364*b1cdbd2cSJim Jagielski //==================================================================================================
365*b1cdbd2cSJim Jagielski class acc_Restr
366*b1cdbd2cSJim Jagielski     : public WeakImplHelper1< security::XAccessControlContext >
367*b1cdbd2cSJim Jagielski {
368*b1cdbd2cSJim Jagielski     Any m_perm;
369*b1cdbd2cSJim Jagielski 
370*b1cdbd2cSJim Jagielski public:
371*b1cdbd2cSJim Jagielski     inline acc_Restr( Any const & perm = Any() ) SAL_THROW( () )
372*b1cdbd2cSJim Jagielski         : m_perm( perm )
373*b1cdbd2cSJim Jagielski         {}
374*b1cdbd2cSJim Jagielski 
375*b1cdbd2cSJim Jagielski     // XAccessControlContext impl
376*b1cdbd2cSJim Jagielski     virtual void SAL_CALL checkPermission( Any const & perm )
377*b1cdbd2cSJim Jagielski         throw (RuntimeException);
378*b1cdbd2cSJim Jagielski };
379*b1cdbd2cSJim Jagielski //__________________________________________________________________________________________________
checkPermission(Any const & perm)380*b1cdbd2cSJim Jagielski void acc_Restr::checkPermission( Any const & perm )
381*b1cdbd2cSJim Jagielski     throw (RuntimeException)
382*b1cdbd2cSJim Jagielski {
383*b1cdbd2cSJim Jagielski     if (perm != m_perm)
384*b1cdbd2cSJim Jagielski     {
385*b1cdbd2cSJim Jagielski         throw security::AccessControlException(
386*b1cdbd2cSJim Jagielski             OUSTR("dyn violation!"), Reference< XInterface >(), perm );
387*b1cdbd2cSJim Jagielski     }
388*b1cdbd2cSJim Jagielski }
389*b1cdbd2cSJim Jagielski 
390*b1cdbd2cSJim Jagielski typedef void (* t_action)( AccessControl &, Any const & arg );
391*b1cdbd2cSJim Jagielski 
392*b1cdbd2cSJim Jagielski //==================================================================================================
393*b1cdbd2cSJim Jagielski class Action
394*b1cdbd2cSJim Jagielski     : public WeakImplHelper1< security::XAction >
395*b1cdbd2cSJim Jagielski {
396*b1cdbd2cSJim Jagielski     t_action m_action;
397*b1cdbd2cSJim Jagielski     AccessControl & m_ac;
398*b1cdbd2cSJim Jagielski     Any m_arg;
399*b1cdbd2cSJim Jagielski 
400*b1cdbd2cSJim Jagielski public:
Action(t_action action,AccessControl & ac,Any const & arg=Any ())401*b1cdbd2cSJim Jagielski     inline Action( t_action action, AccessControl & ac, Any const & arg = Any() ) SAL_THROW( () )
402*b1cdbd2cSJim Jagielski         : m_action( action )
403*b1cdbd2cSJim Jagielski         , m_ac( ac )
404*b1cdbd2cSJim Jagielski         , m_arg( arg )
405*b1cdbd2cSJim Jagielski         {}
406*b1cdbd2cSJim Jagielski 
407*b1cdbd2cSJim Jagielski     // XAction impl
408*b1cdbd2cSJim Jagielski     virtual Any SAL_CALL run()
409*b1cdbd2cSJim Jagielski         throw (Exception);
410*b1cdbd2cSJim Jagielski };
411*b1cdbd2cSJim Jagielski //__________________________________________________________________________________________________
run()412*b1cdbd2cSJim Jagielski Any Action::run()
413*b1cdbd2cSJim Jagielski     throw (Exception)
414*b1cdbd2cSJim Jagielski {
415*b1cdbd2cSJim Jagielski     (*m_action)( m_ac, m_arg );
416*b1cdbd2cSJim Jagielski     return Any();
417*b1cdbd2cSJim Jagielski }
418*b1cdbd2cSJim Jagielski 
419*b1cdbd2cSJim Jagielski //==================================================================================================
420*b1cdbd2cSJim Jagielski // static void restr_file_permissions( AccessControl & ac )
421*b1cdbd2cSJim Jagielski // {
422*b1cdbd2cSJim Jagielski //     // running in dbo's domain
423*b1cdbd2cSJim Jagielski //     /* permission com.sun.star.io.FilePermission "file:///home/dbo/-", ",,read , write "; */
424*b1cdbd2cSJim Jagielski //     CHECK( ac.checkFilePermission( OUSTR("file:///home/dbo/bla"), OUSTR("read,write,execute") ), true );
425*b1cdbd2cSJim Jagielski //     CHECK( ac.checkFilePermission( OUSTR("file:///home/dbo/bla"), OUSTR("read,write") ), false );
426*b1cdbd2cSJim Jagielski // }
427*b1cdbd2cSJim Jagielski //==================================================================================================
all_dbo_permissions(AccessControl & ac,Any const &)428*b1cdbd2cSJim Jagielski static void all_dbo_permissions( AccessControl & ac, Any const & )
429*b1cdbd2cSJim Jagielski {
430*b1cdbd2cSJim Jagielski     check_dbo_pos( ac );
431*b1cdbd2cSJim Jagielski     check_dbo_neg( ac );
432*b1cdbd2cSJim Jagielski }
433*b1cdbd2cSJim Jagielski //==================================================================================================
no_permissions(AccessControl & ac,Any const & arg)434*b1cdbd2cSJim Jagielski static void no_permissions( AccessControl & ac, Any const & arg )
435*b1cdbd2cSJim Jagielski {
436*b1cdbd2cSJim Jagielski     check_dbo_pos( ac, true );
437*b1cdbd2cSJim Jagielski     check_dbo_neg( ac );
438*b1cdbd2cSJim Jagielski     // set privs to old dbo restr
439*b1cdbd2cSJim Jagielski     Reference< security::XAccessControlContext > xContext;
440*b1cdbd2cSJim Jagielski     OSL_VERIFY( arg >>= xContext );
441*b1cdbd2cSJim Jagielski     ac->doPrivileged(
442*b1cdbd2cSJim Jagielski         new Action( all_dbo_permissions, ac ),
443*b1cdbd2cSJim Jagielski         xContext );
444*b1cdbd2cSJim Jagielski }
445*b1cdbd2cSJim Jagielski //==================================================================================================
check_dbo_dynamic(AccessControl & ac)446*b1cdbd2cSJim Jagielski static void check_dbo_dynamic( AccessControl & ac )
447*b1cdbd2cSJim Jagielski {
448*b1cdbd2cSJim Jagielski     Any arg( makeAny( ac->getContext() ) );
449*b1cdbd2cSJim Jagielski     ac->doRestricted(
450*b1cdbd2cSJim Jagielski         new Action( no_permissions, ac, arg ),
451*b1cdbd2cSJim Jagielski         new acc_Restr() );
452*b1cdbd2cSJim Jagielski }
453*b1cdbd2cSJim Jagielski 
SAL_IMPLEMENT_MAIN()454*b1cdbd2cSJim Jagielski SAL_IMPLEMENT_MAIN()
455*b1cdbd2cSJim Jagielski {
456*b1cdbd2cSJim Jagielski     try
457*b1cdbd2cSJim Jagielski     {
458*b1cdbd2cSJim Jagielski         // single-user test
459*b1cdbd2cSJim Jagielski         Reference< XComponentContext > xContext( defaultBootstrap_InitialComponentContext(
460*b1cdbd2cSJim Jagielski             OUSTR("../../test/security/test_security_singleuser.ini") ) );
461*b1cdbd2cSJim Jagielski         {
462*b1cdbd2cSJim Jagielski         ::fprintf( stderr, "[security test] single-user checking dbo..." );
463*b1cdbd2cSJim Jagielski         AccessControl ac( xContext );
464*b1cdbd2cSJim Jagielski         check_dbo_pos( ac );
465*b1cdbd2cSJim Jagielski         check_dbo_neg( ac );
466*b1cdbd2cSJim Jagielski         check_dbo_dynamic( ac );
467*b1cdbd2cSJim Jagielski         ::fprintf( stderr, "dbo checked.\n" );
468*b1cdbd2cSJim Jagielski         }
469*b1cdbd2cSJim Jagielski 
470*b1cdbd2cSJim Jagielski         // multi-user test
471*b1cdbd2cSJim Jagielski         dispose( xContext );
472*b1cdbd2cSJim Jagielski         xContext = defaultBootstrap_InitialComponentContext(
473*b1cdbd2cSJim Jagielski             OUSTR("../../test/security/test_security.ini") ); // UNO_AC=on
474*b1cdbd2cSJim Jagielski         AccessControl ac( xContext );
475*b1cdbd2cSJim Jagielski 
476*b1cdbd2cSJim Jagielski         {
477*b1cdbd2cSJim Jagielski         // set up dbo current context
478*b1cdbd2cSJim Jagielski         ContextLayer layer( new user_CurrentContext( getCurrentContext(), OUSTR("dbo") ) );
479*b1cdbd2cSJim Jagielski         ::fprintf( stderr, "[security test] multi-user checking dbo..." );
480*b1cdbd2cSJim Jagielski         check_dbo_pos( ac );
481*b1cdbd2cSJim Jagielski         check_dbo_neg( ac );
482*b1cdbd2cSJim Jagielski         check_dbo_dynamic( ac );
483*b1cdbd2cSJim Jagielski         ::fprintf( stderr, "dbo checked.\n" );
484*b1cdbd2cSJim Jagielski         }
485*b1cdbd2cSJim Jagielski         {
486*b1cdbd2cSJim Jagielski         // set up jbu current context
487*b1cdbd2cSJim Jagielski         ContextLayer layer( new user_CurrentContext( getCurrentContext(), OUSTR("jbu") ) );
488*b1cdbd2cSJim Jagielski         ::fprintf( stderr, "[security test] multi-user checking jbu..." );
489*b1cdbd2cSJim Jagielski         check_jbu_pos( ac );
490*b1cdbd2cSJim Jagielski         check_jbu_neg( ac );
491*b1cdbd2cSJim Jagielski         ::fprintf( stderr, "jbu checked.\n" );
492*b1cdbd2cSJim Jagielski         }
493*b1cdbd2cSJim Jagielski         {
494*b1cdbd2cSJim Jagielski         // set up root current context
495*b1cdbd2cSJim Jagielski         ContextLayer layer( new user_CurrentContext( getCurrentContext(), OUSTR("root") ) );
496*b1cdbd2cSJim Jagielski         ::fprintf( stderr, "[security test] multi-user checking root..." );
497*b1cdbd2cSJim Jagielski         check_root_pos( ac );
498*b1cdbd2cSJim Jagielski         ::fprintf( stderr, "root checked.\n" );
499*b1cdbd2cSJim Jagielski         }
500*b1cdbd2cSJim Jagielski         {
501*b1cdbd2cSJim Jagielski         // set up unknown guest user current context => default permissions
502*b1cdbd2cSJim Jagielski         ContextLayer layer( new user_CurrentContext( getCurrentContext(), OUSTR("guest") ) );
503*b1cdbd2cSJim Jagielski         ::fprintf( stderr, "[security test] multi-user checking guest..." );
504*b1cdbd2cSJim Jagielski         check_defaults_pos( ac );
505*b1cdbd2cSJim Jagielski         check_defaults_neg( ac );
506*b1cdbd2cSJim Jagielski         ::fprintf( stderr, "guest checked.\n" );
507*b1cdbd2cSJim Jagielski         }
508*b1cdbd2cSJim Jagielski 
509*b1cdbd2cSJim Jagielski         dispose( xContext );
510*b1cdbd2cSJim Jagielski         ::fprintf( stderr, "security test succeeded.\n" );
511*b1cdbd2cSJim Jagielski         return 0;
512*b1cdbd2cSJim Jagielski     }
513*b1cdbd2cSJim Jagielski     catch (Exception & exc)
514*b1cdbd2cSJim Jagielski     {
515*b1cdbd2cSJim Jagielski         OString str( OUStringToOString( exc.Message, RTL_TEXTENCODING_ASCII_US ) );
516*b1cdbd2cSJim Jagielski         ::fprintf( stderr, "[security test] error: %s!\n", str.getStr() );
517*b1cdbd2cSJim Jagielski         return 1;
518*b1cdbd2cSJim Jagielski     }
519*b1cdbd2cSJim Jagielski }
520