fix: fixed capitalisation bugs in command parsing

This commit is contained in:
Lorenzo Torres 2024-12-24 13:44:12 +01:00
parent 81a1c7447c
commit 9418c7b9a4
7 changed files with 107 additions and 5 deletions

View file

@ -3,8 +3,8 @@
include config.mk
SRC = sis.c imap.c utils.c
HDR = config.def.h imap.h utils.h imap.routines
SRC = sis.c imap.c auth.c utils.c
HDR = config.def.h imap.h auth.h utils.h imap.routines
OBJ = ${SRC:.c=.o}
all: options sis

37
auth.c Normal file
View file

@ -0,0 +1,37 @@
/*-
* Copyright (c) 2024, Lorenzo Torres
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the <organization> nor the
* names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#ifdef AUTH_PAM
int pam_conv_func(int num_msg, const struct pam_message **msg, struct pam_response **resp, void *appdata_ptr) {
}
uint8_t auth_pam(char *username, char *password)
{
}
#endif

43
auth.h Normal file
View file

@ -0,0 +1,43 @@
/*-
* Copyright (c) 2024, Lorenzo Torres
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the <organization> nor the
* names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef AUTH_H
#define AUTH_H
#define AUTH_OK 0x1
#define AUTH_FAIL 0x1 << 1
#ifdef AUTH_PAM
#include <security/pam_appl.h>
#include <security/pam_modules.h>
#include <security/pam_ext.h>
uint8_t auth_pam(char *username, char *password);
#endif
#endif

View file

@ -21,6 +21,11 @@
* modify this.
*/
#define CMD_MAX_SIZE 8000
/*-
* Use pam (Pluggable Authentication Modules)
* as an authentication method
*/
#define AUTH_PAM
static char *imap_capabilities[] = {
"IMAP4rev1",

View file

@ -15,7 +15,7 @@ INCS = -I.
LIBS = -lssl -lcrypto
# flags
CPPFLAGS = -DVERSION=\"${VERSION}\"
CFLAGS := -std=c99 -pedantic -Wall -O0 -Wno-gnu-label-as-value -Wno-gnu-zero-variadic-macro-arguments ${INCS} ${CPPFLAGS}
CFLAGS := -std=gnu99 -pedantic -Wall -O0 -Wno-gnu-label-as-value -Wno-gnu-zero-variadic-macro-arguments ${INCS} ${CPPFLAGS}
CFLAGS := ${CFLAGS} -g
LDFLAGS = ${LIBS}

7
imap.c
View file

@ -35,6 +35,7 @@
#include <syslog.h>
#include <errno.h>
#include <config.h>
#include <ctype.h>
#include <utils.h>
#include <imap.h>
@ -370,10 +371,11 @@ uint8_t imap_match_cmd(char *cmd, size_t len)
imap_cmd imap_parse_cmd(char *s)
{
char *cpy;
imap_cmd cmd;
strstrip(s);
size_t params = 0, id_len = 0, i = 0;
char *cpy;
printf("%s\n", s);
cmd.params = NULL;
@ -393,6 +395,9 @@ imap_cmd imap_parse_cmd(char *s)
id_len -= 1;
s -= id_len+1;
cpy = s;
for (; (cpy-s) <= id_len; ++cpy) *cpy = tolower(*cpy);
cmd.id = imap_match_cmd(s, id_len);
s += id_len+2;

View file

@ -16,6 +16,8 @@ name: { \
#define IMAP_ROUTINE_END imap_flush(node, ssl);
#define IMAP_ROUTINE_OK(routine) \
imap_write(node, ssl, "%s OK " #routine " completed\n", cmd.tag);
#define IMAP_ROUTINE_NO(routine) \
imap_write(node, ssl, "%s NO " #routine " completed\n", cmd.tag);
#define IMAP_STRING(fmt, ...) \
imap_write(node, ssl, fmt, ##__VA_ARGS__);
#define IMAP_NLINE imap_write(node, ssl, "\n");
@ -77,7 +79,7 @@ static inline uint8_t imap_routine_auth(imap_cmd cmd, client_list *node, uint8_t
int bytes;
if (strcmp(cmd.params[0], "PLAIN") == 0) {
if (strcmp(cmd.params[0], "plain") == 0) {
IMAP_STRING("+\n");
if ((bytes = imap_read(node, buf, CMD_MAX_SIZE, ssl)) < 0) {
perror("recv");
@ -98,5 +100,15 @@ static inline uint8_t imap_routine_auth(imap_cmd cmd, client_list *node, uint8_t
static inline uint8_t imap_routine_login(imap_cmd cmd, client_list *node, uint8_t ssl, uint8_t state)
{
IMAP_CHECK_STATE(NO_AUTH)
IMAP_CHECK_ARGS(2)
if ((strcmp(cmd.params[0], "lorenzo") == 0) && (strcmp(cmd.params[1], "lorenzo06") == 0)) {
IMAP_ROUTINE_OK(LOGIN)
} else {
IMAP_ROUTINE_NO(LOGIN)
}
IMAP_ROUTINE_END
return IMAP_SUCCESS;
}