Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 :
21 : #include <vector>
22 :
23 : #include <osl/process.h>
24 : #include <osl/socket.hxx>
25 : #include <osl/mutex.hxx>
26 :
27 : #include <rtl/string.hxx>
28 : #include <rtl/ustrbuf.hxx>
29 :
30 : #include <com/sun/star/security/RuntimePermission.hpp>
31 : #include <com/sun/star/security/AllPermission.hpp>
32 : #include <com/sun/star/io/FilePermission.hpp>
33 : #include <com/sun/star/connection/SocketPermission.hpp>
34 : #include <com/sun/star/security/AccessControlException.hpp>
35 :
36 : #include "permissions.h"
37 :
38 : #define OUSTR(x) ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM(x) )
39 :
40 :
41 : using namespace ::std;
42 : using namespace ::osl;
43 : using namespace ::com::sun::star;
44 : using namespace ::com::sun::star::uno;
45 : using ::rtl::OUString;
46 : using ::rtl::OUStringBuffer;
47 :
48 : namespace stoc_sec
49 : {
50 :
51 : //--------------------------------------------------------------------------------------------------
52 0 : static inline sal_Int32 makeMask(
53 : OUString const & items, char const * const * strings ) SAL_THROW(())
54 : {
55 0 : sal_Int32 mask = 0;
56 :
57 0 : sal_Int32 n = 0;
58 0 : do
59 : {
60 0 : OUString item( items.getToken( 0, ',', n ).trim() );
61 0 : if ( item.isEmpty())
62 0 : continue;
63 0 : sal_Int32 nPos = 0;
64 0 : while (strings[ nPos ])
65 : {
66 0 : if (item.equalsAscii( strings[ nPos ] ))
67 : {
68 0 : mask |= (0x80000000 >> nPos);
69 0 : break;
70 : }
71 0 : ++nPos;
72 0 : }
73 : #if OSL_DEBUG_LEVEL > 0
74 : if (! strings[ nPos ])
75 : {
76 : OUStringBuffer buf( 48 );
77 : buf.appendAscii( RTL_CONSTASCII_STRINGPARAM("### ignoring unknown socket action: ") );
78 : buf.append( item );
79 : ::rtl::OString str( ::rtl::OUStringToOString(
80 : buf.makeStringAndClear(), RTL_TEXTENCODING_ASCII_US ) );
81 : OSL_TRACE( "%s", str.getStr() );
82 : }
83 : #endif
84 : }
85 : while (n >= 0); // all items
86 0 : return mask;
87 : }
88 : //--------------------------------------------------------------------------------------------------
89 0 : static inline OUString makeStrings(
90 : sal_Int32 mask, char const * const * strings ) SAL_THROW(())
91 : {
92 0 : OUStringBuffer buf( 48 );
93 0 : while (mask)
94 : {
95 0 : if (0x80000000 & mask)
96 : {
97 0 : buf.appendAscii( *strings );
98 0 : if (mask << 1) // more items following
99 0 : buf.append( (sal_Unicode)',' );
100 : }
101 0 : mask = (mask << 1);
102 0 : ++strings;
103 : }
104 0 : return buf.makeStringAndClear();
105 : }
106 :
107 : //##################################################################################################
108 :
109 : //==================================================================================================
110 0 : class SocketPermission : public Permission
111 : {
112 : static char const * s_actions [];
113 : sal_Int32 m_actions;
114 :
115 : OUString m_host;
116 : sal_Int32 m_lowerPort;
117 : sal_Int32 m_upperPort;
118 : mutable OUString m_ip;
119 : mutable bool m_resolveErr;
120 : mutable bool m_resolvedHost;
121 : bool m_wildCardHost;
122 :
123 : inline bool resolveHost() const SAL_THROW(());
124 :
125 : public:
126 : SocketPermission(
127 : connection::SocketPermission const & perm,
128 : ::rtl::Reference< Permission > const & next = ::rtl::Reference< Permission >() )
129 : SAL_THROW(());
130 : virtual bool implies( Permission const & perm ) const SAL_THROW(());
131 : virtual OUString toString() const SAL_THROW(());
132 : };
133 : //__________________________________________________________________________________________________
134 : char const * SocketPermission::s_actions [] = { "accept", "connect", "listen", "resolve", 0 };
135 : //__________________________________________________________________________________________________
136 0 : SocketPermission::SocketPermission(
137 : connection::SocketPermission const & perm,
138 : ::rtl::Reference< Permission > const & next )
139 : SAL_THROW(())
140 : : Permission( SOCKET, next )
141 0 : , m_actions( makeMask( perm.Actions, s_actions ) )
142 : , m_host( perm.Host )
143 : , m_lowerPort( 0 )
144 : , m_upperPort( 65535 )
145 : , m_resolveErr( false )
146 : , m_resolvedHost( false )
147 0 : , m_wildCardHost( !perm.Host.isEmpty() && '*' == perm.Host.pData->buffer[ 0 ] )
148 : {
149 0 : if (0xe0000000 & m_actions) // if any (except resolve) is given => resolve implied
150 0 : m_actions |= 0x10000000;
151 :
152 : // separate host from portrange
153 0 : sal_Int32 colon = m_host.indexOf( ':' );
154 0 : if (colon >= 0) // port [range] given
155 : {
156 0 : sal_Int32 minus = m_host.indexOf( '-', colon +1 );
157 0 : if (minus < 0)
158 : {
159 0 : m_lowerPort = m_upperPort = m_host.copy( colon +1 ).toInt32();
160 : }
161 0 : else if (minus == (colon +1)) // -N
162 : {
163 0 : m_upperPort = m_host.copy( minus +1 ).toInt32();
164 : }
165 0 : else if (minus == (m_host.getLength() -1)) // N-
166 : {
167 0 : m_lowerPort = m_host.copy( colon +1, m_host.getLength() -1 -colon -1 ).toInt32();
168 : }
169 : else // A-B
170 : {
171 0 : m_lowerPort = m_host.copy( colon +1, minus - colon -1 ).toInt32();
172 0 : m_upperPort = m_host.copy( minus +1, m_host.getLength() -minus -1 ).toInt32();
173 : }
174 0 : m_host = m_host.copy( 0, colon );
175 : }
176 0 : }
177 : //__________________________________________________________________________________________________
178 0 : inline bool SocketPermission::resolveHost() const SAL_THROW(())
179 : {
180 0 : if (m_resolveErr)
181 0 : return false;
182 :
183 0 : if (! m_resolvedHost)
184 : {
185 : // dns lookup
186 0 : SocketAddr addr;
187 0 : SocketAddr::resolveHostname( m_host, addr );
188 0 : OUString ip;
189 : m_resolveErr = (::osl_Socket_Ok != ::osl_getDottedInetAddrOfSocketAddr(
190 0 : addr.getHandle(), &ip.pData ));
191 0 : if (m_resolveErr)
192 0 : return false;
193 :
194 0 : MutexGuard guard( Mutex::getGlobalMutex() );
195 0 : if (! m_resolvedHost)
196 : {
197 0 : m_ip = ip;
198 0 : m_resolvedHost = true;
199 0 : }
200 : }
201 0 : return m_resolvedHost;
202 : }
203 : //__________________________________________________________________________________________________
204 0 : bool SocketPermission::implies( Permission const & perm ) const SAL_THROW(())
205 : {
206 : // check type
207 0 : if (SOCKET != perm.m_type)
208 0 : return false;
209 0 : SocketPermission const & demanded = static_cast< SocketPermission const & >( perm );
210 :
211 : // check actions
212 0 : if ((m_actions & demanded.m_actions) != demanded.m_actions)
213 0 : return false;
214 :
215 : // check ports
216 0 : if (demanded.m_lowerPort < m_lowerPort)
217 0 : return false;
218 0 : if (demanded.m_upperPort > m_upperPort)
219 0 : return false;
220 :
221 : // quick check host (DNS names: RFC 1034/1035)
222 0 : if (m_host.equalsIgnoreAsciiCase( demanded.m_host ))
223 0 : return true;
224 : // check for host wildcards
225 0 : if (m_wildCardHost)
226 : {
227 0 : OUString const & demanded_host = demanded.m_host;
228 0 : if (demanded_host.getLength() <= m_host.getLength())
229 0 : return false;
230 0 : sal_Int32 len = m_host.getLength() -1; // skip star
231 : return (0 == ::rtl_ustr_compareIgnoreAsciiCase_WithLength(
232 0 : demanded_host.getStr() + demanded_host.getLength() - len, len,
233 0 : m_host.pData->buffer + 1, len ));
234 : }
235 0 : if (demanded.m_wildCardHost)
236 0 : return false;
237 :
238 : // compare IP addresses
239 0 : if (! resolveHost())
240 0 : return false;
241 0 : if (! demanded.resolveHost())
242 0 : return false;
243 0 : return (sal_False != m_ip.equals( demanded.m_ip ));
244 : }
245 : //__________________________________________________________________________________________________
246 0 : OUString SocketPermission::toString() const SAL_THROW(())
247 : {
248 0 : OUStringBuffer buf( 48 );
249 : // host
250 : buf.appendAscii(
251 0 : RTL_CONSTASCII_STRINGPARAM("com.sun.star.connection.SocketPermission (host=\"") );
252 0 : buf.append( m_host );
253 0 : if (m_resolvedHost)
254 : {
255 0 : buf.append( (sal_Unicode)'[' );
256 0 : buf.append( m_ip );
257 0 : buf.append( (sal_Unicode)']' );
258 : }
259 : // port
260 0 : if (0 != m_lowerPort || 65535 != m_upperPort)
261 : {
262 0 : buf.append( (sal_Unicode)':' );
263 0 : if (m_lowerPort > 0)
264 0 : buf.append( m_lowerPort );
265 0 : if (m_upperPort > m_lowerPort)
266 : {
267 0 : buf.append( (sal_Unicode)'-' );
268 0 : if (m_upperPort < 65535)
269 0 : buf.append( m_upperPort );
270 : }
271 : }
272 : // actions
273 0 : buf.appendAscii( RTL_CONSTASCII_STRINGPARAM("\", actions=\"") );
274 0 : buf.append( makeStrings( m_actions, s_actions ) );
275 0 : buf.appendAscii( RTL_CONSTASCII_STRINGPARAM("\")") );
276 0 : return buf.makeStringAndClear();
277 : }
278 :
279 : //##################################################################################################
280 :
281 : //==================================================================================================
282 0 : class FilePermission : public Permission
283 : {
284 : static char const * s_actions [];
285 : sal_Int32 m_actions;
286 :
287 : OUString m_url;
288 : bool m_allFiles;
289 :
290 : public:
291 : FilePermission(
292 : io::FilePermission const & perm,
293 : ::rtl::Reference< Permission > const & next = ::rtl::Reference< Permission >() )
294 : SAL_THROW(());
295 : virtual bool implies( Permission const & perm ) const SAL_THROW(());
296 : virtual OUString toString() const SAL_THROW(());
297 : };
298 : //__________________________________________________________________________________________________
299 : char const * FilePermission::s_actions [] = { "read", "write", "execute", "delete", 0 };
300 : //--------------------------------------------------------------------------------------------------
301 0 : static OUString const & getWorkingDir() SAL_THROW(())
302 : {
303 : static OUString * s_workingDir = 0;
304 0 : if (! s_workingDir)
305 : {
306 0 : OUString workingDir;
307 0 : ::osl_getProcessWorkingDir( &workingDir.pData );
308 :
309 0 : MutexGuard guard( Mutex::getGlobalMutex() );
310 0 : if (! s_workingDir)
311 : {
312 0 : static OUString s_dir( workingDir );
313 0 : s_workingDir = &s_dir;
314 0 : }
315 : }
316 0 : return *s_workingDir;
317 : }
318 : //__________________________________________________________________________________________________
319 0 : FilePermission::FilePermission(
320 : io::FilePermission const & perm,
321 : ::rtl::Reference< Permission > const & next )
322 : SAL_THROW(())
323 : : Permission( FILE, next )
324 0 : , m_actions( makeMask( perm.Actions, s_actions ) )
325 : , m_url( perm.URL )
326 0 : , m_allFiles( sal_False != perm.URL.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("<<ALL FILES>>")) )
327 : {
328 0 : if (! m_allFiles)
329 : {
330 0 : if ( m_url == "*" )
331 : {
332 0 : OUStringBuffer buf( 64 );
333 0 : buf.append( getWorkingDir() );
334 0 : buf.appendAscii( RTL_CONSTASCII_STRINGPARAM("/*") );
335 0 : m_url = buf.makeStringAndClear();
336 : }
337 0 : else if ( m_url == "-" )
338 : {
339 0 : OUStringBuffer buf( 64 );
340 0 : buf.append( getWorkingDir() );
341 0 : buf.appendAscii( RTL_CONSTASCII_STRINGPARAM("/-") );
342 0 : m_url = buf.makeStringAndClear();
343 : }
344 0 : else if (0 != m_url.compareToAscii( RTL_CONSTASCII_STRINGPARAM("file:///") ))
345 : {
346 : // relative path
347 0 : OUString out;
348 : oslFileError rc = ::osl_getAbsoluteFileURL(
349 0 : getWorkingDir().pData, perm.URL.pData, &out.pData );
350 0 : m_url = (osl_File_E_None == rc ? out : perm.URL); // fallback
351 : }
352 : #ifdef SAL_W32
353 : // correct win drive letters
354 : if (9 < m_url.getLength() && '|' == m_url[ 9 ]) // file:///X|
355 : {
356 : static OUString s_colon = OUSTR(":");
357 : // common case in API is a ':' (sal), so convert '|' to ':'
358 : m_url = m_url.replaceAt( 9, 1, s_colon );
359 : }
360 : #endif
361 : }
362 0 : }
363 : //__________________________________________________________________________________________________
364 0 : bool FilePermission::implies( Permission const & perm ) const SAL_THROW(())
365 : {
366 : // check type
367 0 : if (FILE != perm.m_type)
368 0 : return false;
369 0 : FilePermission const & demanded = static_cast< FilePermission const & >( perm );
370 :
371 : // check actions
372 0 : if ((m_actions & demanded.m_actions) != demanded.m_actions)
373 0 : return false;
374 :
375 : // check url
376 0 : if (m_allFiles)
377 0 : return true;
378 0 : if (demanded.m_allFiles)
379 0 : return false;
380 :
381 : #ifdef SAL_W32
382 : if (m_url.equalsIgnoreAsciiCase( demanded.m_url ))
383 : return true;
384 : #else
385 0 : if (m_url.equals( demanded.m_url ))
386 0 : return true;
387 : #endif
388 0 : if (m_url.getLength() > demanded.m_url.getLength())
389 0 : return false;
390 : // check /- wildcard: all files and recursive in that path
391 0 : if (1 < m_url.getLength() &&
392 0 : 0 == ::rtl_ustr_ascii_compare_WithLength( m_url.getStr() + m_url.getLength() - 2, 2, "/-" ))
393 : {
394 : // demanded url must start with granted path (including path trailing path sep)
395 0 : sal_Int32 len = m_url.getLength() -1;
396 : #ifdef SAL_W32
397 : return (0 == ::rtl_ustr_compareIgnoreAsciiCase_WithLength(
398 : demanded.m_url.pData->buffer, len, m_url.pData->buffer, len ));
399 : #else
400 : return (0 == ::rtl_ustr_reverseCompare_WithLength(
401 0 : demanded.m_url.pData->buffer, len, m_url.pData->buffer, len ));
402 : #endif
403 : }
404 : // check /* wildcard: all files in that path (not recursive!)
405 0 : if (1 < m_url.getLength() &&
406 0 : 0 == ::rtl_ustr_ascii_compare_WithLength( m_url.getStr() + m_url.getLength() - 2, 2, "/*" ))
407 : {
408 : // demanded url must start with granted path (including path trailing path sep)
409 0 : sal_Int32 len = m_url.getLength() -1;
410 : #ifdef SAL_W32
411 : return ((0 == ::rtl_ustr_compareIgnoreAsciiCase_WithLength(
412 : demanded.m_url.pData->buffer, len, m_url.pData->buffer, len )) &&
413 : (0 > demanded.m_url.indexOf( '/', len ))); // in addition, no deeper paths
414 : #else
415 : return ((0 == ::rtl_ustr_reverseCompare_WithLength(
416 0 : demanded.m_url.pData->buffer, len, m_url.pData->buffer, len )) &&
417 0 : (0 > demanded.m_url.indexOf( '/', len ))); // in addition, no deeper paths
418 : #endif
419 : }
420 0 : return false;
421 : }
422 : //__________________________________________________________________________________________________
423 0 : OUString FilePermission::toString() const SAL_THROW(())
424 : {
425 0 : OUStringBuffer buf( 48 );
426 : // url
427 0 : buf.appendAscii( RTL_CONSTASCII_STRINGPARAM("com.sun.star.io.FilePermission (url=\"") );
428 0 : buf.append( m_url );
429 : // actions
430 0 : buf.appendAscii( RTL_CONSTASCII_STRINGPARAM("\", actions=\"") );
431 0 : buf.append( makeStrings( m_actions, s_actions ) );
432 0 : buf.appendAscii( RTL_CONSTASCII_STRINGPARAM("\")") );
433 0 : return buf.makeStringAndClear();
434 : }
435 :
436 : //##################################################################################################
437 :
438 : //==================================================================================================
439 0 : class RuntimePermission : public Permission
440 : {
441 : OUString m_name;
442 :
443 : public:
444 0 : inline RuntimePermission(
445 : security::RuntimePermission const & perm,
446 : ::rtl::Reference< Permission > const & next = ::rtl::Reference< Permission >() )
447 : SAL_THROW(())
448 : : Permission( RUNTIME, next )
449 0 : , m_name( perm.Name )
450 0 : {}
451 : virtual bool implies( Permission const & perm ) const SAL_THROW(());
452 : virtual OUString toString() const SAL_THROW(());
453 : };
454 : //__________________________________________________________________________________________________
455 0 : bool RuntimePermission::implies( Permission const & perm ) const SAL_THROW(())
456 : {
457 : // check type
458 0 : if (RUNTIME != perm.m_type)
459 0 : return false;
460 0 : RuntimePermission const & demanded = static_cast< RuntimePermission const & >( perm );
461 :
462 : // check name
463 0 : return (sal_False != m_name.equals( demanded.m_name ));
464 : }
465 : //__________________________________________________________________________________________________
466 0 : OUString RuntimePermission::toString() const SAL_THROW(())
467 : {
468 0 : OUStringBuffer buf( 48 );
469 : buf.appendAscii(
470 0 : RTL_CONSTASCII_STRINGPARAM("com.sun.star.security.RuntimePermission (name=\"") );
471 0 : buf.append( m_name );
472 0 : buf.appendAscii( RTL_CONSTASCII_STRINGPARAM("\")") );
473 0 : return buf.makeStringAndClear();
474 : }
475 :
476 : //##################################################################################################
477 :
478 : //__________________________________________________________________________________________________
479 0 : bool AllPermission::implies( Permission const & ) const SAL_THROW(())
480 : {
481 0 : return true;
482 : }
483 : //__________________________________________________________________________________________________
484 0 : OUString AllPermission::toString() const SAL_THROW(())
485 : {
486 0 : return OUSTR("com.sun.star.security.AllPermission");
487 : }
488 :
489 : //##################################################################################################
490 :
491 : //__________________________________________________________________________________________________
492 0 : PermissionCollection::PermissionCollection(
493 : Sequence< Any > const & permissions, PermissionCollection const & addition )
494 : SAL_THROW( (RuntimeException) )
495 0 : : m_head( addition.m_head )
496 : {
497 0 : Any const * perms = permissions.getConstArray();
498 0 : for ( sal_Int32 nPos = permissions.getLength(); nPos--; )
499 : {
500 0 : Any const & perm = perms[ nPos ];
501 0 : Type const & perm_type = perm.getValueType();
502 :
503 : // supported permission types
504 0 : if (perm_type.equals( ::getCppuType( (io::FilePermission const *)0 ) ))
505 : {
506 : m_head = new FilePermission(
507 0 : *reinterpret_cast< io::FilePermission const * >( perm.pData ), m_head );
508 : }
509 0 : else if (perm_type.equals( ::getCppuType( (connection::SocketPermission const *)0 ) ))
510 : {
511 : m_head = new SocketPermission(
512 0 : *reinterpret_cast< connection::SocketPermission const * >( perm.pData ), m_head );
513 : }
514 0 : else if (perm_type.equals( ::getCppuType( (security::RuntimePermission const *)0 ) ))
515 : {
516 : m_head = new RuntimePermission(
517 0 : *reinterpret_cast< security::RuntimePermission const * >( perm.pData ), m_head );
518 : }
519 0 : else if (perm_type.equals( ::getCppuType( (security::AllPermission const *)0 ) ))
520 : {
521 0 : m_head = new AllPermission( m_head );
522 : }
523 : else
524 : {
525 0 : OUStringBuffer buf( 48 );
526 : buf.appendAscii( RTL_CONSTASCII_STRINGPARAM(
527 0 : "checking for unsupported permission type: ") );
528 0 : buf.append( perm_type.getTypeName() );
529 : throw RuntimeException(
530 0 : buf.makeStringAndClear(), Reference< XInterface >() );
531 : }
532 : }
533 0 : }
534 : #ifdef __DIAGNOSE
535 : //__________________________________________________________________________________________________
536 : Sequence< OUString > PermissionCollection::toStrings() const SAL_THROW(())
537 : {
538 : vector< OUString > strings;
539 : strings.reserve( 8 );
540 : for ( Permission * perm = m_head.get(); perm; perm = perm->m_next.get() )
541 : {
542 : strings.push_back( perm->toString() );
543 : }
544 : return Sequence< OUString >(
545 : strings.empty() ? 0 : &strings[ 0 ], strings.size() );
546 : }
547 : #endif
548 : //__________________________________________________________________________________________________
549 0 : inline static bool __implies(
550 : ::rtl::Reference< Permission > const & head, Permission const & demanded ) SAL_THROW(())
551 : {
552 0 : for ( Permission * perm = head.get(); perm; perm = perm->m_next.get() )
553 : {
554 0 : if (perm->implies( demanded ))
555 0 : return true;
556 : }
557 0 : return false;
558 : }
559 :
560 : #ifdef __DIAGNOSE
561 : //--------------------------------------------------------------------------------------------------
562 : static void demanded_diag(
563 : Permission const & perm )
564 : SAL_THROW(())
565 : {
566 : OUStringBuffer buf( 48 );
567 : buf.appendAscii( RTL_CONSTASCII_STRINGPARAM("demanding ") );
568 : buf.append( perm.toString() );
569 : buf.appendAscii( RTL_CONSTASCII_STRINGPARAM(" => ok.") );
570 : ::rtl::OString str(
571 : ::rtl::OUStringToOString( buf.makeStringAndClear(), RTL_TEXTENCODING_ASCII_US ) );
572 : OSL_TRACE( "%s", str.getStr() );
573 : }
574 : #endif
575 : //--------------------------------------------------------------------------------------------------
576 0 : static void throwAccessControlException(
577 : Permission const & perm, Any const & demanded_perm )
578 : SAL_THROW( (security::AccessControlException) )
579 : {
580 0 : OUStringBuffer buf( 48 );
581 0 : buf.appendAscii( RTL_CONSTASCII_STRINGPARAM("access denied: ") );
582 0 : buf.append( perm.toString() );
583 : throw security::AccessControlException(
584 0 : buf.makeStringAndClear(), Reference< XInterface >(), demanded_perm );
585 : }
586 : //==================================================================================================
587 0 : void PermissionCollection::checkPermission( Any const & perm ) const
588 : SAL_THROW( (RuntimeException) )
589 : {
590 0 : Type const & demanded_type = perm.getValueType();
591 :
592 : // supported permission types
593 : // stack object of SimpleReferenceObject are ok, as long as they are not
594 : // assigned to a ::rtl::Reference<> (=> delete this)
595 0 : if (demanded_type.equals( ::getCppuType( (io::FilePermission const *)0 ) ))
596 : {
597 : FilePermission demanded(
598 0 : *reinterpret_cast< io::FilePermission const * >( perm.pData ) );
599 0 : if (__implies( m_head, demanded ))
600 : {
601 : #ifdef __DIAGNOSE
602 : demanded_diag( demanded );
603 : #endif
604 : return;
605 : }
606 0 : throwAccessControlException( demanded, perm );
607 : }
608 0 : else if (demanded_type.equals( ::getCppuType( (connection::SocketPermission const *)0 ) ))
609 : {
610 : SocketPermission demanded(
611 0 : *reinterpret_cast< connection::SocketPermission const * >( perm.pData ) );
612 0 : if (__implies( m_head, demanded ))
613 : {
614 : #ifdef __DIAGNOSE
615 : demanded_diag( demanded );
616 : #endif
617 : return;
618 : }
619 0 : throwAccessControlException( demanded, perm );
620 : }
621 0 : else if (demanded_type.equals( ::getCppuType( (security::RuntimePermission const *)0 ) ))
622 : {
623 : RuntimePermission demanded(
624 0 : *reinterpret_cast< security::RuntimePermission const * >( perm.pData ) );
625 0 : if (__implies( m_head, demanded ))
626 : {
627 : #ifdef __DIAGNOSE
628 : demanded_diag( demanded );
629 : #endif
630 : return;
631 : }
632 0 : throwAccessControlException( demanded, perm );
633 : }
634 0 : else if (demanded_type.equals( ::getCppuType( (security::AllPermission const *)0 ) ))
635 : {
636 0 : AllPermission demanded;
637 0 : if (__implies( m_head, demanded ))
638 : {
639 : #ifdef __DIAGNOSE
640 : demanded_diag( demanded );
641 : #endif
642 : return;
643 : }
644 0 : throwAccessControlException( demanded, perm );
645 : }
646 : else
647 : {
648 0 : OUStringBuffer buf( 48 );
649 0 : buf.appendAscii( RTL_CONSTASCII_STRINGPARAM("checking for unsupported permission type: ") );
650 0 : buf.append( demanded_type.getTypeName() );
651 : throw RuntimeException(
652 0 : buf.makeStringAndClear(), Reference< XInterface >() );
653 : }
654 : }
655 :
656 : }
657 :
658 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|