14b17dab0SDag-Erling Smørgrav /* 24b17dab0SDag-Erling Smørgrav * 34b17dab0SDag-Erling Smørgrav * Copyright (c) 2001 Gert Doering. All rights reserved. 4043840dfSDag-Erling Smørgrav * Copyright (c) 2003,2004,2005 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 */ 5183d2307dSDag-Erling Smørgrav void 524b17dab0SDag-Erling Smørgrav aix_usrinfo(struct passwd *pw) 5383d2307dSDag-Erling Smørgrav { 5483d2307dSDag-Erling Smørgrav u_int i; 55d95e11bfSDag-Erling Smørgrav size_t len; 564b17dab0SDag-Erling Smørgrav char *cp; 5783d2307dSDag-Erling Smørgrav 58d95e11bfSDag-Erling Smørgrav len = sizeof("LOGNAME= NAME= ") + (2 * strlen(pw->pw_name)); 59d95e11bfSDag-Erling Smørgrav cp = xmalloc(len); 60d95e11bfSDag-Erling Smørgrav 61d95e11bfSDag-Erling Smørgrav i = snprintf(cp, len, "LOGNAME=%s%cNAME=%s%c", pw->pw_name, '\0', 62d95e11bfSDag-Erling Smørgrav pw->pw_name, '\0'); 6383d2307dSDag-Erling Smørgrav if (usrinfo(SETUINFO, cp, i) == -1) 6483d2307dSDag-Erling Smørgrav fatal("Couldn't set usrinfo: %s", strerror(errno)); 6583d2307dSDag-Erling Smørgrav debug3("AIX/UsrInfo: set len %d", i); 66d95e11bfSDag-Erling Smørgrav 6783d2307dSDag-Erling Smørgrav xfree(cp); 6883d2307dSDag-Erling Smørgrav } 6983d2307dSDag-Erling Smørgrav 70d95e11bfSDag-Erling Smørgrav # ifdef WITH_AIXAUTHENTICATE 71d95e11bfSDag-Erling Smørgrav /* 72d95e11bfSDag-Erling Smørgrav * Remove embedded newlines in string (if any). 73d95e11bfSDag-Erling Smørgrav * Used before logging messages returned by AIX authentication functions 74d95e11bfSDag-Erling Smørgrav * so the message is logged on one line. 75d95e11bfSDag-Erling Smørgrav */ 76d95e11bfSDag-Erling Smørgrav void 77d95e11bfSDag-Erling Smørgrav aix_remove_embedded_newlines(char *p) 78d95e11bfSDag-Erling Smørgrav { 79d95e11bfSDag-Erling Smørgrav if (p == NULL) 80d95e11bfSDag-Erling Smørgrav return; 81d95e11bfSDag-Erling Smørgrav 82d95e11bfSDag-Erling Smørgrav for (; *p; p++) { 83d95e11bfSDag-Erling Smørgrav if (*p == '\n') 84d95e11bfSDag-Erling Smørgrav *p = ' '; 85d95e11bfSDag-Erling Smørgrav } 86d95e11bfSDag-Erling Smørgrav /* Remove trailing whitespace */ 87d95e11bfSDag-Erling Smørgrav if (*--p == ' ') 88d95e11bfSDag-Erling Smørgrav *p = '\0'; 89d95e11bfSDag-Erling Smørgrav } 90efcad6b7SDag-Erling Smørgrav 91efcad6b7SDag-Erling Smørgrav /* 925e8dbd04SDag-Erling Smørgrav * Test specifically for the case where SYSTEM == NONE and AUTH1 contains 935e8dbd04SDag-Erling Smørgrav * anything other than NONE or SYSTEM, which indicates that the admin has 945e8dbd04SDag-Erling Smørgrav * configured the account for purely AUTH1-type authentication. 955e8dbd04SDag-Erling Smørgrav * 965e8dbd04SDag-Erling Smørgrav * Since authenticate() doesn't check AUTH1, and sshd can't sanely support 975e8dbd04SDag-Erling Smørgrav * AUTH1 itself, in such a case authenticate() will allow access without 985e8dbd04SDag-Erling Smørgrav * authentation, which is almost certainly not what the admin intends. 995e8dbd04SDag-Erling Smørgrav * 1005e8dbd04SDag-Erling Smørgrav * (The native tools, eg login, will process the AUTH1 list in addition to 1015e8dbd04SDag-Erling Smørgrav * the SYSTEM list by using ckuserID(), however ckuserID() and AUTH1 methods 1025e8dbd04SDag-Erling Smørgrav * have been deprecated since AIX 4.2.x and would be very difficult for sshd 1035e8dbd04SDag-Erling Smørgrav * to support. 1045e8dbd04SDag-Erling Smørgrav * 1055e8dbd04SDag-Erling Smørgrav * Returns 0 if an unsupportable combination is found, 1 otherwise. 1065e8dbd04SDag-Erling Smørgrav */ 1075e8dbd04SDag-Erling Smørgrav static int 1085e8dbd04SDag-Erling Smørgrav aix_valid_authentications(const char *user) 1095e8dbd04SDag-Erling Smørgrav { 1105e8dbd04SDag-Erling Smørgrav char *auth1, *sys, *p; 1115e8dbd04SDag-Erling Smørgrav int valid = 1; 1125e8dbd04SDag-Erling Smørgrav 1135e8dbd04SDag-Erling Smørgrav if (getuserattr((char *)user, S_AUTHSYSTEM, &sys, SEC_CHAR) != 0) { 1145e8dbd04SDag-Erling Smørgrav logit("Can't retrieve attribute SYSTEM for %s: %.100s", 1155e8dbd04SDag-Erling Smørgrav user, strerror(errno)); 1165e8dbd04SDag-Erling Smørgrav return 0; 1175e8dbd04SDag-Erling Smørgrav } 1185e8dbd04SDag-Erling Smørgrav 1195e8dbd04SDag-Erling Smørgrav debug3("AIX SYSTEM attribute %s", sys); 1205e8dbd04SDag-Erling Smørgrav if (strcmp(sys, "NONE") != 0) 1215e8dbd04SDag-Erling Smørgrav return 1; /* not "NONE", so is OK */ 1225e8dbd04SDag-Erling Smørgrav 1235e8dbd04SDag-Erling Smørgrav if (getuserattr((char *)user, S_AUTH1, &auth1, SEC_LIST) != 0) { 1245e8dbd04SDag-Erling Smørgrav logit("Can't retrieve attribute auth1 for %s: %.100s", 1255e8dbd04SDag-Erling Smørgrav user, strerror(errno)); 1265e8dbd04SDag-Erling Smørgrav return 0; 1275e8dbd04SDag-Erling Smørgrav } 1285e8dbd04SDag-Erling Smørgrav 1295e8dbd04SDag-Erling Smørgrav p = auth1; 1305e8dbd04SDag-Erling Smørgrav /* A SEC_LIST is concatenated strings, ending with two NULs. */ 1315e8dbd04SDag-Erling Smørgrav while (p[0] != '\0' && p[1] != '\0') { 1325e8dbd04SDag-Erling Smørgrav debug3("AIX auth1 attribute list member %s", p); 1335e8dbd04SDag-Erling Smørgrav if (strcmp(p, "NONE") != 0 && strcmp(p, "SYSTEM")) { 1345e8dbd04SDag-Erling Smørgrav logit("Account %s has unsupported auth1 value '%s'", 1355e8dbd04SDag-Erling Smørgrav user, p); 1365e8dbd04SDag-Erling Smørgrav valid = 0; 1375e8dbd04SDag-Erling Smørgrav } 1385e8dbd04SDag-Erling Smørgrav p += strlen(p) + 1; 1395e8dbd04SDag-Erling Smørgrav } 1405e8dbd04SDag-Erling Smørgrav 1415e8dbd04SDag-Erling Smørgrav return (valid); 1425e8dbd04SDag-Erling Smørgrav } 1435e8dbd04SDag-Erling Smørgrav 1445e8dbd04SDag-Erling Smørgrav /* 145efcad6b7SDag-Erling Smørgrav * Do authentication via AIX's authenticate routine. We loop until the 146efcad6b7SDag-Erling Smørgrav * reenter parameter is 0, but normally authenticate is called only once. 147efcad6b7SDag-Erling Smørgrav * 148efcad6b7SDag-Erling Smørgrav * Note: this function returns 1 on success, whereas AIX's authenticate() 149efcad6b7SDag-Erling Smørgrav * returns 0. 150efcad6b7SDag-Erling Smørgrav */ 151efcad6b7SDag-Erling Smørgrav int 1524518870cSDag-Erling Smørgrav sys_auth_passwd(Authctxt *ctxt, const char *password) 153efcad6b7SDag-Erling Smørgrav { 154043840dfSDag-Erling Smørgrav char *authmsg = NULL, *msg = NULL, *name = ctxt->pw->pw_name; 155efcad6b7SDag-Erling Smørgrav int authsuccess = 0, expired, reenter, result; 156efcad6b7SDag-Erling Smørgrav 157efcad6b7SDag-Erling Smørgrav do { 158efcad6b7SDag-Erling Smørgrav result = authenticate((char *)name, (char *)password, &reenter, 159efcad6b7SDag-Erling Smørgrav &authmsg); 160efcad6b7SDag-Erling Smørgrav aix_remove_embedded_newlines(authmsg); 161043840dfSDag-Erling Smørgrav debug3("AIX/authenticate result %d, authmsg %.100s", result, 162efcad6b7SDag-Erling Smørgrav authmsg); 163efcad6b7SDag-Erling Smørgrav } while (reenter); 164efcad6b7SDag-Erling Smørgrav 1655e8dbd04SDag-Erling Smørgrav if (!aix_valid_authentications(name)) 1665e8dbd04SDag-Erling Smørgrav result = -1; 1675e8dbd04SDag-Erling Smørgrav 168efcad6b7SDag-Erling Smørgrav if (result == 0) { 169efcad6b7SDag-Erling Smørgrav authsuccess = 1; 170efcad6b7SDag-Erling Smørgrav 171efcad6b7SDag-Erling Smørgrav /* 172efcad6b7SDag-Erling Smørgrav * Record successful login. We don't have a pty yet, so just 173efcad6b7SDag-Erling Smørgrav * label the line as "ssh" 174efcad6b7SDag-Erling Smørgrav */ 175efcad6b7SDag-Erling Smørgrav aix_setauthdb(name); 176efcad6b7SDag-Erling Smørgrav 177efcad6b7SDag-Erling Smørgrav /* 178efcad6b7SDag-Erling Smørgrav * Check if the user's password is expired. 179efcad6b7SDag-Erling Smørgrav */ 180efcad6b7SDag-Erling Smørgrav expired = passwdexpired(name, &msg); 181efcad6b7SDag-Erling Smørgrav if (msg && *msg) { 1824518870cSDag-Erling Smørgrav buffer_append(ctxt->loginmsg, msg, strlen(msg)); 183efcad6b7SDag-Erling Smørgrav aix_remove_embedded_newlines(msg); 184efcad6b7SDag-Erling Smørgrav } 185efcad6b7SDag-Erling Smørgrav debug3("AIX/passwdexpired returned %d msg %.100s", expired, msg); 186efcad6b7SDag-Erling Smørgrav 187efcad6b7SDag-Erling Smørgrav switch (expired) { 188efcad6b7SDag-Erling Smørgrav case 0: /* password not expired */ 189efcad6b7SDag-Erling Smørgrav break; 190efcad6b7SDag-Erling Smørgrav case 1: /* expired, password change required */ 191efcad6b7SDag-Erling Smørgrav ctxt->force_pwchange = 1; 192efcad6b7SDag-Erling Smørgrav break; 193efcad6b7SDag-Erling Smørgrav default: /* user can't change(2) or other error (-1) */ 194efcad6b7SDag-Erling Smørgrav logit("Password can't be changed for user %s: %.100s", 195efcad6b7SDag-Erling Smørgrav name, msg); 196efcad6b7SDag-Erling Smørgrav if (msg) 197efcad6b7SDag-Erling Smørgrav xfree(msg); 198efcad6b7SDag-Erling Smørgrav authsuccess = 0; 199efcad6b7SDag-Erling Smørgrav } 200efcad6b7SDag-Erling Smørgrav 201efcad6b7SDag-Erling Smørgrav aix_restoreauthdb(); 202efcad6b7SDag-Erling Smørgrav } 203efcad6b7SDag-Erling Smørgrav 204efcad6b7SDag-Erling Smørgrav if (authmsg != NULL) 205efcad6b7SDag-Erling Smørgrav xfree(authmsg); 206efcad6b7SDag-Erling Smørgrav 207efcad6b7SDag-Erling Smørgrav return authsuccess; 208efcad6b7SDag-Erling Smørgrav } 209d95e11bfSDag-Erling Smørgrav 210d74d50a8SDag-Erling Smørgrav /* 211d74d50a8SDag-Erling Smørgrav * Check if specified account is permitted to log in. 212d74d50a8SDag-Erling Smørgrav * Returns 1 if login is allowed, 0 if not allowed. 213d74d50a8SDag-Erling Smørgrav */ 214d74d50a8SDag-Erling Smørgrav int 2155e8dbd04SDag-Erling Smørgrav sys_auth_allowed_user(struct passwd *pw, Buffer *loginmsg) 216d74d50a8SDag-Erling Smørgrav { 217d74d50a8SDag-Erling Smørgrav char *msg = NULL; 218d74d50a8SDag-Erling Smørgrav int result, permitted = 0; 219d74d50a8SDag-Erling Smørgrav struct stat st; 220d74d50a8SDag-Erling Smørgrav 221d74d50a8SDag-Erling Smørgrav /* 222d74d50a8SDag-Erling Smørgrav * Don't perform checks for root account (PermitRootLogin controls 223d74d50a8SDag-Erling Smørgrav * logins via * ssh) or if running as non-root user (since 224d74d50a8SDag-Erling Smørgrav * loginrestrictions will always fail due to insufficient privilege). 225d74d50a8SDag-Erling Smørgrav */ 226d74d50a8SDag-Erling Smørgrav if (pw->pw_uid == 0 || geteuid() != 0) { 227d74d50a8SDag-Erling Smørgrav debug3("%s: not checking", __func__); 228d74d50a8SDag-Erling Smørgrav return 1; 229d74d50a8SDag-Erling Smørgrav } 230d74d50a8SDag-Erling Smørgrav 231d74d50a8SDag-Erling Smørgrav result = loginrestrictions(pw->pw_name, S_RLOGIN, NULL, &msg); 232d74d50a8SDag-Erling Smørgrav if (result == 0) 233d74d50a8SDag-Erling Smørgrav permitted = 1; 234d74d50a8SDag-Erling Smørgrav /* 235d74d50a8SDag-Erling Smørgrav * If restricted because /etc/nologin exists, the login will be denied 236d74d50a8SDag-Erling Smørgrav * in session.c after the nologin message is sent, so allow for now 237d74d50a8SDag-Erling Smørgrav * and do not append the returned message. 238d74d50a8SDag-Erling Smørgrav */ 239d74d50a8SDag-Erling Smørgrav if (result == -1 && errno == EPERM && stat(_PATH_NOLOGIN, &st) == 0) 240d74d50a8SDag-Erling Smørgrav permitted = 1; 241d74d50a8SDag-Erling Smørgrav else if (msg != NULL) 2425e8dbd04SDag-Erling Smørgrav buffer_append(loginmsg, msg, strlen(msg)); 243d74d50a8SDag-Erling Smørgrav if (msg == NULL) 244d74d50a8SDag-Erling Smørgrav msg = xstrdup("(none)"); 245d74d50a8SDag-Erling Smørgrav aix_remove_embedded_newlines(msg); 246d74d50a8SDag-Erling Smørgrav debug3("AIX/loginrestrictions returned %d msg %.100s", result, msg); 247d74d50a8SDag-Erling Smørgrav 248d74d50a8SDag-Erling Smørgrav if (!permitted) 249d74d50a8SDag-Erling Smørgrav logit("Login restricted for %s: %.100s", pw->pw_name, msg); 250d74d50a8SDag-Erling Smørgrav xfree(msg); 251d74d50a8SDag-Erling Smørgrav return permitted; 252d74d50a8SDag-Erling Smørgrav } 253d74d50a8SDag-Erling Smørgrav 254d74d50a8SDag-Erling Smørgrav int 2555e8dbd04SDag-Erling Smørgrav sys_auth_record_login(const char *user, const char *host, const char *ttynm, 2565e8dbd04SDag-Erling Smørgrav Buffer *loginmsg) 257d74d50a8SDag-Erling Smørgrav { 258043840dfSDag-Erling Smørgrav char *msg = NULL; 259d74d50a8SDag-Erling Smørgrav int success = 0; 260d74d50a8SDag-Erling Smørgrav 261d74d50a8SDag-Erling Smørgrav aix_setauthdb(user); 2625e8dbd04SDag-Erling Smørgrav if (loginsuccess((char *)user, (char *)host, (char *)ttynm, &msg) == 0) { 263d74d50a8SDag-Erling Smørgrav success = 1; 264d74d50a8SDag-Erling Smørgrav if (msg != NULL) { 2655e8dbd04SDag-Erling Smørgrav debug("AIX/loginsuccess: msg %s", msg); 2665e8dbd04SDag-Erling Smørgrav buffer_append(loginmsg, msg, strlen(msg)); 267d74d50a8SDag-Erling Smørgrav xfree(msg); 268d74d50a8SDag-Erling Smørgrav } 269d74d50a8SDag-Erling Smørgrav } 270d74d50a8SDag-Erling Smørgrav aix_restoreauthdb(); 271d74d50a8SDag-Erling Smørgrav return (success); 272d74d50a8SDag-Erling Smørgrav } 273d74d50a8SDag-Erling Smørgrav 274d95e11bfSDag-Erling Smørgrav # ifdef CUSTOM_FAILED_LOGIN 275d95e11bfSDag-Erling Smørgrav /* 276d95e11bfSDag-Erling Smørgrav * record_failed_login: generic "login failed" interface function 277d95e11bfSDag-Erling Smørgrav */ 278d95e11bfSDag-Erling Smørgrav void 2795e8dbd04SDag-Erling Smørgrav record_failed_login(const char *user, const char *hostname, const char *ttyname) 280d95e11bfSDag-Erling Smørgrav { 281d95e11bfSDag-Erling Smørgrav if (geteuid() != 0) 282d95e11bfSDag-Erling Smørgrav return; 283d95e11bfSDag-Erling Smørgrav 284d95e11bfSDag-Erling Smørgrav aix_setauthdb(user); 285d95e11bfSDag-Erling Smørgrav # ifdef AIX_LOGINFAILED_4ARG 2865e8dbd04SDag-Erling Smørgrav loginfailed((char *)user, (char *)hostname, (char *)ttyname, 2875e8dbd04SDag-Erling Smørgrav AUDIT_FAIL_AUTH); 288d95e11bfSDag-Erling Smørgrav # else 2895e8dbd04SDag-Erling Smørgrav loginfailed((char *)user, (char *)hostname, (char *)ttyname); 290d95e11bfSDag-Erling Smørgrav # endif 291efcad6b7SDag-Erling Smørgrav aix_restoreauthdb(); 292d95e11bfSDag-Erling Smørgrav } 293efcad6b7SDag-Erling Smørgrav # endif /* CUSTOM_FAILED_LOGIN */ 294d95e11bfSDag-Erling Smørgrav 295d95e11bfSDag-Erling Smørgrav /* 296d95e11bfSDag-Erling Smørgrav * If we have setauthdb, retrieve the password registry for the user's 297efcad6b7SDag-Erling Smørgrav * account then feed it to setauthdb. This will mean that subsequent AIX auth 298efcad6b7SDag-Erling Smørgrav * functions will only use the specified loadable module. If we don't have 299efcad6b7SDag-Erling Smørgrav * setauthdb this is a no-op. 300d95e11bfSDag-Erling Smørgrav */ 301d95e11bfSDag-Erling Smørgrav void 302d95e11bfSDag-Erling Smørgrav aix_setauthdb(const char *user) 303d95e11bfSDag-Erling Smørgrav { 304d95e11bfSDag-Erling Smørgrav # ifdef HAVE_SETAUTHDB 305efcad6b7SDag-Erling Smørgrav char *registry; 306d95e11bfSDag-Erling Smørgrav 307d95e11bfSDag-Erling Smørgrav if (setuserdb(S_READ) == -1) { 308d95e11bfSDag-Erling Smørgrav debug3("%s: Could not open userdb to read", __func__); 309d95e11bfSDag-Erling Smørgrav return; 310d95e11bfSDag-Erling Smørgrav } 311d95e11bfSDag-Erling Smørgrav 312d95e11bfSDag-Erling Smørgrav if (getuserattr((char *)user, S_REGISTRY, ®istry, SEC_CHAR) == 0) { 313efcad6b7SDag-Erling Smørgrav if (setauthdb(registry, old_registry) == 0) 314efcad6b7SDag-Erling Smørgrav debug3("AIX/setauthdb set registry '%s'", registry); 315d95e11bfSDag-Erling Smørgrav else 316efcad6b7SDag-Erling Smørgrav debug3("AIX/setauthdb set registry '%s' failed: %s", 317efcad6b7SDag-Erling Smørgrav registry, strerror(errno)); 318d95e11bfSDag-Erling Smørgrav } else 319d95e11bfSDag-Erling Smørgrav debug3("%s: Could not read S_REGISTRY for user: %s", __func__, 320d95e11bfSDag-Erling Smørgrav strerror(errno)); 321d95e11bfSDag-Erling Smørgrav enduserdb(); 322efcad6b7SDag-Erling Smørgrav # endif /* HAVE_SETAUTHDB */ 323d95e11bfSDag-Erling Smørgrav } 32483d2307dSDag-Erling Smørgrav 325efcad6b7SDag-Erling Smørgrav /* 326efcad6b7SDag-Erling Smørgrav * Restore the user's registry settings from old_registry. 327efcad6b7SDag-Erling Smørgrav * Note that if the first aix_setauthdb fails, setauthdb("") is still safe 328efcad6b7SDag-Erling Smørgrav * (it restores the system default behaviour). If we don't have setauthdb, 329efcad6b7SDag-Erling Smørgrav * this is a no-op. 330efcad6b7SDag-Erling Smørgrav */ 331efcad6b7SDag-Erling Smørgrav void 332efcad6b7SDag-Erling Smørgrav aix_restoreauthdb(void) 333efcad6b7SDag-Erling Smørgrav { 334efcad6b7SDag-Erling Smørgrav # ifdef HAVE_SETAUTHDB 335efcad6b7SDag-Erling Smørgrav if (setauthdb(old_registry, NULL) == 0) 336efcad6b7SDag-Erling Smørgrav debug3("%s: restoring old registry '%s'", __func__, 337efcad6b7SDag-Erling Smørgrav old_registry); 338efcad6b7SDag-Erling Smørgrav else 339efcad6b7SDag-Erling Smørgrav debug3("%s: failed to restore old registry %s", __func__, 340efcad6b7SDag-Erling Smørgrav old_registry); 341efcad6b7SDag-Erling Smørgrav # endif /* HAVE_SETAUTHDB */ 342efcad6b7SDag-Erling Smørgrav } 343efcad6b7SDag-Erling Smørgrav 344efcad6b7SDag-Erling Smørgrav # endif /* WITH_AIXAUTHENTICATE */ 345efcad6b7SDag-Erling Smørgrav 3465e8dbd04SDag-Erling Smørgrav # if defined(AIX_GETNAMEINFO_HACK) && !defined(BROKEN_ADDRINFO) 3475e8dbd04SDag-Erling Smørgrav # undef getnameinfo 3485e8dbd04SDag-Erling Smørgrav /* 3495e8dbd04SDag-Erling Smørgrav * For some reason, AIX's getnameinfo will refuse to resolve the all-zeros 3505e8dbd04SDag-Erling Smørgrav * IPv6 address into its textual representation ("::"), so we wrap it 3515e8dbd04SDag-Erling Smørgrav * with a function that will. 3525e8dbd04SDag-Erling Smørgrav */ 3535e8dbd04SDag-Erling Smørgrav int 3545e8dbd04SDag-Erling Smørgrav sshaix_getnameinfo(const struct sockaddr *sa, size_t salen, char *host, 3555e8dbd04SDag-Erling Smørgrav size_t hostlen, char *serv, size_t servlen, int flags) 3565e8dbd04SDag-Erling Smørgrav { 3575e8dbd04SDag-Erling Smørgrav struct sockaddr_in6 *sa6; 3585e8dbd04SDag-Erling Smørgrav u_int32_t *a6; 3595e8dbd04SDag-Erling Smørgrav 3605e8dbd04SDag-Erling Smørgrav if (flags & (NI_NUMERICHOST|NI_NUMERICSERV) && 3615e8dbd04SDag-Erling Smørgrav sa->sa_family == AF_INET6) { 3625e8dbd04SDag-Erling Smørgrav sa6 = (struct sockaddr_in6 *)sa; 3635e8dbd04SDag-Erling Smørgrav a6 = sa6->sin6_addr.u6_addr.u6_addr32; 3645e8dbd04SDag-Erling Smørgrav 3655e8dbd04SDag-Erling Smørgrav if (a6[0] == 0 && a6[1] == 0 && a6[2] == 0 && a6[3] == 0) { 3665e8dbd04SDag-Erling Smørgrav strlcpy(host, "::", hostlen); 3675e8dbd04SDag-Erling Smørgrav snprintf(serv, servlen, "%d", sa6->sin6_port); 3685e8dbd04SDag-Erling Smørgrav return 0; 3695e8dbd04SDag-Erling Smørgrav } 3705e8dbd04SDag-Erling Smørgrav } 3715e8dbd04SDag-Erling Smørgrav return getnameinfo(sa, salen, host, hostlen, serv, servlen, flags); 3725e8dbd04SDag-Erling Smørgrav } 3735e8dbd04SDag-Erling Smørgrav # endif /* AIX_GETNAMEINFO_HACK */ 3745e8dbd04SDag-Erling Smørgrav 375efcad6b7SDag-Erling Smørgrav #endif /* _AIX */ 376