[첫화면으로]UseModWiki소스수정/반영된사용자의견archive01

마지막으로 [b]

1. 조프 - 사용자 ID 대소문자 문제
2. 조프 - 도움말의 테이블 설명 수정
3. 조프 - 입력시 변환하는 매크로를 미리 보기 창에도 적용하기
4. Bab2 - 테이블 관련 문답
5. Bab2 - Footer 관련 버그 수정
6. 암호 저장 방식
7. 달력 기능
8. 로그아웃시 상단 메뉴의 '로그아웃'링크가 남는 문제
9. 페이지 Link
10. 매크로 처리 시점의 문제

1. 조프 - 사용자 ID 대소문자 문제

조프 - 사용자 ID 대소문자 문제에 대해서 소스를 살펴봤습니다.

근본적인 문제는 UseMod 위키가 각 페이지의 처음을 대문자만 사용하도록 지정해놨다는 것이더군요.
FreeToNormal 이라는 함수에서 ucfirst라는 함수를 돌리는데, 이 함수가 단어의 첫번째 글자를 대문자로 바꿔주는 함수입니다.
그리고 DoUpdatePrefs 함수에서 FreeToNormal 함수를 호출하면서 아이디의 첫 글자가 대문자로 바뀌는 것이죠.

실제로는 아이디를 가지고 페이지를 만들 수도 있고, RecentChanges에서 아이디에 링크도 걸리기 때문에,
그 부분을 함부로 수정했다가는 어떤 부작용이 생길지 짐작하기가 힘드네요.

지양 - 환경 설정에서만이라면..
어찌어찌 했더니 소문자로 시작하는 아이디라도 소문자 화일명으로 제대로 생성됩니다. 로그인도 소문자로 시작하는 아이디로 당연히 되지요. 다만 최근변경내역이나 환경설정에서는 여전히 대문자로 시작하는 아이디가 나와버리긴 합니다. 사용자가 좀 헷갈릴 수는 있어도 저는 그냥 이러고 쓰고 있습니다. DoUpdatePref 에서

$UserID = &GetParam("p_username",  ""); 
이것을
$UserID = &GetParam('id', "");
if ( $UserID eq '' ) {
	$UserID = &GetParam("p_username",  "");
}
이것으로 고치면 화일을 만들 때 username 이 아니라 id 대로 만들겠지요.

아예, 새로운 아이디를 만들때와 로긴할 때 사용자명을 소문자로 넣었더라도 첫글자를 대문자로 바꿔버린 후에 생성 또는 암호체크 등을 하게 고치는 것은 어떨까요? 그러니까 사용자 입장에서는 대문자를 넣든 소문자를 넣는 시스템 입장에서는 같은 아이디로 취급해버리도록요. (으.. 요새 WikiX 설치를 검토한다고 끙긍댔더니 편집할 때 자꾸 그쪽 방식대로 되는군요 ^^;) -raymundo

뭐 그것도 좋겠네요. ^_^; -지양

UseModWiki소스수정을 통해서 그렇게 바꿨습니다. 이쪽이 훨씬 간편한 해결책이 될 것 같죠? :-) 다만, 정신이 몽롱한 상태에서 제대로 알지도 못하는 코드를 들여다보면서 찍은 거라.. ^^; 제대로 동작하는지 확신이 안 서는군요. 몇 번 테스트한 것 가지고는 잘 되는 것 같습니다만. -raymundo

2. 조프 - 도움말의 테이블 설명 수정

도움말의 '링크와 이미지' 부분에서 테이블 설명이 문제가 있네요.

예제 부분을 각각

<pre>
|| first || second || third ||
|||| span four || five ||
</pre>

<pre>
TABLE: bgcolor=yellow cellspacing=5 border=1 width=90% align=center
|| first || second || third ||
|||| span four || five ||
</pre>

이렇게 고쳐주는게 좋을 것 같습니다. (원래는 pre가 아니라 nowiki 로 되어있습니다)

고쳤습니다. 감사합니다 -raymundo

3. 조프 - 입력시 변환하는 매크로를 미리 보기 창에도 적용하기

Preview 문제라면 말씀하신 것처럼 별도의 함수로 분리해봤습니다.
sub DoPreview {
	my $textPreview;
	
	$ClickEdit = 0;
	print &GetHttpHeader();
	print &GetHtmlHeader("$SiteName: Preview", "Preview");
	$textPreview = &GetParam("text", undef);
	print &WikiToHTML(&ProcessPostMacro($textPreview));
}

sub ProcessPostMacro {
	my ($string) = @_;
	my $authorAddr = $ENV{REMOTE_ADDR};

	my ($timestamp) = CalcDay($Now) . " " . CalcTime($Now);
	...
	return $string;
}

