14b17dab0SDag-Erling Smørgrav /* 24b17dab0SDag-Erling Smørgrav * 34b17dab0SDag-Erling Smørgrav * Copyright (c) 2001 Gert Doering. All rights reserved. 45e8dbd04SDag-Erling Smørgrav * Copyright (c) 2003,2004 Darren Tucker. All rights reserved. 54b17dab0SDag-Erling Smørgrav * 64b17dab0SDag-Erling Smørgrav * Redistribution and use in source and binary forms, with or without 74b17dab0SDag-Erling Smørgrav * modification, are permitted provided that the following conditions 84b17dab0SDag-Erling Smørgrav * are met: 94b17dab0SDag-Erling Smørgrav * 1. Redistributions of source code must retain the above copyright 104b17dab0SDag-Erling Smørgrav * notice, this list of conditions and the following disclaimer. 114b17dab0SDag-Erling Smørgrav * 2. Redistributions in binary form must reproduce the above copyright 124b17dab0SDag-Erling Smørgrav * notice, this list of conditions and the following disclaimer in the 134b17dab0SDag-Erling Smørgrav * documentation and/or other materials provided with the distribution. 144b17dab0SDag-Erling Smørgrav * 154b17dab0SDag-Erling Smørgrav * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 164b17dab0SDag-Erling Smørgrav * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 174b17dab0SDag-Erling Smørgrav * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 184b17dab0SDag-Erling Smørgrav * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 194b17dab0SDag-Erling Smørgrav * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 204b17dab0SDag-Erling Smørgrav * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 214b17dab0SDag-Erling Smørgrav * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 224b17dab0SDag-Erling Smørgrav * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 234b17dab0SDag-Erling Smørgrav * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 244b17dab0SDag-Erling Smørgrav * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 254b17dab0SDag-Erling Smørgrav * 264b17dab0SDag-Erling Smørgrav */ 2783d2307dSDag-Erling Smørgrav #include "includes.h" 28efcad6b7SDag-Erling Smørgrav #include "auth.h" 29d95e11bfSDag-Erling Smørgrav #include "ssh.h" 30d95e11bfSDag-Erling Smørgrav #include "log.h" 31d95e11bfSDag-Erling Smørgrav #include "xmalloc.h" 32efcad6b7SDag-Erling Smørgrav #include "buffer.h" 3383d2307dSDag-Erling Smørgrav 3483d2307dSDag-Erling Smørgrav #ifdef _AIX 3583d2307dSDag-Erling Smørgrav 3683d2307dSDag-Erling Smørgrav #include <uinfo.h> 375e8dbd04SDag-Erling Smørgrav #include <sys/socket.h> 38d95e11bfSDag-Erling Smørgrav #include "port-aix.h" 39d95e11bfSDag-Erling Smørgrav 40efcad6b7SDag-Erling Smørgrav # ifdef HAVE_SETAUTHDB 41efcad6b7SDag-Erling Smørgrav static char old_registry[REGISTRY_SIZE] = ""; 42efcad6b7SDag-Erling Smørgrav # endif 4383d2307dSDag-Erling Smørgrav 4483d2307dSDag-Erling Smørgrav /* 454b17dab0SDag-Erling Smørgrav * AIX has a "usrinfo" area where logname and other stuff is stored - 464b17dab0SDag-Erling Smørgrav * a few applications actually use this and die if it's not set 474b17dab0SDag-Erling Smørgrav * 484b17dab0SDag-Erling Smørgrav * NOTE: TTY= should be set, but since no one uses it and it's hard to 494b17dab0SDag-Erling Smørgrav * acquire due to privsep code. We will just drop support. 5083d2307dSDag-Erling Smørgrav */ 515e8dbd04SDag-Erling Smørgrav 525e8dbd04SDag-Erling Smørgrav 5383d2307dSDag-Erling Smørgrav void 544b17dab0SDag-Erling Smørgrav aix_usrinfo(struct passwd *pw) 5583d2307dSDag-Erling Smørgrav { 5683d2307dSDag-Erling Smørgrav u_int i; 57d95e11bfSDag-Erling Smørgrav size_t len; 584b17dab0SDag-Erling Smørgrav char *cp; 5983d2307dSDag-Erling Smørgrav 60d95e11bfSDag-Erling Smørgrav len = sizeof("LOGNAME= NAME= ") + (2 * strlen(pw->pw_name)); 61d95e11bfSDag-Erling Smørgrav cp = xmalloc(len); 62d95e11bfSDag-Erling Smørgrav 63d95e11bfSDag-Erling Smørgrav i = snprintf(cp, len, "LOGNAME=%s%cNAME=%s%c", pw->pw_name, '\0', 64d95e11bfSDag-Erling Smørgrav pw->pw_name, '\0'); 6583d2307dSDag-Erling Smørgrav if (usrinfo(SETUINFO, cp, i) == -1) 6683d2307dSDag-Erling Smørgrav fatal("Couldn't set usrinfo: %s", strerror(errno)); 6783d2307dSDag-Erling Smørgrav debug3("AIX/UsrInfo: set len %d", i); 68d95e11bfSDag-Erling Smørgrav 6983d2307dSDag-Erling Smørgrav xfree(cp); 7083d2307dSDag-Erling Smørgrav } 7183d2307dSDag-Erling Smørgrav 72d95e11bfSDag-Erling Smørgrav # ifdef WITH_AIXAUTHENTICATE 73d95e11bfSDag-Erling Smørgrav /* 74d95e11bfSDag-Erling Smørgrav * Remove embedded newlines in string (if any). 75d95e11bfSDag-Erling Smørgrav * Used before logging messages returned by AIX authentication functions 76d95e11bfSDag-Erling Smørgrav * so the message is logged on one line. 77d95e11bfSDag-Erling Smørgrav */ 78d95e11bfSDag-Erling Smørgrav void 79d95e11bfSDag-Erling Smørgrav aix_remove_embedded_newlines(char *p) 80d95e11bfSDag-Erling Smørgrav { 81d95e11bfSDag-Erling Smørgrav if (p == NULL) 82d95e11bfSDag-Erling Smørgrav return; 83d95e11bfSDag-Erling Smørgrav 84d95e11bfSDag-Erling Smørgrav for (; *p; p++) { 85d95e11bfSDag-Erling Smørgrav if (*p == '\n') 86d95e11bfSDag-Erling Smørgrav *p = ' '; 87d95e11bfSDag-Erling Smørgrav } 88d95e11bfSDag-Erling Smørgrav /* Remove trailing whitespace */ 89d95e11bfSDag-Erling Smørgrav if (*--p == ' ') 90d95e11bfSDag-Erling Smørgrav *p = '\0'; 91d95e11bfSDag-Erling Smørgrav } 92efcad6b7SDag-Erling Smørgrav 93efcad6b7SDag-Erling Smørgrav /* 945e8dbd04SDag-Erling Smørgrav * Test specifically for the case where SYSTEM == NONE and AUTH1 contains 955e8dbd04SDag-Erling Smørgrav * anything other than NONE or SYSTEM, which indicates that the admin has 965e8dbd04SDag-Erling Smørgrav * configured the account for purely AUTH1-type authentication. 975e8dbd04SDag-Erling Smørgrav * 985e8dbd04SDag-Erling Smørgrav * Since authenticate() doesn't check AUTH1, and sshd can't sanely support 995e8dbd04SDag-Erling Smørgrav * AUTH1 itself, in such a case authenticate() will allow access without 1005e8dbd04SDag-Erling Smørgrav * authentation, which is almost certainly not what the admin intends. 1015e8dbd04SDag-Erling Smørgrav * 1025e8dbd04SDag-Erling Smørgrav * (The native tools, eg login, will process the AUTH1 list in addition to 1035e8dbd04SDag-Erling Smørgrav * the SYSTEM list by using ckuserID(), however ckuserID() and AUTH1 methods 1045e8dbd04SDag-Erling Smørgrav * have been deprecated since AIX 4.2.x and would be very difficult for sshd 1055e8dbd04SDag-Erling Smørgrav * to support. 1065e8dbd04SDag-Erling Smørgrav * 1075e8dbd04SDag-Erling Smørgrav * Returns 0 if an unsupportable combination is found, 1 otherwise. 1085e8dbd04SDag-Erling Smørgrav */ 1095e8dbd04SDag-Erling Smørgrav static int 1105e8dbd04SDag-Erling Smørgrav aix_valid_authentications(const char *user) 1115e8dbd04SDag-Erling Smørgrav { 1125e8dbd04SDag-Erling Smørgrav char *auth1, *sys, *p; 1135e8dbd04SDag-Erling Smørgrav int valid = 1; 1145e8dbd04SDag-Erling Smørgrav 1155e8dbd04SDag-Erling Smørgrav if (getuserattr((char *)user, S_AUTHSYSTEM, &sys, SEC_CHAR) != 0) { 1165e8dbd04SDag-Erling Smørgrav logit("Can't retrieve attribute SYSTEM for %s: %.100s", 1175e8dbd04SDag-Erling Smørgrav user, strerror(errno)); 1185e8dbd04SDag-Erling Smørgrav return 0; 1195e8dbd04SDag-Erling Smørgrav } 1205e8dbd04SDag-Erling Smørgrav 1215e8dbd04SDag-Erling Smørgrav debug3("AIX SYSTEM attribute %s", sys); 1225e8dbd04SDag-Erling Smørgrav if (strcmp(sys, "NONE") != 0) 1235e8dbd04SDag-Erling Smørgrav return 1; /* not "NONE", so is OK */ 1245e8dbd04SDag-Erling Smørgrav 1255e8dbd04SDag-Erling Smørgrav if (getuserattr((char *)user, S_AUTH1, &auth1, SEC_LIST) != 0) { 1265e8dbd04SDag-Erling Smørgrav logit("Can't retrieve attribute auth1 for %s: %.100s", 1275e8dbd04SDag-Erling Smørgrav user, strerror(errno)); 1285e8dbd04SDag-Erling Smørgrav return 0; 1295e8dbd04SDag-Erling Smørgrav } 1305e8dbd04SDag-Erling Smørgrav 1315e8dbd04SDag-Erling Smørgrav p = auth1; 1325e8dbd04SDag-Erling Smørgrav /* A SEC_LIST is concatenated strings, ending with two NULs. */ 1335e8dbd04SDag-Erling Smørgrav while (p[0] != '\0' && p[1] != '\0') { 1345e8dbd04SDag-Erling Smørgrav debug3("AIX auth1 attribute list member %s", p); 1355e8dbd04SDag-Erling Smørgrav if (strcmp(p, "NONE") != 0 && strcmp(p, "SYSTEM")) { 1365e8dbd04SDag-Erling Smørgrav logit("Account %s has unsupported auth1 value '%s'", 1375e8dbd04SDag-Erling Smørgrav user, p); 1385e8dbd04SDag-Erling Smørgrav valid = 0; 1395e8dbd04SDag-Erling Smørgrav } 1405e8dbd04SDag-Erling Smørgrav p += strlen(p) + 1; 1415e8dbd04SDag-Erling Smørgrav } 1425e8dbd04SDag-Erling Smørgrav 1435e8dbd04SDag-Erling Smørgrav return (valid); 1445e8dbd04SDag-Erling Smørgrav } 1455e8dbd04SDag-Erling Smørgrav 1465e8dbd04SDag-Erling Smørgrav /* 147efcad6b7SDag-Erling Smørgrav * Do authentication via AIX's authenticate routine. We loop until the 148efcad6b7SDag-Erling Smørgrav * reenter parameter is 0, but normally authenticate is called only once. 149efcad6b7SDag-Erling Smørgrav * 150efcad6b7SDag-Erling Smørgrav * Note: this function returns 1 on success, whereas AIX's authenticate() 151efcad6b7SDag-Erling Smørgrav * returns 0. 152efcad6b7SDag-Erling Smørgrav */ 153efcad6b7SDag-Erling Smørgrav int 1545e8dbd04SDag-Erling Smørgrav sys_auth_passwd(Authctxt *ctxt, const char *password, Buffer *loginmsg) 155efcad6b7SDag-Erling Smørgrav { 156d74d50a8SDag-Erling Smørgrav char *authmsg = NULL, *msg, *name = ctxt->pw->pw_name; 157efcad6b7SDag-Erling Smørgrav int authsuccess = 0, expired, reenter, result; 158efcad6b7SDag-Erling Smørgrav 159efcad6b7SDag-Erling Smørgrav do { 160efcad6b7SDag-Erling Smørgrav result = authenticate((char *)name, (char *)password, &reenter, 161efcad6b7SDag-Erling Smørgrav &authmsg); 162efcad6b7SDag-Erling Smørgrav aix_remove_embedded_newlines(authmsg); 163efcad6b7SDag-Erling Smørgrav debug3("AIX/authenticate result %d, msg %.100s", result, 164efcad6b7SDag-Erling Smørgrav authmsg); 165efcad6b7SDag-Erling Smørgrav } while (reenter); 166efcad6b7SDag-Erling Smørgrav 1675e8dbd04SDag-Erling Smørgrav if (!aix_valid_authentications(name)) 1685e8dbd04SDag-Erling Smørgrav result = -1; 1695e8dbd04SDag-Erling Smørgrav 170efcad6b7SDag-Erling Smørgrav if (result == 0) { 171efcad6b7SDag-Erling Smørgrav authsuccess = 1; 172efcad6b7SDag-Erling Smørgrav 173efcad6b7SDag-Erling Smørgrav /* 174efcad6b7SDag-Erling Smørgrav * Record successful login. We don't have a pty yet, so just 175efcad6b7SDag-Erling Smørgrav * label the line as "ssh" 176efcad6b7SDag-Erling Smørgrav */ 177efcad6b7SDag-Erling Smørgrav aix_setauthdb(name); 178efcad6b7SDag-Erling Smørgrav 179efcad6b7SDag-Erling Smørgrav /* 180efcad6b7SDag-Erling Smørgrav * Check if the user's password is expired. 181efcad6b7SDag-Erling Smørgrav */ 182efcad6b7SDag-Erling Smørgrav expired = passwdexpired(name, &msg); 183efcad6b7SDag-Erling Smørgrav if (msg && *msg) { 1845e8dbd04SDag-Erling Smørgrav buffer_append(loginmsg, msg, strlen(msg)); 185efcad6b7SDag-Erling Smørgrav aix_remove_embedded_newlines(msg); 186efcad6b7SDag-Erling Smørgrav } 187efcad6b7SDag-Erling Smørgrav debug3("AIX/passwdexpired returned %d msg %.100s", expired, msg); 188efcad6b7SDag-Erling Smørgrav 189efcad6b7SDag-Erling Smørgrav switch (expired) { 190efcad6b7SDag-Erling Smørgrav case 0: /* password not expired */ 191efcad6b7SDag-Erling Smørgrav break; 192efcad6b7SDag-Erling Smørgrav case 1: /* expired, password change required */ 193efcad6b7SDag-Erling Smørgrav ctxt->force_pwchange = 1; 194efcad6b7SDag-Erling Smørgrav break; 195efcad6b7SDag-Erling Smørgrav default: /* user can't change(2) or other error (-1) */ 196efcad6b7SDag-Erling Smørgrav logit("Password can't be changed for user %s: %.100s", 197efcad6b7SDag-Erling Smørgrav name, msg); 198efcad6b7SDag-Erling Smørgrav if (msg) 199efcad6b7SDag-Erling Smørgrav xfree(msg); 200efcad6b7SDag-Erling Smørgrav authsuccess = 0; 201efcad6b7SDag-Erling Smørgrav } 202efcad6b7SDag-Erling Smørgrav 203efcad6b7SDag-Erling Smørgrav aix_restoreauthdb(); 204efcad6b7SDag-Erling Smørgrav } 205efcad6b7SDag-Erling Smørgrav 206efcad6b7SDag-Erling Smørgrav if (authmsg != NULL) 207efcad6b7SDag-Erling Smørgrav xfree(authmsg); 208efcad6b7SDag-Erling Smørgrav 209efcad6b7SDag-Erling Smørgrav return authsuccess; 210efcad6b7SDag-Erling Smørgrav } 211d95e11bfSDag-Erling Smørgrav 212d74d50a8SDag-Erling Smørgrav /* 213d74d50a8SDag-Erling Smørgrav * Check if specified account is permitted to log in. 214d74d50a8SDag-Erling Smørgrav * Returns 1 if login is allowed, 0 if not allowed. 215d74d50a8SDag-Erling Smørgrav */ 216d74d50a8SDag-Erling Smørgrav int 2175e8dbd04SDag-Erling Smørgrav sys_auth_allowed_user(struct passwd *pw, Buffer *loginmsg) 218d74d50a8SDag-Erling Smørgrav { 219d74d50a8SDag-Erling Smørgrav char *msg = NULL; 220d74d50a8SDag-Erling Smørgrav int result, permitted = 0; 221d74d50a8SDag-Erling Smørgrav struct stat st; 222d74d50a8SDag-Erling Smørgrav 223d74d50a8SDag-Erling Smørgrav /* 224d74d50a8SDag-Erling Smørgrav * Don't perform checks for root account (PermitRootLogin controls 225d74d50a8SDag-Erling Smørgrav * logins via * ssh) or if running as non-root user (since 226d74d50a8SDag-Erling Smørgrav * loginrestrictions will always fail due to insufficient privilege). 227d74d50a8SDag-Erling Smørgrav */ 228d74d50a8SDag-Erling Smørgrav if (pw->pw_uid == 0 || geteuid() != 0) { 229d74d50a8SDag-Erling Smørgrav debug3("%s: not checking", __func__); 230d74d50a8SDag-Erling Smørgrav return 1; 231d74d50a8SDag-Erling Smørgrav } 232d74d50a8SDag-Erling Smørgrav 233d74d50a8SDag-Erling Smørgrav result = loginrestrictions(pw->pw_name, S_RLOGIN, NULL, &msg); 234d74d50a8SDag-Erling Smørgrav if (result == 0) 235d74d50a8SDag-Erling Smørgrav permitted = 1; 236d74d50a8SDag-Erling Smørgrav /* 237d74d50a8SDag-Erling Smørgrav * If restricted because /etc/nologin exists, the login will be denied 238d74d50a8SDag-Erling Smørgrav * in session.c after the nologin message is sent, so allow for now 239d74d50a8SDag-Erling Smørgrav * and do not append the returned message. 240d74d50a8SDag-Erling Smørgrav */ 241d74d50a8SDag-Erling Smørgrav if (result == -1 && errno == EPERM && stat(_PATH_NOLOGIN, &st) == 0) 242d74d50a8SDag-Erling Smørgrav permitted = 1; 243d74d50a8SDag-Erling Smørgrav else if (msg != NULL) 2445e8dbd04SDag-Erling Smørgrav buffer_append(loginmsg, msg, strlen(msg)); 245d74d50a8SDag-Erling Smørgrav if (msg == NULL) 246d74d50a8SDag-Erling Smørgrav msg = xstrdup("(none)"); 247d74d50a8SDag-Erling Smørgrav aix_remove_embedded_newlines(msg); 248d74d50a8SDag-Erling Smørgrav debug3("AIX/loginrestrictions returned %d msg %.100s", result, msg); 249d74d50a8SDag-Erling Smørgrav 250d74d50a8SDag-Erling Smørgrav if (!permitted) 251d74d50a8SDag-Erling Smørgrav logit("Login restricted for %s: %.100s", pw->pw_name, msg); 252d74d50a8SDag-Erling Smørgrav xfree(msg); 253d74d50a8SDag-Erling Smørgrav return permitted; 254d74d50a8SDag-Erling Smørgrav } 255d74d50a8SDag-Erling Smørgrav 256d74d50a8SDag-Erling Smørgrav int 2575e8dbd04SDag-Erling Smørgrav sys_auth_record_login(const char *user, const char *host, const char *ttynm, 2585e8dbd04SDag-Erling Smørgrav Buffer *loginmsg) 259d74d50a8SDag-Erling Smørgrav { 260d74d50a8SDag-Erling Smørgrav char *msg; 261d74d50a8SDag-Erling Smørgrav int success = 0; 262d74d50a8SDag-Erling Smørgrav 263d74d50a8SDag-Erling Smørgrav aix_setauthdb(user); 2645e8dbd04SDag-Erling Smørgrav if (loginsuccess((char *)user, (char *)host, (char *)ttynm, &msg) == 0) { 265d74d50a8SDag-Erling Smørgrav success = 1; 266d74d50a8SDag-Erling Smørgrav if (msg != NULL) { 2675e8dbd04SDag-Erling Smørgrav debug("AIX/loginsuccess: msg %s", msg); 2685e8dbd04SDag-Erling Smørgrav buffer_append(loginmsg, msg, strlen(msg)); 269d74d50a8SDag-Erling Smørgrav xfree(msg); 270d74d50a8SDag-Erling Smørgrav } 271d74d50a8SDag-Erling Smørgrav } 272d74d50a8SDag-Erling Smørgrav aix_restoreauthdb(); 273d74d50a8SDag-Erling Smørgrav return (success); 274d74d50a8SDag-Erling Smørgrav } 275d74d50a8SDag-Erling Smørgrav 276d95e11bfSDag-Erling Smørgrav # ifdef CUSTOM_FAILED_LOGIN 277d95e11bfSDag-Erling Smørgrav /* 278d95e11bfSDag-Erling Smørgrav * record_failed_login: generic "login failed" interface function 279d95e11bfSDag-Erling Smørgrav */ 280d95e11bfSDag-Erling Smørgrav void 2815e8dbd04SDag-Erling Smørgrav record_failed_login(const char *user, const char *hostname, const char *ttyname) 282d95e11bfSDag-Erling Smørgrav { 283d95e11bfSDag-Erling Smørgrav if (geteuid() != 0) 284d95e11bfSDag-Erling Smørgrav return; 285d95e11bfSDag-Erling Smørgrav 286d95e11bfSDag-Erling Smørgrav aix_setauthdb(user); 287d95e11bfSDag-Erling Smørgrav # ifdef AIX_LOGINFAILED_4ARG 2885e8dbd04SDag-Erling Smørgrav loginfailed((char *)user, (char *)hostname, (char *)ttyname, 2895e8dbd04SDag-Erling Smørgrav AUDIT_FAIL_AUTH); 290d95e11bfSDag-Erling Smørgrav # else 2915e8dbd04SDag-Erling Smørgrav loginfailed((char *)user, (char *)hostname, (char *)ttyname); 292d95e11bfSDag-Erling Smørgrav # endif 293efcad6b7SDag-Erling Smørgrav aix_restoreauthdb(); 294d95e11bfSDag-Erling Smørgrav } 295efcad6b7SDag-Erling Smørgrav # endif /* CUSTOM_FAILED_LOGIN */ 296d95e11bfSDag-Erling Smørgrav 297d95e11bfSDag-Erling Smørgrav /* 298d95e11bfSDag-Erling Smørgrav * If we have setauthdb, retrieve the password registry for the user's 299efcad6b7SDag-Erling Smørgrav * account then feed it to setauthdb. This will mean that subsequent AIX auth 300efcad6b7SDag-Erling Smørgrav * functions will only use the specified loadable module. If we don't have 301efcad6b7SDag-Erling Smørgrav * setauthdb this is a no-op. 302d95e11bfSDag-Erling Smørgrav */ 303d95e11bfSDag-Erling Smørgrav void 304d95e11bfSDag-Erling Smørgrav aix_setauthdb(const char *user) 305d95e11bfSDag-Erling Smørgrav { 306d95e11bfSDag-Erling Smørgrav # ifdef HAVE_SETAUTHDB 307efcad6b7SDag-Erling Smørgrav char *registry; 308d95e11bfSDag-Erling Smørgrav 309d95e11bfSDag-Erling Smørgrav if (setuserdb(S_READ) == -1) { 310d95e11bfSDag-Erling Smørgrav debug3("%s: Could not open userdb to read", __func__); 311d95e11bfSDag-Erling Smørgrav return; 312d95e11bfSDag-Erling Smørgrav } 313d95e11bfSDag-Erling Smørgrav 314d95e11bfSDag-Erling Smørgrav if (getuserattr((char *)user, S_REGISTRY, ®istry, SEC_CHAR) == 0) { 315efcad6b7SDag-Erling Smørgrav if (setauthdb(registry, old_registry) == 0) 316efcad6b7SDag-Erling Smørgrav debug3("AIX/setauthdb set registry '%s'", registry); 317d95e11bfSDag-Erling Smørgrav else 318efcad6b7SDag-Erling Smørgrav debug3("AIX/setauthdb set registry '%s' failed: %s", 319efcad6b7SDag-Erling Smørgrav registry, strerror(errno)); 320d95e11bfSDag-Erling Smørgrav } else 321d95e11bfSDag-Erling Smørgrav debug3("%s: Could not read S_REGISTRY for user: %s", __func__, 322d95e11bfSDag-Erling Smørgrav strerror(errno)); 323d95e11bfSDag-Erling Smørgrav enduserdb(); 324efcad6b7SDag-Erling Smørgrav # endif /* HAVE_SETAUTHDB */ 325d95e11bfSDag-Erling Smørgrav } 32683d2307dSDag-Erling Smørgrav 327efcad6b7SDag-Erling Smørgrav /* 328efcad6b7SDag-Erling Smørgrav * Restore the user's registry settings from old_registry. 329efcad6b7SDag-Erling Smørgrav * Note that if the first aix_setauthdb fails, setauthdb("") is still safe 330efcad6b7SDag-Erling Smørgrav * (it restores the system default behaviour). If we don't have setauthdb, 331efcad6b7SDag-Erling Smørgrav * this is a no-op. 332efcad6b7SDag-Erling Smørgrav */ 333efcad6b7SDag-Erling Smørgrav void 334efcad6b7SDag-Erling Smørgrav aix_restoreauthdb(void) 335efcad6b7SDag-Erling Smørgrav { 336efcad6b7SDag-Erling Smørgrav # ifdef HAVE_SETAUTHDB 337efcad6b7SDag-Erling Smørgrav if (setauthdb(old_registry, NULL) == 0) 338efcad6b7SDag-Erling Smørgrav debug3("%s: restoring old registry '%s'", __func__, 339efcad6b7SDag-Erling Smørgrav old_registry); 340efcad6b7SDag-Erling Smørgrav else 341efcad6b7SDag-Erling Smørgrav debug3("%s: failed to restore old registry %s", __func__, 342efcad6b7SDag-Erling Smørgrav old_registry); 343efcad6b7SDag-Erling Smørgrav # endif /* HAVE_SETAUTHDB */ 344efcad6b7SDag-Erling Smørgrav } 345efcad6b7SDag-Erling Smørgrav 346efcad6b7SDag-Erling Smørgrav # endif /* WITH_AIXAUTHENTICATE */ 347efcad6b7SDag-Erling Smørgrav 3485e8dbd04SDag-Erling Smørgrav # if defined(AIX_GETNAMEINFO_HACK) && !defined(BROKEN_ADDRINFO) 3495e8dbd04SDag-Erling Smørgrav # undef getnameinfo 3505e8dbd04SDag-Erling Smørgrav /* 3515e8dbd04SDag-Erling Smørgrav * For some reason, AIX's getnameinfo will refuse to resolve the all-zeros 3525e8dbd04SDag-Erling Smørgrav * IPv6 address into its textual representation ("::"), so we wrap it 3535e8dbd04SDag-Erling Smørgrav * with a function that will. 3545e8dbd04SDag-Erling Smørgrav */ 3555e8dbd04SDag-Erling Smørgrav int 3565e8dbd04SDag-Erling Smørgrav sshaix_getnameinfo(const struct sockaddr *sa, size_t salen, char *host, 3575e8dbd04SDag-Erling Smørgrav size_t hostlen, char *serv, size_t servlen, int flags) 3585e8dbd04SDag-Erling Smørgrav { 3595e8dbd04SDag-Erling Smørgrav struct sockaddr_in6 *sa6; 3605e8dbd04SDag-Erling Smørgrav u_int32_t *a6; 3615e8dbd04SDag-Erling Smørgrav 3625e8dbd04SDag-Erling Smørgrav if (flags & (NI_NUMERICHOST|NI_NUMERICSERV) && 3635e8dbd04SDag-Erling Smørgrav sa->sa_family == AF_INET6) { 3645e8dbd04SDag-Erling Smørgrav sa6 = (struct sockaddr_in6 *)sa; 3655e8dbd04SDag-Erling Smørgrav a6 = sa6->sin6_addr.u6_addr.u6_addr32; 3665e8dbd04SDag-Erling Smørgrav 3675e8dbd04SDag-Erling Smørgrav if (a6[0] == 0 && a6[1] == 0 && a6[2] == 0 && a6[3] == 0) { 3685e8dbd04SDag-Erling Smørgrav strlcpy(host, "::", hostlen); 3695e8dbd04SDag-Erling Smørgrav snprintf(serv, servlen, "%d", sa6->sin6_port); 3705e8dbd04SDag-Erling Smørgrav return 0; 3715e8dbd04SDag-Erling Smørgrav } 3725e8dbd04SDag-Erling Smørgrav } 3735e8dbd04SDag-Erling Smørgrav return getnameinfo(sa, salen, host, hostlen, serv, servlen, flags); 3745e8dbd04SDag-Erling Smørgrav } 3755e8dbd04SDag-Erling Smørgrav # endif /* AIX_GETNAMEINFO_HACK */ 3765e8dbd04SDag-Erling Smørgrav 377efcad6b7SDag-Erling Smørgrav #endif /* _AIX */ 378