| /************************************************************** |
| * |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| * |
| *************************************************************/ |
| |
| |
| |
| |
| #include "system.h" |
| |
| #include <osl/security.h> |
| #include <osl/diagnose.h> |
| #include <osl/module.h> |
| |
| #include "osl/thread.h" |
| #include "osl/file.h" |
| |
| #ifdef SOLARIS |
| #include <crypt.h> |
| #endif |
| |
| #include "secimpl.h" |
| |
| #ifndef PAM_BINARY_MSG |
| #define PAM_BINARY_MSG 6 |
| #endif |
| |
| extern oslModule SAL_CALL osl_psz_loadModule(const sal_Char *pszModuleName, sal_Int32 nRtldMode); |
| extern void* SAL_CALL osl_psz_getSymbol(oslModule hModule, const sal_Char* pszSymbolName); |
| extern oslSecurityError SAL_CALL |
| osl_psz_loginUser(const sal_Char* pszUserName, const sal_Char* pszPasswd, |
| oslSecurity* pSecurity); |
| sal_Bool SAL_CALL osl_psz_getUserIdent(oslSecurity Security, sal_Char *pszIdent, sal_uInt32 nMax); |
| sal_Bool SAL_CALL osl_psz_getUserName(oslSecurity Security, sal_Char* pszName, sal_uInt32 nMax); |
| sal_Bool SAL_CALL osl_psz_getHomeDir(oslSecurity Security, sal_Char* pszDirectory, sal_uInt32 nMax); |
| sal_Bool SAL_CALL osl_psz_getConfigDir(oslSecurity Security, sal_Char* pszDirectory, sal_uInt32 nMax); |
| |
| |
| |
| oslSecurity SAL_CALL osl_getCurrentSecurity() |
| { |
| |
| oslSecurityImpl *pSecImpl = (oslSecurityImpl*) malloc(sizeof(oslSecurityImpl)); |
| struct passwd *pPasswd = getpwuid(getuid()); |
| |
| if (pPasswd) |
| { |
| memcpy(&pSecImpl->m_pPasswd, pPasswd, sizeof(pSecImpl->m_pPasswd)); |
| pSecImpl->m_isValid = sal_True; |
| } |
| else |
| { |
| /* Some UNIX-OS don't implement getpwuid, e.g. NC OS (special NetBSD) 1.2.1 */ |
| /* so we have to catch this in this else branch */ |
| pSecImpl->m_pPasswd.pw_name = getenv("USER"); |
| pSecImpl->m_pPasswd.pw_dir = getenv("HOME"); |
| if (pSecImpl->m_pPasswd.pw_name && pSecImpl->m_pPasswd.pw_dir) |
| pSecImpl->m_isValid = sal_True; |
| else |
| { |
| pSecImpl->m_pPasswd.pw_name = "unknown"; |
| pSecImpl->m_pPasswd.pw_dir = "/tmp"; |
| pSecImpl->m_isValid = sal_False; |
| } |
| pSecImpl->m_pPasswd.pw_passwd = NULL; |
| pSecImpl->m_pPasswd.pw_uid = getuid(); |
| pSecImpl->m_pPasswd.pw_gid = getgid(); |
| pSecImpl->m_pPasswd.pw_gecos = "unknown"; |
| pSecImpl->m_pPasswd.pw_shell = "unknown"; |
| } |
| |
| |
| return ((oslSecurity)pSecImpl); |
| } |
| |
| |
| oslSecurityError SAL_CALL osl_loginUser( |
| rtl_uString *ustrUserName, |
| rtl_uString *ustrPassword, |
| oslSecurity *pSecurity |
| ) |
| { |
| oslSecurityError ret; |
| |
| *pSecurity = osl_getCurrentSecurity(); |
| ret = osl_Security_E_None; |
| |
| return ret; |
| } |
| |
| |
| |
| oslSecurityError SAL_CALL osl_loginUserOnFileServer( |
| rtl_uString *strUserName, |
| rtl_uString *strPasswd, |
| rtl_uString *strFileServer, |
| oslSecurity *pSecurity |
| ) |
| { |
| oslSecurityError erg; |
| return erg = osl_Security_E_UserUnknown; |
| } |
| |
| |
| oslSecurityError SAL_CALL osl_psz_loginUserOnFileServer( const sal_Char* pszUserName, |
| const sal_Char* pszPasswd, |
| const sal_Char* pszFileServer, |
| oslSecurity* pSecurity ) |
| { |
| oslSecurityError erg; |
| return erg = osl_Security_E_UserUnknown; |
| } |
| |
| sal_Bool SAL_CALL osl_getUserIdent(oslSecurity Security, rtl_uString **ustrIdent) |
| { |
| sal_Bool bRet=sal_False; |
| sal_Char pszIdent[1024]; |
| |
| pszIdent[0] = '\0'; |
| |
| bRet = osl_psz_getUserIdent(Security,pszIdent,sizeof(pszIdent)); |
| |
| rtl_string2UString( ustrIdent, pszIdent, rtl_str_getLength( pszIdent ), osl_getThreadTextEncoding(), OUSTRING_TO_OSTRING_CVTFLAGS ); |
| OSL_ASSERT(*ustrIdent != NULL); |
| |
| return bRet; |
| } |
| |
| |
| sal_Bool SAL_CALL osl_psz_getUserIdent(oslSecurity Security, sal_Char *pszIdent, sal_uInt32 nMax) |
| { |
| sal_Char buffer[32]; |
| sal_Int32 nChr; |
| |
| oslSecurityImpl *pSecImpl = (oslSecurityImpl *)Security; |
| |
| if (pSecImpl == NULL) |
| return sal_False; |
| |
| nChr = snprintf(buffer, sizeof(buffer), "%u", pSecImpl->m_pPasswd.pw_uid); |
| if ( nChr < 0 || nChr >= sizeof(buffer) || nChr >= nMax ) |
| return sal_False; /* leave *pszIdent unmodified in case of failure */ |
| |
| memcpy(pszIdent, buffer, nChr+1); |
| return sal_True; |
| } |
| |
| sal_Bool SAL_CALL osl_getUserName(oslSecurity Security, rtl_uString **ustrName) |
| { |
| sal_Bool bRet=sal_False; |
| sal_Char pszName[1024]; |
| |
| pszName[0] = '\0'; |
| |
| bRet = osl_psz_getUserName(Security,pszName,sizeof(pszName)); |
| |
| rtl_string2UString( ustrName, pszName, rtl_str_getLength( pszName ), osl_getThreadTextEncoding(), OUSTRING_TO_OSTRING_CVTFLAGS ); |
| OSL_ASSERT(*ustrName != NULL); |
| |
| return bRet; |
| } |
| |
| |
| |
| sal_Bool SAL_CALL osl_psz_getUserName(oslSecurity Security, sal_Char* pszName, sal_uInt32 nMax) |
| { |
| oslSecurityImpl *pSecImpl = (oslSecurityImpl *)Security; |
| |
| if ((pSecImpl == NULL) || (! pSecImpl->m_isValid)) |
| return sal_False; |
| |
| strncpy(pszName, pSecImpl->m_pPasswd.pw_name, nMax); |
| |
| return sal_True; |
| } |
| |
| sal_Bool SAL_CALL osl_getHomeDir(oslSecurity Security, rtl_uString **pustrDirectory) |
| { |
| sal_Bool bRet=sal_False; |
| sal_Char pszDirectory[PATH_MAX]; |
| |
| pszDirectory[0] = '\0'; |
| |
| bRet = osl_psz_getHomeDir(Security,pszDirectory,sizeof(pszDirectory)); |
| |
| if ( bRet == sal_True ) |
| { |
| rtl_string2UString( pustrDirectory, pszDirectory, rtl_str_getLength( pszDirectory ), osl_getThreadTextEncoding(), OUSTRING_TO_OSTRING_CVTFLAGS ); |
| OSL_ASSERT(*pustrDirectory != NULL); |
| osl_getFileURLFromSystemPath( *pustrDirectory, pustrDirectory ); |
| } |
| |
| return bRet; |
| } |
| |
| |
| sal_Bool SAL_CALL osl_psz_getHomeDir(oslSecurity Security, sal_Char* pszDirectory, sal_uInt32 nMax) |
| { |
| oslSecurityImpl *pSecImpl = (oslSecurityImpl *)Security; |
| |
| if (pSecImpl == NULL) |
| return sal_False; |
| |
| /* if current user, check also environment for HOME */ |
| if (getuid() == pSecImpl->m_pPasswd.pw_uid) |
| { |
| sal_Char *pStr = NULL; |
| #ifdef SOLARIS |
| char buffer[8192]; |
| |
| struct passwd pwd; |
| struct passwd *ppwd; |
| |
| #ifdef _POSIX_PTHREAD_SEMANTICS |
| if ( 0 != getpwuid_r(getuid(), &pwd, buffer, sizeof(buffer), &ppwd ) ) |
| ppwd = NULL; |
| #else |
| ppwd = getpwuid_r(getuid(), &pwd, buffer, sizeof(buffer) ); |
| #endif |
| |
| if ( ppwd ) |
| pStr = ppwd->pw_dir; |
| #else |
| pStr = getenv("HOME"); |
| #endif |
| |
| if ((pStr != NULL) && (strlen(pStr) > 0) && |
| (access(pStr, 0) == 0)) |
| strncpy(pszDirectory, pStr, nMax); |
| else |
| if (pSecImpl->m_isValid) |
| strncpy(pszDirectory, pSecImpl->m_pPasswd.pw_dir, nMax); |
| else |
| return sal_False; |
| } |
| else |
| strncpy(pszDirectory, pSecImpl->m_pPasswd.pw_dir, nMax); |
| |
| return sal_True; |
| } |
| |
| sal_Bool SAL_CALL osl_getConfigDir(oslSecurity Security, rtl_uString **pustrDirectory) |
| { |
| sal_Bool bRet = sal_False; |
| sal_Char pszDirectory[PATH_MAX]; |
| |
| pszDirectory[0] = '\0'; |
| |
| bRet = osl_psz_getConfigDir(Security,pszDirectory,sizeof(pszDirectory)); |
| |
| if ( bRet == sal_True ) |
| { |
| rtl_string2UString( pustrDirectory, pszDirectory, rtl_str_getLength( pszDirectory ), osl_getThreadTextEncoding(), OUSTRING_TO_OSTRING_CVTFLAGS ); |
| OSL_ASSERT(*pustrDirectory != NULL); |
| osl_getFileURLFromSystemPath( *pustrDirectory, pustrDirectory ); |
| } |
| |
| return bRet; |
| } |
| |
| |
| sal_Bool SAL_CALL osl_psz_getConfigDir(oslSecurity Security, sal_Char* pszDirectory, sal_uInt32 nMax) |
| { |
| return (osl_psz_getHomeDir(Security, pszDirectory, nMax)); |
| } |
| |
| sal_Bool SAL_CALL osl_isAdministrator(oslSecurity Security) |
| { |
| oslSecurityImpl *pSecImpl = (oslSecurityImpl *)Security; |
| |
| if (pSecImpl == NULL) |
| return sal_False; |
| |
| if (pSecImpl->m_pPasswd.pw_uid != 0) |
| return (sal_False); |
| |
| return (sal_True); |
| } |
| |
| void SAL_CALL osl_freeSecurityHandle(oslSecurity Security) |
| { |
| if (Security) |
| free ((oslSecurityImpl*)Security); |
| } |
| |
| |
| sal_Bool SAL_CALL osl_loadUserProfile(oslSecurity Security) |
| { |
| return sal_False; |
| } |
| |
| void SAL_CALL osl_unloadUserProfile(oslSecurity Security) |
| { |
| return; |
| } |
| |
| |