Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
openSUSE:Leap:42.1:Staging:A
rsh
netkit-rsh-0.17-rexec-netrc.diff
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File netkit-rsh-0.17-rexec-netrc.diff of Package rsh
--- rexec/Makefile +++ rexec/Makefile @@ -4,7 +4,7 @@ include ../MRULES PROG=rexec -OBJS=rexec.o +OBJS=rexec.o ruserpass.o $(PROG): $(OBJS) $(CC) $(LDFLAGS) $^ $(LIBS) -o $@ --- rexec/rexec.c +++ rexec/rexec.c @@ -99,6 +99,7 @@ void set_signal(int sig, SIGHANDLER_T handler); void echo_sig(int sig); void safe_write_error(const char *message); +int xruserpass(const char *host, char **aname, char **apass); /* These need to be global for signal passing. */ int aux_sock=-1; /* Socket for auxiliary channel. */ @@ -163,7 +164,31 @@ else /* else we just want standard error directed as standar out--no aux */ p_to_aux_sock = NULL; - if (prompt || user_name == NULL || prompt == NULL) + if (!prompt) + { + if (user_name == NULL) //no user_name on command line + user_name = getenv("REXEC_USER"); + if (user_name == NULL) { //try ~/.netrc file + if (xruserpass(host, &user_name, &passwd) < 0) { + user_name = NULL; + passwd = NULL; + } + } + if ( user_name == NULL ) { + uid_t uid = getuid(); + struct passwd *pw = getpwuid(uid); + if (!(pw && pw->pw_name)) { + fprintf(stderr, "Can't lookup uid %d\n", uid); + exit(1); + } + user_name = strdup(pw->pw_name); + } + if (user_name && (passwd == NULL)) + passwd = getenv("REXEC_PASS"); + if (user_name && (passwd == NULL)) + passwd = getpass("Password: "); + } + if (prompt || user_name == NULL) { FILE *term_in,*term_out; @@ -175,22 +200,18 @@ else term_out = term_in; - if (prompt || user_name == NULL) - { - fprintf(term_out,"Username at %s: ",host); - user_name = fgets(user_buf,USERLEN,term_in); - user_name[strlen(user_name)-1] = '\0'; /* Hopefully fgets always adds + fprintf(term_out,"Username at %s: ",host); + user_name = fgets(user_buf,USERLEN,term_in); + user_name[strlen(user_name)-1] = '\0'; /* Hopefully fgets always adds a newline. */ - } - if (prompt || passwd == NULL) - passwd = getpass("Password: "); + passwd = getpass("Password: "); + } + if (!(user_name && passwd)) { + fprintf(stderr, "Can't use %s without supplying a user and password\n", + progname); + exit(1); } - if ( user_name == NULL ) - user_name = getenv("REXEC_USER"); - if ( passwd == NULL ) - passwd = getenv("REXEC_PASS"); - if ( (sock = rexec_af (&host, port_exec, user_name, passwd, command, p_to_aux_sock, af)) < 0 ) { @@ -215,7 +236,7 @@ if (bsd) { - for (sig = 0; sig < sizeof(bsd_signals)/sizeof(int); ++sig) + for (sig = 0; (unsigned) sig < sizeof(bsd_signals)/sizeof(int); ++sig) set_signal(bsd_signals[sig],echo_sig); } else { for (sig = 1; sig < NSIG; ++sig) --- rexec/ruserpass.c +++ rexec/ruserpass.c @@ -0,0 +1,214 @@ +/* + * Copyright (c) 1985 Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +/* + * from: @(#)ruserpass.c 5.3 (Berkeley) 3/1/91 + */ +char ruserpass_rcsid[] = + "$Id: ruserpass.c,v 1.9 1999/10/02 19:12:33 dholland Exp $"; + +#include <stdio.h> +#include <stdlib.h> +#include <utmp.h> +#include <ctype.h> +#include <sys/stat.h> +#include <sys/param.h> +#include <errno.h> +#include <string.h> +#include <unistd.h> + +static FILE *cfile; +static int token(void); + +#define MACBUF_LEN 4096 + +#define DEFAULT 1 +#define LOGIN 2 +#define PASSWD 3 +#define ACCOUNT 4 +#define MACDEF 5 +#define ID 10 +#define MACH 11 + +static char tokval[100]; + +static struct toktab { + const char *tokstr; + int tval; +} toktab[]= { + { "default", DEFAULT }, + { "login", LOGIN }, + { "password", PASSWD }, + { "passwd", PASSWD }, + { "account", ACCOUNT }, + { "machine", MACH }, + { "macdef", MACDEF }, + { NULL, 0 } +}; + +int +xruserpass(const char *host, char **aname, char **apass) +{ + const char *hdir; + char buf[BUFSIZ], *tmp; + char myname[MAXHOSTNAMELEN]; + const char *mydomain; + int t, usedefault = 0; + struct stat stb; + + hdir = getenv("HOME"); + if (hdir == NULL) + hdir = "."; + snprintf(buf, sizeof(buf), "%s/.netrc", hdir); + cfile = fopen(buf, "r"); + if (cfile == NULL) { + if (errno != ENOENT) + perror(buf); + return(0); + } + if (gethostname(myname, sizeof(myname)) < 0) + myname[0] = '\0'; + if ((mydomain = strchr(myname, '.')) == NULL) + mydomain = ""; +next: + while ((t = token())) switch(t) { + + case DEFAULT: + usedefault = 1; + /* FALL THROUGH */ + + case MACH: + if (!usedefault) { + if (token() != ID) + continue; + /* + * Allow match of incompletely-specified host in + * local domain. + */ + if (strcasecmp(host, tokval) == 0) + goto match; + if ((tmp = index(host, '.')) != NULL && + strcasecmp(tmp, mydomain) == 0 && + strncasecmp(host, tokval, tmp - host) == 0 && + tokval[tmp - host] == '\0') + goto match; + continue; + } + match: + while ((t = token()) && t != MACH && t != DEFAULT) switch(t) { + + case LOGIN: + if (token()) { + if (*aname == 0) { + *aname = malloc((unsigned) strlen(tokval) + 1); + (void) strcpy(*aname, tokval); + } else { + if (strcmp(*aname, tokval)) + goto next; + } + } + break; + case PASSWD: + if (*aname==NULL) { + fprintf(stderr, "Error: `password' must follow `login' in .netrc\n"); + goto bad; + } + if (strcmp(*aname, "anonymous") && + fstat(fileno(cfile), &stb) >= 0 && + (stb.st_mode & 077) != 0) { + fprintf(stderr, "Error - .netrc file not correct permissions.\n"); + fprintf(stderr, "Remove password or correct mode (should be 600).\n"); + goto bad; + } + if (token() && *apass == 0) { + *apass = malloc((unsigned) strlen(tokval) + 1); + (void) strcpy(*apass, tokval); + } + break; + case ACCOUNT: + break; + case MACDEF: + break; + default: + fprintf(stderr, "Unknown .netrc keyword %s\n", tokval); + break; + } + goto done; + } +done: + (void) fclose(cfile); + return(0); +bad: + (void) fclose(cfile); + return(-1); +} + +static +int +token(void) +{ + char *cp; + int c; + struct toktab *t; + + if (feof(cfile)) + return (0); + while ((c = getc(cfile)) != EOF && + (c == '\n' || c == '\t' || c == ' ' || c == ',')) + continue; + if (c == EOF) + return (0); + cp = tokval; + if (c == '"') { + while ((c = getc(cfile)) != EOF && c != '"') { + if (c == '\\') + c = getc(cfile); + *cp++ = c; + } + } else { + *cp++ = c; + while ((c = getc(cfile)) != EOF + && c != '\n' && c != '\t' && c != ' ' && c != ',') { + if (c == '\\') + c = getc(cfile); + *cp++ = c; + } + } + *cp = 0; + if (tokval[0] == 0) + return (0); + for (t = toktab; t->tokstr; t++) + if (!strcmp(t->tokstr, tokval)) + return (t->tval); + return (ID); +}
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor