blank.c

/*
* $Id$
*/ /* Andrew Morgan (morgan@parc.power.net) -- a self contained `blank'
* application
*
* I am not very proud of this code. It makes use of a possibly ill-
* defined pamh pointer to call pam_strerror() with. The reason that
* I was sloppy with this is historical (pam_strerror, prior to 0.59,
* did not require a pamh argument) and if this program is used as a
* model for anything, I should wish that you will take this error into
* account.
*/ #include <stdio.h>
#include <stdlib.h> #include <security/pam_appl.h>
#include <security/pam_misc.h> /* ------ some local (static) functions ------- */ static void bail_out(pam_handle_t *pamh, int really, int code, const char *fn)
{
fprintf(stderr,"==> called %s()\n got: `%s'\n", fn,
pam_strerror(pamh, code));
if (really && code)
exit ();
} /* ------ some static data objects ------- */ static struct pam_conv conv = {
misc_conv,
NULL
}; /* ------- the application itself -------- */ int main(int argc, char **argv)
{
pam_handle_t *pamh=NULL;
char *username=NULL;
int retcode; /* did the user call with a username as an argument ? */ if (argc > ) {
fprintf(stderr,"usage: %s [username]\n",argv[]);
} else if (argc == ) {
username = argv[];
} /* initialize the Linux-PAM library */
retcode = pam_start("blank", username, &conv, &pamh);
bail_out(pamh,,retcode,"pam_start"); /* test the environment stuff */
{
#define MAXENV 15
const char *greek[MAXENV] = {
"a=alpha", "b=beta", "c=gamma", "d=delta", "e=epsilon",
"f=phi", "g=psi", "h=eta", "i=iota", "j=mu", "k=nu",
"l=zeta", "h=", "d", "k=xi"
};
char **env;
int i; for (i=; i<MAXENV; ++i) {
retcode = pam_putenv(pamh,greek[i]);
bail_out(pamh,,retcode,"pam_putenv");
}
env = pam_getenvlist(pamh);
if (env)
env = pam_misc_drop_env(env);
else
fprintf(stderr,"???\n");
fprintf(stderr,"a test: c=[%s], j=[%s]\n"
, pam_getenv(pamh, "c"), pam_getenv(pamh, "j"));
} /* to avoid using goto we abuse a loop here */
for (;;) {
/* authenticate the user --- `0' here, could have been PAM_SILENT
* | PAM_DISALLOW_NULL_AUTHTOK */ retcode = pam_authenticate(pamh, );
bail_out(pamh,,retcode,"pam_authenticate"); /* has the user proved themself valid? */
if (retcode != PAM_SUCCESS) {
fprintf(stderr,"%s: invalid request\n",argv[]);
break;
} /* the user is valid, but should they have access at this
time? */ retcode = pam_acct_mgmt(pamh, ); /* `0' could be as above */
bail_out(pamh,,retcode,"pam_acct_mgmt"); if (retcode == PAM_NEW_AUTHTOK_REQD) {
fprintf(stderr,"Application must request new password...\n");
retcode = pam_chauthtok(pamh,PAM_CHANGE_EXPIRED_AUTHTOK);
bail_out(pamh,,retcode,"pam_chauthtok");
} if (retcode != PAM_SUCCESS) {
fprintf(stderr,"%s: invalid request\n",argv[]);
break;
} /* `0' could be as above */
retcode = pam_setcred(pamh, PAM_ESTABLISH_CRED);
bail_out(pamh,,retcode,"pam_setcred1"); if (retcode != PAM_SUCCESS) {
fprintf(stderr,"%s: problem setting user credentials\n"
,argv[]);
break;
} /* open a session for the user --- `0' could be PAM_SILENT */
retcode = pam_open_session(pamh,);
bail_out(pamh,,retcode,"pam_open_session");
if (retcode != PAM_SUCCESS) {
fprintf(stderr,"%s: problem opening a session\n",argv[]);
break;
} fprintf(stderr,"The user has been authenticated and `logged in'\n"); /* close a session for the user --- `0' could be PAM_SILENT
* it is possible that this pam_close_call is in another program..
*/ retcode = pam_close_session(pamh,);
bail_out(pamh,,retcode,"pam_close_session");
if (retcode != PAM_SUCCESS) {
fprintf(stderr,"%s: problem closing a session\n",argv[]);
break;
} retcode = pam_setcred(pamh, PAM_DELETE_CRED);
bail_out(pamh,,retcode,"pam_setcred2"); break; /* don't go on for ever! */
} /* close the Linux-PAM library */
retcode = pam_end(pamh, PAM_SUCCESS);
pamh = NULL; bail_out(pamh,,retcode,"pam_end"); exit();
}

check_user.c

