]> git.pld-linux.org Git - packages/php-pecl-sasl.git/blame - branch.diff
add module load test
[packages/php-pecl-sasl.git] / branch.diff
CommitLineData
3230199c
ER
1Index: Makefile.in
2===================================================================
3--- Makefile.in (.../tags/RELEASE_0_1_0)
4+++ Makefile.in (.../trunk)
5@@ -1,8 +0,0 @@
6-# $Id$
7-
8-LTLIBRARY_NAME = libsasl.la
9-LTLIBRARY_SOURCES = sasl.c
10-LTLIBRARY_SHARED_NAME = sasl.la
11-LTLIBRARY_SHARED_LIBADD = $(SASL_SHARED_LIBADD)
12-
13-include $(top_srcdir)/build/dynlib.mk
14Index: sasl.c
15===================================================================
16--- sasl.c (.../tags/RELEASE_0_1_0)
17+++ sasl.c (.../trunk)
18@@ -41,13 +41,493 @@
19 #define le_conn_name "SASL Connection Context"
20 static int le_conn;
21
22-/* {{{ sasl_callbacks[]
23- Global callbacks. These have no per-session context. */
24-static sasl_callback_t sasl_callbacks[] = {
25- { SASL_CB_LIST_END, 0, 0 }
26-};
27-/* }}}*/
28+PHPAPI ZEND_DECLARE_MODULE_GLOBALS(sasl);
29
30+/* SASL Callback Functions */
31+/* {{{ php_sasl_cb_getopt
32+ */
33+static int php_sasl_cb_getopt(void *context, const char *plugin_name,
34+ const char *option, const char **result,
35+ unsigned *len)
36+{
37+ zval *function = context;
38+ zval *args[2];
39+ zval *retval;
40+ int ret = SASL_FAIL;
41+
42+ MAKE_STD_ZVAL(args[0]);
43+ MAKE_STD_ZVAL(args[1]);
44+ MAKE_STD_ZVAL(retval);
45+
46+ ZVAL_STRING(args[0], (plugin_name) ? (char *)plugin_name : "", 1);
47+ ZVAL_STRING(args[1], (char *)option, 1);
48+
49+ if (call_user_function(CG(function_table), NULL, function, retval,
50+ 2, args TSRMLS_CC) == SUCCESS) {
51+ ret = Z_LVAL_P(retval);
52+ *result = estrdup(Z_STRVAL_P(retval));
53+ *len = Z_STRLEN_P(retval);
54+ }
55+
56+ zval_ptr_dtor(&args[0]);
57+ zval_ptr_dtor(&args[1]);
58+ zval_ptr_dtor(&retval);
59+
60+ return ret;
61+}
62+/* }}} */
63+/* {{{ php_sasl_cb_log
64+ */
65+static int php_sasl_cb_log(void *context, int level, const char *message)
66+{
67+ zval *function = context;
68+ zval *args[2];
69+ zval *retval;
70+ int ret = SASL_FAIL;
71+
72+ MAKE_STD_ZVAL(args[0]);
73+ MAKE_STD_ZVAL(args[1]);
74+ MAKE_STD_ZVAL(retval);
75+
76+ ZVAL_LONG(args[0], level);
77+ ZVAL_STRING(args[1], (char *)message, 1);
78+
79+ if (call_user_function(CG(function_table), NULL, function, retval,
80+ 2, args TSRMLS_CC) == SUCCESS) {
81+ ret = Z_LVAL_P(retval);
82+ }
83+
84+ zval_ptr_dtor(&args[0]);
85+ zval_ptr_dtor(&args[1]);
86+ zval_ptr_dtor(&retval);
87+
88+ return ret;
89+}
90+/* }}} */
91+/* {{{ php_sasl_cb_getpath
92+ */
93+static int php_sasl_cb_getpath(void *context, const char **path)
94+{
95+ zval *function = context;
96+ zval *retval;
97+ int ret = SASL_FAIL;
98+
99+ MAKE_STD_ZVAL(retval);
100+
101+ if (call_user_function(CG(function_table), NULL, function, retval,
102+ 0, NULL TSRMLS_CC) == SUCCESS) {
103+ ret = Z_LVAL_P(retval);
104+ *path = estrdup(Z_STRVAL_P(retval));
105+ }
106+
107+ zval_ptr_dtor(&retval);
108+
109+ return ret;
110+}
111+/* }}} */
112+/* {{{ php_sasl_cb_verifyfile
113+ */
114+static int php_sasl_cb_verifyfile(void *context, const char *file,
115+ sasl_verify_type_t type)
116+{
117+ zval *function = context;
118+ zval *args[2];
119+ zval *retval;
120+ int ret = SASL_FAIL;
121+
122+ MAKE_STD_ZVAL(args[0]);
123+ MAKE_STD_ZVAL(args[1]);
124+ MAKE_STD_ZVAL(retval);
125+
126+ ZVAL_STRING(args[0], (char *)file, 1);
127+ ZVAL_LONG(args[1], type);
128+
129+ if (call_user_function(CG(function_table), NULL, function, retval,
130+ 2, args TSRMLS_CC) == SUCCESS) {
131+ ret = Z_LVAL_P(retval);
132+ }
133+
134+ zval_ptr_dtor(&args[0]);
135+ zval_ptr_dtor(&args[1]);
136+ zval_ptr_dtor(&retval);
137+
138+ return ret;
139+}
140+/* }}} */
141+/* {{{ php_sasl_cb_getconfpath
142+ */
143+static int php_sasl_cb_getconfpath(void *context, char **path)
144+{
145+ zval *function = context;
146+ zval *retval;
147+ int ret = SASL_FAIL;
148+
149+ MAKE_STD_ZVAL(retval);
150+
151+ if (call_user_function(CG(function_table), NULL, function, retval,
152+ 0, NULL TSRMLS_CC) == SUCCESS) {
153+ ret = Z_LVAL_P(retval);
154+ *path = estrdup(Z_STRVAL_P(retval));
155+ }
156+
157+ zval_ptr_dtor(&retval);
158+
159+ return ret;
160+}
161+/* }}} */
162+/* {{{ php_sasl_cb_getsimple
163+ */
164+static int php_sasl_cb_getsimple(void *context, int id, const char **result,
165+ unsigned *len)
166+{
167+ zval *function = context;
168+ zval *args[1];
169+ zval *retval;
170+
171+ MAKE_STD_ZVAL(args[0]);
172+ MAKE_STD_ZVAL(retval);
173+
174+ ZVAL_LONG(args[0], id);
175+
176+ if (call_user_function(CG(function_table), NULL, function, retval,
177+ 1, args TSRMLS_CC) == SUCCESS) {
178+ *result = estrdup(Z_STRVAL_P(retval));
179+ *len = Z_STRLEN_P(retval);
180+ }
181+
182+ zval_ptr_dtor(&args[0]);
183+ zval_ptr_dtor(&retval);
184+
185+ return SASL_OK;
186+}
187+/* }}} */
188+/* {{{ php_sasl_cb_getsecret
189+ */
190+static int php_sasl_cb_getsecret(sasl_conn_t *conn, void *context, int id,
191+ sasl_secret_t **psecret)
192+{
193+ zval *function = context;
194+ zval *args[2];
195+ zval *retval;
196+
197+ MAKE_STD_ZVAL(args[0]);
198+ MAKE_STD_ZVAL(args[1]);
199+ MAKE_STD_ZVAL(retval);
200+
201+ ZVAL_NULL(args[0]);
202+ //ZVAL_RESOURCE(args[0], r);
203+ ZVAL_LONG(args[1], id);
204+
205+ if (call_user_function(CG(function_table), NULL, function, retval,
206+ 2, args TSRMLS_CC) == SUCCESS) {
207+ int len = Z_STRLEN_P(retval);
208+ *psecret = (sasl_secret_t *)emalloc(sizeof(sasl_secret_t) +
209+ (len * sizeof(char)));
210+ if (*psecret) {
211+ (*psecret)->len = len;
212+ memcpy((*psecret)->data, Z_STRVAL_P(retval), len);
213+ }
214+ }
215+
216+ zval_ptr_dtor(&args[0]);
217+ zval_ptr_dtor(&args[1]);
218+ zval_ptr_dtor(&retval);
219+
220+ return SASL_OK;
221+}
222+/* }}} */
223+/* {{{ php_sasl_cb_chalprompt
224+ */
225+static int php_sasl_cb_chalprompt(void *context, int id, const char *challenge,
226+ const char *prompt, const char *defresult,
227+ const char **result, unsigned *len)
228+{
229+ zval *function = context;
230+ zval *args[4];
231+ zval *retval;
232+
233+ MAKE_STD_ZVAL(args[0]);
234+ MAKE_STD_ZVAL(args[1]);
235+ MAKE_STD_ZVAL(args[2]);
236+ MAKE_STD_ZVAL(args[3]);
237+ MAKE_STD_ZVAL(retval);
238+
239+ ZVAL_LONG(args[0], id);
240+ ZVAL_STRING(args[1], (char *)challenge, 1);
241+ ZVAL_STRING(args[2], (char *)prompt, 1);
242+ ZVAL_STRING(args[3], (char *)defresult, 1);
243+
244+ if (call_user_function(CG(function_table), NULL, function, retval,
245+ 4, args TSRMLS_CC) == SUCCESS) {
246+ *result = estrdup(Z_STRVAL_P(retval));
247+ *len = Z_STRLEN_P(retval);
248+ }
249+
250+ zval_ptr_dtor(&args[0]);
251+ zval_ptr_dtor(&args[1]);
252+ zval_ptr_dtor(&args[2]);
253+ zval_ptr_dtor(&args[3]);
254+ zval_ptr_dtor(&retval);
255+
256+ return SASL_OK;
257+}
258+/* }}} */
259+/* {{{ php_sasl_cb_getrealm
260+ */
261+static int php_sasl_cb_getrealm(void *context, int id,
262+ const char **availrealms, const char **result)
263+{
264+ zval *function = context;
265+ zval *args[2];
266+ zval *retval;
267+
268+ MAKE_STD_ZVAL(args[0]);
269+ MAKE_STD_ZVAL(args[1]);
270+ MAKE_STD_ZVAL(retval);
271+
272+ ZVAL_LONG(args[0], id);
273+ ZVAL_NULL(args[1]); // TODO: Make an array of available realms
274+
275+ if (call_user_function(CG(function_table), NULL, function, retval,
276+ 2, args TSRMLS_CC) == SUCCESS) {
277+ *result = estrdup(Z_STRVAL_P(retval));
278+ }
279+
280+ zval_ptr_dtor(&args[0]);
281+ zval_ptr_dtor(&args[1]);
282+ zval_ptr_dtor(&retval);
283+
284+ return SASL_OK;
285+}
286+/* }}} */
287+/* {{{ php_sasl_cb_authorize
288+ */
289+static int php_sasl_cb_authorize(sasl_conn_t *conn, void *context,
290+ const char *requested_user, unsigned rlen,
291+ const char *auth_identity, unsigned alen,
292+ const char *def_realm, unsigned urlen,
293+ struct propctx *propctx)
294+{
295+ zval *function = context;
296+ zval *args[2];
297+ zval *retval;
298+ int ret = SASL_NOAUTHZ;
299+
300+#if 0
301+ MAKE_STD_ZVAL(args[0]);
302+ MAKE_STD_ZVAL(args[1]);
303+ MAKE_STD_ZVAL(retval);
304+
305+ ZVAL_LONG(args[0], id);
306+ ZVAL_NULL(args[1]); // TODO: Make an array of available realms
307+
308+ if (call_user_function(CG(function_table), NULL, function, retval,
309+ 2, args TSRMLS_CC) == SUCCESS) {
310+ *result = estrdup(Z_STRVAL_P(retval));
311+ }
312+
313+ zval_ptr_dtor(&args[0]);
314+ zval_ptr_dtor(&args[1]);
315+ zval_ptr_dtor(&retval);
316+#endif
317+
318+ return ret;
319+}
320+/* }}} */
321+/* {{{ php_sasl_cb_userdb_checkpass
322+ */
323+static int php_sasl_cb_userdb_checkpass(sasl_conn_t *conn, void *context,
324+ const char *user, const char *pass,
325+ unsigned passlen,
326+ struct propctx *propctx)
327+{
328+ zval *function = context;
329+ zval *args[2];
330+ zval *retval;
331+ int ret = SASL_FAIL;
332+
333+#if 0
334+ MAKE_STD_ZVAL(args[0]);
335+ MAKE_STD_ZVAL(args[1]);
336+ MAKE_STD_ZVAL(retval);
337+
338+ ZVAL_LONG(args[0], id);
339+ ZVAL_NULL(args[1]); // TODO: Make an array of available realms
340+
341+ if (call_user_function(CG(function_table), NULL, function, retval,
342+ 2, args TSRMLS_CC) == SUCCESS) {
343+ *result = estrdup(Z_STRVAL_P(retval));
344+ }
345+
346+ zval_ptr_dtor(&args[0]);
347+ zval_ptr_dtor(&args[1]);
348+ zval_ptr_dtor(&retval);
349+#endif
350+
351+ return ret;
352+}
353+/* }}} */
354+/* {{{ php_sasl_cb_userdb_setpass
355+ */
356+static int php_sasl_cb_userdb_setpass(sasl_conn_t *conn, void *context,
357+ const char *user, const char *pass,
358+ unsigned passlen,
359+ struct propctx *propctx, unsigned flags)
360+{
361+ zval *function = context;
362+ zval *args[2];
363+ zval *retval;
364+ int ret = SASL_FAIL;
365+
366+#if 0
367+ MAKE_STD_ZVAL(args[0]);
368+ MAKE_STD_ZVAL(args[1]);
369+ MAKE_STD_ZVAL(retval);
370+
371+ ZVAL_LONG(args[0], id);
372+ ZVAL_NULL(args[1]); // TODO: Make an array of available realms
373+
374+ if (call_user_function(CG(function_table), NULL, function, retval,
375+ 2, args TSRMLS_CC) == SUCCESS) {
376+ *result = estrdup(Z_STRVAL_P(retval));
377+ }
378+
379+ zval_ptr_dtor(&args[0]);
380+ zval_ptr_dtor(&args[1]);
381+ zval_ptr_dtor(&retval);
382+#endif
383+
384+ return ret;
385+}
386+/* }}} */
387+/* {{{ php_sasl_cb_canon_user
388+ */
389+static int php_sasl_cb_canon_user(sasl_conn_t *conn, void *context,
390+ const char *in, unsigned inlen,
391+ unsigned flags, const char *user_realm,
392+ char *out, unsigned out_max,
393+ unsigned *out_len)
394+{
395+ zval *function = context;
396+ zval *args[2];
397+ zval *retval;
398+ int ret = SASL_FAIL;
399+
400+#if 0
401+ MAKE_STD_ZVAL(args[0]);
402+ MAKE_STD_ZVAL(args[1]);
403+ MAKE_STD_ZVAL(retval);
404+
405+ ZVAL_LONG(args[0], id);
406+ ZVAL_NULL(args[1]); // TODO: Make an array of available realms
407+
408+ if (call_user_function(CG(function_table), NULL, function, retval,
409+ 2, args TSRMLS_CC) == SUCCESS) {
410+ *result = estrdup(Z_STRVAL_P(retval));
411+ }
412+
413+ zval_ptr_dtor(&args[0]);
414+ zval_ptr_dtor(&args[1]);
415+ zval_ptr_dtor(&retval);
416+#endif
417+
418+ return ret;
419+}
420+/* }}} */
421+
422+/* {{{ sasl_callback_function_t php_sasl_get_callback_function(unsigned long id)
423+ */
424+typedef int (*sasl_callback_function_t)();
425+static sasl_callback_function_t php_sasl_get_callback_function(unsigned long id)
426+{
427+ switch (id) {
428+ case SASL_CB_GETOPT: return php_sasl_cb_getopt;
429+ case SASL_CB_LOG: return php_sasl_cb_log;
430+ case SASL_CB_GETPATH: return php_sasl_cb_getpath;
431+ case SASL_CB_VERIFYFILE: return php_sasl_cb_verifyfile;
432+ case SASL_CB_GETCONFPATH: return php_sasl_cb_getconfpath;
433+ case SASL_CB_USER: return php_sasl_cb_getsimple;
434+ case SASL_CB_AUTHNAME: return php_sasl_cb_getsimple;
435+ case SASL_CB_LANGUAGE: return php_sasl_cb_getsimple;
436+ case SASL_CB_CNONCE: return php_sasl_cb_getsimple;
437+ case SASL_CB_PASS: return php_sasl_cb_getsecret;
438+ case SASL_CB_ECHOPROMPT: return php_sasl_cb_chalprompt;
439+ case SASL_CB_NOECHOPROMPT: return php_sasl_cb_chalprompt;
440+ case SASL_CB_GETREALM: return php_sasl_cb_getrealm;
441+ case SASL_CB_PROXY_POLICY: return php_sasl_cb_authorize;
442+ case SASL_CB_SERVER_USERDB_CHECKPASS: return php_sasl_cb_userdb_checkpass;
443+ case SASL_CB_SERVER_USERDB_SETPASS: return php_sasl_cb_userdb_setpass;
444+ case SASL_CB_CANON_USER: return php_sasl_cb_canon_user;
445+ }
446+
447+ return NULL;
448+}
449+/* }}} */
450+/* {{{ php_sasl_create_callbacks(HashTable *ht)
451+ */
452+static int php_sasl_create_callbacks(HashTable *ht, sasl_callback_t *callbacks)
453+{
454+ int n = 0;
455+ zval **entry;
456+ char *string_key;
457+ long num_key;
458+
459+ /*
460+ * Start by counting the number of legitimate callbacks that exist in
461+ * the array. This allows us to appropriately size our callback array.
462+ */
463+ zend_hash_internal_pointer_reset(ht);
464+ while (zend_hash_get_current_data(ht, (void **)&entry) == SUCCESS) {
465+ switch (zend_hash_get_current_key(ht, &string_key, &num_key, 0)) {
466+ case HASH_KEY_IS_LONG:
467+ if (php_sasl_get_callback_function(num_key)) {
468+ n++;
469+ }
470+ break;
471+ }
472+ zend_hash_move_forward(ht);
473+ }
474+
475+ /*
476+ * Now that we know how many callbacks we have, allocate the array. We
477+ * include an additional entry for the final SASL_CB_LIST_END sentinel.
478+ */
479+ callbacks = (sasl_callback_t *)emalloc(sizeof(sasl_callback_t) * (n + 1));
480+
481+ if (callbacks) {
482+ /* Assign the sentinel to the last entry in the callback array. */
483+ callbacks[n].id = SASL_CB_LIST_END;
484+
485+ /*
486+ * Now we iterate through the array again, except this time we will
487+ * actually create the callback entries.
488+ */
489+ n = 0;
490+
491+ zend_hash_internal_pointer_reset(ht);
492+ while (zend_hash_get_current_data(ht, (void **)&entry) == SUCCESS) {
493+ sasl_callback_t *cb = &callbacks[n];
494+
495+ switch (zend_hash_get_current_key(ht, &string_key, &num_key, 0)) {
496+ case HASH_KEY_IS_LONG:
497+ {
498+ cb->proc = php_sasl_get_callback_function(num_key);
499+ if (cb->proc) {
500+ cb->id = num_key;
501+ cb->context = *entry;
502+ n++;
503+ }
504+ }
505+ break;
506+ }
507+ zend_hash_move_forward(ht);
508+ }
509+ }
510+
511+ return n;
512+}
513+/* }}} */
514+
515 /* {{{ php_sasl_error(int level, int reason)
516 */
517 static void php_sasl_error(int level, int code TSRMLS_DC)
518@@ -56,6 +536,29 @@
519 "%s", sasl_errstring(code, NULL, NULL));
520 }
521 /* }}} */
522+/* {{{ php_sasl_rinit_globals(TSRMLS_D)
523+ */
524+static void php_sasl_rinit_globals(TSRMLS_D)
525+{
526+ SASLG(client_callbacks) = NULL;
527+ SASLG(server_callbacks) = NULL;
528+}
529+/* }}} */
530+/* {{{ php_sasl_rshutdown_globals(TSRMLS_D)
531+ */
532+static void php_sasl_rshutdown_globals(TSRMLS_D)
533+{
534+ if (SASLG(client_callbacks)) {
535+ efree(SASLG(client_callbacks));
536+ SASLG(client_callbacks) = NULL;
537+ }
538+
539+ if (SASLG(server_callbacks)) {
540+ efree(SASLG(server_callbacks));
541+ SASLG(server_callbacks) = NULL;
542+ }
543+}
544+/* }}} */
545 /* {{{ php_sasl_destroy_conn(zend_rsrc_list_entry *rsrc TSRMLS_DC)
546 */
547 static void php_sasl_destroy_conn(zend_rsrc_list_entry *rsrc TSRMLS_DC)
548@@ -67,29 +570,30 @@
549
550 /* {{{ sasl_functions[]
551 */
552-function_entry sasl_functions[] = {
553+zend_function_entry sasl_functions[] = {
554 /* Common Functions */
555- PHP_FE(sasl_version, NULL)
556- PHP_FE(sasl_errstring, NULL)
557+ PHP_FE(sasl_version, NULL)
558+ PHP_FE(sasl_errstring, NULL)
559 #if SASL_VERSION_MAJOR >= 2
560- PHP_FE(sasl_errdetail, NULL)
561+ PHP_FE(sasl_errdetail, NULL)
562+ PHP_FE(sasl_seterror, NULL)
563 #endif
564- PHP_FE(sasl_encode, NULL)
565- PHP_FE(sasl_decode, NULL)
566+ PHP_FE(sasl_encode, NULL)
567+ PHP_FE(sasl_decode, NULL)
568
569 /* Client Functions */
570- PHP_FE(sasl_client_init, NULL)
571- PHP_FE(sasl_client_new, NULL)
572- PHP_FE(sasl_client_start, NULL)
573- PHP_FE(sasl_client_step, NULL)
574+ PHP_FE(sasl_client_init, NULL)
575+ PHP_FE(sasl_client_new, NULL)
576+ PHP_FE(sasl_client_start, NULL)
577+ PHP_FE(sasl_client_step, NULL)
578
579 /* Server Functions */
580- PHP_FE(sasl_server_init, NULL)
581- PHP_FE(sasl_server_new, NULL)
582- PHP_FE(sasl_server_start, NULL)
583- PHP_FE(sasl_server_step, NULL)
584- PHP_FE(sasl_listmech, NULL)
585- PHP_FE(sasl_checkpass, NULL)
586+ PHP_FE(sasl_server_init, NULL)
587+ PHP_FE(sasl_server_new, NULL)
588+ PHP_FE(sasl_server_start, NULL)
589+ PHP_FE(sasl_server_step, NULL)
590+ PHP_FE(sasl_listmech, NULL)
591+ PHP_FE(sasl_checkpass, NULL)
592
593 {NULL, NULL, NULL}
594 };
595@@ -102,10 +606,10 @@
596 sasl_functions,
597 PHP_MINIT(sasl),
598 PHP_MSHUTDOWN(sasl),
599- NULL,
600- NULL,
601+ PHP_RINIT(sasl),
602+ PHP_RSHUTDOWN(sasl),
603 PHP_MINFO(sasl),
604- NO_VERSION_YET,
605+ PHP_SASL_VERSION,
606 STANDARD_MODULE_PROPERTIES
607 };
608
609@@ -173,6 +677,31 @@
610 SASL_CONSTANT(SASL_SEC_MAXIMUM);
611 #endif
612
613+ /* SASL callback identifiers */
614+ SASL_CONSTANT(SASL_CB_GETOPT);
615+ SASL_CONSTANT(SASL_CB_LOG);
616+ SASL_CONSTANT(SASL_CB_GETPATH);
617+ SASL_CONSTANT(SASL_CB_VERIFYFILE);
618+ SASL_CONSTANT(SASL_CB_GETCONFPATH);
619+ SASL_CONSTANT(SASL_CB_USER);
620+ SASL_CONSTANT(SASL_CB_AUTHNAME);
621+ SASL_CONSTANT(SASL_CB_LANGUAGE);
622+ SASL_CONSTANT(SASL_CB_CNONCE);
623+ SASL_CONSTANT(SASL_CB_PASS);
624+ SASL_CONSTANT(SASL_CB_ECHOPROMPT);
625+ SASL_CONSTANT(SASL_CB_NOECHOPROMPT);
626+ SASL_CONSTANT(SASL_CB_GETREALM);
627+ SASL_CONSTANT(SASL_CB_PROXY_POLICY);
628+ SASL_CONSTANT(SASL_CB_SERVER_USERDB_CHECKPASS);
629+ SASL_CONSTANT(SASL_CB_SERVER_USERDB_SETPASS);
630+ SASL_CONSTANT(SASL_CB_CANON_USER);
631+
632+ /* SASL_CB_VERIFYFILE flags */
633+ SASL_CONSTANT(SASL_VRFY_PLUGIN);
634+ SASL_CONSTANT(SASL_VRFY_CONF);
635+ SASL_CONSTANT(SASL_VRFY_PASSWD);
636+ SASL_CONSTANT(SASL_VRFY_OTHER);
637+
638 return SUCCESS;
639 }
640 /* }}} */
641@@ -185,6 +714,22 @@
642 return SUCCESS;
643 }
644 /* }}} */
645+/* {{{ PHP_RINIT_FUNCTION
646+ */
647+PHP_RINIT_FUNCTION(sasl)
648+{
649+ php_sasl_rinit_globals(TSRMLS_C);
650+ return SUCCESS;
651+}
652+/* }}} */
653+/* {{{ PHP_RSHUTDOWN_FUNCTION
654+ */
655+PHP_RSHUTDOWN_FUNCTION(sasl)
656+{
657+ php_sasl_rshutdown_globals(TSRMLS_C);
658+ return SUCCESS;
659+}
660+/* }}} */
661 /* {{{ PHP_MINFO_FUNCTION
662 */
663 PHP_MINFO_FUNCTION(sasl)
664@@ -214,7 +759,8 @@
665 php_info_print_table_row(2, "SASL Support", "enabled");
666 php_info_print_table_row(2, "SASL API Version", api_version);
667 php_info_print_table_row(2, "SASL Library Version", lib_version);
668- php_info_print_table_row(2, "Extension Version", "$Revision$");
669+ php_info_print_table_row(2, "Extension Version", PHP_SASL_VERSION);
670+ php_info_print_table_row(2, "CVS Revision", "$Revision$");
671 php_info_print_table_end();
672 }
673 /* }}} */
674@@ -239,7 +785,7 @@
675 libsasl_step = libsasl_version & 0xFFFF;
676 #endif
677
678- snprintf(version, 64, "%u.%u.%u (%s)",
679+ snprintf(version, sizeof(version), "%u.%u.%u (%s)",
680 libsasl_major, libsasl_minor, libsasl_step, sasl_implementation);
681
682 RETURN_STRING(version, 1);
683@@ -267,7 +813,7 @@
684 Returns the string translation of the given error code. */
685 PHP_FUNCTION(sasl_errstring)
686 {
687- long code;
688+ long code;
689 char *languages = NULL;
690 int languages_len;
691
692@@ -279,6 +825,27 @@
693 RETURN_STRING((char *)sasl_errstring(code, languages, NULL), 1);
694 }
695 /* }}} */
696+/* {{{ proto void sasl_seterror(resource conn, string message)
697+ Set the error string which will be returned by sasl_errdetail. */
698+#if SASL_VERSION_MAJOR >= 2
699+PHP_FUNCTION(sasl_seterror)
700+{
701+ zval *rsrc;
702+ sasl_conn_t *conn;
703+ char *message;
704+ int message_len;
705+
706+ if (zend_parse_parameters(2 TSRMLS_CC, "rs",
707+ &rsrc, &message, &message_len) == FAILURE) {
708+ return;
709+ }
710+
711+ ZEND_FETCH_RESOURCE(conn, sasl_conn_t *, &rsrc, -1, le_conn_name, le_conn);
712+
713+ sasl_seterror(conn, 0, message);
714+}
715+#endif
716+/* }}} */
717 /* {{{ proto string sasl_encode(resource conn, string input)
718 Encodes a block of data for tranmission using the security layer. */
719 PHP_FUNCTION(sasl_encode)
720@@ -345,10 +912,25 @@
721 Initializes the SASL client drivers. */
722 PHP_FUNCTION(sasl_client_init)
723 {
724- if (sasl_client_init(NULL) != SASL_OK) {
725+ zval *array;
726+
727+ if (zend_parse_parameters(1 TSRMLS_CC, "a", &array) == FAILURE) {
728+ return;
729+ }
730+
731+ /*
732+ * Convert the supplied array into a set of callback functions. We
733+ * don't bother spending any time validating its contents because the
734+ * sasl_client_init() function will do that for us (and return an error
735+ * if it encounters something that it doesn't like).
736+ */
737+ php_sasl_create_callbacks(Z_ARRVAL_P(array), SASLG(client_callbacks));
738+
739+ if (sasl_client_init(SASLG(client_callbacks)) != SASL_OK) {
740+ /* XXX: Free the callbacks? */
741 RETURN_FALSE;
742 }
743-
744+
745 RETURN_TRUE;
746 }
747 /* }}} */
748@@ -384,7 +966,7 @@
749 ZEND_REGISTER_RESOURCE(return_value, conn, le_conn);
750 }
751 /* }}} */
752-/* {{{ proto bool sasl_client_start(resource conn, string mechlist [, string &$output [, string &$mech]])
753+/* {{{ proto int sasl_client_start(resource conn, string mechlist [, string &$output [, string &$mech]])
754 Starts an authentication session. */
755 PHP_FUNCTION(sasl_client_start)
756 {
757@@ -421,10 +1003,13 @@
758 r = sasl_client_start(conn, mechlist, NULL, &data, &data_len, &chosenmech);
759 #endif
760
761- /* Print a warning and return false if we receive an unexpected result. */
762+ /*
763+ * Issue a warning and return the error code if we receive an unexpected
764+ * result code.
765+ */
766 if ((r != SASL_OK) && (r != SASL_CONTINUE)) {
767 php_sasl_error(E_WARNING, r TSRMLS_CC);
768- RETURN_FALSE;
769+ RETURN_LONG(r);
770 }
771
772 /* Store the output in the "output" parameter (by reference). */
773@@ -434,7 +1019,7 @@
774 /* Store the chosen mechanism in the "mech" parameter (by reference). */
775 ZVAL_STRING(mech, (char *)chosenmech, 1);
776
777- RETURN_TRUE;
778+ RETURN_LONG(r);
779 }
780 /* }}} */
781 /* {{{ proto int sasl_client_step(resource conn, string input, string &$output)
782@@ -483,14 +1068,25 @@
783 Initializes the session and loads the shared authentication mechanisms. */
784 PHP_FUNCTION(sasl_server_init)
785 {
786+ zval *array;
787 char *name;
788 int name_len;
789
790- if (zend_parse_parameters(1 TSRMLS_CC, "s", &name, &name_len) == FAILURE) {
791+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "as",
792+ &array, &name, &name_len) == FAILURE) {
793 return;
794 }
795
796- if (sasl_server_init(NULL, name) != SASL_OK) {
797+ /*
798+ * Convert the supplied array into a set of callback functions. We
799+ * don't bother spending any time validating its contents because the
800+ * sasl_client_init() function will do that for us (and return an error
801+ * if it encounters something that it doesn't like).
802+ */
803+ php_sasl_create_callbacks(Z_ARRVAL_P(array), SASLG(server_callbacks));
804+
805+ if (sasl_server_init(SASLG(server_callbacks), name) != SASL_OK) {
806+ /* XXX: Free the callbacks? */
807 RETURN_FALSE;
808 }
809
810
811Property changes on: sasl.c
812___________________________________________________________________
813Modified: cvs2svn:cvs-rev
814## -1 +1 ##
815-1.3
816\ No newline at end of property
817+1.6
818\ No newline at end of property
819Index: config.m4
820===================================================================
821--- config.m4 (.../tags/RELEASE_0_1_0)
822+++ config.m4 (.../trunk)
823@@ -6,7 +6,7 @@
824
825 if test "$PHP_SASL" != "no"; then
826 SEARCH_DIRS="/usr/local /usr"
827- SEARCH_SUBS="sasl sasl1 sasl2"
828+ SEARCH_SUBS="sasl2 sasl sasl1"
829 SEARCH_LIBS="sasl2 sasl"
830
831 if test -r $PHP_SASL; then
832@@ -19,6 +19,7 @@
833 SASL_DIR=$i
834 SASL_SUB=$j
835 AC_MSG_RESULT(found in $i)
836+ break
837 fi
838 done
839 done
840@@ -31,9 +32,10 @@
841
842 AC_MSG_CHECKING(for SASL library in $SASL_DIR/lib)
843 for i in $SEARCH_LIBS; do
844- if test -r $SASL_DIR/lib/lib$i.a; then
845+ if test -r $SASL_DIR/lib/lib$i.a -o -r $SASL_DIR/lib/lib$i.$SHLIB_SUFFIX_NAME; then
846 SASL_LIB=$i
847 AC_MSG_RESULT(found -l$i)
848+ break
849 fi
850 done
851
852
853Property changes on: config.m4
854___________________________________________________________________
855Modified: cvs2svn:cvs-rev
856## -1 +1 ##
857-1.2
858\ No newline at end of property
859+1.4
860\ No newline at end of property
861Index: docs/guide.txt
862===================================================================
863--- docs/guide.txt (.../tags/RELEASE_0_1_0)
864+++ docs/guide.txt (.../trunk)
865@@ -0,0 +1,50 @@
866+============================
867+ The SASL Extension for PHP
868+============================
869+
870+--------------------
871+ User Documentation
872+--------------------
873+
874+:Author: Jon Parise
875+:Contact: jon@php.net
876+:Date: $Date$
877+:Revision: $Revision$
878+
879+.. contents:: Contents
880+.. section-numbering::
881+
882+Frequently Asked Questions
883+--------------------------
884+
885+How does the SASL extension relate to the Auth_SASL PEAR package?
886+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
887+The `Auth_SASL`_ PEAR package provides native PHP implementations of many of
888+the SASL authentication mechanisms. In theory, those methods could call out
889+to the SASL extension to compute those strings using the native C library, but
890+I'm not sure the effort is worth it. I wouldn't object to the idea if someone
891+did the work, though.
892+
893+.. _Auth_SASL: http://pear.php.net/Auth_SASL
894+
895+Does saslauthd need to be running locally?
896+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
897+``saslauthd`` needs to be running on the same machine as the SASL client (the
898+PHP process, in your case). The libsasl library (that the SASL extension
899+wraps) will communicate with the ``saslauthd`` process via a local Unix domain
900+socket.
901+
902+Can saslauthd be used to authenticate against a remote server?
903+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
904+
905+The ``saslauthd`` process loads the SASL authentication modules and performs
906+the actual authentication. This may involve contacting a foreign machine
907+(such as a remote Kerberos or LDAP server).
908+
909+To complicate things even further, ``saslauthd`` can use `PAM`_ as its
910+authentication backend, which opens up even more authentication possibilities
911+(many of which may involve other hosts).
912+
913+.. _PAM: http://www.freebsd.org/doc/en_US.ISO8859-1/articles/pam/
914+
915+.. vim: tabstop=4 shiftwidth=4 softtabstop=4 expandtab textwidth=78 ft=rst:
916
917Property changes on: docs/guide.txt
918___________________________________________________________________
919Added: cvs2svn:cvs-rev
920## -0,0 +1 ##
921+1.1
922\ No newline at end of property
923Added: svn:mime-type
924## -0,0 +1 ##
925+text/plain
926\ No newline at end of property
927Added: svn:keywords
928## -0,0 +1 ##
929+Id Rev Revision Date LastChangedDate LastChangedRevision Author LastChangedBy HeadURL URL
930\ No newline at end of property
931Added: svn:eol-style
932## -0,0 +1 ##
933+native
934\ No newline at end of property
935Index: package.xml
936===================================================================
937Cannot display: file marked as a binary type.
938svn:mime-type = application/xml
939Index: package.xml
940===================================================================
941--- package.xml (.../tags/RELEASE_0_1_0)
942+++ package.xml (.../trunk)
943
944Property changes on: package.xml
945___________________________________________________________________
946Modified: cvs2svn:cvs-rev
947## -1 +1 ##
948-1.3
949\ No newline at end of property
950+1.5
951\ No newline at end of property
952Deleted: svn:mime-type
953## -1 +0,0 ##
954-application/xml
955\ No newline at end of property
956Index: php_sasl.h
957===================================================================
958--- php_sasl.h (.../tags/RELEASE_0_1_0)
959+++ php_sasl.h (.../trunk)
960@@ -26,6 +26,8 @@
961 extern zend_module_entry sasl_module_entry;
962 #define phpext_sasl_ptr &sasl_module_entry
963
964+#define PHP_SASL_VERSION "0.2.0-dev"
965+
966 #ifdef PHP_WIN32
967 #define PHP_SASL_API __declspec(dllexport)
968 #else
969@@ -38,6 +40,8 @@
970
971 PHP_MINIT_FUNCTION(sasl);
972 PHP_MSHUTDOWN_FUNCTION(sasl);
973+PHP_RINIT_FUNCTION(sasl);
974+PHP_RSHUTDOWN_FUNCTION(sasl);
975 PHP_MINFO_FUNCTION(sasl);
976
977 /* Common Functions */
978@@ -45,6 +49,7 @@
979 PHP_FUNCTION(sasl_errstring);
980 #if SASL_VERSION_MAJOR >= 2
981 PHP_FUNCTION(sasl_errdetail);
982+PHP_FUNCTION(sasl_seterror);
983 #endif
984 PHP_FUNCTION(sasl_encode);
985 PHP_FUNCTION(sasl_decode);
986@@ -63,12 +68,16 @@
987 PHP_FUNCTION(sasl_listmech);
988 PHP_FUNCTION(sasl_checkpass);
989
990-#if 0
991+/* Global Variables */
992+ZEND_BEGIN_MODULE_GLOBALS(sasl)
993+ sasl_callback_t *client_callbacks;
994+ sasl_callback_t *server_callbacks;
995+ZEND_END_MODULE_GLOBALS(sasl)
996+
997 #ifdef ZTS
998 #define SASLG(v) TSRMG(sasl_globals_id, zend_sasl_globals *, v)
999 #else
1000 #define SASLG(v) (sasl_globals.v)
1001 #endif
1002-#endif
1003
1004 #endif /* PHP_SASL_H */
1005
1006Property changes on: php_sasl.h
1007___________________________________________________________________
1008Modified: cvs2svn:cvs-rev
1009## -1 +1 ##
1010-1.2
1011\ No newline at end of property
1012+1.4
1013\ No newline at end of property
1014Index: package.php
1015===================================================================
1016--- package.php (.../tags/RELEASE_0_1_0)
1017+++ package.php (.../trunk)
1018@@ -0,0 +1,67 @@
1019+<?php
1020+
1021+require_once 'PEAR/PackageFileManager2.php';
1022+PEAR::setErrorHandling(PEAR_ERROR_DIE);
1023+
1024+$desc = <<<EOT
1025+SASL is the Simple Authentication and Security Layer (as defined by RFC 2222). It provides a system for adding plugable authenticating support to connection-based protocols. The SASL Extension for PHP makes the Cyrus SASL library functions available to PHP. It aims to provide a 1-to-1 wrapper around the SASL library to provide the greatest amount of implementation flexibility. To that end, it is possible to build both a client-side and server-side SASL implementation entirely in PHP.
1026+EOT;
1027+
1028+$version = '0.2.0';
1029+$notes = <<<EOT
1030+- The build system now searches for both static and shared versions of the SASL library. (Bug #13097)
1031+EOT;
1032+
1033+$package = new PEAR_PackageFileManager2();
1034+
1035+$result = $package->setOptions(array(
1036+ 'filelistgenerator' => 'svn',
1037+ 'changelogoldtonew' => false,
1038+ 'simpleoutput' => true,
1039+ 'baseinstalldir' => '/',
1040+ 'packagefile' => 'package.xml',
1041+ 'packagedirectory' => '.',
1042+ 'clearcontents' => true,
1043+ 'ignore' => array('package.php', 'package.xml'),
1044+ 'dir_roles' => array(
1045+ 'docs' => 'doc',
1046+ 'tests' => 'test',
1047+ ),
1048+));
1049+
1050+if (PEAR::isError($result)) {
1051+ echo $result->getMessage();
1052+ die();
1053+}
1054+
1055+$package->clearDeps();
1056+$package->setPackage('sasl');
1057+$package->setPackageType('extsrc');
1058+$package->setSummary('Cyrus SASL Extensions');
1059+$package->setDescription($desc);
1060+$package->setChannel('pecl.php.net');
1061+$package->setLicense('PHP License');
1062+$package->addMaintainer('lead', 'jon', 'Jon Parise', 'jon@php.net');
1063+
1064+$package->addRelease();
1065+$package->setProvidesExtension('sasl');
1066+$package->setAPIVersion('0.6.0');
1067+$package->setAPIStability('alpha');
1068+$package->setReleaseVersion($version);
1069+$package->setReleaseStability('alpha');
1070+$package->setNotes($notes);
1071+$package->setPhpDep('5.3.0');
1072+$package->setPearInstallerDep('1.4.3');
1073+
1074+$package->generateContents();
1075+
1076+if (isset($_SERVER['argv'][1]) && $_SERVER['argv'][1] == 'commit') {
1077+ $result = $package->writePackageFile();
1078+} else {
1079+ $result = $package->debugPackageFile();
1080+}
1081+
1082+if (PEAR::isError($result)) {
1083+ echo $result->getMessage();
1084+ die();
1085+}
1086
1087Property changes on: package.php
1088___________________________________________________________________
1089Added: cvs2svn:cvs-rev
1090## -0,0 +1 ##
1091+1.3
1092\ No newline at end of property
1093Added: svn:keywords
1094## -0,0 +1 ##
1095+Id Rev Revision Date LastChangedDate LastChangedRevision Author LastChangedBy HeadURL URL
1096\ No newline at end of property
1097Added: svn:eol-style
1098## -0,0 +1 ##
1099+native
1100\ No newline at end of property
1101Index: tests/sasl_version.phpt
1102===================================================================
1103--- tests/sasl_version.phpt (.../tags/RELEASE_0_1_0)
1104+++ tests/sasl_version.phpt (.../trunk)
1105@@ -4,11 +4,7 @@
1106 <?php if (!extension_loaded("sasl")) die('skip'); ?>
1107 --FILE--
1108 <?php
1109+echo sasl_version();
1110
1111-$version = sasl_version();
1112-if (strlen($version) > 0) {
1113- echo "OK";
1114-}
1115-
1116---EXPECT--
1117-OK
1118+--EXPECTREGEX--
1119+\d+\.\d+\.\d+ \(.*\)
1120
1121Property changes on: tests/sasl_version.phpt
1122___________________________________________________________________
1123Modified: cvs2svn:cvs-rev
1124## -1 +1 ##
1125-1.2
1126\ No newline at end of property
1127+1.3
1128\ No newline at end of property
1129Index: tests
1130===================================================================
1131--- tests (.../tags/RELEASE_0_1_0)
1132+++ tests (.../trunk)
1133
1134Property changes on: tests
1135___________________________________________________________________
1136Added: svn:ignore
1137## -0,0 +1,4 ##
1138+*.diff
1139+*.exp
1140+*.log
1141+*.out
1142Index: .
1143===================================================================
1144--- . (.../tags/RELEASE_0_1_0)
1145+++ . (.../trunk)
1146
1147Property changes on: .
1148___________________________________________________________________
1149Added: svn:ignore
1150## -0,0 +1,32 ##
1151+.deps
1152+Makefile
1153+*.lo
1154+*.la
1155+.libs
1156+libs.mk
1157+Makefile.fragments
1158+Makefile.global
1159+Makefile.objects
1160+autom4te.cache
1161+acinclude.m4
1162+aclocal.m4
1163+build
1164+config.cache
1165+config.guess
1166+config.h
1167+config.h.in
1168+config.log
1169+config.nice
1170+config.status
1171+config.sub
1172+configure
1173+configure.in
1174+install-sh
1175+libtool
1176+ltmain.sh
1177+missing
1178+mkinstalldirs
1179+modules
1180+scan_makefile_in.awk
1181+conftest*
1182+*.tgz
This page took 0.291042 seconds and 4 git commands to generate.