Annotation of mqtt/src/accmqtt.c, revision 1.4

1.4     ! misho       1: /*************************************************************************
        !             2: * (C) 2011 AITNET ltd - Sofia/Bulgaria - <misho@aitbg.com>
        !             3: *  by Michael Pounov <misho@openbsd-bg.org>
        !             4: *
        !             5: * $Author: misho $
        !             6: * $Id: accmqtt.c,v 1.3.2.1 2012/07/03 12:22:56 misho Exp $
        !             7: *
        !             8: **************************************************************************
        !             9: The ELWIX and AITNET software is distributed under the following
        !            10: terms:
        !            11: 
        !            12: All of the documentation and software included in the ELWIX and AITNET
        !            13: Releases is copyrighted by ELWIX - Sofia/Bulgaria <info@elwix.org>
        !            14: 
        !            15: Copyright 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
        !            16:        by Michael Pounov <misho@elwix.org>.  All rights reserved.
        !            17: 
        !            18: Redistribution and use in source and binary forms, with or without
        !            19: modification, are permitted provided that the following conditions
        !            20: are met:
        !            21: 1. Redistributions of source code must retain the above copyright
        !            22:    notice, this list of conditions and the following disclaimer.
        !            23: 2. Redistributions in binary form must reproduce the above copyright
        !            24:    notice, this list of conditions and the following disclaimer in the
        !            25:    documentation and/or other materials provided with the distribution.
        !            26: 3. All advertising materials mentioning features or use of this software
        !            27:    must display the following acknowledgement:
        !            28: This product includes software developed by Michael Pounov <misho@elwix.org>
        !            29: ELWIX - Embedded LightWeight unIX and its contributors.
        !            30: 4. Neither the name of AITNET nor the names of its contributors
        !            31:    may be used to endorse or promote products derived from this software
        !            32:    without specific prior written permission.
        !            33: 
        !            34: THIS SOFTWARE IS PROVIDED BY AITNET AND CONTRIBUTORS ``AS IS'' AND
        !            35: ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
        !            36: IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
        !            37: ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
        !            38: FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
        !            39: DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
        !            40: OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
        !            41: HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
        !            42: LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
        !            43: OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
        !            44: SUCH DAMAGE.
        !            45: */
1.2       misho      46: #include "global.h"
                     47: 
                     48: 
                     49: extern const char sql_schema[];
                     50: 
                     51: 
                     52: /*
                     53:  * mqtt_rtlm_log() Log database connection message
                     54:  *
                     55:  * @fmt = format string
                     56:  * @... = argument list
                     57:  * return: none
                     58:  */
                     59: static void
                     60: mqtt_rtlm_log(const char *fmt, ...)
                     61: {
                     62:        va_list lst;
                     63: 
                     64:        va_start(lst, fmt);
                     65:        vsyslog(LOG_ERR, fmt, lst);
                     66:        va_end(lst);
                     67: }
1.3       misho      68: #define MQTT_RTLM_LOG(_sql)    (assert((_sql)), mqtt_rtlm_log("Error:: %s(%d) SQL #%d - %s", \
                     69:                                        __func__, __LINE__, \
1.2       misho      70:                                        sqlite3_errcode((_sql)), sqlite3_errmsg((_sql))))
                     71: 
1.3       misho      72: /* library pre-loaded actions */
                     73: void
                     74: _init()
                     75: {
                     76:        sqlite3_initialize();
                     77: }
                     78: 
                     79: void
                     80: _fini()
                     81: {
                     82:        sqlite3_shutdown();
                     83: }
                     84: 
1.2       misho      85: 
                     86: /*
                     87:  * mqtt_rtlm_open() Open database connection
                     88:  *
                     89:  * @cfg = loaded config
                     90:  * return: NULL error or SQL handle
                     91:  */
                     92: sqlite3 *
1.3       misho      93: mqtt_rtlm_open(cfg_root_t *cfg)
1.2       misho      94: {
                     95:        sqlite3 *sql = NULL;
                     96:        const char *str = NULL;
                     97: 
                     98:        if (!cfg)
                     99:                return NULL;
                    100: 
1.3       misho     101:        str = (const char*) cfg_getAttribute(cfg, "mqtt_acc", "name");
1.2       misho     102:        if (!str) {
                    103:                mqtt_rtlm_log("Error:: Unknown database name ...\n");
                    104:                return NULL;
                    105:        }
                    106: 
                    107:        if (sqlite3_open_v2(str, &sql, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, NULL)) {
                    108:                MQTT_RTLM_LOG(sql);
                    109:                sqlite3_close(sql);
                    110:                return NULL;
                    111:        }
                    112: 
                    113:        if (sqlite3_exec(sql, sql_schema, NULL, NULL, NULL)) {
                    114:                MQTT_RTLM_LOG(sql);
                    115:                sqlite3_close(sql);
                    116:                return NULL;
                    117:        }
1.3       misho     118: 
1.2       misho     119:        return sql;
                    120: }
                    121: 
                    122: /*
                    123:  * mqtt_rtlm_close() Close database connection
                    124:  *
                    125:  * @sql = SQL handle
                    126:  * return: none
                    127:  */
                    128: void
                    129: mqtt_rtlm_close(sqlite3 *sql)
                    130: {
                    131:        sqlite3_close(sql);
                    132: }
                    133: 
                    134: /*
                    135:  * mqtt_rtlm_login() Verify login account
                    136:  *
                    137:  * @cfg = loaded config
                    138:  * @sql = SQL handle
                    139:  * @user = username
                    140:  * @pass = password
                    141:  * return: -1 error, 0 ALLOW and 1 REJECT
                    142:  */
                    143: int
1.3       misho     144: mqtt_rtlm_login(cfg_root_t *cfg, sqlite3 *sql, const char *user, const char *pass)
1.2       misho     145: {
                    146:        /* insert into Users values (NULL, "", "", 1, strftime('%s','now')); */
                    147:        int ret = 0;
                    148:        sqlite3_stmt *stmt;
1.3       misho     149:        char *str, *psStmt;
1.2       misho     150: 
                    151:        if (!sql)
                    152:                return -1;
                    153: 
1.3       misho     154:        str = (char*) cfg_getAttribute(cfg, "mqtt_acc", "tbl_users");
1.2       misho     155:        if (!str) {
                    156:                mqtt_rtlm_log("Error:: not found users table name");
                    157:                return -1;
                    158:        }
1.3       misho     159:        psStmt = sqlite3_mprintf("SELECT DISTINCT Username, Password, Access FROM %s "
                    160:                        "WHERE Username = '%q' AND Password = '%q' AND Access > 0;", str, user, pass);
1.2       misho     161: 
1.3       misho     162:        if (sqlite3_prepare_v2(sql, psStmt, strlen(psStmt), &stmt, NULL)) {
1.2       misho     163:                MQTT_RTLM_LOG(sql);
1.3       misho     164:                sqlite3_free(psStmt);
1.2       misho     165:                return -1;
1.3       misho     166:        } else
                    167:                sqlite3_free(psStmt);
1.2       misho     168:        while (sqlite3_step(stmt) == SQLITE_ROW) {
                    169:                if (sqlite3_data_count(stmt) < 1)
                    170:                        ret = 0;
                    171:                else
                    172:                        ret = 1;
                    173:                break;
                    174:        }
                    175:        sqlite3_finalize(stmt);
                    176: 
                    177:        return ret;
                    178: }

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