/*
$Id$ This program was contributed by Shane Watts <shane@icarus.bofh.asn.au>
slight modifications by AGM. You need to add the following (or equivalent) to the /etc/pam.conf file.
# check authorization
check auth required pam_unix_auth.so
check account required pam_unix_acct.so
*/ #include <security/pam_appl.h>
#include <security/pam_misc.h>
#include <stdio.h> static struct pam_conv conv = {
misc_conv,
NULL
}; int main(int argc, char *argv[])
{
pam_handle_t *pamh=NULL;
int retval;
const char *user="nobody"; if(argc == ) {
user = argv[];
} if(argc > ) {
fprintf(stderr, "Usage: check_user [username]\n");
exit();
} retval = pam_start("check", user, &conv, &pamh); if (retval == PAM_SUCCESS)
retval = pam_authenticate(pamh, ); /* is user really user? */ if (retval == PAM_SUCCESS)
retval = pam_acct_mgmt(pamh, ); /* permitted access? */ /* This is where we have been authorized or not. */ if (retval == PAM_SUCCESS) {
fprintf(stdout, "Authenticated\n");
} else {
fprintf(stdout, "Not Authenticated\n");
} if (pam_end(pamh,retval) != PAM_SUCCESS) { /* close Linux-PAM */
pamh = NULL;
fprintf(stderr, "check_user: failed to release authenticator\n");
exit();
} return ( retval == PAM_SUCCESS ? : ); /* indicate success */
}

vpass.c

#include "config.h"

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <pwd.h>
#include <sys/types.h>
#include <security/pam_appl.h> static int
test_conv (int num_msg UNUSED, const struct pam_message **msgm UNUSED,
struct pam_response **response UNUSED, void *appdata_ptr UNUSED)
{
return ;
} static struct pam_conv conv = {
test_conv,
NULL
}; int main(void)
{
char *user;
pam_handle_t *pamh;
struct passwd *pw;
uid_t uid;
int res; uid = geteuid();
pw = getpwuid(uid);
if (pw) {
user = pw->pw_name;
} else {
fprintf(stderr, "Invalid userid: %lu\n", (unsigned long) uid);
exit();
} pam_start("vpass", user, &conv, &pamh);
pam_set_item(pamh, PAM_TTY, "/dev/tty");
if ((res = pam_authenticate(pamh, )) != PAM_SUCCESS) {
fprintf(stderr, "Oops: %s\n", pam_strerror(pamh, res));
exit();
} pam_end(pamh, res);
exit();
}

xsh.c

/* Andrew Morgan (morgan@kernel.org) -- an example application
* that invokes a shell, based on blank.c */ #include "config.h" #include <stdio.h>
#include <stdlib.h> #include <security/pam_appl.h>
#include <security/pam_misc.h> #include <pwd.h>
#include <sys/types.h>
#include <unistd.h> /* ------ some local (static) functions ------- */ static void bail_out(pam_handle_t *pamh,int really, int code, const char *fn)
{
fprintf(stderr,"==> called %s()\n got: `%s'\n", fn,
pam_strerror(pamh,code));
if (really && code)
exit ();
} /* ------ some static data objects ------- */ static struct pam_conv conv = {
misc_conv,
NULL
}; /* ------- the application itself -------- */ int main(int argc, char **argv)
{
pam_handle_t *pamh=NULL;
const void *username=NULL;
const char *service="xsh";
int retcode; /* did the user call with a username as an argument ?
* did they also */ if (argc > ) {
fprintf(stderr,"usage: %s [username [service-name]]\n",argv[]);
}
if ((argc >= ) && (argv[][] != '-')) {
username = argv[];
}
if (argc == ) {
service = argv[];
} /* initialize the Linux-PAM library */
retcode = pam_start(service, username, &conv, &pamh);
bail_out(pamh,,retcode,"pam_start"); /* fill in the RUSER and RHOST etc. fields */
{
char buffer[];
struct passwd *pw;
const char *tty; pw = getpwuid(getuid());
if (pw != NULL) {
retcode = pam_set_item(pamh, PAM_RUSER, pw->pw_name);
bail_out(pamh,,retcode,"pam_set_item(PAM_RUSER)");
} retcode = gethostname(buffer, sizeof(buffer)-);
if (retcode) {
perror("failed to look up hostname");
retcode = pam_end(pamh, PAM_ABORT);
bail_out(pamh,,retcode,"pam_end");
}
retcode = pam_set_item(pamh, PAM_RHOST, buffer);
bail_out(pamh,,retcode,"pam_set_item(PAM_RHOST)"); tty = ttyname(fileno(stdin));
if (tty) {
retcode = pam_set_item(pamh, PAM_TTY, tty);
bail_out(pamh,,retcode,"pam_set_item(PAM_RHOST)");
}
} /* to avoid using goto we abuse a loop here */
for (;;) {
/* authenticate the user --- `0' here, could have been PAM_SILENT
* | PAM_DISALLOW_NULL_AUTHTOK */ retcode = pam_authenticate(pamh, );
bail_out(pamh,,retcode,"pam_authenticate"); /* has the user proved themself valid? */
if (retcode != PAM_SUCCESS) {
fprintf(stderr,"%s: invalid request\n",argv[]);
break;
} /* the user is valid, but should they have access at this
time? */ retcode = pam_acct_mgmt(pamh, ); /* `0' could be as above */
bail_out(pamh,,retcode,"pam_acct_mgmt"); if (retcode == PAM_NEW_AUTHTOK_REQD) {
fprintf(stderr,"Application must request new password...\n");
retcode = pam_chauthtok(pamh,PAM_CHANGE_EXPIRED_AUTHTOK);
bail_out(pamh,,retcode,"pam_chauthtok");
} if (retcode != PAM_SUCCESS) {
fprintf(stderr,"%s: invalid request\n",argv[]);
break;
} /* `0' could be as above */
retcode = pam_setcred(pamh, PAM_ESTABLISH_CRED);
bail_out(pamh,,retcode,"pam_setcred"); if (retcode != PAM_SUCCESS) {
fprintf(stderr,"%s: problem setting user credentials\n"
,argv[]);
break;
} /* open a session for the user --- `0' could be PAM_SILENT */
retcode = pam_open_session(pamh,);
bail_out(pamh,,retcode,"pam_open_session");
if (retcode != PAM_SUCCESS) {
fprintf(stderr,"%s: problem opening a session\n",argv[]);
break;
} pam_get_item(pamh, PAM_USER, &username);
fprintf(stderr,
"The user [%s] has been authenticated and `logged in'\n",
(const char *)username); /* this is always a really bad thing for security! */
retcode = system("/bin/sh"); /* close a session for the user --- `0' could be PAM_SILENT
* it is possible that this pam_close_call is in another program..
*/ retcode = pam_close_session(pamh,);
bail_out(pamh,,retcode,"pam_close_session");
if (retcode != PAM_SUCCESS) {
fprintf(stderr,"%s: problem closing a session\n",argv[]);
break;
} /* `0' could be as above */
retcode = pam_setcred(pamh, PAM_DELETE_CRED);
bail_out(pamh,,retcode,"pam_setcred");
if (retcode != PAM_SUCCESS) {
fprintf(stderr,"%s: problem deleting user credentials\n"
,argv[]);
break;
} break; /* don't go on for ever! */
} /* close the Linux-PAM library */
retcode = pam_end(pamh, PAM_SUCCESS);
pamh = NULL;
bail_out(pamh,,retcode,"pam_end"); return ();
}

