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: 2014-11-16 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                 :    5082367 : fko_set_username(fko_ctx_t ctx, const char * const spoof_user)
      42                 :            : {
      43                 :    5082367 :     char   *username = NULL;
      44                 :    5082367 :     int     res = FKO_SUCCESS, is_user_heap_allocated=0;
      45                 :            : 
      46                 :            : #if HAVE_LIBFIU
      47         [ +  + ]:    5082367 :     fiu_return_on("fko_set_username_init", FKO_ERROR_CTX_NOT_INITIALIZED);
      48                 :            : #endif
      49                 :            : 
      50                 :            :     /* Must be initialized
      51                 :            :     */
      52 [ +  + ][ +  - ]:    5082364 :     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 [ +  + ][ -  + ]:    5082350 :     if(spoof_user != NULL && strnlen(spoof_user, MAX_SPA_USERNAME_SIZE))
      59                 :            :         username = (char*)spoof_user;
      60                 :            :     else
      61                 :    3486386 :         username = getenv("SPOOF_USER");
      62                 :            : 
      63                 :            :     /* Try to get the username from the system.
      64                 :            :     */
      65         [ +  + ]:    5082350 :     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         [ +  + ]:    3486381 :         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         [ +  + ]:    5082350 :     if(strnlen(username, MAX_SPA_USERNAME_SIZE) == MAX_SPA_USERNAME_SIZE)
     100                 :         84 :         *(username + MAX_SPA_USERNAME_SIZE - 1) = '\0';
     101                 :            : 
     102         [ +  + ]:    5082350 :     if((res = validate_username(username)) != FKO_SUCCESS)
     103                 :            :     {
     104         [ -  + ]:        841 :         if(is_user_heap_allocated == 1)
     105                 :          0 :             free(username);
     106                 :            : #if HAVE_LIBFIU
     107         [ +  - ]:        841 :         fiu_return_on("fko_set_username_valuser", FKO_ERROR_INVALID_DATA);
     108                 :            : #endif
     109                 :        841 :         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         [ +  + ]:    5081509 :     if(ctx->username != NULL)
     116                 :    1595135 :         free(ctx->username);
     117                 :            : 
     118                 :            : #if HAVE_LIBFIU
     119         [ +  + ]:    5081509 :     fiu_return_on("fko_set_username_strdup2", FKO_ERROR_MEMORY_ALLOCATION);
     120                 :            : #endif
     121                 :            : 
     122                 :    5081506 :     ctx->username = strdup(username);
     123                 :            : 
     124                 :    5081506 :     ctx->state |= FKO_DATA_MODIFIED;
     125                 :            : 
     126         [ -  + ]:    5081506 :     if(is_user_heap_allocated == 1)
     127                 :          0 :         free(username);
     128                 :            : 
     129         [ +  + ]:    5081506 :     if(ctx->username == NULL)
     130                 :            :         return(FKO_ERROR_MEMORY_ALLOCATION);
     131                 :            : 
     132                 :    5081460 :     return(FKO_SUCCESS);
     133                 :            : }
     134                 :            : 
     135                 :            : /* Return the current username for this fko context.
     136                 :            : */
     137                 :            : int
     138                 :       5537 : fko_get_username(fko_ctx_t ctx, char **username)
     139                 :            : {
     140                 :            : 
     141                 :            : #if HAVE_LIBFIU
     142         [ +  + ]:       5537 :     fiu_return_on("fko_get_username_init", FKO_ERROR_CTX_NOT_INITIALIZED);
     143                 :            : #endif
     144                 :            : 
     145                 :            :     /* Must be initialized
     146                 :            :     */
     147 [ +  + ][ +  - ]:       5535 :     if(!CTX_INITIALIZED(ctx))
     148                 :            :         return(FKO_ERROR_CTX_NOT_INITIALIZED);
     149                 :            : 
     150         [ +  + ]:       5383 :     if(username == NULL)
     151                 :            :         return(FKO_ERROR_INVALID_DATA);
     152                 :            : 
     153                 :            : #if HAVE_LIBFIU
     154         [ +  + ]:       5315 :     fiu_return_on("fko_get_username_val", FKO_ERROR_INVALID_DATA);
     155                 :            : #endif
     156                 :            : 
     157                 :       5313 :     *username = ctx->username;
     158                 :            : 
     159                 :       5313 :     return(FKO_SUCCESS);
     160                 :            : }
     161                 :            : 
     162                 :            : int
     163                 :    9202187 : validate_username(const char *username)
     164                 :            : {
     165                 :            :     int i;
     166                 :            : 
     167 [ +  - ][ +  + ]:    9202187 :     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         [ +  + ]:   56447999 :     for (i=0; i < (int)strnlen(username, MAX_SPA_USERNAME_SIZE); i++)
     175                 :            :     {
     176         [ +  + ]:   47305841 :         if((isalnum(username[i]) == 0)
     177         [ +  + ]:    2511986 :                 && ((username[i] < 0x20 || username[i] > 0x7e)
     178                 :            :                 /* Not allowed chars: " / \ [ ] : ; | = , + * ? < >
     179                 :            :                 */
     180         [ +  + ]:    2482160 :                 || (username[i] == 0x22
     181                 :    2482160 :                     || username[i] == 0x2f
     182         [ +  + ]:    2480360 :                     || username[i] == 0x5c
     183         [ +  + ]:    2480332 :                     || username[i] == 0x5b
     184         [ +  + ]:    2460524 :                     || username[i] == 0x5d
     185         [ +  + ]:    2460402 :                     || username[i] == 0x3a
     186         [ +  + ]:    2459982 :                     || username[i] == 0x3b
     187         [ +  + ]:    2459966 :                     || username[i] == 0x7c
     188         [ +  + ]:    2459846 :                     || username[i] == 0x3d
     189         [ +  + ]:    2459837 :                     || username[i] == 0x2c
     190         [ +  + ]:    2457617 :                     || username[i] == 0x2b
     191         [ +  + ]:    2455649 :                     || username[i] == 0x2a
     192         [ +  + ]:    2453765 :                     || username[i] == 0x3f
     193         [ +  + ]:    2453677 :                     || username[i] == 0x3c
     194         [ +  + ]:    2453569 :                     || username[i] == 0x3e)))
     195                 :            :         {
     196         [ +  + ]:      58501 :             if(i == 0)
     197                 :            :             {
     198                 :            :                 return(FKO_ERROR_INVALID_DATA_USER_FIRSTCHAR_VALIDFAIL);
     199                 :            :             }
     200                 :            :             else
     201                 :            :             {
     202                 :      25860 :                 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