sub DoPost {
	...
	# Remove "\r"-s (0x0d) from the string
	$string =~ s/\r//g;
	
	# Post Macro
	$string = &ProcessPostMacro($string);
	
	# Lock before getting old page to prevent races
	&RequestLock() or die(T('Could not get editing lock'));
	...
}
이런 식으로 수정해봤더니 일단 되는 것 같네요.

그리고... 쓸 때 <mysign> 이라고 쓰면 저장할 때는 바로 저장하는게 아니라 <mysign(네임,시간)> 이런 식으로 저장한 다음에, 화면 출력할 때 실제 html로 바꿀 수는 없을까요? 중간에 mysign에 대한 포맷을 전부 변경하고 싶어질 때를 대비할 수 있는 방법이 아닐까 생각합니다.

-- 조프 2002-11-12 4:12 pm

글쎄요.. 그러면 애초부터 매크로를 mysign(네임,시간) 으로 지정한 것과 동일한 건가요? (제가 제대로 이해를 한건지..) 그럴 경우 예전에 했던 서명을 나중에 수정해 버릴 수 있기 때문에 옳지 않다고 생각합니다. 그걸 막으려면, 편집창에서는 mysign 으로, 내부적으로는 mysign(네임,시간) 으로, 출력할때는 div 어쩌고... 로 변환되어야 하는데.. 그래도 여전히 기존의 mysign 과 나중의 mysign 을 어찌 구분하느냐 하는 문제가 남고.. 음.. 암튼 복잡할 것 같네요. ^^
제가 말씀드린 방식을 택하면 편집할 때 바로 mysign(네임,시간) 처럼 써도 마찬가지 결과가 나오겠죠. 하지만, 일단 아이디나 시간이 자동으로 들어가는 것 자체가 장점이 될 수 있을 겁니다. 매번 아이디와 시간을 입력해야 한다면 아무도 안쓰겠지요. 그리고 지금 처리하신 방식에서도 누군가가 고치자고 마음만 먹으면 고칠 수 있는건 마찬가지입니다. 그건 위키의 특성상 당연한 일이죠(제가 위의 제 mysign 결과로 나온 태그의 시간 부분을 수정할 수도 있지요). 하지만 제가 제안한 방식으로 하면 편집할 때 "이 부분은 매크로 처리가 되는 부분이다." 라고 사용자가 알 수 있고, "화면에 출력되는 양식은 화면에 출력할 때 결정할 수 있게 해주는게 좋다." 라고 하는 생각에 근거를 두고 있습니다.