pam_examples的更多相关文章

随机推荐

  1. HTML5可用的css reset

    html, body, div, span, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, abbr, address, ci ...

  2. CF961D Pair Of Lines

    题目描述 You are given n n n points on Cartesian plane. Every point is a lattice point (i. e. both of it ...

  3. 【题解】Atcoder ARC#90 E-Avoiding Collision

    自己做出来固然开心,但是越发感觉到自己写题的确是很慢很慢了……往往有很多的细节反反复复的考虑才能确定,还要加油呀~ 这道题目的突破口在于正难则反.直接求有多少不相交的不好求,我们转而求出所有相交的.我 ...

  4. [JSOI2009]计数问题 二维树状数组

    ---题面--- 题解: 二维树状数组的板子题,,,学了这么久第一次写二维树状数组,惭愧啊. 怎么写就不说了,看代码吧. 跟普通的是一样的写法 #include<bits/stdc++.h> ...

  5. BZOJ1997:[HNOI2010]PLANAR——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=1997 https://www.luogu.org/problemnew/show/P3209 若能 ...

  6. 51NOD 1149:Pi的递推式——题解

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1149 F(x) = 1 (0 <= x < 4) F(x) ...

  7. 2017 ccpc哈尔滨 A题 Palindrome

    2017 ccpc哈尔滨 A题 Palindrome 题意: 给一个串\(T\),计算存在多少子串S满足\(S[i]=S[2n−i]=S[2n+i−2](1≤i≤n)\) 思路: 很明显这里的回文串长 ...

  8. BZOJ1179 [Apio2009]Atm 【tarjan缩点】

    1179: [Apio2009]Atm Time Limit: 15 Sec  Memory Limit: 162 MB Submit: 4048  Solved: 1762 [Submit][Sta ...

  9. AtCoder Regular Contest 075 E - Meaningful Mean(树状数组)

    题目大意:求一个数组中,平均值不小于k的连续子序列个数 所有数减去k,算个前缀和出来,就变成二维数点问题了. 没有修改,离线的话就是CZL所说的“NOIP最喜欢的套路”了:倒着加进BIT,以权值为数组 ...

  10. 几个与特殊字符处理有关的PHP函数(过滤html js 标签)

    函数名 释义 介绍 htmlspecialchars 将与.单双引号.大于和小于号化成HTML格式 &转成&"转成"' 转成'<转成<>转成> ...