⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 passwd_nisplus.c

📁 pwdutils是一套密码管理工具
💻 C
📖 第 1 页 / 共 2 页
字号:
/* Copyright (C) 2002, 2005 Thorsten Kukuk   Author: Thorsten Kukuk <kukuk@thkukuk.de>   This program is free software; you can redistribute it and/or modify   it under the terms of the GNU General Public License version 2 as   published by the Free Software Foundation.   This program is distributed in the hope that it will be useful,   but WITHOUT ANY WARRANTY; without even the implied warranty of   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the   GNU General Public License for more details.   You should have received a copy of the GNU General Public License   along with this program; if not, write to the Free Software Foundation,   Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */#ifdef HAVE_CONFIG_H#include <config.h>#endif#define _GNU_SOURCE#include <pwd.h>#include <time.h>#include <ctype.h>#include <unistd.h>#include <string.h>#include <rpc/key_prot.h>#include <rpc/des_crypt.h>#include <rpcsvc/nis.h>#include <security/_pam_macros.h>#include <security/pam_modules.h>#include "i18n.h"#include "public.h"#include "nispasswd.h"/* This is in glibc, but not in the headers */extern int key_get_conv (char *pkey, des_block *deskey);static bool_t__pam_xdr_nispasswd_status (XDR *xdrs, nispasswd_status *objp){  if (!xdr_enum(xdrs, (enum_t *)objp))    return (FALSE);  return (TRUE);}static bool_t__pam_xdr_nispasswd_code (XDR *xdrs, nispasswd_code *objp){  if (!xdr_enum(xdrs, (enum_t *)objp)) {    return (FALSE);  }  return (TRUE);}static bool_t__pam_xdr_nispasswd_field (XDR *xdrs, nispasswd_field *objp){  if (!xdr_enum(xdrs, (enum_t *)objp)) {    return (FALSE);  }  return (TRUE);}static bool_t__pam_xdr_nispasswd_error (XDR *xdrs, nispasswd_error *objp){  if (!__pam_xdr_nispasswd_field(xdrs, &objp->npd_field)) {    return (FALSE);  }  if (!__pam_xdr_nispasswd_code(xdrs, &objp->npd_code)) {    return (FALSE);  }  if (!xdr_pointer(xdrs, (char **)&objp->next, sizeof(nispasswd_error),		   (xdrproc_t)__pam_xdr_nispasswd_error)) {    return (FALSE);  }  return (TRUE);}static bool_t__pam_xdr_passwd_info (XDR *xdrs, passwd_info *objp){  if (!xdr_string(xdrs, &objp->pw_gecos, ~0)) {    return (FALSE);  }  if (!xdr_string(xdrs, &objp->pw_shell, ~0)) {    return (FALSE);  }  return (TRUE);}static bool_t__pam_xdr_npd_request(XDR *xdrs, npd_request *objp){  if (!xdr_string(xdrs, &objp->username, ~0)) {    return (FALSE);  }  if (!xdr_string(xdrs, &objp->domain, ~0)) {    return (FALSE);  }  if (!xdr_string(xdrs, &objp->key_type, ~0)) {    return (FALSE);  }  if (!xdr_array(xdrs, (char **)&objp->user_pub_key.user_pub_key_val,		 (u_int *)&objp->user_pub_key.user_pub_key_len, ~0,		 sizeof(u_char), (xdrproc_t)xdr_u_char))    return (FALSE);  if (!xdr_array(xdrs, (char **)&objp->npd_authpass.npd_authpass_val,		 (u_int *)&objp->npd_authpass.npd_authpass_len, ~0,		 sizeof(u_char), (xdrproc_t)xdr_u_char))    return (FALSE);  if (!xdr_u_int (xdrs, &objp->ident))    return (FALSE);  return (TRUE);}static bool_t__pam_xdr_passbuf (XDR *xdrs, passbuf objp){  if (!xdr_opaque(xdrs, objp, __NPD_MAXPASSBYTES)) {    return (FALSE);  }  return (TRUE);}static bool_t__pam_xdr_npd_newpass (XDR *xdrs, npd_newpass *objp){  if (!xdr_u_int(xdrs, &objp->npd_xrandval)) {    return (FALSE);  }  if (!__pam_xdr_passbuf(xdrs, objp->pass)) {    return (FALSE);  }  return (TRUE);}static bool_t__pam_xdr_npd_update (XDR *xdrs, npd_update *objp){  if (!xdr_u_int(xdrs, &objp->ident)) {    return (FALSE);  }  if (!__pam_xdr_npd_newpass(xdrs, &objp->xnewpass)) {    return (FALSE);  }  if (!__pam_xdr_passwd_info(xdrs, &objp->pass_info)) {    return (FALSE);  }  return (TRUE);}static bool_t__pam_xdr_nispasswd_verf (XDR *xdrs, nispasswd_verf *objp){  if (!xdr_u_int (xdrs, &objp->npd_xid)) {    return (FALSE);  }  if (!xdr_u_int (xdrs, &objp->npd_xrandval)) {    return (FALSE);  }  return (TRUE);}static bool_t__pam_xdr_nispasswd_authresult (XDR *xdrs, nispasswd_authresult *objp){  if (!__pam_xdr_nispasswd_status(xdrs, &objp->status)) {    return (FALSE);  }  switch (objp->status) {  case NPD_SUCCESS:  case NPD_TRYAGAIN:    if (!__pam_xdr_nispasswd_verf(xdrs,				  &objp->nispasswd_authresult_u.npd_verf))      return FALSE;    break;  default:    if (!__pam_xdr_nispasswd_code(xdrs,				  &objp->nispasswd_authresult_u.npd_err))      return (FALSE);    break;  }  return (TRUE);}static bool_t__pam_xdr_nispasswd_updresult (XDR *xdrs, nispasswd_updresult *objp){  if (!__pam_xdr_nispasswd_status (xdrs, &objp->status))    return (FALSE);  switch (objp->status)    {    case NPD_PARTIALSUCCESS:      if (!__pam_xdr_nispasswd_error (xdrs,				      &objp->nispasswd_updresult_u.reason))        return (FALSE);      break;    case NPD_FAILED:      if (!__pam_xdr_nispasswd_code (xdrs,				     &objp->nispasswd_updresult_u.npd_err))        return (FALSE);      break;    default:      break;    }  return (TRUE);}static const char *npderr2str (nispasswd_code error){  switch (error)    {    case NPD_NOTMASTER:      return "Server is not master of this domain";    case NPD_NOSUCHENTRY:      return "No passwd entry exists for this user";    case NPD_IDENTINVALID:      return "Identifier invalid";    case NPD_NOPASSWD:      return "No password stored";    case NPD_NOSHDWINFO:      return "No shadow information stored";    case NPD_SHDWCORRUPT:      return "Shadow information corrupted";    case NPD_NOTAGED:      return "Passwd has not aged sufficiently";    case NPD_CKGENFAILED:      return "Common key could not be generated";    case NPD_VERFINVALID:      return "Verifier mismatch";    case NPD_PASSINVALID:      return "All auth attempts incorrect";    case NPD_ENCRYPTFAIL:      return "Encryption failed";    case NPD_DECRYPTFAIL:      return "Decryption failed";    case NPD_KEYSUPDATED:      return "New key-pair generated for user";    case NPD_KEYNOTREENC:      return "Could not reencrypt secret key";    case NPD_PERMDENIED:      return "Permission denied";    case NPD_SRVNOTRESP:      return "Server not responding";    case NPD_NISERROR:      return "NIS+ server error";    case NPD_SYSTEMERR:      return "System error";    case NPD_BUFTOOSMALL:      return "Buffer too small";    case NPD_INVALIDARGS:      return "Invalid args to function";    default:      return "Unknown error!";    }}#define NISENTRYVAL(col,obj) \        ((obj)->EN_data.en_cols.en_cols_val[(col)].ec_value.ec_value_val)#define NISENTRYLEN(col,obj) \        ((obj)->EN_data.en_cols.en_cols_val[(col)].ec_value.ec_value_len)#define NISENTRYFLAG(col,res) \        ((obj)->EN_data.en_cols.en_cols_val[(col)].ec_flags)static intupdate_npd (nis_object *obj, user_t *data){  nis_server **server;  CLIENT *clnt;  struct timeval timeout;  char oldpwd[17];  npd_request request;  npd_update update;  nispasswd_authresult result;  nispasswd_updresult updresult;  char pkey_host[HEXKEYBYTES + 1];  char pkey_user[HEXKEYBYTES + 1];  char skey_data[HEXKEYBYTES + 1];  char usernetname[MAXNETNAMELEN + 1], servernetname[MAXNETNAMELEN + 1];  des_block CK;  const char *masterhost;  des_block cryptbuf;  char ivec[8];  u_int32_t *ixdr;  int error;  char *cp;  /* build netname for user or if caller == root, host */  if (getuid () == 0 && strncmp (NISENTRYVAL(0,obj), "root",				 NISENTRYLEN(0,obj)) == 0)    {      char hostname[MAXHOSTNAMELEN + 1];      if (gethostname (hostname, MAXHOSTNAMELEN) != 0)	{	  fprintf (stderr, _("Could not determine hostname!\n"));	  return -1;	}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -