summaryrefslogtreecommitdiff
path: root/misc/libmcal/files/patch-al
diff options
context:
space:
mode:
Diffstat (limited to 'misc/libmcal/files/patch-al')
-rw-r--r--misc/libmcal/files/patch-al479
1 files changed, 479 insertions, 0 deletions
diff --git a/misc/libmcal/files/patch-al b/misc/libmcal/files/patch-al
new file mode 100644
index 000000000000..9f0e4019b1ff
--- /dev/null
+++ b/misc/libmcal/files/patch-al
@@ -0,0 +1,479 @@
+--- mstore/mstore.c.orig Mon Mar 27 06:07:12 2000
++++ mstore/mstore.c Tue Dec 11 08:56:58 2001
+@@ -1,4 +1,4 @@
+-/* $Id: mstore.c,v 1.11 2000/03/27 04:07:12 zircote Exp $ */
++/* $Id: mstore.c,v 1.21 2001/05/07 17:37:10 chuck Exp $ */
+
+ #include <stdlib.h>
+ #include <string.h>
+@@ -6,26 +6,33 @@
+ #include <pwd.h>
+ #include <unistd.h>
+ #include <crypt.h>
++
++#ifdef USE_PAM
++#include <security/pam_appl.h>
++#endif /* USE_PAM */
++
+ #include "mcal.h"
+ #include "mstore.h"
+ #include "icap/icaproutines.h"
+
+-
+ #define MSTORE_VER "0.5"
+ #define DATA_T struct mstore_data
+ #define DATA ((DATA_T*) stream->data)
+
+-
++/* mpasswd path define */
++#ifndef MPASSWD_PATH
++#define MPASSWD_PATH "/etc/mpasswd"
++#endif
+
+ static void mstore_freestream(CALSTREAM *stream);
+ static bool mstore_validuser(const char *username,const char *password);
+-static bool mstore_userexists(const char *username);
+
+ static bool mstore_valid(const CALADDR *addr);
+ static CALSTREAM* mstore_open( CALSTREAM *stream,
+ const CALADDR *addr, long options);
+ static CALSTREAM* mstore_close(CALSTREAM *stream, long options);
+ static bool mstore_ping(CALSTREAM *stream);
++static bool mstore_create (CALSTREAM *stream, const char *calendar);
+ static bool mstore_search_range( CALSTREAM *stream,
+ const datetime_t *start,
+ const datetime_t *end);
+@@ -44,12 +51,18 @@
+ unsigned long id);
+ static bool mstore_store( CALSTREAM *stream,
+ const CALEVENT *modified_event);
++static bool mstore_delete( CALSTREAM *stream,
++ char *calendar);
++static bool mstore_rename( CALSTREAM *stream,
++ char *src,char *dest);
++
+ CALDRIVER mstore_driver =
+ {
+ mstore_valid,
+ mstore_open,
+ mstore_close,
+ mstore_ping,
++ mstore_create,
+ mstore_search_range,
+ mstore_search_alarm,
+ mstore_fetch,
+@@ -57,6 +70,8 @@
+ mstore_remove,
+ mstore_snooze,
+ mstore_store,
++ mstore_delete,
++ mstore_rename
+ };
+
+
+@@ -88,13 +103,98 @@
+ }
+
+
++#ifdef USE_PAM
++
++/* PAM support stuff goes here */
++
++static pam_handle_t *pamh = NULL;
++static char *PAM_username;
++static char *PAM_password;
++
++#define COPY_STRING(s) (s) ? strdup(s) : NULL
++
++static int PAM_conv (int num_msg,
++ const struct pam_message **msg,
++ struct pam_response **resp,
++ void *appdata_ptr)
++{
++ struct pam_response *reply;
++ int count;
++
++ if (num_msg < 1)
++ return PAM_CONV_ERR;
++
++ reply = (struct pam_response *)
++ calloc (num_msg, sizeof(struct pam_response));
++
++ if (!reply)
++ return PAM_CONV_ERR;
++
++ for (count=0; count<num_msg; count++) {
++ char *string = NULL;
++
++ switch (msg[count]->msg_style) {
++ case PAM_PROMPT_ECHO_ON:
++ if (!(string = COPY_STRING(PAM_username)))
++ goto pam_fail_conv;
++ break;
++ case PAM_PROMPT_ECHO_OFF:
++ if (!(string = COPY_STRING(PAM_password)))
++ goto pam_fail_conv;
++ break;
++ case PAM_TEXT_INFO:
++#ifdef PAM_BINARY_PROMPT
++ case PAM_BINARY_PROMPT:
++#endif /* PAM_BINARY_PROMPT */
++ /* ignore it */
++ break;
++ case PAM_ERROR_MSG:
++ default:
++ goto pam_fail_conv;
++ } /* end switch msg[count]->msg_style */
++
++ if (string) {
++ reply[count].resp_retcode = 0;
++ reply[count].resp = string;
++ string = NULL;
++ } /* end if string */
++
++ } // end for count
++
++ *resp = reply;
++ return PAM_SUCCESS;
++
++pam_fail_conv:
++ for(count=0; count<num_msg; count++) {
++ if (!reply[count].resp)
++ continue;
++ switch (msg[count]->msg_style) {
++ case PAM_PROMPT_ECHO_ON:
++ case PAM_PROMPT_ECHO_OFF:
++ free(reply[count].resp);
++ break;
++ } /* end switch msg[count]->msg_style */
++ } /* end for count */
++
++ free(reply);
++ return PAM_CONV_ERR;
++} /* end function static int PAM_conv (...) */
++
++static struct pam_conv PAM_conversation = {
++ &PAM_conv,
++ NULL
++};
++
++#endif /* USE_PAM */
++
+ bool
+ mstore_validuser(const char *username,const char *password)
+ {
++#ifndef USE_PAM
+ FILE *mpasswd;
+ char line[1000];
+ char *musername,*mpassword;
+- mpasswd=fopen("/etc/mpasswd","r");
++ mpasswd=fopen(MPASSWD_PATH,"r");
+ if(!mpasswd)
+ {
+ printf("Error! couldn't open mpasswd file!\n");
+@@ -123,36 +223,31 @@
+ }
+ fclose(mpasswd);
+ return false;
+-}
+-
+-
+-bool
+-mstore_userexists(const char *username)
+-{
+- FILE *mpasswd;
+- char line[1000];
+- char *musername,*mpassword;
+- mpasswd=fopen("/etc/mpasswd","r");
+- if(!mpasswd)
+- {
+- printf("Error! couldn't open mpasswd file!\n");
+- exit(1);
+- }
+- while(fgets(line,900,mpasswd))
+- {
+- if(line[strlen(line)-1]=='\n') line[strlen(line)-1]=0x00;
+- musername=line;
+- mpassword=strchr(line,':');
+- *mpassword=0x00;
+- mpassword++;
+- if(!strcmp(username,musername))
+- {
+- fclose(mpasswd);
+- return true;
+- }
+- }
+- fclose(mpasswd);
+- return false;
++#else
++ /* PAM authentication */
++ int PAM_error;
++
++ PAM_error = pam_start("mstore", username, &PAM_conversation, &pamh);
++ if (PAM_error != PAM_SUCCESS)
++ goto login_err;
++ pam_set_item(pamh, PAM_TTY, "mstore");
++ pam_set_item(pamh, PAM_RHOST, "localhost");
++ PAM_error = pam_authenticate(pamh, 0);
++ if (PAM_error != PAM_SUCCESS)
++ if (PAM_error == PAM_MAXTRIES)
++ goto login_err;
++#ifndef PAM_CRED_ESTABLISH
++#define PAM_CRED_ESTABLISH PAM_ESTABLISH_CRED
++#endif /* PAM_CRED_ESTABLISH */
++ PAM_error = pam_setcred(pamh, PAM_CRED_ESTABLISH);
++ if (PAM_error != PAM_SUCCESS)
++ goto login_err;
++
++login_err:
++ pam_end(pamh, PAM_error);
++ pamh = NULL;
++ return false;
++#endif /* ! USE_PAM */
+ }
+
+
+@@ -161,8 +256,6 @@
+ {
+ if (!addr->proto || strcasecmp(addr->proto, "mstore"))
+ return false;
+- if (addr->user && !mstore_userexists(addr->user))
+- return false;
+ return true;
+ }
+
+@@ -197,10 +290,18 @@
+ }
+
+ cc_login(&username, &password);
+- if (username == NULL)
++ if (username == NULL) {
++ #ifdef DEBUG
++ printf("\nNULL username\n");
++ #endif
+ goto fail;
+- if (!mstore_validuser(username,password))
++ }
++ if (!mstore_validuser(username,password)) {
++ #ifdef DEBUG
++ printf("\n!mstore_validuser(%s,%s)\n",username,password);
++ #endif
+ goto fail;
++ }
+ }
+
+ if (!reopen) {
+@@ -212,13 +313,23 @@
+
+ if (options & CAL_LOGIN) {
+ /* Copy login_userbuf, folder. */
+- if ((DATA->login_userbuf = strdup(username)) == NULL)
++ if ((DATA->login_userbuf = strdup(username)) == NULL) {
++ #ifdef DEBUG
++ printf("\ncouldn't get login_userbuf (%s)\n",
++ username);
++ #endif
+ goto fail;
++ }
+
+ }
+
+- if ((DATA->folder = strdup(addr->folder)) == NULL)
++ if ((DATA->folder = strdup(addr->folder)) == NULL) {
++ #ifdef DEBUG
++ printf("\ncouldn't get folder (%s)\n",
++ addr->folder);
++ #endif
+ goto fail;
++ }
+
+ /* Set up folder_user */
+ if(addr->host)
+@@ -229,8 +340,13 @@
+ DATA->login_user=DATA->login_userbuf;
+ if (addr->user) {
+ /* Copy and split folder_userbuf */
+- if ((DATA->folder_userbuf = strdup(addr->user)) == NULL)
++ if ((DATA->folder_userbuf = strdup(addr->user)) == NULL) {
++#ifdef DEBUG
++ printf("\ncouldn't get folder_userbuf (%s)\n",
++ addr->user);
++#endif
+ goto fail;
++ }
+ /* Check for identical folder/login users. */
+ DATA->folder_user=DATA->folder_userbuf;
+ if ( !strcmp(DATA->login_user, DATA->folder_user))
+@@ -246,7 +362,6 @@
+ DATA->folder_user = DATA->login_user;
+ }
+
+-
+ return stream;
+ fail:
+ mstore_freestream(stream);
+@@ -270,6 +385,36 @@
+ }
+
+
++bool
++mstore_create(CALSTREAM *stream, const char *calendar)
++{
++ FILE *calfile;
++ char userpath[1000];
++
++ /*
++ if (!(stream = mstore_open (stream, (const CALADDR *)calendar, 0))) {
++ #ifdef DEBUG
++ printf("Error! couldn't open calendar stream!\n");
++ #endif
++ return false;
++ }
++ */
++ snprintf(userpath, 900, "%s/%s", DATA->base_path, calendar);
++ #ifdef DEBUG
++ printf("attempting fopen on calendar file '%s'\n", userpath);
++ #endif
++ calfile = fopen (userpath, "w");
++ if (!calfile) {
++ #ifdef DEBUG
++ printf("Error! couldn't create calendar file!\n");
++ #endif
++ return false;
++ }
++ fclose (calfile);
++ return true;
++}
++
++
+ CALEVENT *read_event(FILE *calfile)
+ {
+ char line[100];
+@@ -277,7 +422,8 @@
+ int size;
+ CALEVENT *event;
+
+- fgets(line, sizeof(line), calfile);
++ if (fgets(line, sizeof(line), calfile) == NULL)
++ return NULL;
+ if (sscanf(line, "%d", &size) != 1)
+ return NULL;
+ buf = malloc(size + 2);
+@@ -334,17 +480,18 @@
+ datetime_t _end = DT_INIT;
+ FILE *calfile;
+ char userpath[1000];
+- snprintf(userpath,900,"%s/%s",DATA->base_path,DATA->folder_user);
+- calfile=fopen (userpath,"a+");
+- if(!calfile)
+- {
++
++ snprintf(userpath, 900, "%s/%s", DATA->base_path, DATA->folder_user);
++ calfile = fopen (userpath, "a+");
++ if(!calfile) {
+ printf("Error! couldn't open calendar file!\n");
+ exit(1);
+- }
++ }
+ rewind(calfile);
+
+ if (start) {
+ if (!dt_hasdate(start))
++//LM:should this be _start = NULL? and again below for end?
+ start = NULL;
+ else {
+ dt_setdate(&_start,
+@@ -358,7 +505,7 @@
+ dt_setdate(&_end, end->year, end->mon, end->mday);
+ }
+
+- while((event=read_event(calfile))) {
++ while((event = read_event(calfile))) {
+ datetime_t clamp = DT_INIT;
+
+ if (!start)
+@@ -385,28 +532,24 @@
+ bool
+ mstore_search_alarm(CALSTREAM *stream, const datetime_t *when)
+ {
+- datetime_t start;
+- datetime_t end;
+- long alarm = 0;
+- unsigned long id = 0;
+ CALEVENT *event;
+ FILE *calfile;
+ char userpath[1000];
+
+- snprintf(userpath,900,"%s/%s",DATA->base_path,DATA->folder_user);
+- calfile=fopen (userpath,"a+");
+- if(!calfile)
+- {
++ snprintf(userpath, 900, "%s/%s", DATA->base_path, DATA->folder_user);
++ calfile=fopen (userpath, "a+");
++ if(!calfile) {
+ printf("Error! couldn't open calendar file!\n");
+ exit(1);
+- }
++ }
+ rewind(calfile);
+- while((event=read_event(calfile))) {
+- if (dt_roll_time(&(event->start), 0, -alarm, 0) &&
+- dt_compare(&(event->start),&start)<=0 &&
+- dt_compare(&end,&(event->end)) <=0)
++ while ((event = read_event(calfile))) {
++ if (event->alarm &&
++ dt_roll_time(&(event->start), 0, -(event->alarm), 0) &&
++ dt_compare(&(event->start), when) <= 0 &&
++ dt_compare(when, &(event->end)) <=0)
+ {
+- cc_searched(id);
++ cc_searched(event->id);
+ }
+ calevent_free(event);
+ }
+@@ -422,13 +565,12 @@
+ FILE *calfile;
+ char userpath[1000];
+
+- snprintf(userpath,900,"%s/%s",DATA->base_path,DATA->folder_user);
+- calfile=fopen (userpath,"a+");
+- if(!calfile)
+- {
++ snprintf(userpath, 900, "%s/%s", DATA->base_path, DATA->folder_user);
++ calfile = fopen (userpath,"a+");
++ if(!calfile) {
+ printf("Error! couldn't open calendar file!\n");
+ exit(1);
+- }
++ }
+ rewind(calfile);
+ while((event=read_event(calfile))) {
+ if(event->id==id) {
+@@ -459,8 +601,11 @@
+ if (strcasecmp(addr->folder, "INBOX"))
+ return false;
+
++ /* comment this out so that we can share calendars
+ if (DATA->folder_userbuf)
+ return false;
++ */
++
+ if (!dt_hasdate(&event->start))
+ return false;
+
+@@ -609,3 +754,15 @@
+ return true;
+ }
+
++
++bool
++mstore_delete(CALSTREAM *stream, char *calendar)
++{
++ return true;
++}
++
++bool
++mstore_rename(CALSTREAM *stream, char *src,char *dest)
++{
++ return true;
++}