diff options
author | piaip <piaip@63ad8ddf-47c3-0310-b6dd-a9e9d9715204> | 2008-04-12 14:35:31 +0800 |
---|---|---|
committer | piaip <piaip@63ad8ddf-47c3-0310-b6dd-a9e9d9715204> | 2008-04-12 14:35:31 +0800 |
commit | 2b0055b710b9dde906533fb8ff116ac75bbe2b95 (patch) | |
tree | c7856b9d2e804e23509a32827b4030aa16e76b61 /mbbsd | |
parent | 3f850274b0b2f83e62b4a26149c41d754e17f614 (diff) | |
download | pttbbs-2b0055b710b9dde906533fb8ff116ac75bbe2b95.tar pttbbs-2b0055b710b9dde906533fb8ff116ac75bbe2b95.tar.gz pttbbs-2b0055b710b9dde906533fb8ff116ac75bbe2b95.tar.bz2 pttbbs-2b0055b710b9dde906533fb8ff116ac75bbe2b95.tar.lz pttbbs-2b0055b710b9dde906533fb8ff116ac75bbe2b95.tar.xz pttbbs-2b0055b710b9dde906533fb8ff116ac75bbe2b95.tar.zst pttbbs-2b0055b710b9dde906533fb8ff116ac75bbe2b95.zip |
- new interface to edit system files (preventing links/source change)
git-svn-id: http://opensvn.csie.org/pttbbs/trunk/pttbbs@4144 63ad8ddf-47c3-0310-b6dd-a9e9d9715204
Diffstat (limited to 'mbbsd')
-rw-r--r-- | mbbsd/admin.c | 261 |
1 files changed, 118 insertions, 143 deletions
diff --git a/mbbsd/admin.c b/mbbsd/admin.c index 5e188b59..66f415e1 100644 --- a/mbbsd/admin.c +++ b/mbbsd/admin.c @@ -714,158 +714,133 @@ m_board(void) return 0; } +static void +str_unify_blank(char *s) +{ + while(*s) + { + if (*s == '\t') *s = ' '; + s++; + } +} + +// ���i�@�U�A�g���̤j�W���C +#define MAX_ENTRIES (100) +#define min(a,b) ((a)<(b) ? (a) : (b)) + +// TODO ���ѧ�o�� UI �g���� general �@�I... + /* �]�w�t���ɮ� */ int x_file(void) { - int aborted, num; - char ans[4], *fpath, buf[PATHLEN]; - - move(b_lines - 7, 0); - /* Ptt */ - outs("�]�w (1)�����T�{�H (4)post�`�N�ƶ� (5)���~�n�J�T�� (6)���U�d�� (7)�q�L�T�{�q��\n"); - outs(" (8)email post�q�� (9)�t�Υ\\����F (A)���� (B)�����W�� (C)email�q�L�T�{\n"); - outs(" (D)�s�ϥΪ̻ݪ� (E)�����T�{��k (F)�w��e�� (G)�i���e�� " -#ifdef MULTI_WELCOME_LOGIN - "(X)�R���i���e��" -#endif - "\n"); - outs(" (H)�ݪO���� (I)�G�m (J)�X���e�� (K)�ͤ�d (L)�`�� (M)�~�y�ϥΪ̻{�ҳq��\n"); - outs(" (N)�~�y�ϥΪ̹L��ĵ�i�q�� (O)�ݪO�C�� help (P)�峹�C�� help\n"); -#ifdef PLAY_ANGEL - outs(" (R)�p�Ѩϻ{�ҳq�� (S)�p�Ѩϥ\\���\n"); -#endif - getdata(b_lines - 1, 0, "[Q]����[1-9 A-P]�H", ans, sizeof(ans), LCECHO); - - switch (ans[0]) { - case '1': - fpath = "etc/confirm"; - break; - case '4': - fpath = "etc/post.note"; - break; - case '5': - fpath = "etc/goodbye"; - break; - case '6': - fpath = "etc/register"; - break; - case '7': - fpath = "etc/registered"; - break; - case '8': - fpath = "etc/emailpost"; - break; - case '9': - fpath = "etc/hint"; - break; - case 'b': - fpath = "etc/sysop"; - break; - case 'c': - fpath = "etc/bademail"; - break; - case 'd': - fpath = "etc/newuser"; - break; - case 'e': - fpath = "etc/justify"; - break; - case 'f': - fpath = "etc/Welcome"; - break; - case 'g': -#ifdef MULTI_WELCOME_LOGIN - getdata(b_lines - 1, 0, "�ĴX�Ӷi���e��[0-4]", ans, sizeof(ans), LCECHO); - if (ans[0] == '1') { - fpath = "etc/Welcome_login.1"; - } else if (ans[0] == '2') { - fpath = "etc/Welcome_login.2"; - } else if (ans[0] == '3') { - fpath = "etc/Welcome_login.3"; - } else if (ans[0] == '4') { - fpath = "etc/Welcome_login.4"; - } else { - fpath = "etc/Welcome_login.0"; - } -#else - fpath = "etc/Welcome_login"; -#endif - break; - -#ifdef MULTI_WELCOME_LOGIN - case 'x': - getdata(b_lines - 1, 0, "�ĴX�Ӷi���e��[1-4]", ans, sizeof(ans), LCECHO); - if (ans[0] == '1') { - unlink("etc/Welcome_login.1"); - vmsg("ok"); - } else if (ans[0] == '2') { - unlink("etc/Welcome_login.2"); - vmsg("ok"); - } else if (ans[0] == '3') { - unlink("etc/Welcome_login.3"); - vmsg("ok"); - } else if (ans[0] == '4') { - unlink("etc/Welcome_login.4"); - vmsg("ok"); - } else { - vmsg("�ҫ��w���i���e���L�k�R��"); - } - return FULLUPDATE; + char *entries[MAX_ENTRIES] = {NULL}; + int centries = 0, i = 0; + char *fn, *v; + int sel = 0, page = 0; + char buf[PATHLEN]; + FILE *fp = NULL; + + fp = fopen("etc/editable", "rt"); + if (!fp) + { + vmsg("���]�w�i�s���ɮצC���A�Ь��t�ί����C"); + return 0; + } -#endif + // load the editable file. + // format: filename [ \t]* description + while (centries < MAX_ENTRIES && fgets(buf, sizeof(buf), fp)) + { + if (!buf[0] || buf[0] == '#' || buf[0] == '.' + || buf[0] == '/' || buf[0] == ' ') + continue; + str_unify_blank(buf); // replace all \t to ' ' in buf. + v = strchr(buf, ' '); // find if description exists. + if (v == NULL) continue; + fn = strstr(buf, ".."); // see if someone trying to crack + if (fn && fn < v) continue; + // reject anything outside etc/ folder. + if (strncmp(buf, "etc/", strlen("etc/")) != 0) + continue; + chomp(buf); + entries[centries++] = strdup(buf); + } + fclose(fp); + if (centries == 0) + { + vmsg("�L�i�s���ɮסA�Ь��t�ί����C"); + return 0; + } - case 'h': - fpath = "etc/expire.conf"; - break; - case 'i': - fpath = "etc/domain_name_query.cidr"; - break; - case 'j': - fpath = "etc/Logout"; - break; - case 'k': - mouts(b_lines - 3, 0, "1.���~ 2.���~ 3.���� 4.�d�� 5.���� 6.���l"); - mouts(b_lines - 2, 0, "7.���� 8.��l 9.�B�k 10.�ѯ� 11.���� 12.�g��"); - getdata(b_lines - 1, 0, "�п�� [1-12]", ans, sizeof(ans), LCECHO); - num = atoi(ans); - if (num <= 0 || num > 12) - return FULLUPDATE; - snprintf(buf, sizeof(buf), "etc/Welcome_birth.%d", num); - fpath = buf; - break; - case 'l': - fpath = "etc/feast"; - break; - case 'm': - fpath = "etc/foreign_welcome"; - break; - case 'n': - fpath = "etc/foreign_expired_warn"; - break; - case 'o': - fpath = "etc/boardlist.help"; - break; - case 'p': - fpath = "etc/board.help"; - break; + // edit the files! + while (sel >= 0) + { + const int rows = t_lines-2; -#ifdef PLAY_ANGEL - case 'r': - fpath = "etc/angel_notify"; - break; + // display. + clear(); stand_title("�s��t���ɮ�"); + for (i = page*rows; i < min(centries, (page+1)*rows); i++) + { + // parse entry + strlcpy(buf, entries[i], sizeof(buf)); + fn = buf; + v = strchr(fn, ' '); + *v++ = 0; + while (*v == ' ') v++; + if (strlen(fn) > 30) + strcpy(fn+30-2, ".."); + prints(" %3d. " + ANSI_COLOR(1;32) "%-36.36s " + ANSI_COLOR(0;1) "%-30.30s" + ANSI_RESET "\n", + i+1, v, fn); + } + move(b_lines, 0); + outs(ANSI_COLOR(31;47)); + prints("%-*s " ANSI_RESET, t_columns-2, + " ���Ы���V��μƦr���ܡA[ENTER/��]�s��A[q/��] ���X: "); + cursor_show(1+sel-page*rows, 0); + switch((i = vkey())) + { + case 'q': case KEY_LEFT: + sel = -1; continue; + case KEY_HOME: sel = 0; break; + case KEY_END: sel = centries-1; break; + case KEY_PGDN: sel += rows; + if (sel >= centries) sel = centries-1; + break; + case KEY_PGUP: sel -= rows; + if (sel < 0) sel = 0; + break; + case 'k': case KEY_UP: + if (sel > 0) sel--; break; + case 'j': case KEY_DOWN: + if (sel < centries-1) sel++; break; + + case '\n': case '\r': case KEY_RIGHT: + strlcpy(buf, entries[sel], sizeof(buf)); + v = strchr(buf, ' '); + *v++ = 0; + i = vedit(buf, NA, NULL); + vmsgf("�t���ɮ�[%s]: %s", buf, (i == -1) ? + "������" : "��s����"); + default: + if (i >= '0' && i <= '9') + { + sel = search_num(i, centries-1); + if (sel < 0) sel = 0; + } + break; + } + // change page if required. + page = sel / rows; + } - case 's': - fpath = "etc/angel_usage"; - break; -#endif + // free the entries + for (i = 0; i < centries; i++) + free(entries[i]); - default: - return FULLUPDATE; - } - aborted = vedit(fpath, NA, NULL); - vmsgf("\n\n�t���ɮ�[%s]: %s", fpath, - (aborted == -1) ? "������" : "��s����"); return FULLUPDATE; } |