* [owner] 英字ページ更新時の挙動不審 [#z46ba4d3]

- 元タイトル: 英字ページ更新時の挙動不審
-ページ: BugTrack
-投稿者: [[ゆう]]
-優先順位: 重要
-状態: 着手
-カテゴリー: 本体バグ
-投稿日: 2002-08-05 (月) 18:38:58
-バージョン: 

** 結論 [#z0684fd8]

- See [[BugTrack2/55]] pkwk_chown()

**メッセージ [#nf32f321]
>[[P太]] (2002-08-04 (日) 12:16:40)

お世話になってます。~
英字ページをタイムスタンプを変更せずに編集しようとすると、以下のワーニングが出ます。
 Warning: utime failed: Operation not permitted
 in /usr/home0/******/virtual_html/trpg/file.php on line 44
 
 Warning: Cannot add header information - headers already sent by 
 (output started at /usr/home0/tinge3/virtual_html/trpg/file.php:44) 
 in /usr/home0/******/virtual_html/trpg/index.php on line 283
 
 Warning: Cannot add header information - headers already sent by 
 (output started at /usr/home0/tinge3/virtual_html/trpg/file.php:44) 
 in /usr/home0/******/virtual_html/trpg/skin/pukiwiki.skin.ja.php on line 1
↑PukiWiki-officialでは再現されないので、CVSをもらってきたあとの状態です。

どうやらページが英字WikiNameだと再現する模様。 :( -- [[P太]] SIZE(10){2002-08-04 (日) 10:03:21}

CVSから落としたファイルに差し替えて、該当ファイルのパーミッションを確認してもおかしくないので、いろいろと調べたんですが。Wikiフォルダ内の.txtのパーミッションが666のモノと644のモノが混在。~
666の所有者はサーバのIDなんですが、644の所有者はwwwとなってます。ナニこれ? :(~
ちなみに、644から666へのパーミッションの変更は拒否されます。~
でも、エラーの出る英字WikiNameファイルは666になってるんだよなぁ……。644にしてみてもよけいダメでした。 :( -- [[P太]] SIZE(10){2002-08-04 (日) 11:49:06}

-file.phpの35行目を
 -	$timestamp = @filemtime($dir.encode($page).".txt");
 +	$timestamp = filemtime($dir.encode($page).".txt");
にすると、何かwarning出ませんか? -- [[ぱんだ]] SIZE(10){2002-08-04 (日) 13:39:31}

前と同じwarningが出ますね。メッセージ自体は同じです。 -- [[P太]] SIZE(10){2002-08-04 (日) 14:03:49}

-ありがちですが、wwwユーザがhttpdの実効ユーザですよね。Wikiディレクトリを777+stにして、あとはPHPスクリプトの中でumask設定するべきなのかなぁ。。。 -- [[seagull]] SIZE(10){2002-08-04 (日) 13:54:57}

-なんか、妙なコトしたかも。一旦、Wiki内を消して再アップロードして全て666にしたら日本語も英字もwarning出るようになってしまいました。と言うことは、644でwww所有の時にしか通らない? 所有者wwwって意味が判ってませんが。 :( -- [[P太]] SIZE(10){2002-08-04 (日) 14:03:49}

|名前|新規作成|時刻保持修正|所有者|パーミッション|h
|TestFile|問題なし|問題なし|www|644|
|テストページ|問題なし|問題なし|www|644|
新規作成・修正のテストしてみました。新しく生成されるのはやっぱりwwwの644ファイルですね。 -- [[P太]] SIZE(10){2002-08-04 (日) 14:19:59}
-phpはapacheの中で実行されてますから。phpがファイルを作ったときにはapacheの実効ユーザすなわちwwwがファイルを作ったことになるはずです。 -- [[ぱんだ]] SIZE(10){2002-08-04 (日) 14:24:38}
 touch コマンドでファイルのアクセス時間や修正時間を現在時刻に変更する場
 合、実行するユーザーはファイルの所有者でなくても、そのファイルに対する
 書き込みアクセス権があれば良い。そうでない場合には、そのファイルの所有
 者である必要がある。
-ん。だから、ディレクトリに+stつけておけばオーナシップのグループ部が引き継がれるので、umaskいじってg+wされるようにするのでは? --  SIZE(10){2002-08-04 (日) 16:00:14}
-む~ん、謎の呪文です。 :D  ぐ~ぐるさんに「umask」を訊いてまわってみます。 -- [[P太]] SIZE(10){2002-08-04 (日) 17:08:39}
-自分のサーバでerror_reporting(E_ALL)を入れて試してみたら、Warning: utime failed: Operation not permittedがしっかり出てました。 -- [[ぱんだ]] SIZE(10){2002-08-04 (日) 23:12:45}
 *** file.php 41
         fputs($fp,$str);
         flock($fp,LOCK_UN);
         fclose($fp);
 +       chmod($dir.encode($page).".txt", 0666);
         if($timestamp)
 	     touch($dir.encode($page).".txt",$timestamp);
  }
 *** file.php 104
         if($cnt > $maxshow) break;
     }
     flock($fp,LOCK_EX);
     fclose($fp);
 +   chmod(get_filename(encode($whatsnew)), 0666);
 }

う~ん、こんな状況になりました。 -- [[P太]] SIZE(10){2002-08-05 (月) 00:38:36}

|ページ名|新規作成|通常修正|時間保持修正|パーミッション|所有者|h
|新規ページ|warning|warning|問題なし|666|www|
|日本語|***|warning|warning|666|UserID|

 Warning: chmod failed: Operation not permitted in /usr/home0/******
 /virtual_html/trpg/file.php on line 95
 
 Warning: chmod failed: Operation not permitted in /usr/home0/******
 /virtual_html/trpg/file.php on line 95
 
 Warning: Cannot add header information - headers already sent by 
  (output started at /usr/home0/******/virtual_html/trpg/file.php:95)
   in /usr/home0/tinge3/virtual_html/trpg/index.php on line 283
 
 Warning: Cannot add header information - headers already sent by 
  (output started at /usr/home0/******/virtual_html/trpg/file.php:95)
   in /usr/home0/tinge3/virtual_html/trpg/skin/pukiwiki.skin.ja.php on line 1

 Warning: chmod failed: Operation not permitted in /usr/home0/******
 /virtual_html/trpg/file.php on line 42
 
 Warning: utime failed: Operation not permitted in /usr/home0/******
 /virtual_html/trpg/file.php on line 44
 
 Warning: Cannot add header information - headers already sent by 
  (output started at /usr/home0/******/virtual_html/trpg/file.php:42)
   in /usr/home0/tinge3/virtual_html/trpg/index.php on line 283
 
 Warning: Cannot add header information - headers already sent by 
  (output started at /usr/home0/******/virtual_html/trpg/file.php:42)
   in /usr/home0/tinge3/virtual_html/trpg/skin/pukiwiki.skin.ja.php on line 1

 ***backup.php 49
     backup_fputs($fp,$strout);
     backup_fputs($fp,$body);
     backup_fclose($fp);
 +   chmod($realfilename, 0666);
 }
----

-chown www wiki/*するか、Warningの表示を抑止してタイムスタンプが変わってしまうのを受け入れるか、のどちらかしかないような。 --  SIZE(10){2002-08-05 (月) 19:30:00}
-chmod +st wiki/; して、 pukiwiki.ini.php あたりで、umask(0001) してもだめだったのかな。。。OSにもよるだろうけど。 -- [[seagull]] SIZE(10){2002-08-05 (月) 19:55:46}
-まちがい。umask(0002)か。。 -- [[seagull]] SIZE(10){2002-08-05 (月) 19:56:57}
-いずれにしても、新規にファイルを作るようなアプリで、umaskを意識しないのはまずいですな。。実行形式uploadされたら、サーバ側で実行可能になるのかな? http://.../attach/crack.pl とかできたらいや~んだな。。 -- [[seagull]] SIZE(10){2002-08-05 (月) 19:59:15}
-今、手もとで試したところ、しっかり +x されてますな。私の所では suffix が.cgiでないと実行しないようにしてあるので問題ないですが、実行権限付いてれば実行しちゃう(初心者向けISPとかでありそう)ような場合は致命的。。。 -- [[seagull]] SIZE(10){2002-08-05 (月) 20:05:25}~
あ~、いや、まてよ。実行権限付きのファイルをサーバにおけるとこまで行ったのなら、別にhttp経由でなくても他の手段でキックできればそれでいいんだよなぁ。。。う~ん。。

- この問題は、[[BugTrack2/55]] で追加した pkwk_touch_file() を使っている部分では発生しないはずです。pkwk_touch_file() は 同時に追加した pkwk_chown() を使って、ファイルのownerを強引に切り替えます。ただし、backupデータなどもケアしていたかどうかはチェックする価値があるかもしれません。もしケア漏れがあれば教えて下さい。(backupとか怪しいな) -- [[henoheno]] &new{2007-08-31 (金) 23:47:37};
-- 問題があるかはひとまずおいといて、touch()を呼んでいるところを検索((pkwk_touch_file() やpkwk_chown() の中の物は除く))してみました。 --  &new{2007-09-01 (土) 17:26:03};
 // $Id: init.php,v 1.53 2007/05/14 14:47:51 henoheno Exp $
 205行目~:
 foreach(array($defaultpage, $whatsnew, $interwiki) as $page){
	if (! is_page($page)) touch(get_filename($page));
 }
 
 // $Id: attach.inc.php,v 1.87 2007/07/30 14:30:14 henoheno Exp $
 197行目~:
	if (is_page($page))
		touch(get_filename($page));
 644行目~:
		if (is_page($this->page))
			touch(get_filename($this->page));
 
 // $Id: dump.inc.php,v 1.40 2007/05/13 22:11:23 teanan Exp $
 665行目~:
				// 既に同じファイルがある場合は上書きされる
				$fpw = @fopen($name, 'wb');
				if ($fpw !== FALSE) {
					flock($fpw, LOCK_EX);
					fwrite($fpw, $buff, $size);
					@chmod($name, 0666);
					@touch($name, $mtime);
					flock($fpw, LOCK_UN);
- ありがとうございます。確かに何箇所かありますね。dumpのところは、すでにfopenした後であるのでそのままにしておきました。 -- [[henoheno]] &new{2007-09-02 (日) 21:38:32};
--[[cvs:lib/init.php]] (1.54)
--[[cvs:plugin/attach.inc.php]] (1.88)

#comment
//#comment

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Site admin: PukiWiki Development Team

PukiWiki 1.5.4+ © 2001-2022 PukiWiki Development Team. Powered by PHP 8.2.12. HTML convert time: 0.042 sec.

SourceForge