aboutsummaryrefslogtreecommitdiffstats
path: root/src/include
diff options
context:
space:
mode:
authorLaurent Bercot <ska-skaware@skarnet.org>2018-02-04 23:22:53 +0000
committerLaurent Bercot <ska-skaware@skarnet.org>2018-02-04 23:22:53 +0000
commit03012f54b1bcd31e0b817fc0222a9a47709c4018 (patch)
treed53c568d1e14bae1e1e0efadab8b0bf3e66982aa /src/include
downloadpamela-03012f54b1bcd31e0b817fc0222a9a47709c4018.tar.gz
Initial commit
Diffstat (limited to 'src/include')
-rw-r--r--src/include/pamela/common.h101
-rw-r--r--src/include/pamela/pam.h161
-rw-r--r--src/include/pamela/pamela.h80
3 files changed, 342 insertions, 0 deletions
diff --git a/src/include/pamela/common.h b/src/include/pamela/common.h
new file mode 100644
index 0000000..5ae689e
--- /dev/null
+++ b/src/include/pamela/common.h
@@ -0,0 +1,101 @@
+/* ISC license. */
+
+#ifndef PAMELA_COMMON_H
+#define PAMELA_COMMON_H
+
+#define PAMELA_BUFSIZE 4096
+
+enum pamela_retcode_e
+{
+ PAMELA_PAM_SUCCESS = 0,
+ PAMELA_PAM_OPEN_ERR,
+ PAMELA_PAM_SYMBOL_ERR,
+ PAMELA_PAM_SERVICE_ERR,
+ PAMELA_PAM_SYSTEM_ERR,
+ PAMELA_PAM_BUF_ERR,
+ PAMELA_PAM_PERM_DENIED,
+ PAMELA_PAM_AUTH_ERR,
+ PAMELA_PAM_CRED_INSUFFICIENT,
+ PAMELA_PAM_AUTHINFO_UNAVAIL,
+ PAMELA_PAM_USER_UNKNOWN,
+ PAMELA_PAM_MAXTRIES,
+ PAMELA_PAM_NEW_AUTHTOK_REQD,
+ PAMELA_PAM_ACCT_EXPIRED,
+ PAMELA_PAM_SESSION_ERR,
+ PAMELA_PAM_CRED_UNAVAIL,
+ PAMELA_PAM_CRED_EXPIRED,
+ PAMELA_PAM_CRED_ERR,
+ PAMELA_PAM_NO_MODULE_DATA,
+ PAMELA_PAM_CONV_ERR,
+ PAMELA_PAM_AUTHTOK_ERR,
+ PAMELA_PAM_AUTHTOK_RECOVERY_ERR,
+ PAMELA_PAM_AUTHTOK_LOCK_BUSY,
+ PAMELA_PAM_AUTHTOK_DISABLE_AGING,
+ PAMELA_PAM_TRY_AGAIN,
+ PAMELA_PAM_IGNORE,
+ PAMELA_PAM_ABORT,
+ PAMELA_PAM_AUTHTOK_EXPIRED,
+ PAMELA_PAM_MODULE_UNKNOWN,
+ PAMELA_PAM_BAD_ITEM,
+ PAMELA_PAM_CONV_AGAIN,
+ PAMELA_PAM_INCOMPLETE
+} ;
+
+
+enum pamela_item_e
+{
+ PAMELA_ENV = 0,
+ PAMELA_PAM_SERVICE,
+ PAMELA_PAM_USER,
+ PAMELA_PAM_TTY,
+ PAMELA_PAM_RHOST,
+ PAMELA_PAM_CONV,
+ PAMELA_PAM_AUTHTOK,
+ PAMELA_PAM_OLDAUTHTOK,
+ PAMELA_PAM_RUSER,
+ PAMELA_PAM_USER_PROMPT,
+ PAMELA_PAM_FAIL_DELAY,
+ PAMELA_PAM_XDISPLAY,
+ PAMELA_PAM_XAUTHDATA,
+ PAMELA_PAM_AUTHTOK_TYPE
+} ;
+
+
+enum pamela_convmsgtype_e
+{
+ PAMELA_PAM_PROMPT_ECHO_OFF = 1,
+ PAMELA_PAM_PROMPT_ECHO_ON,
+ PAMELA_PAM_ERROR_MSG,
+ PAMELA_PAM_TEXT_INFO,
+ PAMELA_PAM_RADIO_TYPE,
+ PAMELA_PAM_BINARY_PROMPT = 7
+} ;
+
+#define PAMELA_PAM_CONV_MAX_MESSAGES 1024
+
+
+enum pamela_op_e
+{
+ PAMELA_OP_ACCT_MGMT = 1,
+ PAMELA_OP_AUTHENTICATE,
+ PAMELA_OP_CHAUTHTOK,
+ PAMELA_OP_CLOSE_SESSION,
+ PAMELA_OP_FAIL_DELAY,
+ PAMELA_OP_OPEN_SESSION,
+ PAMELA_OP_SETCRED,
+ PAMELA_OP_SETFAILDELAY,
+ PAMELA_OP_END
+} ;
+
+
+ /* flags */
+
+#define PAMELA_PAM_SILENT 0x8000U
+#define PAMELA_PAM_DISALLOW_NULL_AUTHTOK 0x0001U
+#define PAMELA_PAM_ESTABLISH_CRED 0x0002U
+#define PAMELA_PAM_DELETE_CRED 0x0004U
+#define PAMELA_PAM_REINITIALIZE_CRED 0x0008U
+#define PAMELA_PAM_REFRESH_CRED 0x0010U
+#define PAMELA_PAM_CHANGE_EXPIRED_AUTHTOK 0x0020U
+
+#endif
diff --git a/src/include/pamela/pam.h b/src/include/pamela/pam.h
new file mode 100644
index 0000000..aab7d7d
--- /dev/null
+++ b/src/include/pamela/pam.h
@@ -0,0 +1,161 @@
+/* ISC license. */
+
+#ifndef PAMELA_PAM_H
+#define PAMELA_PAM_H
+
+ /*
+ This is pamela's client-side PAM library.
+
+ */
+
+#include <skalibs/uint64.h>
+#include <skalibs/stralloc.h>
+#include <pamela/pamela.h>
+
+#define __LINUX_PAM__ 1
+#define __LINUX_PAM_MINOR__ 0
+
+
+ /* Return codes */
+
+#define _PAM_RETURN_VALUES 32
+
+#define PAM_SUCCESS PAMELA_PAM_SUCCESS
+#define PAM_OPEN_ERR PAMELA_PAM_OPEN_ERR
+#define PAM_SYMBOL_ERR PAMELA_PAM_SYMBOL_ERR
+#define PAM_SERVICE_ERR PAMELA_PAM_SERVICE_ERR
+#define PAM_SYSTEM_ERR PAMELA_PAM_SYSTEM_ERR
+#define PAM_BUF_ERR PAMELA_PAM_BUF_ERR
+#define PAM_PERM_DENIED PAMELA_PAM_PERM_DENIED
+#define PAM_AUTH_ERR PAMELA_PAM_AUTH_ERR
+#define PAM_CRED_INSUFFICIENT PAMELA_PAM_CRED_INSUFFICIENT
+#define PAM_AUTHINFO_UNAVAIL PAMELA_PAM_AUTHINFO_UNAVAIL
+#define PAM_USER_UNKNOWN PAMELA_PAM_USER_UNKNOWN
+#define PAM_MAXTRIES PAMELA_PAM_MAXTRIES
+#define PAM_NEW_AUTHTOK_REQD PAMELA_PAM_NEW_AUTHTOK_REQD
+#define PAM_ACCT_EXPIRED PAMELA_PAM_ACCT_EXPIRED
+#define PAM_SESSION_ERR PAMELA_PAM_SESSION_ERR
+#define PAM_CRED_UNAVAIL PAMELA_PAM_CRED_UNAVAIL
+#define PAM_CRED_EXPIRED PAMELA_PAM_CRED_EXPIRED
+#define PAM_CRED_ERR PAMELA_PAM_CRED_ERR
+#define PAM_NO_MODULE_DATA PAMELA_PAM_NO_MODULE_DATA
+#define PAM_CONV_ERR PAMELA_PAM_CONV_ERR
+#define PAM_AUTHTOK_ERR PAMELA_PAM_AUTHTOK_ERR
+#define PAM_AUTHTOK_RECOVERY_ERR PAMELA_PAM_AUTHTOK_RECOVERY_ERR
+#define PAM_AUTHTOK_LOCK_BUSY PAMELA_PAM_AUTHTOK_LOCK_BUSY
+#define PAM_AUTHTOK_DISABLE_AGING PAMELA_PAM_AUTHTOK_DISABLE_AGING
+#define PAM_TRY_AGAIN PAMELA_PAM_TRY_AGAIN
+#define PAM_IGNORE PAMELA_PAM_IGNORE
+#define PAM_ABORT PAMELA_PAM_ABORT
+#define PAM_AUTHTOK_EXPIRED PAMELA_PAM_AUTHTOK_EXPIRED
+#define PAM_MODULE_UNKNOWN PAMELA_PAM_MODULE_UNKNOWN
+#define PAM_BAD_ITEM PAMELA_PAM_BAD_ITEM
+#define PAM_CONV_AGAIN PAMELA_PAM_CONV_AGAIN
+#define PAM_INCOMPLETE PAMELA_PAM_INCOMPLETE
+
+
+ /* Items */
+
+#define PAM_ITEM_MAX 14 /* 13 items + environment */
+
+#define PAM_SERVICE PAMELA_PAM_SERVICE
+#define PAM_USER PAMELA_PAM_USER
+#define PAM_TTY PAMELA_PAM_TTY
+#define PAM_RHOST PAMELA_PAM_RHOST
+#define PAM_CONV PAMELA_PAM_CONV
+#define PAM_AUTHTOK PAMELA_PAM_AUTHTOK
+#define PAM_OLDAUTHTOK PAMELA_PAM_OLDAUTHTOK
+#define PAM_RUSER PAMELA_PAM_RUSER
+#define PAM_USER_PROMPT PAMELA_PAM_USER_PROMPT
+#define PAM_FAIL_DELAY PAMELA_PAM_FAIL_DELAY
+#define PAM_XDISPLAY PAMELA_PAM_XDISPLAY
+#define PAM_XAUTHDATA PAMELA_PAM_XAUTHDATA
+#define PAM_AUTHTOK_TYPE PAMELA_PAM_AUTHTOK_TYPE
+
+
+ /* Flags */
+
+#define PAM_SILENT PAMELA_PAM_SILENT
+#define PAM_DISALLOW_NULL_AUTHTOK PAMELA_PAM_DISALLOW_NULL_AUTHTOK
+#define PAM_ESTABLISH_CRED PAMELA_PAM_ESTABLISH_CRED
+#define PAM_DELETE_CRED PAMELA_PAM_DELETE_CRED
+#define PAM_REINITIALIZE_CRED PAMELA_PAM_REINITIALIZE_CRED
+#define PAM_REFRESH_CRED PAMELA_PAM_REFRESH_CRED
+#define PAM_CHANGE_EXPIRED_AUTHTOK PAMELA_PAM_CHANGE_EXPIRED_AUTHTOK
+
+
+ /* Conversation types */
+
+#define PAM_PROMPT_ECHO_OFF PAMELA_PAM_PROMPT_ECHO_OFF
+#define PAM_PROMPT_ECHO_ON PAMELA_PAM_PROMPT_ECHO_ON
+#define PAM_ERROR_MSG PAMELA_PAM_ERROR_MSG
+#define PAM_TEXT_INFO PAMELA_PAM_TEXT_INFO
+#define PAM_RADIO_TYPE PAMELA_PAM_RADIO_TYPE
+#define PAM_BINARY_PROMPT PAMELA_PAM_BINARY_PROMPT
+
+
+ /* Misc Linux-PAM stuff */
+
+#define PAM_MAX_NUM_MSG 32
+#define PAM_MAX_MSG_SIZE 512
+#define PAM_MAX_RESP_SIZE 512
+
+#define PAM_DATA_SILENT PAMELA_PAM_DATA_SILENT
+
+
+ /* Data structures and functions */
+
+struct pam_message
+{
+ int msg_style ;
+ char const *msg ;
+} ;
+
+struct pam_response
+{
+ char *resp ;
+ int resp_retcode ;
+} ;
+
+struct pam_conv
+{
+ int (*conv) (int, struct pam_message const **, struct pam_response **, void *) ;
+ void *appdata_ptr ;
+} ;
+
+struct pam_xauth_data
+{
+ int namelen ;
+ char *name ;
+ int datalen ;
+ char *data ;
+} ;
+
+typedef struct pam_handle_s pam_handle_t ;
+struct pam_handle_s
+{
+ pamela_t handle ;
+ struct pam_xauth_data xauthdata ;
+ stralloc err[_PAM_RETURN_VALUES] ;
+ stralloc item[PAM_ITEM_MAX] ;
+ uint64_t flagerrcached : _PAM_RETURN_VALUES ;
+ uint64_t flagenvcached : 1 ;
+} ;
+
+extern int pam_start (char const *, char const *, struct pam_conv const *, pam_handle_t **) ;
+extern int pam_end (pam_handle_t *, int) ;
+extern int pam_set_item (pam_handle_t *, int, void const *) ;
+extern int pam_get_item (pam_handle_t *, int, void const **) ;
+extern char const *pam_strerror (pam_handle_t *, int) ;
+extern int pam_fail_delay (pam_handle_t *, unsigned int) ;
+extern int pam_authenticate (pam_handle_t *, int) ;
+extern int pam_setcred (pam_handle_t *, int) ;
+extern int pam_acct_mgmt (pam_handle_t *, int) ;
+extern int pam_chauthtok (pam_handle_t *, int) ;
+extern int pam_open_session (pam_handle_t *, int) ;
+extern int pam_close_session (pam_handle_t *, int) ;
+extern int pam_putenv (pam_handle_t *, char const *) ;
+extern char const *pam_getenv (pam_handle_t *, char const *) ;
+extern char **pam_getenvlist (pam_handle_t *) ;
+
+#endif
diff --git a/src/include/pamela/pamela.h b/src/include/pamela/pamela.h
new file mode 100644
index 0000000..ca45124
--- /dev/null
+++ b/src/include/pamela/pamela.h
@@ -0,0 +1,80 @@
+/* ISC license. */
+
+#ifndef PAMELA_H
+#define PAMELA_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <sys/types.h>
+#include <stdint.h>
+#include <sys/uio.h>
+#include <skalibs/stralloc.h>
+#include <skalibs/textmessage.h>
+#include <pamela/common.h>
+
+
+ /* pam_fail_delay */
+
+typedef void pamela_pam_delay_func_t (int, unsigned int, void *) ;
+typedef pamela_pam_delay_func_t *pamela_pam_delay_func_t_ref ;
+
+
+ /* Conversations */
+
+typedef struct pamela_pam_message_s pamela_pam_message_t, *pamela_pam_message_t_ref ;
+struct pamela_pam_message_s
+{
+ int msg_style ;
+ char const *msg ;
+} ;
+
+typedef struct pamela_pam_response_s pamela_pam_response_t, *pamela_pam_response_t_ref ;
+struct pamela_pam_response_s
+{
+ char *resp ;
+ int *resp_retcode ;
+} ;
+
+extern void pamela_pam_response_free (pamela_pam_response_t *, uint32_t) ;
+
+typedef int pamela_pam_conv_func_t (int, pamela_pam_message_t const **, pamela_pam_response_t **, void *) ;
+typedef pamela_pam_conv_func_t *pamela_pam_conv_func_t_ref ;
+
+
+ /* Client handle */
+
+typedef struct pamela_s pamela_t, *pamela_t_ref ;
+struct pamela_s
+{
+ textmessage_receiver_t in ;
+ textmessage_sender_t out ;
+ pid_t pid ;
+ pamela_pam_delay_func_t_ref delayfn ;
+ pamela_pam_conv_func_t_ref convfn ;
+ void *aux ;
+ char inbuf[PAMELA_BUFSIZE] ;
+} ;
+#define PAMELA_ZERO { TEXTMESSAGE_RECEIVER_ZERO, TEXTMESSAGE_SENDER_ZERO, 0, 0, 0, 0, "" }
+
+extern pamela_t const pamela_zero ;
+
+
+ /* User-facing functions */
+
+extern int pamela_startf (pamela_t *, char const *, char const *, pamela_pam_conv_func_t_ref, void *) ;
+extern void pamela_end (pamela_t *) ;
+extern int pamela_strerror (pamela_t *, unsigned char, stralloc *) ;
+extern int pamela_getenvlist (pamela_t *, stralloc *) ;
+extern int pamela_get_item (pamela_t *, unsigned char, stralloc *) ;
+extern int pamela_set_item (pamela_t *, unsigned char, char const *) ;
+extern int pamela_set_itemv (pamela_t *, unsigned char, struct iovec const *, unsigned int) ;
+extern int pamela_op (pamela_t *, unsigned char, int) ;
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif