sas Tue Apr 24 02:40:06 2001 EDT
Modified files:
/php4/ext/ircg ircg.c ircg_scanner.c php_ircg.h
Log:
Add support for suppressing the "loopback" of messages sent using ircg_msg.
Add support for nickname escaping
Using this technique it becomes possible to use nicknames like
"John Doe" in the front-end. Scripts can use ircg_nickname_(un)escape.
This should be applyable to channel names as well.
A new flag character (2) is introduced which unescapes the respective
argument.
I.e. a format string could look like
"%2f joins %c<script>parent.new_user('%12f','%1c')</script>"
In the case of "G|27n|27R", this would be interpolated as:
"G'n'R joins foobar<script>parent.new_user('G\'n\'R','foobar')</script>"
I.e. %12f means "unescape the parameter and apply javascript escaping".
Index: php4/ext/ircg/ircg.c
diff -u php4/ext/ircg/ircg.c:1.60 php4/ext/ircg/ircg.c:1.61
--- php4/ext/ircg/ircg.c:1.60 Wed Apr 18 04:42:30 2001
+++ php4/ext/ircg/ircg.c Tue Apr 24 02:40:05 2001
@@ -16,7 +16,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: ircg.c,v 1.60 2001/04/18 11:42:30 sas Exp $ */
+/* $Id: ircg.c,v 1.61 2001/04/24 09:40:05 sas Exp $ */
#include "php.h"
#include "php_ini.h"
@@ -82,6 +82,8 @@
PHP_FE(ircg_html_encode, NULL)
PHP_FE(ircg_whois, NULL)
PHP_FE(ircg_kick, NULL)
+ PHP_FE(ircg_nickname_escape, NULL)
+ PHP_FE(ircg_nickname_unescape, NULL)
PHP_FE(ircg_ignore_add, NULL)
PHP_FE(ircg_ignore_del, NULL)
PHP_FE(ircg_disconnect, NULL)
@@ -218,6 +220,55 @@
}
}
+static const char hextab[] = "0123456789abcdef";
+
+#define NICKNAME_ESC_CHAR '|'
+
+static void ircg_nickname_escape(smart_str *input, smart_str *output)
+{
+ char *p;
+ char *end;
+ char c;
+
+ end = input->c + input->len;
+
+ for(p = input->c; p < end; p++) {
+ c = *p;
+ if ((c >= 'a' && c <= 'z')
+ || (c >= 'A' && c <= 'Z')
+ || (c >= '0' && c <= '9'))
+ smart_str_appendc_ex(output, c, 1);
+ else {
+ smart_str_appendc_ex(output, NICKNAME_ESC_CHAR, 1);
+ smart_str_appendc_ex(output, hextab[c >> 4], 1);
+ smart_str_appendc_ex(output, hextab[c & 15], 1);
+ }
+ }
+}
+
+#define HEX_VALUE(c) ((c>='a'&&c<='f')?c-'a':(c>='0'&&c<='9')?c-'0':0)
+
+static void ircg_nickname_unescape(smart_str *input, smart_str *output)
+{
+ char *p;
+ char *end;
+
+ end = input->c + input->len;
+
+ for(p = input->c; p < end; p++) {
+ switch (p[0]) {
+ case NICKNAME_ESC_CHAR:
+ if (p + 2 >= end) break;
+ smart_str_appendc_ex(output, (HEX_VALUE(p[1]) << 4) +
+HEX_VALUE(p[2]), 1);
+ p += 2;
+ break;
+ default:
+ smart_str_appendc_ex(output, p[0], 1);
+ }
+ }
+}
+
+
void ircg_mirc_color(const char *, smart_str *, size_t);
static void format_msg(const char *fmt, smart_str *channel, smart_str *to, smart_str
*from, smart_str *msg, smart_str *result)
@@ -231,6 +282,7 @@
int js_encoded = 0;
unsigned long len;
int mod_encode;
+ int nickname_decode;
if (fmt[0] == '\0') {
return;
@@ -243,19 +295,23 @@
smart_str_appendl_ex(result, p, len, 1);
- mod_encode = 0;
+ nickname_decode = mod_encode = 0;
#define IRCG_APPEND(what) \
- if (mod_encode) { \
+ if (mod_encode && nickname_decode) { \
smart_str tmp = {0}; \
- ircg_js_escape(what, &tmp); \
- smart_str_append_ex(result, &tmp, 1); \
+ ircg_nickname_unescape(what, &tmp); \
+ ircg_js_escape(&tmp, result); \
smart_str_free_ex(&tmp, 1); \
+ } else if (mod_encode) { \
+ ircg_js_escape(what, result); \
+ } else if (nickname_decode) { \
+ ircg_nickname_unescape(what, result); \
} else { \
smart_str_append_ex(result, what, 1); \
}
-
+
again:
c = q[1];
@@ -264,6 +320,10 @@
mod_encode = 1;
q++;
goto again;
+ case '2':
+ nickname_decode = 1;
+ q++;
+ goto again;
case 'c':
IRCG_APPEND(channel);
break;
@@ -683,6 +743,48 @@
#endif
}
+PHP_FUNCTION(ircg_nickname_escape)
+{
+ zval **p1;
+ smart_str in;
+ smart_str out = {0};
+
+ if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &p1) == FAILURE)
+ WRONG_PARAM_COUNT;
+
+ convert_to_string_ex(p1);
+
+ smart_str_setl(&in, Z_STRVAL_PP(p1), Z_STRLEN_PP(p1));
+
+ ircg_nickname_escape(&in, &out);
+ smart_str_0(&out);
+
+ RETVAL_STRINGL(out.c, out.len, 1);
+
+ smart_str_free_ex(&out, 1);
+}
+
+PHP_FUNCTION(ircg_nickname_unescape)
+{
+ zval **p1;
+ smart_str in;
+ smart_str out = {0};
+
+ if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &p1) == FAILURE)
+ WRONG_PARAM_COUNT;
+
+ convert_to_string_ex(p1);
+
+ smart_str_setl(&in, Z_STRVAL_PP(p1), Z_STRLEN_PP(p1));
+
+ ircg_nickname_unescape(&in, &out);
+ smart_str_0(&out);
+
+ RETVAL_STRINGL(out.c, out.len, 1);
+
+ smart_str_free_ex(&out, 1);
+}
+
PHP_FUNCTION(ircg_new_window)
{
zval **p1;
@@ -1168,48 +1270,59 @@
PHP_FUNCTION(ircg_msg)
{
- zval **id, **recipient, **msg;
+ zval **id, **recipient, **msg, **suppress;
php_irconn_t *conn;
smart_str l = {0};
smart_str m = {0};
smart_str tmp, tmp2;
+ int o_suppress = 0;
- if (ZEND_NUM_ARGS() != 3 || zend_get_parameters_ex(3, &id, &recipient, &msg)
== FAILURE)
+ if (ZEND_NUM_ARGS() < 3 || ZEND_NUM_ARGS() > 4 ||
+zend_get_parameters_ex(ZEND_NUM_ARGS(), &id, &recipient, &msg, &suppress) == FAILURE)
WRONG_PARAM_COUNT;
- convert_to_long_ex(id);
- convert_to_string_ex(recipient);
- convert_to_string_ex(msg);
+ switch (ZEND_NUM_ARGS()) {
+ case 4:
+ convert_to_long_ex(suppress);
+ o_suppress = Z_LVAL_PP(suppress);
+ case 3:
+ convert_to_long_ex(id);
+ convert_to_string_ex(recipient);
+ convert_to_string_ex(msg);
+ }
conn = lookup_irconn(Z_LVAL_PP(id));
if (!conn) RETURN_FALSE;
irc_msg(&conn->conn, Z_STRVAL_PP(recipient), Z_STRVAL_PP(msg));
- smart_str_setl(&l, Z_STRVAL_PP(msg), Z_STRLEN_PP(msg));
+
+ if (!o_suppress) {
+ smart_str_setl(&l, Z_STRVAL_PP(msg), Z_STRLEN_PP(msg));
- smart_str_setl(&tmp, Z_STRVAL_PP(recipient), Z_STRLEN_PP(recipient));
- smart_str_setl(&tmp2, conn->conn.username, conn->conn.username_len);
+ smart_str_setl(&tmp, Z_STRVAL_PP(recipient), Z_STRLEN_PP(recipient));
+ smart_str_setl(&tmp2, conn->conn.username, conn->conn.username_len);
- switch (Z_STRVAL_PP(recipient)[0]) {
- case '#':
- case '&':
- if (l.c[0] == 1) {
- handle_ctcp(conn, &tmp, &tmp2, &l, &m);
- } else {
- format_msg(MSG(conn, FMT_MSG_CHAN), &tmp, NULL, &tmp2, &l, &m);
- }
- break;
- default:
- if (l.c[0] == 1) {
- handle_ctcp(conn, NULL, &tmp2, &l, &m);
- } else {
- format_msg(MSG(conn, FMT_MSG_PRIV_FROM_ME), NULL,
- &tmp, &tmp2, &l, &m);
+
+ switch (Z_STRVAL_PP(recipient)[0]) {
+ case '#':
+ case '&':
+ if (l.c[0] == 1) {
+ handle_ctcp(conn, &tmp, &tmp2, &l, &m);
+ } else {
+ format_msg(MSG(conn, FMT_MSG_CHAN), &tmp,
+NULL, &tmp2, &l, &m);
+ }
+ break;
+ default:
+ if (l.c[0] == 1) {
+ handle_ctcp(conn, NULL, &tmp2, &l, &m);
+ } else {
+ format_msg(MSG(conn, FMT_MSG_PRIV_FROM_ME),
+NULL,
+ &tmp, &tmp2, &l, &m);
+ }
}
- }
- msg_send(conn, &m);
+ msg_send(conn, &m);
+ }
RETURN_TRUE;
}
Index: php4/ext/ircg/ircg_scanner.c
diff -u php4/ext/ircg/ircg_scanner.c:1.8 php4/ext/ircg/ircg_scanner.c:1.9
--- php4/ext/ircg/ircg_scanner.c:1.8 Sat Mar 10 15:21:49 2001
+++ php4/ext/ircg/ircg_scanner.c Tue Apr 24 02:40:05 2001
@@ -1,4 +1,4 @@
-/* Generated by re2c 0.5 on Sun Mar 11 00:24:46 2001 */
+/* Generated by re2c 0.5 on Fri Apr 20 10:19:53 2001 */
#line 1 "/home/sas/src/php4/ext/ircg/ircg_scanner.re"
/*
+----------------------------------------------------------------------+
@@ -18,7 +18,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: ircg_scanner.c,v 1.8 2001/03/10 23:21:49 sas Exp $ */
+/* $Id: ircg_scanner.c,v 1.9 2001/04/24 09:40:05 sas Exp $ */
#include <ext/standard/php_smart_str.h>
#include <stdio.h>
Index: php4/ext/ircg/php_ircg.h
diff -u php4/ext/ircg/php_ircg.h:1.11 php4/ext/ircg/php_ircg.h:1.12
--- php4/ext/ircg/php_ircg.h:1.11 Wed Apr 18 04:42:30 2001
+++ php4/ext/ircg/php_ircg.h Tue Apr 24 02:40:06 2001
@@ -48,6 +48,8 @@
PHP_FUNCTION(ircg_is_conn_alive);
PHP_FUNCTION(ircg_lookup_format_messages);
PHP_FUNCTION(ircg_register_format_messages);
+PHP_FUNCTION(ircg_nickname_escape);
+PHP_FUNCTION(ircg_nickname_unescape);
PHP_MINIT_FUNCTION(ircg);
PHP_MSHUTDOWN_FUNCTION(ircg);
--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
To contact the list administrators, e-mail: [EMAIL PROTECTED]