LCOV - code coverage report
Current view: top level - lib - fko_user.c (source / functions) Hit Total Coverage
Test: lcov_coverage_final.info Lines: 54 60 90.0 %
Date: 2015-08-23 Functions: 3 3 100.0 %
Branches: 74 88 84.1 %

           Branch data     Line data    Source code
       1                 :            : /*
       2                 :            :  *****************************************************************************
       3                 :            :  *
       4                 :            :  * File:    fko_user.c
       5                 :            :  *
       6                 :            :  * Purpose: Set/Get the current username.
       7                 :            :  *
       8                 :            :  *  Fwknop is developed primarily by the people listed in the file 'AUTHORS'.
       9                 :            :  *  Copyright (C) 2009-2014 fwknop developers and contributors. For a full
      10                 :            :  *  list of contributors, see the file 'CREDITS'.
      11                 :            :  *
      12                 :            :  *  License (GNU General Public License):
      13                 :            :  *
      14                 :            :  *  This program is free software; you can redistribute it and/or
      15                 :            :  *  modify it under the terms of the GNU General Public License
      16                 :            :  *  as published by the Free Software Foundation; either version 2
      17                 :            :  *  of the License, or (at your option) any later version.
      18                 :            :  *
      19                 :            :  *  This program is distributed in the hope that it will be useful,
      20                 :            :  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
      21                 :            :  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      22                 :            :  *  GNU General Public License for more details.
      23                 :            :  *
      24                 :            :  *  You should have received a copy of the GNU General Public License
      25                 :            :  *  along with this program; if not, write to the Free Software
      26                 :            :  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307
      27                 :            :  *  USA
      28                 :            :  *
      29                 :            :  *****************************************************************************
      30                 :            : */
      31                 :            : #include "fko_common.h"
      32                 :            : #include "fko.h"
      33                 :            : 
      34                 :            : #ifdef WIN32
      35                 :            :   #include <getlogin.h>
      36                 :            : #endif
      37                 :            : 
      38                 :            : /* Get or Set the username for the fko context spa data.
      39                 :            : */
      40                 :            : int
      41                 :     866776 : fko_set_username(fko_ctx_t ctx, const char * const spoof_user)
      42                 :            : {
      43                 :     866776 :     char   *username = NULL;
      44                 :     866776 :     int     res = FKO_SUCCESS, is_user_heap_allocated=0;
      45                 :            : 
      46                 :            : #if HAVE_LIBFIU
      47         [ +  + ]:     866776 :     fiu_return_on("fko_set_username_init", FKO_ERROR_CTX_NOT_INITIALIZED);
      48                 :            : #endif
      49                 :            : 
      50                 :            :     /* Must be initialized
      51                 :            :     */
      52 [ +  + ][ +  - ]:     866773 :     if(!CTX_INITIALIZED(ctx))
      53                 :            :         return FKO_ERROR_CTX_NOT_INITIALIZED;
      54                 :            : 
      55                 :            :     /* If spoof_user was not passed in, check for a SPOOF_USER enviroment
      56                 :            :      * variable.  If it is set, use its value.
      57                 :            :     */
      58 [ +  + ][ -  + ]:     866759 :     if(spoof_user != NULL && strnlen(spoof_user, MAX_SPA_USERNAME_SIZE))
      59                 :            :         username = (char*)spoof_user;
      60                 :            :     else
      61                 :     866553 :         username = getenv("SPOOF_USER");
      62                 :            : 
      63                 :            :     /* Try to get the username from the system.
      64                 :            :     */
      65         [ +  + ]:     866759 :     if(username == NULL)
      66                 :            :     {
      67                 :            :         /* Since we've already tried looking at an env variable, try
      68                 :            :          * LOGNAME next (and the cuserid() man page recommends this)
      69                 :            :         */
      70         [ +  + ]:     866548 :         if((username = getenv("LOGNAME")) == NULL)
      71                 :            :         {
      72                 :            : #ifdef _XOPEN_SOURCE
      73                 :            :             /* cuserid will return the effective user (i.e. su or setuid).
      74                 :            :             */
      75                 :          1 :             username = cuserid(NULL);
      76                 :            : #else
      77                 :            :             username = getlogin();
      78                 :            : #endif
      79                 :            :             /* if we still didn't get a username, continue falling back
      80                 :            :             */
      81         [ -  + ]:          1 :             if(username == NULL)
      82                 :            :             {
      83         [ #  # ]:          0 :                 if((username = getenv("USER")) == NULL)
      84                 :            :                 {
      85                 :            : #if HAVE_LIBFIU
      86         [ #  # ]:          0 :                     fiu_return_on("fko_set_username_strdup1", FKO_ERROR_MEMORY_ALLOCATION);
      87                 :            : #endif
      88                 :          0 :                     username = strdup("NO_USER");
      89         [ #  # ]:          0 :                     if(username == NULL)
      90                 :            :                         return(FKO_ERROR_MEMORY_ALLOCATION);
      91                 :            :                     is_user_heap_allocated = 1;
      92                 :            :                 }
      93                 :            :             }
      94                 :            :         }
      95                 :            :     }
      96                 :            : 
      97                 :            :     /* Truncate the username if it is too long.
      98                 :            :     */
      99         [ +  + ]:     866759 :     if(strnlen(username, MAX_SPA_USERNAME_SIZE) == MAX_SPA_USERNAME_SIZE)
     100                 :          1 :         *(username + MAX_SPA_USERNAME_SIZE - 1) = '\0';
     101                 :            : 
     102         [ +  + ]:     866759 :     if((res = validate_username(username)) != FKO_SUCCESS)
     103                 :            :     {
     104         [ -  + ]:         11 :         if(is_user_heap_allocated == 1)
     105                 :          0 :             free(username);
     106                 :            : #if HAVE_LIBFIU
     107         [ +  - ]:         11 :         fiu_return_on("fko_set_username_valuser", FKO_ERROR_INVALID_DATA);
     108                 :            : #endif
     109                 :         11 :         return res;
     110                 :            :     }
     111                 :            : 
     112                 :            :     /* Just in case this is a subsquent call to this function.  We
     113                 :            :      * do not want to be leaking memory.
     114                 :            :     */
     115         [ +  + ]:     866748 :     if(ctx->username != NULL)
     116                 :        207 :         free(ctx->username);
     117                 :            : 
     118                 :            : #if HAVE_LIBFIU
     119         [ +  + ]:     866748 :     fiu_return_on("fko_set_username_strdup2", FKO_ERROR_MEMORY_ALLOCATION);
     120                 :            : #endif
     121                 :            : 
     122                 :     866745 :     ctx->username = strdup(username);
     123                 :            : 
     124                 :     866745 :     ctx->state |= FKO_DATA_MODIFIED;
     125                 :            : 
     126         [ -  + ]:     866745 :     if(is_user_heap_allocated == 1)
     127                 :          0 :         free(username);
     128                 :            : 
     129         [ +  + ]:     866745 :     if(ctx->username == NULL)
     130                 :            :         return(FKO_ERROR_MEMORY_ALLOCATION);
     131                 :            : 
     132                 :     866702 :     return(FKO_SUCCESS);
     133                 :            : }
     134                 :            : 
     135                 :            : /* Return the current username for this fko context.
     136                 :            : */
     137                 :            : int
     138                 :       4543 : fko_get_username(fko_ctx_t ctx, char **username)
     139                 :            : {
     140                 :            : 
     141                 :            : #if HAVE_LIBFIU
     142         [ +  + ]:       4543 :     fiu_return_on("fko_get_username_init", FKO_ERROR_CTX_NOT_INITIALIZED);
     143                 :            : #endif
     144                 :            : 
     145                 :            :     /* Must be initialized
     146                 :            :     */
     147 [ +  + ][ +  - ]:       4541 :     if(!CTX_INITIALIZED(ctx))
     148                 :            :         return(FKO_ERROR_CTX_NOT_INITIALIZED);
     149                 :            : 
     150         [ +  + ]:       4389 :     if(username == NULL)
     151                 :            :         return(FKO_ERROR_INVALID_DATA);
     152                 :            : 
     153                 :            : #if HAVE_LIBFIU
     154         [ +  + ]:       4321 :     fiu_return_on("fko_get_username_val", FKO_ERROR_INVALID_DATA);
     155                 :            : #endif
     156                 :            : 
     157                 :       4319 :     *username = ctx->username;
     158                 :            : 
     159                 :       4319 :     return(FKO_SUCCESS);
     160                 :            : }
     161                 :            : 
     162                 :            : int
     163                 :    1721339 : validate_username(const char *username)
     164                 :            : {
     165                 :            :     int i;
     166                 :            : 
     167 [ +  - ][ +  + ]:    1721339 :     if(username == NULL || strnlen(username, MAX_SPA_USERNAME_SIZE) == 0)
     168                 :            :         return(FKO_ERROR_INVALID_DATA_USER_MISSING);
     169                 :            : 
     170                 :            :     /* Exclude a few chars - this list is consistent with MS guidance since
     171                 :            :      * libfko runs on Windows:
     172                 :            :      *      http://technet.microsoft.com/en-us/library/bb726984.aspx
     173                 :            :     */
     174         [ +  + ]:    9155611 :     for (i=0; i < (int)strnlen(username, MAX_SPA_USERNAME_SIZE); i++)
     175                 :            :     {
     176         [ +  + ]:    7487887 :         if((isalnum(username[i]) == 0)
     177         [ +  + ]:     311411 :                 && ((username[i] < 0x20 || username[i] > 0x7e)
     178                 :            :                 /* Not allowed chars: " / \ [ ] : ; | = , + * ? < >
     179                 :            :                 */
     180         [ +  + ]:     286798 :                 || (username[i] == 0x22
     181                 :     286798 :                     || username[i] == 0x2f
     182         [ +  + ]:     284977 :                     || username[i] == 0x5c
     183         [ +  + ]:     284949 :                     || username[i] == 0x5b
     184         [ +  + ]:     265021 :                     || username[i] == 0x5d
     185         [ +  + ]:     264899 :                     || username[i] == 0x3a
     186         [ +  + ]:     264894 :                     || username[i] == 0x3b
     187         [ +  + ]:     264878 :                     || username[i] == 0x7c
     188         [ +  + ]:     264841 :                     || username[i] == 0x3d
     189         [ +  + ]:     264832 :                     || username[i] == 0x2c
     190         [ +  + ]:     263005 :                     || username[i] == 0x2b
     191         [ +  + ]:     261183 :                     || username[i] == 0x2a
     192         [ +  + ]:     259365 :                     || username[i] == 0x3f
     193         [ +  + ]:     259359 :                     || username[i] == 0x3c
     194         [ +  + ]:     259334 :                     || username[i] == 0x3e)))
     195                 :            :         {
     196         [ +  + ]:      52078 :             if(i == 0)
     197                 :            :             {
     198                 :            :                 return(FKO_ERROR_INVALID_DATA_USER_FIRSTCHAR_VALIDFAIL);
     199                 :            :             }
     200                 :            :             else
     201                 :            :             {
     202                 :      19904 :                 return(FKO_ERROR_INVALID_DATA_USER_REMCHAR_VALIDFAIL);
     203                 :            :             }
     204                 :            :         }
     205                 :            :     }
     206                 :            : 
     207                 :            :     return FKO_SUCCESS;
     208                 :            : }
     209                 :            : 
     210                 :            : /***EOF***/

Generated by: LCOV version 1.10