Annotation of embedaddon/strongswan/src/libcharon/plugins/xauth_pam/xauth_pam_listener.c, revision 1.1

1.1     ! misho       1: /*
        !             2:  * Copyright (C) 2013 Endian srl
        !             3:  * Author: Andrea Bonomi - <a.bonomi@endian.com>
        !             4:  *
        !             5:  * Permission is hereby granted, free of charge, to any person obtaining a copy
        !             6:  * of this software and associated documentation files (the "Software"), to deal
        !             7:  * in the Software without restriction, including without limitation the rights
        !             8:  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
        !             9:  * copies of the Software, and to permit persons to whom the Software is
        !            10:  * furnished to do so, subject to the following conditions:
        !            11:  *
        !            12:  * The above copyright notice and this permission notice shall be included in
        !            13:  * all copies or substantial portions of the Software.
        !            14:  *
        !            15:  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
        !            16:  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
        !            17:  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
        !            18:  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
        !            19:  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
        !            20:  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
        !            21:  * THE SOFTWARE.
        !            22:  */
        !            23: 
        !            24: #define _GNU_SOURCE
        !            25: #include <stdio.h>
        !            26: 
        !            27: #include "xauth_pam_listener.h"
        !            28: 
        !            29: #include <daemon.h>
        !            30: #include <library.h>
        !            31: 
        !            32: #include <security/pam_appl.h>
        !            33: 
        !            34: typedef struct private_xauth_pam_listener_t private_xauth_pam_listener_t;
        !            35: 
        !            36: /**
        !            37:  * Private data of an xauth_pam_listener_t object.
        !            38:  */
        !            39: struct private_xauth_pam_listener_t {
        !            40: 
        !            41:        /**
        !            42:         * Public xauth_pam_listener_t interface.
        !            43:         */
        !            44:        xauth_pam_listener_t public;
        !            45: 
        !            46:        /**
        !            47:         * PAM service
        !            48:         */
        !            49:        char *service;
        !            50: };
        !            51: 
        !            52: /**
        !            53:  * PAM conv callback function
        !            54:  */
        !            55: static int conv(int num_msg, const struct pam_message **msg,
        !            56:                                struct pam_response **resp, void *data)
        !            57: {
        !            58:        int i;
        !            59: 
        !            60:        for (i = 0; i < num_msg; i++)
        !            61:        {
        !            62:                /* ignore any text info, but fail on any interaction request */
        !            63:                if (msg[i]->msg_style != PAM_TEXT_INFO)
        !            64:                {
        !            65:                        return PAM_CONV_ERR;
        !            66:                }
        !            67:        }
        !            68:        return PAM_SUCCESS;
        !            69: }
        !            70: 
        !            71: METHOD(listener_t, ike_updown, bool,
        !            72:        private_xauth_pam_listener_t *this, ike_sa_t *ike_sa, bool up)
        !            73: {
        !            74:        struct pam_conv null_conv = {
        !            75:                .conv = conv,
        !            76:        };
        !            77:        pam_handle_t *pamh = NULL;
        !            78:        char *user;
        !            79:        int ret;
        !            80: 
        !            81:        if (asprintf(&user, "%Y", ike_sa->get_other_eap_id(ike_sa)) != -1)
        !            82:        {
        !            83:                ret = pam_start(this->service, user, &null_conv, &pamh);
        !            84:                if (ret == PAM_SUCCESS)
        !            85:                {
        !            86:                        if (up)
        !            87:                        {
        !            88:                                ret = pam_open_session(pamh, 0);
        !            89:                                if (ret != PAM_SUCCESS)
        !            90:                                {
        !            91:                                        DBG1(DBG_IKE, "XAuth pam_open_session for '%s' failed: %s",
        !            92:                                                 user, pam_strerror(pamh, ret));
        !            93:                                }
        !            94:                        }
        !            95:                        else
        !            96:                        {
        !            97:                                ret = pam_close_session(pamh, 0);
        !            98:                                if (ret != PAM_SUCCESS)
        !            99:                                {
        !           100:                                        DBG1(DBG_IKE, "XAuth pam_close_session for '%s' failed: %s",
        !           101:                                                 user, pam_strerror(pamh, ret));
        !           102:                                }
        !           103:                        }
        !           104:                }
        !           105:                else
        !           106:                {
        !           107:                        DBG1(DBG_IKE, "XAuth pam_start for '%s' failed: %s",
        !           108:                                 user, pam_strerror(pamh, ret));
        !           109:                }
        !           110:                pam_end(pamh, ret);
        !           111:                free(user);
        !           112:        }
        !           113:        return TRUE;
        !           114: }
        !           115: 
        !           116: METHOD(xauth_pam_listener_t, listener_destroy, void,
        !           117:        private_xauth_pam_listener_t *this)
        !           118: {
        !           119:        free(this);
        !           120: }
        !           121: 
        !           122: xauth_pam_listener_t *xauth_pam_listener_create()
        !           123: {
        !           124:        private_xauth_pam_listener_t *this;
        !           125: 
        !           126:        INIT(this,
        !           127:                .public = {
        !           128:                        .listener = {
        !           129:                                .ike_updown = _ike_updown,
        !           130:                        },
        !           131:                        .destroy = _listener_destroy,
        !           132:                },
        !           133:                /* Look for PAM service, with a legacy fallback for the eap-gtc plugin.
        !           134:                 * Default to "login". */
        !           135:                .service = lib->settings->get_str(lib->settings,
        !           136:                                                "%s.plugins.xauth-pam.pam_service",
        !           137:                                                        lib->settings->get_str(lib->settings,
        !           138:                                                                "%s.plugins.eap-gtc.pam_service",
        !           139:                                                        "login", lib->ns),
        !           140:                                                lib->ns),
        !           141:        );
        !           142: 
        !           143:        return &this->public;
        !           144: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>