PHP を使用して効率的で安全な FTP サーバーを実装する (2)

WBOY
リリース: 2016-07-06 13:31:03
オリジナル
1222 人が閲覧しました

前回の記事の続きです。 1. ユーザー クラス CUser を実装します。 ユーザーはテキスト形式で保存され、ユーザー配列は json エンコードされます。 ユーザーファイル形式: * array ( * 'user1' = array ( * 'pass'='', * 'group'='', * 'home'='/home/ftp/', // ftp ホームディレクトリ* ' active'= true , * 'expired='2015-12-12' , * 'descr

前回の記事の続きです。

1. ユーザークラス CUser を実装します。

ユーザーはテキスト形式で保存され、ユーザー配列はjsonエンコードされます。

リーリー

フォルダーとファイルの許可手順:

リーリー

実装コードは次のとおりです:

<span style="color: #0000ff;">クラス</span><span style="color: #000000;">ユーザー{
    
    </span><span style="color: #0000ff;">const</span> I = 1;    <span style="color: #008000;">//</span><span style="color: #008000;">継承</span>
    
    <span style="color: #0000ff;">const</span> FD = 2;    <span style="color: #008000;">//</span><span style="color: #008000;">フォルダー削除</span>
    
    <span style="color: #0000ff;">const</span> FN = 4;    <span style="color: #008000;">//</span><span style="color: #008000;">フォルダーの名前を変更</span>
    
    <span style="color: #0000ff;">const</span> FC = 8;    <span style="color: #008000;">//</span><span style="color: #008000;">フォルダー作成</span>
    
    <span style="color: #0000ff;">const</span> FL = 16;    <span style="color: #008000;">//</span><span style="color: #008000;">フォルダーリスト</span>
    
    <span style="color: #0000ff;">const</span> D = 32;    <span style="color: #008000;">//</span><span style="color: #008000;">ファイル削除</span>
    
    <span style="color: #0000ff;">const</span> N = 64;    <span style="color: #008000;">//</span><span style="color: #008000;">ファイル名変更</span>
    
    <span style="color: #0000ff;">const</span> A = 128;    <span style="color: #008000;">//</span><span style="color: #008000;">ファイル追加</span>
    
    <span style="color: #0000ff;">const</span> W = 256;    <span style="color: #008000;">//</span><span style="color: #008000;">ファイル書き込み(アップロード)</span>
    
    <span style="color: #0000ff;">const</span> R = 512;    <span style="color: #008000;">//</span><span style="color: #008000;">ファイル読み取り(ダウンロード)</span>
    
    <span style="color: #0000ff;">プライベート</span> <span style="color: #800080;">$hash_salt</span> = ''<span style="color: #000000;">;
    
    </span><span style="color: #0000ff;">プライベート</span> <span style="color: #800080;">$user_file</span><span style="color: #000000;">;
    
    </span><span style="color: #0000ff;">プライベート</span> <span style="color: #800080;">$group_file</span><span style="color: #000000;">;
    
    </span><span style="color: #0000ff;">プライベート</span> <span style="color: #800080;">$users</span> = <span style="color: #0000ff;">array</span><span style="color: #000000;">();
    
    </span><span style="color: #0000ff;">プライベート</span> <span style="color: #800080;">$groups</span> = <span style="color: #0000ff;">array</span><span style="color: #000000;">();
    
    </span><span style="color: #0000ff;">プライベート</span> <span style="color: #800080;">$file_hash</span> = ''<span style="color: #000000;">; 
    
    </span><span style="color: #0000ff;">パブリック</span> <span style="color: #0000ff;">関数</span><span style="color: #000000;"> __construct(){
        </span><span style="color: #800080;">$this</span>->user_file = BASE_PATH.'/conf/users'<span style="color: #000000;">;
        </span><span style="color: #800080;">$this</span>->group_file = BASE_PATH.'/conf/groups'<span style="color: #000000;">;
        </span><span style="color: #800080;">$this</span>-><span style="color: #000000;">reload();
    }
    
    </span><span style="color: #008000;">/*</span><span style="color: #008000;">*
     * 戻り权制限表达式
     * @param int $access
     * @戻り文字列
     </span><span style="color: #008000;">*/</span>
    <span style="color: #0000ff;">パブリック</span> <span style="color: #0000ff;">静的</span> <span style="color: #0000ff;">関数</span> AC(<span style="color: #800080;">$access</span><span style="color: #000000;">){
        </span><span style="color: #800080;">$str</span> = ''<span style="color: #000000;">;
        </span><span style="color: #800080;">$char</span> = <span style="color: #0000ff;">array</span>('R','W','A','N','D','L','C','N','D','I'<span style="color: #000000;"> );
        </span><span style="color: #0000ff;">for</span>(<span style="color: #800080;">$i</span> = 0; <span style="color: #800080;">$i</span> $i++<span style="color: #000000;">){
            </span><span style="color: #0000ff;">if</span>(<span style="color: #800080;">$access</span> & <span style="color: #008080;">pow</span>(2,9-<span style="color: #800080;">$i</span>))<span style="color: #800080;">$str</span>.= <span style="color: #800080;">$char</span>[<span style="color: #800080;">$i</span>];<span style="color: #0000ff;">else</span> <span style="color: #800080;">$str</span>.= 「-」<span style="color: #000000;">;
        }</span><span style="color: #0000ff;">リターン</span> <span style="color: #800080;">$str</span><span style="color: #000000;">;
    }
    
    </span><span style="color: #008000;">/*</span><span style="color: #008000;">*
     * 追加用户データ
     </span><span style="color: #008000;">*/</span>
    <span style="color: #0000ff;">パブリック</span> <span style="color: #0000ff;">関数</span><span style="color: #000000;"> reload(){
        </span><span style="color: #800080;">$user_file_hash</span> = <span style="color: #008080;">md5_file</span>(<span style="color: #800080;">$this</span>-><span style="color: #000000;">user_file);
        </span><span style="color: #800080;">$group_file_hash</span> = <span style="color: #008080;">md5_file</span>(<span style="color: #800080;">$this</span>-><span style="color: #000000;">group_file);        
        </span><span style="color: #0000ff;">if</span>(<span style="color: #800080;">$this</span>->file_hash != <span style="color: #008080;">md5</span>(<span style="color: #800080;">$user_file_hash</span>.<span style="color: #800080;">$group_file_hash</span><span style="color: #000000;">)){
            </span><span style="color: #0000ff;">if</span>((<span style="color: #800080;">$user</span> = <span style="color: #008080;">file_get_contents</span>(<span style="color: #800080;">$this</span>->user_file)) !== <span style="color: #0000ff;">false</span><span style="color: #000000;">){
                </span><span style="color: #800080;">$this</span>->users = json_decode(<span style="color: #800080;">$user</span>,<span style="color: #0000ff;">true</span><span style="color: #000000;">);
                </span><span style="color: #0000ff;">if</span>(<span style="color: #800080;">$this</span>-><span style="color: #000000;">ユーザー){
                    </span><span style="color: #008000;">//</span><span style="color: #008000;">folder排序</span>
                    <span style="color: #0000ff;">foreach</span> (<span style="color: #800080;">$this</span>->ユーザー <span style="color: #0000ff;">as</span> <span style="color: #800080;">$user</span>=><span style="color: #800080;">$profile</span><span style="color: #000000;">){
                        </span><span style="color: #0000ff;">if</span>(<span style="color: #0000ff;">isset</span>(<span style="color: #800080;">$profile</span>['フォルダ'<span style="color: #000000;">])){
                            </span><span style="color: #800080;">$this</span>->users[<span style="color: #800080;">$user</span>]['folder'] = <span style="color: #800080;">$this</span>->sortFolder(<span style="color: #800080;">$profile</span>['folder'<span style="color: #000000;">]);
                        }
                    }
                }
            }
            </span><span style="color: #0000ff;">if</span>((<span style="color: #800080;">$group</span> = <span style="color: #008080;">file_get_contents</span>(<span style="color: #800080;">$this</span>->group_file)) !== <span style="color: #0000ff;">false</span><span style="color: #000000;">){
                </span><span style="color: #800080;">$this</span>->groups = json_decode(<span style="color: #800080;">$group</span>,<span style="color: #0000ff;">true</span><span style="color: #000000;">);
                </span><span style="color: #0000ff;">if</span>(<span style="color: #800080;">$this</span>-><span style="color: #000000;">グループ){
                    </span><span style="color: #008000;">//</span><span style="color: #008000;">folder排序</span>
                    <span style="color: #0000ff;">foreach</span> (<span style="color: #800080;">$this</span>->グループ <span style="color: #0000ff;">as</span> <span style="color: #800080;">$group</span>=><span style="color: #800080;">$profile</span><span style="color: #000000;">){                            
                        </span><span style="color: #0000ff;">if</span>(<span style="color: #0000ff;">isset</span>(<span style="color: #800080;">$profile</span>['フォルダ'<span style="color: #000000;">])){                        
                            </span><span style="color: #800080;">$this</span>->groups[<span style="color: #800080;">$group</span>]['フォルダー'] = <span style="color: #800080;">$this</span>->sortFolder(<span style="color: #800080;">$profile</span>['フォルダー'<span style="color: #000000;">]);
                        }
                    }
                }
            }
            </span><span style="color: #800080;">$this</span>->file_hash = <span style="color: #008080;">md5</span>(<span style="color: #800080;">$user_file_hash</span>.<span style="color: #800080;">$group_file_hash</span><span style="color: #000000;">);            
        }
    }</span><span style="color: #008000;">/*</span><span style="color: #008000;">*
     * フォルダーを並べ替える
     * @return 配列
     </span><span style="color: #008000;">*/</span>
    <span style="color: #0000ff;">プライベート</span> <span style="color: #0000ff;">関数</span> sortFolder(<span style="color: #800080;">$folder</span><span style="color: #000000;">){
        </span><span style="color: #008080;">uasort</span>(<span style="color: #800080;">$フォルダー</span>, <span style="color: #0000ff;">関数</span>(<span style="color: #800080;">$a</span>,<span style="color: #800080;">$b</span><span style="color: #000000;">){
            </span><span style="color: #0000ff;">return</span> <span style="color: #008080;">strnatcmp</span>(<span style="color: #800080;">$a</span>['path'], <span style="color: #800080;">$b</span>['path'<span style="color: #000000;">]);
        });
        </span><span style="color: #800080;">$result</span> = <span style="color: #0000ff;">array</span><span style="color: #000000;">();
        </span><span style="color: #0000ff;">foreach</span> (<span style="color: #800080;">$フォルダー</span> <span style="color: #0000ff;">as</span> <span style="color: #800080;">$v</span><span style="color: #000000;">){
            </span><span style="color: #800080;">$結果</span>[] = <span style="color: #800080;">$v</span><span style="color: #000000;">;
        }
        </span><span style="color: #0000ff;">リターン</span> <span style="color: #800080;">$結果</span><span style="color: #000000;">;
    }
    
    </span><span style="color: #008000;">/*</span><span style="color: #008000;">*
     * ユーザーデータの保存
     </span><span style="color: #008000;">*/</span>
    <span style="color: #0000ff;">パブリック</span> <span style="color: #0000ff;">関数</span><span style="color: #000000;"> save(){
        </span><span style="color: #008080;">file_put_contents</span>(<span style="color: #800080;">$this</span>->user_file, json_encode(<span style="color: #800080;">$this</span>->users),<span style="color: #000000;">LOCK_EX);
        </span><span style="color: #008080;">file_put_contents</span>(<span style="color: #800080;">$this</span>->グループファイル, json_encode(<span style="color: #800080;">$this</span>->グループ),<span style="color: #000000;">LOCK_EX);
    }
    
    </span><span style="color: #008000;">/*</span><span style="color: #008000;">*
     * ユーザーを追加する
     * @param 文字列 $user
     * @param 文字列 $pass
     * @param 文字列 $home
     * @param string $expired
     * @param boolean $active
     * @param 文字列 $group
     * @param string $description
     * @param string $email
     * @return ブール値
     </span><span style="color: #008000;">*/</span>
    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> addUser(<span style="color: #800080;">$user</span>,<span style="color: #800080;">$pass</span>,<span style="color: #800080;">$home</span>,<span style="color: #800080;">$expired</span>,<span style="color: #800080;">$active</span>=<span style="color: #0000ff;">true</span>,<span style="color: #800080;">$group</span>=”,<span style="color: #800080;">$description</span>= '',<span style="color: #800080;">$email</span> = ''<span style="color: #000000;">){
        </span><span style="color: #800080;">$user</span> = <span style="color: #008080;">strto lower</span>(<span style="color: #800080;">$user</span><span style="color: #000000;">);
        </span><span style="color: #0000ff;">if</span>(<span style="color: #0000ff;">isset</span>(<span style="color: #800080;">$this</span>->users[<span style="color: #800080;">$user</span>]) || <span style="color: #0000ff;">空</span>(<span style="color: #800080;">$user</span><span style="color: #000000;">)){
            </span><span style="color: #0000ff;">戻る</span> <span style="color: #0000ff;">false</span><span style="color: #000000;">;
        }</span><span style="color: #800080;">$this</span>->users[<span style="color: #800080;">$user</span>] = <span style="color: #0000ff;">array</span><span style="color: #000000;">(
                </span>'パス' => <span style="color: #008080;">md5</span>(<span style="color: #800080;">$user</span>.<span style="color: #800080;">$this</span>->hash_salt.<span style="color: #800080;">$pass</span>),
                'ホーム' => <span style="color: #800080;">$ホーム</span>、
                '期限切れ' => <span style="color: #800080;">$期限切れ</span>、
                'アクティブ' => <span style="color: #800080;">$アクティブ</span>、
                'グループ' => <span style="color: #800080;">$グループ</span>、
                '説明' => <span style="color: #800080;">$説明</span>、
                '電子メール' => <span style="color: #800080;">$メール</span>、<span style="color: #000000;">
        );
        </span><span style="color: #0000ff;">戻る</span> <span style="color: #0000ff;">本当</span><span style="color: #000000;">;
    }
    
    </span><span style="color: #008000;">/*</span><span style="color: #008000;">*
     * 設置用户費
     * @param 文字列 $user
     * @param 配列 $profile
     * @return ブール値
     </span><span style="color: #008000;">*/</span>
    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> setUserProfile(<span style="color: #800080;">$user</span>,<span style="color: #800080;">$profile</span><span style="color: #000000;">){
        </span><span style="color: #800080;">$user</span> = <span style="color: #008080;">strto lower</span>(<span style="color: #800080;">$user</span><span style="color: #000000;">);
        </span><span style="color: #0000ff;">if</span>(<span style="color: #008080;">is_array</span>(<span style="color: #800080;">$profile</span>) && <span style="color: #0000ff;">isset</span>(<span style="color: #800080;">$this</span>->users[<span style="color: #800080;">$user</span><span style="color: #000000;">])){
            </span><span style="color: #0000ff;">if</span>(<span style="color: #0000ff;">isset</span>(<span style="color: #800080;">$profile</span>['pass'<span style="color: #000000;">])){
                </span><span style="color: #800080;">$profile</span>['pass'] = <span style="color: #008080;">md5</span>(<span style="color: #800080;">$user</span>.<span style="color: #800080;">$this</span>->hash_salt.<span style="color: #800080;">$profile</span>['pass'<span style="color: #000000;">]);
            }
            </span><span style="color: #0000ff;">if</span>(<span style="color: #0000ff;">isset</span>(<span style="color: #800080;">$profile</span>['active'<span style="color: #000000;">])){
                </span><span style="color: #0000ff;">if</span>(!<span style="color: #008080;">is_bool</span>(<span style="color: #800080;">$profile</span>['active'<span style="color: #000000;">])){
                    </span><span style="color: #800080;">$profile</span>['active'] = <span style="color: #800080;">$profile</span>['active'] == 'true' ? <span style="color: #0000ff;">真</span>:<span style="color: #0000ff;">偽</span><span style="color: #000000;">;
                }
            }            
            </span><span style="color: #800080;">$this</span>->users[<span style="color: #800080;">$user</span>] = <span style="color: #008080;">array_merge</span>(<span style="color: #800080;">$this</span>->users[<span style="color: #800080;">$user</span>],<span style="color: #800080;">$profile</span><span style="color: #000000;">);
            </span><span style="color: #0000ff;">戻る</span> <span style="color: #0000ff;">本当</span><span style="color: #000000;">;
        }
        </span><span style="color: #0000ff;">戻る</span> <span style="color: #0000ff;">false</span><span style="color: #000000;">;
    }
    
    </span><span style="color: #008000;">/*</span><span style="color: #008000;">*
     *获取用户资料
     * @param 文字列 $user
     * @return multitype:|boolean
     </span><span style="color: #008000;">*/</span>
    <span style="color: #0000ff;">パブリック</span> <span style="color: #0000ff;">関数</span> getUserProfile(<span style="color: #800080;">$user</span><span style="color: #000000;">){
        </span><span style="color: #800080;">$user</span> = <span style="color: #008080;">strto lower</span>(<span style="color: #800080;">$user</span><span style="color: #000000;">);
        </span><span style="color: #0000ff;">if</span>(<span style="color: #0000ff;">isset</span>(<span style="color: #800080;">$this</span>->ユーザー[<span style="color: #800080;">$user</span><span style="color: #000000;">])){
            </span><span style="color: #0000ff;">return</span> <span style="color: #800080;">$this</span>->users[<span style="color: #800080;">$user</span><span style="color: #000000;">];
        }</span><span style="color: #0000ff;">戻る</span> <span style="color: #0000ff;">false</span><span style="color: #000000;">;
    }
    </span><span style="color: #008000;">/*</span><span style="color: #008000;">*
     * ユーザーを削除する
     * @param 文字列 $user
     * @return ブール値
     </span><span style="color: #008000;">*/</span>
    <span style="color: #0000ff;">パブリック</span> <span style="color: #0000ff;">関数</span> delUser(<span style="color: #800080;">$user</span><span style="color: #000000;">){
        </span><span style="color: #800080;">$user</span> = <span style="color: #008080;">strto lower</span>(<span style="color: #800080;">$user</span><span style="color: #000000;">);
        </span><span style="color: #0000ff;">if</span>(<span style="color: #0000ff;">isset</span>(<span style="color: #800080;">$this</span>->ユーザー[<span style="color: #800080;">$user</span><span style="color: #000000;">])){
            </span><span style="color: #0000ff;">設定解除</span>(<span style="color: #800080;">$this</span>->ユーザー[<span style="color: #800080;">$user</span><span style="color: #000000;">]);
            </span><span style="color: #0000ff;">戻る</span> <span style="color: #0000ff;">本当</span><span style="color: #000000;">;
        }
        </span><span style="color: #0000ff;">戻る</span> <span style="color: #0000ff;">false</span><span style="color: #000000;">;
    }
    
    </span><span style="color: #008000;">/*</span><span style="color: #008000;">*
     * ユーザーリストの取得
     * @return 配列
     </span><span style="color: #008000;">*/</span>
    <span style="color: #0000ff;">パブリック</span> <span style="color: #0000ff;">関数</span><span style="color: #000000;"> getUserList(){
        </span><span style="color: #800080;">$list</span> = <span style="color: #0000ff;">array</span><span style="color: #000000;">();
        </span><span style="color: #0000ff;">if</span>(<span style="color: #800080;">$this</span>-><span style="color: #000000;">ユーザー){
            </span><span style="color: #0000ff;">foreach</span> (<span style="color: #800080;">$this</span>->ユーザー <span style="color: #0000ff;">as</span> <span style="color: #800080;">$user</span>=><span style="color: #800080;">$profile</span><span style="color: #000000;">){
                </span><span style="color: #800080;">$list</span>[] = <span style="color: #800080;">$user</span><span style="color: #000000;">;
            }
        }
        </span><span style="color: #008080;">並べ替え</span>(<span style="color: #800080;">$リスト</span><span style="color: #000000;">);
        </span><span style="color: #0000ff;">戻る</span> <span style="color: #800080;">$リスト</span><span style="color: #000000;">;
    }
    
    </span><span style="color: #008000;">/*</span><span style="color: #008000;">*
     * グループを追加
     * @param 文字列 $group
     * @param 文字列 $home
     * @return ブール値
     </span><span style="color: #008000;">*/</span>
    <span style="color: #0000ff;">パブリック</span> <span style="color: #0000ff;">関数</span> addGroup(<span style="color: #800080;">$group</span>,<span style="color: #800080;">$home</span><span style="color: #000000;">){
        </span><span style="color: #800080;">$group</span> = <span style="color: #008080;">strto lower</span>(<span style="color: #800080;">$group</span><span style="color: #000000;">);
        </span><span style="color: #0000ff;">if</span>(<span style="color: #0000ff;">isset</span>(<span style="color: #800080;">$this</span>->グループ[<span style="color: #800080;">$group</span><span style="color: #000000;">])){
            </span><span style="color: #0000ff;">戻る</span> <span style="color: #0000ff;">false</span><span style="color: #000000;">;
        }
        </span><span style="color: #800080;">$this</span>->グループ[<span style="color: #800080;">$グループ</span>] = <span style="color: #0000ff;">配列</span><span style="color: #000000;">(
                </span>'ホーム' => <span style="color: #800080;">$ホーム</span><span style="color: #000000;">
        );
        </span><span style="color: #0000ff;">戻る</span> <span style="color: #0000ff;">本当</span><span style="color: #000000;">;
    }</span><span style="color: #008000;">/*</span><span style="color: #008000;">*
     ※グループ情報の設定
     * @param 文字列 $group
     * @param 配列 $profile
     * @return ブール値
     </span><span style="color: #008000;">*/</span>
    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> setGroupProfile(<span style="color: #800080;">$group</span>,<span style="color: #800080;">$profile</span><span style="color: #000000;">){
        </span><span style="color: #800080;">$group</span> = <span style="color: #008080;">strto lower</span>(<span style="color: #800080;">$group</span><span style="color: #000000;">);
        </span><span style="color: #0000ff;">if</span>(<span style="color: #008080;">is_array</span>(<span style="color: #800080;">$profile</span>) && <span style="color: #0000ff;">isset</span>(<span style="color: #800080;">$this</span>->groups[<span style="color: #800080;">$group</span><span style="color: #000000;">])){
            </span><span style="color: #800080;">$this</span>->グループ[<span style="color: #800080;">$グループ</span>] = <span style="color: #008080;">array_merge</span>(<span style="color: #800080;">$this</span>->グループ[<span style="color: #800080;">$グループ</span>],<span style="color: #800080;">$プロファイル</span><span style="color: #000000;">);
            </span><span style="color: #0000ff;">戻る</span> <span style="color: #0000ff;">本当</span><span style="color: #000000;">;
        }
        </span><span style="color: #0000ff;">戻る</span> <span style="color: #0000ff;">false</span><span style="color: #000000;">;
    }
    
    </span><span style="color: #008000;">/*</span><span style="color: #008000;">*
     * グループ情報の取得
     * @param 文字列 $group
     * @return multitype:|boolean
     </span><span style="color: #008000;">*/</span>
    <span style="color: #0000ff;">パブリック</span> <span style="color: #0000ff;">関数</span> getGroupProfile(<span style="color: #800080;">$group</span><span style="color: #000000;">){
        </span><span style="color: #800080;">$group</span> = <span style="color: #008080;">strto lower</span>(<span style="color: #800080;">$group</span><span style="color: #000000;">);
        </span><span style="color: #0000ff;">if</span>(<span style="color: #0000ff;">isset</span>(<span style="color: #800080;">$this</span>->グループ[<span style="color: #800080;">$group</span><span style="color: #000000;">])){
            </span><span style="color: #0000ff;">戻る</span> <span style="color: #800080;">$this</span>->グループ[<span style="color: #800080;">$グループ</span><span style="color: #000000;">];
        }
        </span><span style="color: #0000ff;">戻る</span> <span style="color: #0000ff;">false</span><span style="color: #000000;">;
    }
    
    </span><span style="color: #008000;">/*</span><span style="color: #008000;">*
     * グループの削除
     * @param 文字列 $group
     * @return ブール値
     </span><span style="color: #008000;">*/</span>
    <span style="color: #0000ff;">パブリック</span> <span style="color: #0000ff;">関数</span> delGroup(<span style="color: #800080;">$group</span><span style="color: #000000;">){
        </span><span style="color: #800080;">$group</span> = <span style="color: #008080;">strto lower</span>(<span style="color: #800080;">$group</span><span style="color: #000000;">);
        </span><span style="color: #0000ff;">if</span>(<span style="color: #0000ff;">isset</span>(<span style="color: #800080;">$this</span>->グループ[<span style="color: #800080;">$group</span><span style="color: #000000;">])){
            </span><span style="color: #0000ff;">設定解除</span>(<span style="color: #800080;">$this</span>->グループ[<span style="color: #800080;">$group</span><span style="color: #000000;">]);
            </span><span style="color: #0000ff;">foreach</span> (<span style="color: #800080;">$this</span>->ユーザー<span style="color: #0000ff;">as</span> <span style="color: #800080;">$user</span> => <span style="color: #800080;">$profile</span><span style="color: #000000;">){
                </span><span style="color: #0000ff;">if</span>(<span style="color: #800080;">$profile</span>['グループ'] == <span style="color: #800080;">$グループ</span><span style="color: #000000;">)
                    </span><span style="color: #800080;">$this</span>->ユーザー[<span style="color: #800080;">$user</span>]['グループ'] = ''<span style="color: #000000;">;
            }
            </span><span style="color: #0000ff;">戻る</span> <span style="color: #0000ff;">本当</span><span style="color: #000000;">;
        }
        </span><span style="color: #0000ff;">戻る</span> <span style="color: #0000ff;">false</span><span style="color: #000000;">;
    }</span><span style="color: #008000;">/*</span><span style="color: #008000;">*
     * グループリストを取得する
     * @return 配列
     </span><span style="color: #008000;">*/</span>
    <span style="color: #0000ff;">パブリック</span> <span style="color: #0000ff;">関数</span><span style="color: #000000;"> getGroupList(){
        </span><span style="color: #800080;">$list</span> = <span style="color: #0000ff;">array</span><span style="color: #000000;">();
        </span><span style="color: #0000ff;">if</span>(<span style="color: #800080;">$this</span>-><span style="color: #000000;">グループ){
            </span><span style="color: #0000ff;">foreach</span> (<span style="color: #800080;">$this</span>->グループ<span style="color: #0000ff;">as</span> <span style="color: #800080;">$group</span>=><span style="color: #800080;">$profile</span><span style="color: #000000;">){
                </span><span style="color: #800080;">$リスト</span>[] = <span style="color: #800080;">$グループ</span><span style="color: #000000;">;
            }
        }
        </span><span style="color: #008080;">並べ替え</span>(<span style="color: #800080;">$リスト</span><span style="color: #000000;">);
        </span><span style="color: #0000ff;">戻る</span> <span style="color: #800080;">$リスト</span><span style="color: #000000;">;
    }
    
    </span><span style="color: #008000;">/*</span><span style="color: #008000;">*
     * グループユーザーリストの取得
     * @param 文字列 $group
     * @return 配列
     </span><span style="color: #008000;">*/</span>
    <span style="color: #0000ff;">パブリック</span> <span style="color: #0000ff;">関数</span> getUserListOfGroup(<span style="color: #800080;">$group</span><span style="color: #000000;">){
        </span><span style="color: #800080;">$list</span> = <span style="color: #0000ff;">array</span><span style="color: #000000;">();
        </span><span style="color: #0000ff;">if</span>(<span style="color: #0000ff;">isset</span>(<span style="color: #800080;">$this</span>->グループ[<span style="color: #800080;">$グループ</span>]) && <span style="color: #800080;">$this</span>-><span style="color: #000000;">ユーザー){
            </span><span style="color: #0000ff;">foreach</span> (<span style="color: #800080;">$this</span>->ユーザー <span style="color: #0000ff;">as</span> <span style="color: #800080;">$user</span>=><span style="color: #800080;">$profile</span><span style="color: #000000;">){
                </span><span style="color: #0000ff;">if</span>(<span style="color: #0000ff;">isset</span>(<span style="color: #800080;">$profile</span>['グループ']) && <span style="color: #800080;">$profile</span>['グループ'] == <span style="color: #800080;">$グループ</span><span style="color: #000000;">){
                    </span><span style="color: #800080;">$list</span>[] = <span style="color: #800080;">$user</span><span style="color: #000000;">;
                }
            }
        }
        </span><span style="color: #008080;">並べ替え</span>(<span style="color: #800080;">$リスト</span><span style="color: #000000;">);
        </span><span style="color: #0000ff;">戻る</span> <span style="color: #800080;">$リスト</span><span style="color: #000000;">;
    }</span><span style="color: #008000;">/*</span><span style="color: #008000;">*
     *用户验证
     * @param 文字列 $user
     * @param 文字列 $pass
     * @パラメータ文字列$ip
     * @return ブール値
     </span><span style="color: #008000;">*/</span>
    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> checkUser(<span style="color: #800080;">$user</span>,<span style="color: #800080;">$pass</span>,<span style="color: #800080;">$ip</span> = ''<span style="color: #000000;">){
        </span><span style="color: #800080;">$this</span>-><span style="color: #000000;">reload();
        </span><span style="color: #800080;">$user</span> = <span style="color: #008080;">strto lower</span>(<span style="color: #800080;">$user</span><span style="color: #000000;">);
        </span><span style="color: #0000ff;">if</span>(<span style="color: #0000ff;">isset</span>(<span style="color: #800080;">$this</span>->ユーザー[<span style="color: #800080;">$user</span><span style="color: #000000;">])){
            </span><span style="color: #0000ff;">if</span>(<span style="color: #800080;">$this</span>->users[<span style="color: #800080;">$user</span>]['active'] && <span style="color: #008080;">time</span>() strtotime(<span style="color: #800080;">$this</span>->users[<span style="color: #800080;">$user</span>) ][「期限切れ」<span style="color: #000000;">])
                 </span>&& <span style="color: #800080;">$this</span>->users[<span style="color: #800080;">$user</span>]['pass'] == <span style="color: #008080;">md5</span>(<span style="color: #800080;">$user</span>.<span style="color: #800080;">$this</span>->hash_salt.<span style="color: #800080;">$pass</span><span style="color: #000000;">)){
                </span><span style="color: #0000ff;">if</span>(<span style="color: #0000ff;">空</span>(<span style="color: #800080;">$ip</span><span style="color: #000000;">)){
                    </span><span style="color: #0000ff;">戻る</span> <span style="color: #0000ff;">本当</span><span style="color: #000000;">;
                }</span><span style="color: #0000ff;">他</span><span style="color: #000000;">{
                    </span><span style="color: #008000;">//</span><span style="color: #008000;">ip验证</span>
                    <span style="color: #0000ff;">return</span> <span style="color: #800080;">$this</span>->checkIP(<span style="color: #800080;">$user</span>, <span style="color: #800080;">$ip</span><span style="color: #000000;">);
                }
            }</span><span style="color: #0000ff;">他</span><span style="color: #000000;">{
                </span><span style="color: #0000ff;">戻る</span> <span style="color: #0000ff;">false</span><span style="color: #000000;">;
            }        
        }
        </span><span style="color: #0000ff;">戻る</span> <span style="color: #0000ff;">false</span><span style="color: #000000;">;
    }</span><span style="color: #008000;">/*</span><span style="color: #008000;">*
     * 基本認証 
     * @パラメータ文字列$base64    
     </span><span style="color: #008000;">*/</span>
    <span style="color: #0000ff;">パブリック</span> <span style="color: #0000ff;">関数</span> checkUserBasicAuth(<span style="color: #800080;">$base64</span><span style="color: #000000;">){
        </span><span style="color: #800080;">$base64</span> = <span style="color: #008080;">trim</span>(<span style="color: #008080;">str_replace</span>('Basic ', '', <span style="color: #800080;">$base64</span><span style="color: #000000;">));
        </span><span style="color: #800080;">$str</span> = <span style="color: #008080;">base64_decode</span>(<span style="color: #800080;">$base64</span><span style="color: #000000;">);
        </span><span style="color: #0000ff;">if</span>(<span style="color: #800080;">$str</span> !== <span style="color: #0000ff;">false</span><span style="color: #000000;">){
            </span><span style="color: #0000ff;">list</span>(<span style="color: #800080;">$user</span>,<span style="color: #800080;">$pass</span>) = <span style="color: #008080;">explode</span>(':', <span style="color: #800080;">$str</span>,2<span style="color: #000000;">);
            </span><span style="color: #800080;">$this</span>-><span style="color: #000000;">reload();
            </span><span style="color: #800080;">$user</span> = <span style="color: #008080;">strto lower</span>(<span style="color: #800080;">$user</span><span style="color: #000000;">);
            </span><span style="color: #0000ff;">if</span>(<span style="color: #0000ff;">isset</span>(<span style="color: #800080;">$this</span>->ユーザー[<span style="color: #800080;">$user</span><span style="color: #000000;">])){
                </span><span style="color: #800080;">$group</span> = <span style="color: #800080;">$this</span>->users[<span style="color: #800080;">$user</span>]['グループ'<span style="color: #000000;">];
                </span><span style="color: #0000ff;">if</span>(<span style="color: #800080;">$group</span> == 'admin' && <span style="color: #800080;">$this</span>->users[<span style="color: #800080;">$user</span>]['active'] && <span style="color: #008080;">time</span>() <= <span style="color: #008080;">strtotime</span>(<span style="color: #800080;">$this </span>->ユーザー[<span style="color: #800080;">$user</span>]['期限切れ'<span style="color: #000000;">])
                </span>&& <span style="color: #800080;">$this</span>->users[<span style="color: #800080;">$user</span>]['pass'] == <span style="color: #008080;">md5</span>(<span style="color: #800080;">$user</span>.<span style="color: #800080;">$this</span>->hash_salt.<span style="color: #800080;">$pass</span><span style="color: #000000;">)){                
                    </span><span style="color: #0000ff;">戻る</span> <span style="color: #0000ff;">本当</span><span style="color: #000000;">;
                }</span><span style="color: #0000ff;">他</span><span style="color: #000000;">{
                    </span><span style="color: #0000ff;">戻る</span> <span style="color: #0000ff;">false</span><span style="color: #000000;">;
                }
            }
        }
        </span><span style="color: #0000ff;">戻る</span> <span style="color: #0000ff;">false</span><span style="color: #000000;">;
    }
    
    </span><span style="color: #008000;">/*</span><span style="color: #008000;">*
     * 用户登录ip验证
     * @param 文字列 $user
     * @パラメータ文字列$ip
     * 
     * ユーザの IP 制限は、承認グループの IP 制限に従います。* マッチングルール:
     * 1. グループ許可リストの照合を実行します。
     * 2. 合格したかのように、グループ拒否リストのマッチングを実行します。
     * 3. ユーザー権限の照合を実行します。
     * 4. 合格した場合、ユーザー拒否マッチングを実行します。
     *
     </span><span style="color: #008000;">*/</span>
    <span style="color: #0000ff;">パブリック</span> <span style="color: #0000ff;">関数</span> checkIP(<span style="color: #800080;">$user</span>,<span style="color: #800080;">$ip</span><span style="color: #000000;">){
        </span><span style="color: #800080;">$pass</span> = <span style="color: #0000ff;">false</span><span style="color: #000000;">;
        </span><span style="color: #008000;">//</span><span style="color: #008000;">最初にグループ認証を実行します </span>
        <span style="color: #800080;">$group</span> = <span style="color: #800080;">$this</span>->users[<span style="color: #800080;">$user</span>]['グループ'<span style="color: #000000;">];
        </span><span style="color: #008000;">//</span><span style="color: #008000;">グループでマッチングが可能です</span>
        <span style="color: #0000ff;">if</span>(<span style="color: #0000ff;">isset</span>(<span style="color: #800080;">$this</span>->グループ[<span style="color: #800080;">$group</span>]['ip']['allow'<span style="color: #000000;">])){
            </span><span style="color: #0000ff;">foreach</span> (<span style="color: #800080;">$this</span>->groups[<span style="color: #800080;">$group</span>]['ip']['allow'] <span style="color: #0000ff;">as</span> <span style="color: #800080;">$addr</span><span style="color: #000000;">){
                </span><span style="color: #800080;">$pattern</span> = '/'.<span style="color: #008080;">str_replace</span>('*','d+',<span style="color: #008080;">str_replace</span>('.', '.', <span style="color: #800080;">$addr</span>)).'/'<span style="color: #000000;">;
                </span><span style="color: #0000ff;">if</span>(<span style="color: #008080;">preg_match</span>(<span style="color: #800080;">$pattern</span>, <span style="color: #800080;">$ip</span>) && !<span style="color: #0000ff;">empty</span>(<span style="color: #800080;">$addr</span><span style="color: #000000;">)){
                    </span><span style="color: #800080;">$pass</span> = <span style="color: #0000ff;">true</span><span style="color: #000000;">;
                    </span><span style="color: #0000ff;">休憩</span><span style="color: #000000;">;
                }
            }
        }
        </span><span style="color: #008000;">//</span><span style="color: #008000;">許可されている場合は、マッチングを拒否します</span>
        <span style="color: #0000ff;">if</span>(<span style="color: #800080;">$pass</span><span style="color: #000000;">){
            </span><span style="color: #0000ff;">if</span>(<span style="color: #0000ff;">isset</span>(<span style="color: #800080;">$this</span>->グループ[<span style="color: #800080;">$group</span>]['ip']['deny'<span style="color: #000000;">])){
                </span><span style="color: #0000ff;">foreach</span> (<span style="color: #800080;">$this</span>->groups[<span style="color: #800080;">$group</span>]['ip']['deny'] <span style="color: #0000ff;">as</span> <span style="color: #800080;">$addr</span><span style="color: #000000;">){
                    </span><span style="color: #800080;">$pattern</span> = '/'.<span style="color: #008080;">str_replace</span>('*','d+',<span style="color: #008080;">str_replace</span>('.', '.', <span style="color: #800080;">$addr</span>)).'/'<span style="color: #000000;">;
                    </span><span style="color: #0000ff;">if</span>(<span style="color: #008080;">preg_match</span>(<span style="color: #800080;">$pattern</span>, <span style="color: #800080;">$ip</span>) && !<span style="color: #0000ff;">empty</span>(<span style="color: #800080;">$addr</span><span style="color: #000000;">)){
                        </span><span style="color: #800080;">$pass</span> = <span style="color: #0000ff;">false</span><span style="color: #000000;">;
                        </span><span style="color: #0000ff;">休憩</span><span style="color: #000000;">;
                    }
                }
            }
        }</span><span style="color: #0000ff;">if</span>(<span style="color: #0000ff;">isset</span>(<span style="color: #800080;">$this</span>->users[<span style="color: #800080;">$user</span>]['ip']['allow'<span style="color: #000000;">])){            
            </span><span style="color: #0000ff;">foreach</span> (<span style="color: #800080;">$this</span>->users[<span style="color: #800080;">$user</span>]['ip']['allow'] <span style="color: #0000ff;">as</span> <span style="color: #800080;">$addr</span><span style="color: #000000;">){
                </span><span style="color: #800080;">$pattern</span> = '/'.<span style="color: #008080;">str_replace</span>('*','d+',<span style="color: #008080;">str_replace</span>('.', '.', <span style="color: #800080;">$addr</span>)).'/'<span style="color: #000000;">;
                </span><span style="color: #0000ff;">if</span>(<span style="color: #008080;">preg_match</span>(<span style="color: #800080;">$pattern</span>, <span style="color: #800080;">$ip</span>) && !<span style="color: #0000ff;">empty</span>(<span style="color: #800080;">$addr</span><span style="color: #000000;">)){
                    </span><span style="color: #800080;">$pass</span> = <span style="color: #0000ff;">true</span><span style="color: #000000;">;
                    </span><span style="color: #0000ff;">休憩</span><span style="color: #000000;">;
                }
            }
        }
        </span><span style="color: #0000ff;">if</span>(<span style="color: #800080;">$pass</span><span style="color: #000000;">){
            </span><span style="color: #0000ff;">if</span>(<span style="color: #0000ff;">isset</span>(<span style="color: #800080;">$this</span>->users[<span style="color: #800080;">$user</span>]['ip']['deny'<span style="color: #000000;">])){
                </span><span style="color: #0000ff;">foreach</span> (<span style="color: #800080;">$this</span>->users[<span style="color: #800080;">$user</span>]['ip']['deny'] <span style="color: #0000ff;">as</span> <span style="color: #800080;">$addr</span><span style="color: #000000;">){
                    </span><span style="color: #800080;">$pattern</span> = '/'.<span style="color: #008080;">str_replace</span>('*','d+',<span style="color: #008080;">str_replace</span>('.', '.', <span style="color: #800080;">$addr</span>)).'/'<span style="color: #000000;">;
                    </span><span style="color: #0000ff;">if</span>(<span style="color: #008080;">preg_match</span>(<span style="color: #800080;">$pattern</span>, <span style="color: #800080;">$ip</span>) && !<span style="color: #0000ff;">empty</span>(<span style="color: #800080;">$addr</span><span style="color: #000000;">)){
                        </span><span style="color: #800080;">$pass</span> = <span style="color: #0000ff;">false</span><span style="color: #000000;">;
                        </span><span style="color: #0000ff;">休憩</span><span style="color: #000000;">;
                    }
                }
            }
        }
        </span><span style="color: #0000ff;">echo</span> <span style="color: #008080;">date</span>('Y-m-d H:i:s')." [デバッグ]tIP アクセス:".' '.(<span style="color: #800080;">$pass</span>?'true':'false')."n"<span style="color: #000000;">;
        </span><span style="color: #0000ff;">リターン</span> <span style="color: #800080;">$pass</span><span style="color: #000000;">;
    }
    
    </span><span style="color: #008000;">/*</span><span style="color: #008000;">*
     *获取用户主目录
     * @param 文字列 $user
     * @戻り文字列
     </span><span style="color: #008000;">*/</span>
    <span style="color: #0000ff;">パブリック</span> <span style="color: #0000ff;">関数</span> getHomeDir(<span style="color: #800080;">$user</span><span style="color: #000000;">){
        </span><span style="color: #800080;">$user</span> = <span style="color: #008080;">strto lower</span>(<span style="color: #800080;">$user</span><span style="color: #000000;">);
        </span><span style="color: #800080;">$group</span> = <span style="color: #800080;">$this</span>->users[<span style="color: #800080;">$user</span>]['グループ'<span style="color: #000000;">];
        </span><span style="color: #800080;">$dir</span> = ''<span style="color: #000000;">;
        </span><span style="color: #0000ff;">if</span>(<span style="color: #800080;">$グループ</span><span style="color: #000000;">){
            </span><span style="color: #0000ff;">if</span>(<span style="color: #0000ff;">isset</span>(<span style="color: #800080;">$this</span>->グループ[<span style="color: #800080;">$group</span>]['home']))<span style="color: #800080;">$dir</span> = <span style="color: #800080;">$this</span>->グループ[<span style="color: #800080;">$group</span>][ 「家」<span style="color: #000000;">];
        }</span><span style="color: #800080;">$dir</span> = !<span style="color: #0000ff;">empty</span>(<span style="color: #800080;">$this</span>->users[<span style="color: #800080;">$user</span>]['home'])?<span style="color: #800080;">$this</span>->users[<span style="color: #800080;">$user</span>]['home' ]:<span style="color: #800080;">$ディレクトリ</span><span style="color: #000000;">;
        </span><span style="color: #0000ff;">return</span> <span style="color: #800080;">$dir</span><span style="color: #000000;">;
    }
    
    </span><span style="color: #008000;">//</span><span style="color: #008000;">文件权限界判断</span>
    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> isReadable(<span style="color: #800080;">$user</span>,<span style="color: #800080;">$path</span><span style="color: #000000;">){        
        </span><span style="color: #800080;">$result</span> = <span style="color: #800080;">$this</span>->getPathAccess(<span style="color: #800080;">$user</span>, <span style="color: #800080;">$path</span><span style="color: #000000;">);
        </span><span style="color: #0000ff;">if</span>(<span style="color: #800080;">$result</span>['isExactMatch'<span style="color: #000000;">]){
            </span><span style="color: #0000ff;">return</span> <span style="color: #800080;">$result</span>['access'][0] == 'R'<span style="color: #000000;">;
        }</span><span style="color: #0000ff;">他</span><span style="color: #000000;">{
            </span><span style="color: #0000ff;">return</span> <span style="color: #800080;">$result</span>['access'][0] == 'R' && <span style="color: #800080;">$result</span>['access'][9] == 'I'<span style="color: #000000;">;
        }
    }    
    
    </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> isWritable(<span style="color: #800080;">$user</span>,<span style="color: #800080;">$path</span><span style="color: #000000;">){        
        </span><span style="color: #800080;">$result</span> = <span style="color: #800080;">$this</span>->getPathAccess(<span style="color: #800080;">$user</span>, <span style="color: #800080;">$path</span><span style="color: #000000;">);        
        </span><span style="color: #0000ff;">if</span>(<span style="color: #800080;">$result</span>['isExactMatch'<span style="color: #000000;">]){
            </span><span style="color: #0000ff;">return</span> <span style="color: #800080;">$result</span>['access'][1] == 'W'<span style="color: #000000;">;
        }</span><span style="color: #0000ff;">他</span><span style="color: #000000;">{
            </span><span style="color: #0000ff;">return</span> <span style="color: #800080;">$result</span>['access'][1] == 'W' && <span style="color: #800080;">$result</span>['access'][9] == 'I'<span style="color: #000000;">;
        }
    }
    
    </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> isAppendable(<span style="color: #800080;">$user</span>,<span style="color: #800080;">$path</span><span style="color: #000000;">){
        </span><span style="color: #800080;">$result</span> = <span style="color: #800080;">$this</span>->getPathAccess(<span style="color: #800080;">$user</span>, <span style="color: #800080;">$path</span><span style="color: #000000;">);
        </span><span style="color: #0000ff;">if</span>(<span style="color: #800080;">$result</span>['isExactMatch'<span style="color: #000000;">]){
            </span><span style="color: #0000ff;">return</span> <span style="color: #800080;">$result</span>['access'][2] == 'A'<span style="color: #000000;">;
        }</span><span style="color: #0000ff;">他</span><span style="color: #000000;">{
            </span><span style="color: #0000ff;">return</span> <span style="color: #800080;">$result</span>['access'][2] == 'A' && <span style="color: #800080;">$result</span>['access'][9] == 'I'<span style="color: #000000;">;
        }
    }    
    
    </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> isRenamable(<span style="color: #800080;">$user</span>,<span style="color: #800080;">$path</span><span style="color: #000000;">){
        </span><span style="color: #800080;">$result</span> = <span style="color: #800080;">$this</span>->getPathAccess(<span style="color: #800080;">$user</span>, <span style="color: #800080;">$path</span><span style="color: #000000;">);
        </span><span style="color: #0000ff;">if</span>(<span style="color: #800080;">$result</span>['isExactMatch'<span style="color: #000000;">]){
            </span><span style="color: #0000ff;">return</span> <span style="color: #800080;">$result</span>['access'][3] == 'N'<span style="color: #000000;">;
        }</span><span style="color: #0000ff;">他</span><span style="color: #000000;">{
            </span><span style="color: #0000ff;">return</span> <span style="color: #800080;">$result</span>['access'][3] == 'N' && <span style="color: #800080;">$result</span>['access'][9] == 'I'<span style="color: #000000;">;
        }
    }
    </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> isDeletable(<span style="color: #800080;">$user</span>,<span style="color: #800080;">$path</span><span style="color: #000000;">){        
        </span><span style="color: #800080;">$result</span> = <span style="color: #800080;">$this</span>->getPathAccess(<span style="color: #800080;">$user</span>, <span style="color: #800080;">$path</span><span style="color: #000000;">);
        </span><span style="color: #0000ff;">if</span>(<span style="color: #800080;">$result</span>['isExactMatch'<span style="color: #000000;">]){
            </span><span style="color: #0000ff;">return</span> <span style="color: #800080;">$result</span>['access'][4] == 'D'<span style="color: #000000;">;
        }</span><span style="color: #0000ff;">他</span><span style="color: #000000;">{
            </span><span style="color: #0000ff;">return</span> <span style="color: #800080;">$result</span>['access'][4] == 'D' && <span style="color: #800080;">$result</span>['access'][9] == 'I'<span style="color: #000000;">;
        }
    }
    
    </span><span style="color: #008000;">//</span><span style="color: #008000;">目录权限界判断</span>
    <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> isFolderListable(<span style="color: #800080;">$user</span>,<span style="color: #800080;">$path</span><span style="color: #000000;">){
        </span><span style="color: #800080;">$result</span> = <span style="color: #800080;">$this</span>->getPathAccess(<span style="color: #800080;">$user</span>, <span style="color: #800080;">$path</span><span style="color: #000000;">);
        </span><span style="color: #0000ff;">if</span>(<span style="color: #800080;">$result</span>['isExactMatch'<span style="color: #000000;">]){
            </span><span style="color: #0000ff;">return</span> <span style="color: #800080;">$result</span>['access'][5] == 'L'<span style="color: #000000;">;
        }</span><span style="color: #0000ff;">他</span><span style="color: #000000;">{
            </span><span style="color: #0000ff;">return</span> <span style="color: #800080;">$result</span>['access'][5] == 'L' && <span style="color: #800080;">$result</span>['access'][9] == 'I'<span style="color: #000000;">;
        }
    }
    
    </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> isFolderCreatable(<span style="color: #800080;">$user</span>,<span style="color: #800080;">$path</span><span style="color: #000000;">){
        </span><span style="color: #800080;">$result</span> = <span style="color: #800080;">$this</span>->getPathAccess(<span style="color: #800080;">$user</span>, <span style="color: #800080;">$path</span><span style="color: #000000;">);
        </span><span style="color: #0000ff;">if</span>(<span style="color: #800080;">$result</span>['isExactMatch'<span style="color: #000000;">]){
            </span><span style="color: #0000ff;">return</span> <span style="color: #800080;">$result</span>['access'][6] == 'C'<span style="color: #000000;">;
        }</span><span style="color: #0000ff;">他</span><span style="color: #000000;">{
            </span><span style="color: #0000ff;">return</span> <span style="color: #800080;">$result</span>['access'][6] == 'C' && <span style="color: #800080;">$result</span>['access'][9] == 'I'<span style="color: #000000;">;
        }
    }
    
    </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> isFolderRenamable(<span style="color: #800080;">$user</span>,<span style="color: #800080;">$path</span><span style="color: #000000;">){
        </span><span style="color: #800080;">$result</span> = <span style="color: #800080;">$this</span>->getPathAccess(<span style="color: #800080;">$user</span>, <span style="color: #800080;">$path</span><span style="color: #000000;">);
        </span><span style="color: #0000ff;">if</span>(<span style="color: #800080;">$result</span>['isExactMatch'<span style="color: #000000;">]){
            </span><span style="color: #0000ff;">return</span> <span style="color: #800080;">$result</span>['access'][7] == 'N'<span style="color: #000000;">;
        }</span><span style="color: #0000ff;">他</span><span style="color: #000000;">{
            </span><span style="color: #0000ff;">return</span> <span style="color: #800080;">$result</span>['access'][7] == 'N' && <span style="color: #800080;">$result</span>['access'][9] == 'I'<span style="color: #000000;">;
        }
    }</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> isFolderDeletable(<span style="color: #800080;">$user</span>,<span style="color: #800080;">$path</span><span style="color: #000000;">){
        </span><span style="color: #800080;">$result</span> = <span style="color: #800080;">$this</span>->getPathAccess(<span style="color: #800080;">$user</span>, <span style="color: #800080;">$path</span><span style="color: #000000;">);
        </span><span style="color: #0000ff;">if</span>(<span style="color: #800080;">$result</span>['isExactMatch'<span style="color: #000000;">]){
            </span><span style="color: #0000ff;">return</span> <span style="color: #800080;">$result</span>['access'][8] == 'D'<span style="color: #000000;">;
        }</span><span style="color: #0000ff;">他</span><span style="color: #000000;">{
            </span><span style="color: #0000ff;">return</span> <span style="color: #800080;">$result</span>['access'][8] == 'D' && <span style="color: #800080;">$result</span>['access'][9] == 'I'<span style="color: #000000;">;
        }
    }</span><span style="color: #008000;">/*</span><span style="color: #008000;">*
     * ディレクトリの権限を取得する
     * @param 文字列 $user
     * @param 文字列 $path
     * @return 配列
     * 最長パスのマッチングを実行します
     *
     * 戻る:
     * 配列(
     * 'access'=>現在の権限
     * ,'isExactMatch'=> 完全に一致するかどうか
     *
     * );
     *
     * 完全に一致する場合は、継承を無視します。
     ※そうでない場合は、親ディレクトリの権限を継承するかどうかを判断する必要があります。
     *許可ビットテーブル:
     * +---+---+---+---+---+---+---+---+---+---+
     | 0 | 2 | 6 |
     * +---+---+---+---+---+---+---+---+---+---+
     | | | | | | | | | | | | | | | | |
     * +---+---+---+---+---+---+---+---+---+---+
     * | フォルダー |
     * +-------------------+-------------------+
     </span><span style="color: #008000;">*/</span>
    
    <span style="color: #0000ff;">パブリック</span> <span style="color: #0000ff;">関数</span> getPathAccess(<span style="color: #800080;">$user</span>,<span style="color: #800080;">$path</span><span style="color: #000000;">){
        </span><span style="color: #800080;">$this</span>-><span style="color: #000000;">reload();
        </span><span style="color: #800080;">$user</span> = <span style="color: #008080;">strto lower</span>(<span style="color: #800080;">$user</span><span style="color: #000000;">);
        </span><span style="color: #800080;">$group</span> = <span style="color: #800080;">$this</span>->users[<span style="color: #800080;">$user</span>]['グループ'<span style="color: #000000;">];
        </span><span style="color: #008000;">//</span><span style="color: #008000;">ファイル名を削除</span>
        <span style="color: #800080;">$path</span> = <span style="color: #008080;">str_replace</span>(<span style="color: #008080;">substr</span>(<span style="color: #008080;">strrchr</span>(<span style="color: #800080;">$path</span>, '/'),1),'',<span style="color: #800080;">$path</span><span style="color: #000000;">);
        </span><span style="color: #800080;">$access</span> = self::AC(0<span style="color: #000000;">);
        </span><span style="color: #800080;">$isExactMatch</span> = <span style="color: #0000ff;">false</span><span style="color: #000000;">;
        </span><span style="color: #0000ff;">if</span>(<span style="color: #800080;">$グループ</span><span style="color: #000000;">){
            </span><span style="color: #0000ff;">if</span>(<span style="color: #0000ff;">isset</span>(<span style="color: #800080;">$this</span>->グループ[<span style="color: #800080;">$グループ</span>]['フォルダー'<span style="color: #000000;">])){
                </span><span style="color: #0000ff;">foreach</span> (<span style="color: #800080;">$this</span>->groups[<span style="color: #800080;">$group</span>]['folder'] <span style="color: #0000ff;">as</span> <span style="color: #800080;">$f</span><span style="color: #000000;">){
                    </span><span style="color: #008000;">//</span><span style="color: #008000;">中国語処理</span>
                    <span style="color: #800080;">$t_path</span> = <span style="color: #008080;">iconv</span>('UTF-8','GB18030',<span style="color: #800080;">$f</span>['パス'<span style="color: #000000;">]);
                    </span><span style="color: #0000ff;">if</span>(<span style="color: #008080;">strpos</span>(<span style="color: #800080;">$path</span>, <span style="color: #800080;">$t_path</span>) === 0<span style="color: #000000;">){
                        </span><span style="color: #800080;">$access</span> = <span style="color: #800080;">$f</span>['access'<span style="color: #000000;">];
                        </span><span style="color: #800080;">$isExactMatch</span> = (<span style="color: #800080;">$path</span> == <span style="color: #800080;">$t_path</span>?<span style="color: #0000ff;">true</span>:<span style="color: #0000ff;">false</span><span style="color: #000000;">);
                    }</span>
ログイン後にコピー
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のおすすめ
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!