비슷한 맥락으로, syntax highlighting 역시, 지금처럼 매번 출력할 때 처리하는 게 아니라, 입력 직후에 code2html 을 불러서 html 출력을 얻어낸 후에 사용자 데이타를 그렇게 바꿔버린다면 훨씬 빨라지겠죠. 그렇지만 그 페이지를 다시 수정하기로 들어간다면.. 게다가 바로 그 {{{#!vim perl }}} 로 둘러쌓인 부분을 수정하려 한다면... 그래서 차마 도입하지 못하고 있습니다.. 음.. 출력시 변환되는 {{{ }}} 와 입력직후 치환되는 {{{ }}} 를 별도로 만들까요.. 아아.. 일이 일을 부르는.. ^^;

위에서 말씀드렸듯이, 제 생각은 사용자가 입력한 내용을 마음대로 바꾸자는게 아니라, 사용자가 입력한 내용을 최소한으로 건드리고(이건 할 수 없고요), 위키에서는 출력할 때의 포맷만 결정해주자는 거지요. mysign의 경우는 뭔가 데이터를 저장해둬야 하는데 그 방법이 미리 태그까지 결정한 채로 저장하는게 아니라, 최소한의 정보만 붙여서 저장하고, 출력할 때 실제 태그를 적용하자는 겁니다. 지금 raymundo님이 구현하신 방법대로 하면 mysign은 저장할 때 포맷이 결정되고, {{{#!vim perl }}} 은 출력할 때 포맷이 결정되는겁니다. 제 생각에는 그게 불합리하다는 것이지요. 좀더 생각을 해봐야 할 문제 같습니다.

아아.. 무슨 말씀인지 알겠습니다. :-) 아까는 이해를 잘 못하고 있었거든요. ^^ 말씀하신 내용이 상당히 합당하다고 생각됩니다. 정리하면, 사용자 입장에서는 mysign 이라고 해도 되고, mysign(이름,시간) 이라고 명시적으로 넣을 수도 있게 되고, (그렇지만 편한 쪽을 택할테니 mysign 쪽을 택하겠군요). 입력시 변환은 최소화하여서 mysign -> mysign(이름,시간) 까지만 변환을 하고, mysign(이름,시간)을 최종적으로 div 어쩌고로 변환하는 것은 출력시 변환 과정에 넣자..는 말씀이시로군요. 그리고 어차피 서명의 성격 운운하더라도, 맘만 먹으면 div 태그부터 직접 입력을 할 수 있으니 그게 그거이기도 하고요.

사용자가 의도적으로 사인을 맘대로 작성할 수 있다는 점에서는 확실히 그런데, 의도가 아닌 실수로 엉뚱한 입력을 할 경우를 고려하니 여전히 망설여지는 부분입니다. 방금 떠오른 생각인데, 사용자가 직접 mysign(이름,시간)의 형태로 넣는다 하더라도, 그 이름과 시간 항목의 값을 입력시변환 과정에서 mysign 을 썼을 때와 동일하게 바꿔버리는 방법도 있겠군요. 고쳐 보겠습니다.
-- Raymundo 2002-11-12 11:59 pm

그리고 별도로 ProcessPostMacro 를 만든 것 좋네요. 그렇게 바꿔야겠습니다. 감사합니다~
-- Raymundo 2002-11-12 6:39 pm

4. Bab2 - 테이블 관련 문답

아...질문이 있었는데 홀랑까먹고 인사만 하고 가버렸었네요..^^; 테이블 정렬이 가운데로만 가능해서 |> |< 이걸로 좌,우 정렬이 가능하게 할려고 했는데 < 이거랑 > 이게 처리하는데 COLSPAN 크기 지정이 제대로 안되네요. 지금은 |( 이거랑 |) 이걸로 대충 쓰고는 있는데 |< |> 이걸로 할 수 있는 방법이 없을까여? 펄이랑 html에 대해서 워낙에 아는게 없어서리..ㅡ.ㅡ;; 수고하세요 ^^

(모인모인은 잘 모르겠고 phpwiki에서는 테이블 내부정렬을 |> |< 이것을 사용합니다.)

 
-- Bab2 2002-11-19 6:34 pm
글쎄요, 저도 Perl 도 html 도 거의 모르는 터라.. 요새 Perl 페이지 내용 올라오는 거 보면 아시겠지만, 이제야 기본 문법 보고 있는 중입니다. 지금껏 했던 소스 수정은 기존의 코드가 있으니까 대충 의미파악하면서 때려맞췄던 것이고... ^^ 테이블 쉘 내의 정렬을 제가 별로 필요를 느끼지 못하고 있어서 관심이 없었는데... |( |) 로는 되면서 |< |> 로는 안 될 이유가 무엇인지 모르겠네요. UseModKr:질문과답변/WikiWiki질문 에 나온 거 말씀하시는 거죠? 도움이 될런지는 모르겠지만 저도 들여다보도록 하겠습니다.
-- Raymundo 2002-11-19 10:55 pm

나름대로 고쳐보았습니다. UseModWiki소스수정 에 고친 부분을 적어 두었고, UseModWiki소스수정/TestTable 에서 확인할 수 있습니다. 직접 고쳐 보니 colspan 값이 제대로 처리되지 않는다는 말의 뜻을 이해할 수 있었습니다. :-) 테이블을 만들기 위해서 "|>" 를 사용할 경우, 이게 테이블 변환이 되기 전에 QuoteHtml() 함수를 거치면서 "|&gt;" 로 바뀌어 버립니다. 따라서 s/ 명령으로 치환할 때, 정규표현식에서 "\|>" 를 찾도록 하지 말고 "\|&gt;" 를 찾도록 해야 하겠죠.

colspan 크기 지정은, "|" 의 갯수를 센 후에 2로 나누어서 계산하도록 되어 있습니다. 즉 "||||" 은 길이가 4이니까 2로 나누면 colspan=2 가 되는 거죠. 그런데 만약 "|>|>" 라고 적었다면, 실제로는 "|&gt;|&gt;" 로 변환되니까, 길이가 10이 되겠죠. 따라서 2로 나눌 것이 아니라 5로 나눠야겠지요. "|<" 도 마찬가지로 "|&lt;" 로 변환되니 이 문자열을 치환하도록 해야 하고, 2가 아닌 5로 나누어야 될 겁니다. 저는 차라리 "|||<" 와 같이 표기하는 것이 더 낫다고 판단하여 좀 다르게 하였습니다만.
-- Raymundo 2002-11-20 1:05 am

|||< 이게 더 낫네요.. 머리가 나빠서 ^^; 저도 그걸로 바꿔야 겠네요. 테이블 정렬기능 추가하실 때 rowspan도 같이 넣는건 어떨까 싶습니다. 잘 되는군요. 여담인데 아무래도 테이블 정렬까지 완료된 소스를 이곳에서 새로 받아와야될거 같습니다. 근데 제위키에서 도움말 매크로 항목에서 $가 계속 99 99라고 나오네요. Syntaxhighlighting 패치까지 엎어놓은 상태입니다. 어떻게 해야될까여..ㅠㅠ (근데 이곳에서 받아온 화일은 $ 표기가 잘되네요 ㅠㅠ)

그리고, 스타일시트의 table과 td클래스에 정렬방식을 명시 해두면 정렬기능이 먹히지 않았던걸로 기억됩니다. (먹혔던가? :)) 그리고, 스타일시트에서 table과 td의 border값을 없애버리고 위키소스의 내용을 아래처럼 수정해주면 TABLE: 매크로로 기본 border값을 1로 하면서 별도의 border값을 줄 수 있을겁니다. (테두리 없는 표가 필요했거든요, 그것도 기본값으로 테두리가 있는.. ^^;)
sub WikiLinesToHtml {
 ..(중간생략)..
	while (@htmlStack < $depth) {
		push(@htmlStack, $code);
		if ($code eq "TABLE") {					# added luke
			$pageHtml .= "<TABLE $TableTag>\n"; <- 요걸
			$pageHtml .= "<TABLE $TableTag border='1'>\n"; <- 요렇게

		} else {
			$pageHtml .= "<$code>\n";
		};	
 ..(이하생략)..
마지막으로 오리지널 유즈모드 사이트에서 글자색을 지정해줄수 있는 패치를 봤었는데 그것도 쓸만하더군요.

제가 너무 욕심을 부려서 고생 많이 하셨네요. 고맙습니다. 수고하세요 ^^
-- Bab2 2002-11-20 2:27 am
rowspan 기능을 추가했습니다. /TestTable 에서 확인할 수 있습니다. 좋은 하루 되세요. :-)
-- Raymundo 2002-11-20 12:15 pm

5. Bab2 - Footer 관련 버그 수정

흑...거의 다 쳤는데 익스창이 죽어버리다니..ㅜㅡ 근영님 wiki.pl 소스중에서 아래함수를 수정해주어야 합니다.
sub GetMinimumFooter {

        my $result = '';  ##추가
        if ($FooterNote ne '') {
#               return T($FooterNote) . $q->end_html;  # Allow local translations
                $result .= T($FooterNote) . $q->end_html;  # Allow local translations  ##변경
        }
####################################################
### replaced by gypark
### page 마지막에 top 으로 가는 링크를 추가
#       return $q->end_html;
#       return "\n<div align=\"right\"><a accesskey=\"x\" name=\"#PAGE_BOTTOM\" href=\"#PAGE_TOP\">" . T('Top') . "</a></div>\n" . $q->end_html;
        $result .= "\n<div align=\"right\"><a accesskey=\"x\" name=\"#PAGE_BOTTOM\" href=\"#PAGE_TOP\">" . T('Top') . "</a></div><br>\n" . $q->end_html; ##변경 -> <br> 안붙여주면 FooterNote내용과 섞여버림.
        return $result;
###
####################################################
}
-- Bab2 2002-11-21 8:40 pm
역시, 코드를 공개하면 이렇게 좋은 피드백이 날아오는 법이로군요. ^_^; 지적하신 부분 수정했습니다. 그리고 위에서 if 문 안에 있는 $q->end_html 쪽은 삭제해야겠습니다. /body /html 태그가 두 번 들어가게 됩니다. FooterNote 의 내용과 섞이는 문제는 FooterNote 쪽에 align=right 인 이미지가 있을 경우 그런 것 같습니다. FooterNote 를
$FooterNote="<p align='right'><img src='이미지경로'></p>";
와 같이 하면 섞이지 않을 겁니다. 좋은 지적 감사합니다~
-- Raymundo 2002-11-21 9:29 pm

6. 암호 저장 방식

User의 Pass나 Admin의 Pass를 crypt 함수를 사용해서 encrypt 하지 않는 이유가 있는지요.

뭔가 특별한 이유가 없으면 고쳐볼까 생각중입니다. -Gravi

그래 주시면 고맙죠 ^^; encrypt 하지 않는 이유가 있는지, 하려면 어떻게 하는지 저는 둘 다 몰라서요. perl 에 대해 아주 간단한 정도만 아는 상태라... -Raymundo

어제 처음 UseModWiki를 설치한 지라 아직 소스 파악이 안되긴 했지만..
원 소스가 그렇다면 프로그램할 때부터 애당초 Password같은 것은 염두에 두지 않고 Open 으로 만든 것 같네요..
(아마 제 생각에는 의도적으로..)
crypt한다고 해도 안전한 것은 아니니 어쩌면 그냥 두는게 나을지도 모르겠습니다. -Gravi


crypt함수를 사용해 봤습니다. 쫌 뒤져봤는데 crypt함수 그냥 쓰는건 좋지 않다고 해서(OS 의존적이랬던가..ㅡ.ㅡa) MD5랑 SHA 까지 해봤는데 인터프리터가 모듈이 없다고 발광을 하네요. 그래서 그냥 crypt 함수 썼습니다. "salt"를 자기가 원하는 키로 집어넣으시면 되겠습니다. 기존 회원 데이터는 쓸모없어집니다.
## 사용자암호 수정
sub DoUpdatePrefs {
        my ($username, $password);

        my $hashpass = "";         #### 추가한다.

        ....

        $password = &GetParam("p_password",  "");
        $hashpass = crypt($password, "salt"); #### 추가한다.

        if ($password eq "") {
                print T('Password removed.'), '<br>';
                undef $UserData{'password'};
        } elsif ($password ne "*") {
                print T('Password changed.'), '<br>';
#               $UserData{'password'} = $password; #### 이것을 ↓
                $UserData{'password'} = $hashpass; #### 이것으로 바꾼다.
        ....
        }
                ....

                } elsif ($password ne "*") {
                        print T('Administrator password changed.'), '<br>';
#                       $UserData{'adminpw'} = $password; #### 이것을 ↓
                        $UserData{'adminpw'} = $hashpass; #### 이것으로 바꾼다.
        ....
}

sub DoLogin {
        my ($uid, $password, $success);
        my $hashpass = "";

        $password = &GetParam("p_password",  "");
        $hashpass = crypt($password, "salt"); #### 추가한다.

        if (($password ne "") && ($password ne "*")) {
                $UserID = $uid;

                &LoadUserData();
#               if (defined($UserData{'password'}) && ($UserData{'password'} eq $password)) { #이것을
                if (defined($UserData{'password'}) && ($UserData{'password'} eq $hashpass)) { #이것으로 바꾼다
        ....
## 관리자암호 수정
sub UserIsAdmin {
        my (@pwlist, $userPassword);

        my $hashadmin = crypt($AdminPass,"salt"); #### 추가한다.
        .....
##########
#이것을 --->
#       foreach (split(/\s+/, $AdminPass)) {
#이것으로 바꾼다. --->
        foreach (split(/\s+/, $hashadmin)) {
##########

        .....
}

sub UserIsEditor {
        my (@pwlist, $userPassword);

        my $hashadmin = crypt($EditPass,"salt"); #### 추가한다.
        .....
##########
#이것을 --->
#       foreach (split(/\s+/, $EditPass)) {
#이것으로 바꾼다. --->
        foreach (split(/\s+/, $hashadmin)) {
##########
        .....
}
-- Bab2 2002-11-24 8:02 pm

아이디어 감사합니다. UseModWiki소스수정에 반영했습니다. 위 코드대로라면 사용자가 해쉬키를 바꿔줄때마다 기존 유저 데이타가 전부 효력을 잃는 문제가 있겠네요. 그래서 검사하는 루틴을 좀 바꿨습니다. 해쉬키를 바꾸더라도 기존 사용자의 로긴이나 관리자 권한 검사는 그대로 유효하게 되고, 환경설정에서 새로 저장할 때 바뀌게 됩니다.
-- Raymundo 2002-11-25 3:07 am

7. 달력 기능

노스모크에서 봤던 달력 모듈을 보고 엄청 맘에 들어했는데, 위키X의 것은 한술 더뜨네여..흑~ 넘 이뻐여..ㅠㅠ
-- Bab2 2002-11-22 12:36 am

^^; 당연히.. 불가능하지 않겠지만.. 날짜 관련 함수를 좀 살펴보기 전까지는 힘들겠네요.
-- Raymundo 2002-11-22 7:55 am
대충 WikiX 의 모습과 비슷하게 만들어 보았습니다. /TestCalendar 에서 확인할 수 있습니다. 소스를 정리를 좀 해야 하기에 지금 공개하지는 못하겠고, 일단 테스트를 좀 해봐야겠습니다. 오동작하지 않는지 연습장 등에서 시험을 좀 해봐주시면 감사하겠습니다.
-- Raymundo 2002-11-22 4:39 pm
2038년 이후로는 오류가 생깁니다.
-- Bab2 2002-11-22 6:31 pm

그럭저럭 달력 매크로를 만들었습니다. Perl 의 날짜처리 함수의 한계 때문에 1902년 정도에서 2037 년까지만 안전하게 출력할 수 있습니다. 그 이상의 범위에서는 에러가 나던가, 엉뚱한 달력이 출력됩니다. 사실 1902년의 달력도 정확한지 확인해본건 아니지만... /TestCalendar 에서 페이지소스와 출력결과를 볼 수 있습니다.

8. 로그아웃시 상단 메뉴의 '로그아웃'링크가 남는 문제

로그아웃할때 화면상에 로그아웃했다는 메세지가 뜨면서 메뉴항목은 로그인으로 다시 바껴야 하는데 로그아웃으로 그대로 남아있습니다. 아래와 같이 하면 일단 로그아웃할때 메뉴이름도 "로그인"으로 바로 바뀝니다. 꽁수이긴 합니다만은...

  1. 로긴/로그아웃꽁수

sub GetGotoBar {
....(중간생략)
#       if (($UserID eq "113") || ($UserID eq "112")) {
        if (($UserID eq "113") || ($UserID eq "112") || ($UserID eq "")) { # "",그니깐 NULL 추가
                $bartext .= ' </td><td bgcolor=white> ' . &ScriptLink("action=login", T('Login'));
        }
        else {
                $bartext .= ' </td><td bgcolor=white> ' . &ScriptLink("action=logout", T('Logout'));
        }
....(이하생략)
}

sub DoLogout {                           ## 이하 주석(#)처리된 구문은 원래코드이며, 통째로 갈아치운다.
<--- 함수내용을 통째로 바꾼다. --->
#       my ($uid);                      ## 사실은 저도 몰라여-_-;; 판단 기준을 $UserID = NULL (or) not NULL 로 뒀음.
#       $SetCookie{'id'} = "";
#       $SetCookie{'randkey'} = $UserData{'randkey'};
#       $SetCookie{'rev'} = 1;
#       print &GetHeader('', T('Logout Results'), '');
#       if (($UserID ne "113") && ($UserID ne "112")) {
#               print Ts('Logout for user ID %s complete.', $UserID);
#       print &ScriptLink("처음", T('<br>첫화면으로..<br>'));
#       print "<hr>\n";
#       %UserCookie = %SetCookie;
#       $UserID = "";
#       #print &GetGotoBar('');
#       print $q->endform;
#       print &GetMinimumFooter();

        my ($uid);
        $uid = "";
        $UserID = $uid;

        &LoadUserData();
        $SetCookie{'id'} = "";

        print &GetHeader('', T('로그아웃'), '');
        print Ts('로그아웃 하였습니다.<br>');
        print &ScriptLink("처음", T('첫화면으로..<br>'));

        %UserCookie = "";
        print "<hr>\n";
        print $q->endform;
        print &GetMinimumFooter();
<--- 여기까지 함수내용을 통째로 바꾼다. --->
}
  1. 아이디 길이제한 : 위와 같이 했을경우 아이디의 길이가 0, 즉 이름이 없는(NULL인) 아이디가 만들어질 경우 난감해집니다. 지양님 위키의 Userdata 디렉에 아마도 '.db' 화일이 있을것입니다. 본인이 장난쳤습니다. 죄송합니다..-_-;

어차피 3글자 이하는 잘 쓰지 않는다는 생각에 저는 영문 4글자 이상으로 아이디 제한을 둬서 쓰고 있습니다.

sub DoUpdatePrefs {
....
#       if ($username eq "") {                ## 위와 같은 이유로 이 부분은 일단 주석처리 해버린다. db화일이 지워지지도 않았던 것 같다.
#               print T('UserName removed.'), '<br>';
#               undef $UserData{'username'};
#       } elsif ((!$FreeLinks) && (!($username =~ /^$LinkPattern$/))) {
    <--- 추가 --->
        if (length($username) < 4) {  # Too long
                print T('사용자명은 영문 3글자 이상, 한글 2글자 이상이어야 함. 저장하지 않음.'), "<br>\n";
                $UserID = 0;
                print "<br><br>".&ScriptLink("action=editprefs", T('다시신청'));
                return;
    <--- 추가 --->
        } elsif ((!$FreeLinks) && (!($username =~ /^$LinkPattern$/))) {
                print Ts('Invalid UserName %s: not saved.', $username), "<br>\n";
....
}
근데 sub DoUpdatePrefs()를 보시면 아이디를 50자이하로 제한하게끔 한 IF 구문을 볼 수 있을 것입니다. 

위의 것을 추가하지 않고
#       } elsif (length($username) > 50) {  # Too long  <-- 이것을
        } elsif (length($username) > 50 || length($username) <4) {  # Too long  <-- 이렇게 해도 됩니다.
sub dologin {
(중간생략)...
                        $success = 1;
                }
                else {
                        $SetCookie{'id'} = "";
                        $UserID = "";           ### 추가한다.
                        &LoadUserData();                ### 추가한다.
                }
(이하생략)...
}

감사합니다. 연구실에 가서 살펴보도록 하겠습니다.
-- Raymundo 2002-11-22 7:55 am

아이디 길이 제한은 좋은 생각입니다. NULL 아이디 문제 말고도, 아이디를 113 이나 112 라고 지을 경우도 문제를 일으켰었거든요. (악용할지 몰라서 밝힐 수는 없었지만 ^^;) 아이디의 최소 길이를 제한 하는 것은 UseModWiki소스수정에 반영했습니다.

그리고 로그아웃 직후에도 여전히 로그아웃 링크가 남아 있는 문제는, 말 그대로 '꽁수'를 써서 일단 고쳐 두었습니다. Bab2 님께서 작성하신 패치도 괜찮은 것 같긴 한데, 제가 소스를 제대로 이해하기 전까지는 사용자ID 를 다루는 부분은 웬만하면 건드리지 않으려고 합니다. K3 버전에서 사용되는 아이디는 오리지널 위키에서는 단지 필명일 뿐이고, 진짜 ID 는 숫자로만 구성되어 임의로 할당되는 것이었는데, Luke 님이 이 숫자아이디와 문자필명과의 관계를 어느 정도나 뜯어 고친 건지 알 수가 없어서 말이죠.
-- Raymundo 2002-11-25 9:13 pm

dologin부분을 추가했습니다.(역시나 꽁수입니다. :) ) $LoadUserData 함수가 $UserID에 해당하는 화일을 부르는 것을 이용했습니다.($UserID는 NULL로) 아마 이게 추가되면 로그인할때 존재하는 아이디 이면서 잘못된 비밀번호 입력시 로그인실패 메세지와 메뉴에 로그아웃, 관리자메뉴가 뜨는 문제도 해결될겁니다.
-- Bab2 2002-11-25 10:33 pm

그런 문제가 있는 줄도 모르고 있었네요. 로그인을 일부로 실패해봐야 발견하는 거라.. :-) 관리자 아이디가 무엇인지는 사실 쉽게 알 수 있는 건데 (잠겨 있는 페이지를 수시로 고치는 걸 보면...) 위키태그까지 붙인채로 말씀하시니 큰 헛점이 있는 줄 알고 순간 깜짝 놀랐습니다. ^^ (어차피 이 UseModWiki 에서는 철저한 보안 같은 것은 기대하지 말아야 할 듯 합니다) 로그인 실패 후 잘못 출력된 관리 메뉴를 클릭해봤자 권한이 없다고 나올테지만, 확실히 보기에 안 좋군요. UseModWiki소스수정에 반영했습니다. 생각 같아서는 ID 를 다루는 방식을 완전히 뜯어고쳐서 깔끔하게 만들고 싶은데, 위키 소스만 들여다보며 시간을 보낼 수도 없다보니 소소한 작업 말고는 엄두가 나지 않는군요.
-- Raymundo 2002-11-26 1:51 am

9. 페이지 Link

현재 UseModWiki 내에 존재하지 않는 페이지에 대해서는 TestPageTest 페이지 이름 다음에 ? 가 나와서 그 ?를 누르면 새 페이지를 만드는 형식으로 되어 있습니다. 이걸 wikiX 에서 사용하는 방식처럼 첫 문자에 Link를 거는 방식으로 바꾸는게 어떨까요?

페이지를 보다가 마우스로 긁어서 다른데로 옮기는 경우에 지금의 방식은 ? 가 나와서 상당히 귀찮더군요.

-- Jmjeong 2002-11-28 4:14 am

음... 전 WikiX 의 방식이 링크가 눈에 띄지 않는다고 생각해서 덜 선호하는 편입니다만... config 에서 결정할 수 있게 하면 되겠네요. 방금 슬쩍 만져봤는데... 학교 가서 조금 더 손을 보면 될 것 같습니다.
-- Raymundo 2002-11-28 9:00 am

10. 매크로 처리 시점의 문제

Bab2 님이 발견한 문제를 살펴보다가 깨달은 것인데, 모든 매크로가 문제를 안고 있습니다.

(줄앞에 공백이 하나 이상)<매크로>
위와 같이 작성할 경우, 일단 매크로가 동작하여 출력물로 치환된 후에, 저 줄 앞에 공백 때문에 치환된 결과의 첫번째 라인만 다시 pre 태그가 붙어 버립니다. 캘린더의 경우 제가 html 출력물이 보기 좋으라고 주요 태그마다 \n 으로 줄바꿈을 시켜놨더니만, 결과적으로 다음과 같이 된 거죠.
(공백)<calendar()>
요것이 변환되어
<pre>
(공백이그대로남아있음)<table>   
</pre>
<tr>
...
</table>
즉 첫번째 table 태그만 pre 로 둘러쌓이는 겁니다. 이 문제는 모든 매크로에 동일하게 적용됩니다.

문제의 원인은, 매크로를 부르는 {{{

       $_ = &MacroSubst($_);    # Luke added
}}} 이 라인은 CommonMarkup 함수 안에 있습니다. 그런데 제가 {{{ }}} 태그를 만들기 위해서, WikiToHTML 함수내에서 CommonMarkup 과 WikiLinesToHtml 함수의 순서를 바꾸었습니다. 그래서 매크로 치환 이후에 WikiLinesToHTML 이 불리면서 저 pre 치환을 이뤄버립니다.

매크로를 부르는 라인은 Luke 님이 넣은 것 같네요. 저 주석문을 보니... Luke 님의 K3 에서는 WikiLinesToHtml 이 먼저 불리고 그 다음에 CommonMarkup 이 불리게 되어 있기 때문에 그 때는 이런 문제는 없었을 겁니다. (하지만 직관적으로 봤을때 전체 마크업이 먼저고 라인 마크업이 나중에 오는 게 합당하다고 생각합니다. 또한 오리지날 UseModWiki 소스에서도 CommonMarkup 이 먼저 불리게 되어 있습니다)

그렇다면 문제의 해결을 위해서는... 저 MacroSubst 호출 루틴을 CommonMarkup 함수 내가 아니라, WikiLinesToHTML 에 넣던가, 아니면 한 단계 위로 빼내어 두 함수를 차례대로 부르는 WikiToHTML 에 넣는 것을 생각해볼 수 있겠는데, 이게 어떤 부작용을 만들지 상상조차 되지 않는터라... ^^; 테스트하는데 시간이 좀 걸리겠습니다. 다른 분들도 소스를 들여다보며 같이 고민 좀 해주시면 고맙겠죠. :-)

-- Raymundo 2002-11-22 11:06 pm

음.. 상위 단계인 WikiToHTML 로 뺐더니만, 이번에는 nowiki 태그 안에 매크로가 있을 경우 기존에는 그대로 출력되던 것이 이제는 죄다 매크로 변환이 되어 버리는군요. 딜레마에 빠지네.. 어찌하나..

-- Raymundo 2002-11-22 11:52 pm
macrosubst()를 commonmarkup의 끝, 그니깐 if ($dolines) { }안에 넣으니 일단 표안에도 잘 들어가지고, 다른 매크로도 대충 잘 되네요. MacroFullSearch와 MacroTitleSearch 만 해결되면 크게 무리없이 쓸 수 있을거 같습니다. (둘중 하나를 없애버리는게 가장 좋은 해결책이지만서두..ㅡㅡ;)
전혀 문제를 해결하지 못하던데요. :-) 여전히 공백 뒤 매크로에 pre 태그를 붙여 버리고 있네요. 캘린더 같은 경우는 제가 아예 \n 을 전혀 출력하지 않도록 했습니다. 그래서 아까는 pre table /pre /table 순으로 붙었던 것을 이제는 pre table /table /pre 순으로 붙기 때문에 별 문제가 없이 보이는 것 뿐입니다. 음... 고민해 봤는데, 그냥 놔두는 것이 좋겠습니다. 건드릴 수록 긁어 부스럼 만드는 느낌이군요. 기존에 손을 대었던 매크로들에 다시 손을 대어서, \n 출력을 다 없앴습니다. 사용자가 일부로 매크로 앞에 공백을 두었을 경우는 pre 가 붙게 되겠지만, pre 가 붙어도 매크로 출력 전체에 적용될테니, 상관없을듯 합니다.
-- Raymundo 2002-11-23 7:36 am

그리고 MacroFullSeach 와 MacroTitleSearch 의 경우 두 가지를 한 줄에 같이 적으면 먼저 적은 쪽에서 뒤부분을 통채로 인자로 인식해버리는 것은 큰 문제가 아닐 듯 한데요. 그 문제를 해결하려면 정규표현식을 (.*) 대신 ([^)]*) 또는 ([^>]*) 정도로 적어주면 되겠지만, 그러면 검색에서 괄호나 부등호는 검색할 수 없게됩니다.
-- Raymundo 2002-11-23 7:24 am

검색폼에서 괄호를 써도 에러나네요, 이건 문서화일 때문에 그런거 같은데.. 좀더 찾아봐야될듯... 그리고 서치매크로에서의 괄호는 막아버렸습니다..흐흐~ (흑..ㅜㅡ)
-- Bab2 2002-11-23 12:56 am

근본적으로... UseModWiki 소스자체가, 검색 기능을 상당히 단순하게 구현해 놓고 있어서 그렇겠지요. 검색폼이나 fullsearch 등의 매크로의 인자로 들어간 문자열을 고스란히 Perl 의 "=~ /패턴/" 구문의 패턴 자리에 넣어버리니까요. 검색폼에 들어간 문자열이 Perl 의 정규표현식 문법에 맞지 않으면 에러가 나는거고, 이것은 뭐 어찌할 도리가 없는 듯 하네요. CGI 가 에러가 나는 것을 막으려면 WikiX 처럼 별도의 검색 명령어를 처리하는 루틴을 두어야 하겠습니다만, 그렇게까지 복잡한 검색을 할 일이 있을런지... 대신 말을 바꾸면 홈페이지 내 검색에 정규표현식을 사용할 수 있다는 것이니 잘 쓰면 큰 효과를 내겠지요.

이미 알고 계시다면 실례가 되겠지만... "(a)" 를 검색하시려면 검색창에는 "\(a\)" 라고 쓰셔야 합니다. :-)
-- Raymundo 2002-11-23 12:09 pm

"아무리 봐도 대책없음. 매크로를 사용하는 사용자가 주의해야 함. 매크로를 만드는 경우 출력에 newline 이 들어가지 않도록 주의해야 함" 으로 결론짓고 /반영된사용자의견으로 이동.

-- Raymundo 2002-12-3 1:31 am


위키위키분류

마지막 편집일: 2007-1-8 12:19 pm (변경사항 [d])
923 hits | Permalink | 변경내역 보기 [h] | 페이지 소스 보기