]>
git.saurik.com Git - apt.git/blob - apt-pkg/contrib/netrc.cc
   1 // -*- mode: cpp; mode: fold -*- 
   3 // $Id: netrc.c,v 1.38 2007-11-07 09:21:35 bagder Exp $ 
   4 /* ###################################################################### 
   6    netrc file parser - returns the login and password of a give host in 
   7                        a specified netrc-type file 
   9    Originally written by Daniel Stenberg, <daniel@haxx.se>, et al. and 
  10    placed into the Public Domain, do with it what you will. 
  12    ##################################################################### */ 
  16 #include <apt-pkg/configuration.h> 
  17 #include <apt-pkg/strutl.h> 
  18 #include <apt-pkg/fileutl.h> 
  31 /* Get user and password from .netrc when given a machine name */ 
  35   HOSTFOUND
,    /* the 'machine' keyword was found */ 
  36   HOSTCOMPLETE
, /* the machine name following the keyword was found too */ 
  37   HOSTVALID
,    /* this is "our" machine! */ 
  38   HOSTEND 
/* LAST enum */ 
  41 /* make sure we have room for at least this size: */ 
  43 #define PASSWORDSIZE 64 
  44 #define NETRC DOT_CHAR "netrc" 
  46 /* returns -1 on failure, 0 if the host is found, 1 is the host isn't found */ 
  47 int parsenetrc (char *host
, char *login
, char *password
, char *netrcfile 
= NULL
) 
  51   int specific_login 
= (login
[0] != 0); 
  53   bool netrc_alloc 
= false; 
  55   int state_our_login 
= false;  /* With specific_login, 
  56                                    found *our* login name */ 
  59     home 
= getenv ("HOME"); /* portable environment reader */ 
  63       pw 
= getpwuid (geteuid ()); 
  71     if (asprintf (&netrcfile
, "%s%s%s", home
, DIR_CHAR
, NETRC
) == -1 || netrcfile 
== NULL
) 
  77   file 
= fopen (netrcfile
, "r"); 
  82     char netrcbuffer
[256]; 
  85     char state_login 
= 0;        /* Found a login keyword */ 
  86     char state_password 
= 0;     /* Found a password keyword */ 
  88     while (!done 
&& fgets(netrcbuffer
, sizeof (netrcbuffer
), file
)) { 
  89       tok 
= strtok_r (netrcbuffer
, " \t\n", &tok_buf
); 
  90       while (!done 
&& tok
) { 
  91         if(login
[0] && password
[0]) { 
  98           if (!strcasecmp ("machine", tok
)) { 
  99             /* the next tok is the machine name, this is in itself the 
 100                delimiter that starts the stuff entered for this machine, 
 101                after this we need to search for 'login' and 
 107            /* extended definition of a "machine" if we have a "/" 
 108               we match the start of the string (host.startswith(token) */ 
 109           if ((strchr(host
, '/') && strstr(host
, tok
) == host
) || 
 110               (!strcasecmp (host
, tok
))) { 
 111             /* and yes, this is our host! */ 
 113             retcode 
= 0; /* we did find our host */ 
 120           /* we are now parsing sub-keywords concerning "our" host */ 
 123               state_our_login 
= !strcasecmp (login
, tok
); 
 125               strncpy (login
, tok
, LOGINSIZE 
- 1); 
 127           } else if (state_password
) { 
 128             if (state_our_login 
|| !specific_login
) 
 129               strncpy (password
, tok
, PASSWORDSIZE 
- 1); 
 131           } else if (!strcasecmp ("login", tok
)) 
 133           else if (!strcasecmp ("password", tok
)) 
 135           else if(!strcasecmp ("machine", tok
)) { 
 136             /* ok, there's machine here go => */ 
 138             state_our_login 
= false; 
 141         } /* switch (state) */ 
 143         tok 
= strtok_r (NULL
, " \t\n", &tok_buf
); 
 145     } /* while fgets() */ 
 156 void maybe_add_auth (URI 
&Uri
, string NetRCFile
) 
 158   if (_config
->FindB("Debug::Acquire::netrc", false) == true) 
 159      std::clog 
<< "maybe_add_auth: " << (string
)Uri 
 
 160                << " " << NetRCFile 
<< std::endl
; 
 161   if (Uri
.Password
.empty () == true || Uri
.User
.empty () == true) 
 163     if (NetRCFile
.empty () == false) 
 166       char password
[64] = ""; 
 167       char *netrcfile 
= strdup(NetRCFile
.c_str()); 
 169       // first check for a generic host based netrc entry 
 170       char *host 
= strdup(Uri
.Host
.c_str()); 
 171       if (host 
&& parsenetrc (host
, login
, password
, netrcfile
) == 0) 
 173          if (_config
->FindB("Debug::Acquire::netrc", false) == true) 
 174             std::clog 
<< "host: " << host 
 
 175                       << " user: " << login
 
 176                       << " pass-size: " << strlen(password
) 
 178         Uri
.User 
= string (login
); 
 179         Uri
.Password 
= string (password
); 
 186       // if host did not work, try Host+Path next, this will trigger 
 187       // a lookup uri.startswith(host) in the netrc file parser (because 
 189       char *hostpath 
= strdup(string(Uri
.Host
+Uri
.Path
).c_str()); 
 190       if (hostpath 
&& parsenetrc (hostpath
, login
, password
, netrcfile
) == 0) 
 192          if (_config
->FindB("Debug::Acquire::netrc", false) == true) 
 193             std::clog 
<< "hostpath: " << hostpath
 
 194                       << " user: " << login
 
 195                       << " pass-size: " << strlen(password
) 
 197          Uri
.User 
= string (login
); 
 198          Uri
.Password 
= string (password
); 
 207 int main(int argc
, char* argv
[]) 
 210   char password
[64] = ""; 
 215   if(0 == parsenetrc (argv
[1], login
, password
, argv
[2])) { 
 216     printf("HOST: %s LOGIN: %s PASSWORD: %s\n", argv
[1], login
, password
);