Browse Source

remove(user/relay)

兩足大貓貓 4 years ago
parent
commit
669853696c

+ 0 - 19
app/routes.php

@@ -49,14 +49,6 @@ return function (SlimApp $app) {
         $this->post('/buy',                     App\Controllers\UserController::class . ':buy');
         $this->post('/buy_traffic_package',     App\Controllers\UserController::class . ':buy_traffic_package');
 
-        // Relay Mange
-        $this->get('/relay',                    App\Controllers\User\RelayController::class . ':index');
-        $this->get('/relay/create',             App\Controllers\User\RelayController::class . ':create');
-        $this->post('/relay',                   App\Controllers\User\RelayController::class . ':add');
-        $this->get('/relay/{id}/edit',          App\Controllers\User\RelayController::class . ':edit');
-        $this->put('/relay/{id}',               App\Controllers\User\RelayController::class . ':update');
-        $this->delete('/relay',                 App\Controllers\User\RelayController::class . ':delete');
-
         $this->get('/ticket',                   App\Controllers\User\TicketController::class . ':ticket');
         $this->get('/ticket/create',            App\Controllers\User\TicketController::class . ':ticket_create');
         $this->post('/ticket',                  App\Controllers\User\TicketController::class . ':ticket_add');
@@ -171,16 +163,6 @@ return function (SlimApp $app) {
         $this->put('/ticket/{id}',              App\Controllers\Admin\TicketController::class . ':update');
         $this->post('/ticket/ajax',             App\Controllers\Admin\TicketController::class . ':ajax');
 
-        // Relay Mange
-        $this->get('/relay',                    App\Controllers\Admin\RelayController::class . ':index');
-        $this->get('/relay/create',             App\Controllers\Admin\RelayController::class . ':create');
-        $this->post('/relay',                   App\Controllers\Admin\RelayController::class . ':add');
-        $this->get('/relay/{id}/edit',          App\Controllers\Admin\RelayController::class . ':edit');
-        $this->put('/relay/{id}',               App\Controllers\Admin\RelayController::class . ':update');
-        $this->delete('/relay',                 App\Controllers\Admin\RelayController::class . ':delete');
-        $this->get('/relay/path_search/{id}',   App\Controllers\Admin\RelayController::class . ':path_search');
-        $this->post('/relay/ajax',              App\Controllers\Admin\RelayController::class . ':ajax_relay');
-
         // Shop Mange
         $this->get('/shop',                     App\Controllers\Admin\ShopController::class . ':index');
         $this->post('/shop/ajax',               App\Controllers\Admin\ShopController::class . ':ajax_shop');
@@ -323,7 +305,6 @@ return function (SlimApp $app) {
         $this->post('/nodes/config',        App\Controllers\Mod_Mu\NodeController::class . ':getConfig');
 
         $this->get('/func/detect_rules',    App\Controllers\Mod_Mu\FuncController::class . ':get_detect_logs');
-        $this->get('/func/relay_rules',     App\Controllers\Mod_Mu\FuncController::class . ':get_relay_rules');
         $this->post('/func/block_ip',       App\Controllers\Mod_Mu\FuncController::class . ':addBlockIp');
         $this->get('/func/block_ip',        App\Controllers\Mod_Mu\FuncController::class . ':get_blockip');
         $this->get('/func/unblock_ip',      App\Controllers\Mod_Mu\FuncController::class . ':get_unblockip');

+ 0 - 3
config/.config.example.php

@@ -494,9 +494,6 @@ $_ENV['cloudflare_email']       = '';            //Cloudflare 邮箱地址
 $_ENV['cloudflare_key']         = '';            //Cloudflare API Key
 $_ENV['cloudflare_name']        = '';            //域名
 
-#不安全中转模式,这个开启之后使用除了 auth_aes128_md5 或者 auth_aes128_sha1 以外的协议地用户也可以设置和使用中转
-$_ENV['relay_insecure_mode']    = false;       //强烈推荐不开启
-
 #是否夹带统计代码,自己在 resources/views/{主题名} 下创建一个 analytics.tpl ,如果有必要就用 literal 界定符
 $_ENV['enable_analytics_code']  = false;
 $_ENV['sspanelAnalysis']        = true;

+ 1 - 2
resources/views/material/admin/main.tpl

@@ -101,7 +101,6 @@
                     <a class="waves-attach" data-toggle="collapse" href="#ui_menu_user">用户</a>
                     <ul class="menu-collapse collapse in" id="ui_menu_user">
                         <li><a href="/admin/user"><i class="icon icon-lg">supervisor_account</i>&nbsp;用户列表</a></li>
-                        <li><a href="/admin/relay"><i class="icon icon-lg">compare_arrows</i>&nbsp;中转规则</a></li>
                         <li><a href="/admin/invite"><i class="icon icon-lg">loyalty</i>&nbsp;邀请与返利</a></li>
                         <li><a href="/admin/subscribe"><i class="icon icon-lg">dialer_sip</i>&nbsp;订阅记录</a></li>
                         <li><a href="/admin/login"><i class="icon icon-lg">text_fields</i>&nbsp;登录记录</a></li>
@@ -135,4 +134,4 @@
             </ul>
         </div>
     </div>
-</nav>
+</nav>

+ 0 - 102
resources/views/material/admin/relay/add.tpl

@@ -1,102 +0,0 @@
-{include file='admin/main.tpl'}
-
-<main class="content">
-    <div class="content-header ui-content-header">
-        <div class="container">
-            <h1 class="content-heading"> 添加中转规则</h1>
-        </div>
-    </div>
-    <div class="container">
-        <div class="col-lg-12 col-sm-12">
-            <section class="content-inner margin-top-no">
-                <form id="main_form">
-                    <div class="card">
-                        <div class="card-main">
-                            <div class="card-inner">
-                                <div class="form-group form-group-label">
-                                    <label class="floating-label" for="source_node">起源节点</label>
-                                    <select id="source_node" class="form-control maxwidth-edit" name="source_node">
-                                        <option value="0">请选择起源节点</option>
-                                        {foreach $source_nodes as $source_node}
-                                            <option value="{$source_node->id}">{$source_node->name}</option>
-                                        {/foreach}
-                                    </select>
-                                </div>
-                                <div class="form-group form-group-label">
-                                    <label class="floating-label" for="dist_node">目标节点</label>
-                                    <select id="dist_node" class="form-control maxwidth-edit" name="dist_node">
-                                        <option value="-1">不进行中转</option>
-                                        {foreach $dist_nodes as $dist_node}
-                                            <option value="{$dist_node->id}">{$dist_node->name}</option>
-                                        {/foreach}
-                                    </select>
-                                </div>
-                                <div class="form-group form-group-label">
-                                    <label class="floating-label" for="port">端口</label>
-                                    <input class="form-control maxwidth-edit" id="port" name="port" type="text"
-                                           value="0">
-                                </div>
-                                <div class="form-group form-group-label">
-                                    <label class="floating-label" for="priority">优先级</label>
-                                    <input class="form-control maxwidth-edit" id="priority" name="priority" type="text"
-                                           value="0">
-                                </div>
-                                <div class="form-group form-group-label">
-                                    <label class="floating-label" for="user_id">用户ID</label>
-                                    <input class="form-control maxwidth-edit" id="user_id" name="user_id" type="text"
-                                           value="0">
-                                </div>
-                                <div class="form-group form-group-label">
-                                    <button id="submit" type="submit" class="btn btn-block btn-brand waves-attach waves-light">添加</button>
-                                </div>
-                            </div>
-                        </div>
-                    </div>
-                </form>
-                {include file='dialog.tpl'}
-                <section>
-        </div>
-    </div>
-</main>
-
-{include file='admin/footer.tpl'}
-
-<script>
-    {literal}
-    $('#main_form').validate({
-        rules: {
-            priority: {required: true},
-            port: {required: true},
-            user_id: {required: true}
-        },
-        {/literal}
-        submitHandler: () => {
-            $.ajax({
-                type: "POST",
-                url: "/admin/relay",
-                dataType: "json",
-                data: {
-                    source_node: $$getValue('source_node'),
-                    dist_node: $$getValue('dist_node'),
-                    port: $$getValue('port'),
-                    user_id: $$getValue('user_id'),
-                    priority: $$getValue('priority')
-                },
-                success: data => {
-                    if (data.ret) {
-                        $("#result").modal();
-                        $$.getElementById('msg').innerHTML = data.msg;
-                        window.setTimeout("location.href=top.document.referrer", {$config['jump_delay']});
-                    } else {
-                        $("#result").modal();
-                        $$.getElementById('msg').innerHTML = data.msg;
-                    }
-                },
-                error: jqXHR => {
-                    $("#result").modal();
-                    $$.getElementById('msg').innerHTML = `${ldelim}data.msg{rdelim} 发生错误了。`;
-                }
-            });
-        }
-    });
-</script>

+ 0 - 116
resources/views/material/admin/relay/edit.tpl

@@ -1,116 +0,0 @@
-{include file='admin/main.tpl'}
-
-<main class="content">
-    <div class="content-header ui-content-header">
-        <div class="container">
-            <h1 class="content-heading"> 编辑规则 #{$rule->id}</h1>
-        </div>
-    </div>
-    <div class="container">
-        <div class="col-lg-12 col-sm-12">
-            <section class="content-inner margin-top-no">
-                <form id="main_form">
-                    <div class="card">
-                        <div class="card-main">
-                            <div class="card-inner">
-                                <div class="form-group form-group-label">
-                                    <label class="floating-label" for="source_node">起源节点</label>
-                                    <select id="source_node" class="form-control maxwidth-edit" name="source_node">
-                                        <option value="0">请选择起源节点</option>
-                                        {foreach $source_nodes as $source_node}
-                                            <option value="{$source_node->id}"
-                                                    {if $rule->source_node_id == $source_node->id}selected{/if}>{$source_node->name}</option>
-                                        {/foreach}
-                                    </select>
-                                </div>
-                                <div class="form-group form-group-label">
-                                    <label class="floating-label" for="dist_node">目标节点</label>
-                                    <select id="dist_node" class="form-control maxwidth-edit" name="dist_node">
-                                        <option value="-1">不进行中转</option>
-                                        {foreach $dist_nodes as $dist_node}
-                                            <option value="{$dist_node->id}"
-                                                    {if $rule->dist_node_id == $dist_node->id}selected{/if}>{$dist_node->name}</option>
-                                        {/foreach}
-                                    </select>
-                                </div>
-                                <div class="form-group form-group-label">
-                                    <label class="floating-label" for="port">端口</label>
-                                    <input class="form-control maxwidth-edit" id="port" name="port" type="text"
-                                           value="{$rule->port}">
-                                </div>
-                                <div class="form-group form-group-label">
-                                    <label class="floating-label" for="priority">优先级</label>
-                                    <input class="form-control maxwidth-edit" id="priority" name="priority" type="text"
-                                           value="{$rule->priority}">
-                                </div>
-                                <div class="form-group form-group-label">
-                                    <label class="floating-label" for="user_id">用户ID</label>
-                                    <input class="form-control maxwidth-edit" id="user_id" name="user_id" type="text"
-                                           value="{$rule->user_id}">
-                                </div>
-                            </div>
-                        </div>
-                    </div>
-                    <div class="card">
-                        <div class="card-main">
-                            <div class="card-inner">
-                                <div class="form-group">
-                                    <div class="row">
-                                        <div class="col-md-10 col-md-push-1">
-                                            <button id="submit" type="submit"
-                                                    class="btn btn-block btn-brand waves-attach waves-light">修改
-                                            </button>
-                                        </div>
-                                    </div>
-                                </div>
-                            </div>
-                        </div>
-                    </div>
-                </form>
-                {include file='dialog.tpl'}
-                <section>
-        </div>
-    </div>
-</main>
-
-{include file='admin/footer.tpl'}
-
-<script>
-    {literal}
-    $('#main_form').validate({
-        rules: {
-            priority: {required: true},
-            port: {required: true},
-            user_id: {required: true}
-        },
-        {/literal}
-        submitHandler: () => {
-            $.ajax({
-                type: "PUT",
-                url: "/admin/relay/{$rule->id}",
-                dataType: "json",
-                data: {
-                    source_node: $$getValue('source_node'),
-                    dist_node: $$getValue('dist_node'),
-                    port: $$getValue('port'),
-                    user_id: $$getValue('user_id'),
-                    priority: $$getValue('priority')
-                },
-                success: data => {
-                    if (data.ret) {
-                        $("#result").modal();
-                        $$.getElementById('msg').innerHTML = data.msg;
-                        window.setTimeout("location.href=top.document.referrer", {$config['jump_delay']});
-                    } else {
-                        $("#result").modal();
-                        $$.getElementById('msg').innerHTML = data.msg;
-                    }
-                },
-                error: jqXHR => {
-                    $("#result").modal();
-                    $$.getElementById('msg').innerHTML = `${ldelim}data.msg{rdelim} 发生错误了。`;
-                }
-            });
-        }
-    });
-</script>

+ 0 - 121
resources/views/material/admin/relay/index.tpl

@@ -1,121 +0,0 @@
-{include file='admin/main.tpl'}
-
-<main class="content">
-    <div class="content-header ui-content-header">
-        <div class="container">
-            <h1 class="content-heading">中转规则管理</h1>
-        </div>
-    </div>
-    <div class="container">
-        <div class="col-lg-12 col-md-12">
-            <section class="content-inner margin-top-no">
-
-                <div class="card">
-                    <div class="card-main">
-                        <div class="card-inner">
-                            <p>系统中所有的中转规则。</p>
-                            <p>显示表项:
-                                {include file='table/checkbox.tpl'}
-                            </p>
-                        </div>
-                    </div>
-                </div>
-                <div class="card">
-                    <div class="card-main">
-                        <div class="card-inner">
-                            <div class="form-group form-group-label">
-                                <label class="floating-label" for="search"> 输入用户 ID 进行搜索链路搜索 </label>
-                                <input class="form-control maxwidth-edit" id="search" type="text">
-                            </div>
-                        </div>
-                        <div class="card-action">
-                            <div class="card-action-btn pull-left">
-                                <a class="btn btn-flat waves-attach waves-light" id="search_button"><span class="icon">search</span>&nbsp;搜索</a>
-                            </div>
-                        </div>
-                    </div>
-                </div>
-                <div class="table-responsive">
-                    {include file='table/table.tpl'}
-                </div>
-                <div class="fbtn-container">
-                    <div class="fbtn-inner">
-                        <a class="fbtn fbtn-lg fbtn-brand-accent waves-attach waves-circle waves-light"
-                           href="/admin/relay/create">+</a>
-
-                    </div>
-                </div>
-                <div aria-hidden="true" class="modal modal-va-middle fade" id="delete_modal" role="dialog"
-                     tabindex="-1">
-                    <div class="modal-dialog modal-xs">
-                        <div class="modal-content">
-                            <div class="modal-heading">
-                                <a class="modal-close" data-dismiss="modal">×</a>
-                                <h2 class="modal-title">确认要删除?</h2>
-                            </div>
-                            <div class="modal-inner">
-                                <p>请您确认。</p>
-                            </div>
-                            <div class="modal-footer">
-                                <p class="text-right">
-                                    <button class="btn btn-flat btn-brand-accent waves-attach waves-effect"
-                                            data-dismiss="modal" type="button">取消
-                                    </button>
-                                    <button class="btn btn-flat btn-brand-accent waves-attach" data-dismiss="modal"
-                                            id="delete_input" type="button">确定
-                                    </button>
-                                </p>
-                            </div>
-                        </div>
-                    </div>
-                </div>
-                {include file='dialog.tpl'}
-        </div>
-    </div>
-</main>
-
-{include file='admin/footer.tpl'}
-
-<script>
-    function delete_modal_show(id) {
-        deleteid = id;
-        $("#delete_modal").modal();
-    }
-    {include file='table/js_1.tpl'}
-    window.addEventListener('load', () => {
-        {include file='table/js_2.tpl'}
-        function delete_id() {
-            $.ajax({
-                type: "DELETE",
-                url: "/admin/relay",
-                dataType: "json",
-                data: {
-                    id: deleteid
-                },
-                success: data => {
-                    if (data.ret) {
-                        $("#result").modal();
-                        $$.getElementById('msg').innerHTML = data.msg;
-                        {include file='table/js_delete.tpl'}
-                    } else {
-                        $("#result").modal();
-                        $$.getElementById('msg').innerHTML = data.msg;
-                    }
-                },
-                error: jqXHR => {
-                    $("#result").modal();
-                    $$.getElementById('msg').innerHTML = `${ldelim}data.msg{rdelim} 发生错误了。`;
-                }
-            });
-        }
-        $$.getElementById('delete_input').addEventListener('click', delete_id);
-        let search = () => {
-            window.location = `/admin/relay/path_search/${ldelim}$$.getElementById('search').value{rdelim}`;
-        }
-        $$.getElementById('search_button').addEventListener('click', () => {
-            if ($$.getElementById('search').value !== "") {
-                search();
-            }
-        })
-    })
-</script>

+ 0 - 92
resources/views/material/admin/relay/search.tpl

@@ -1,92 +0,0 @@
-{include file='admin/main.tpl'}
-
-<main class="content">
-    <div class="content-header ui-content-header">
-        <div class="container">
-            <h1 class="content-heading">中转链路搜索</h1>
-        </div>
-    </div>
-    <div class="container">
-        <div class="col-lg-12 col-md-12">
-            <section class="content-inner margin-top-no">
-                <div class="card">
-                    <div class="card-main">
-                        <div class="card-inner">
-                            <p>系统中这位用户的链路。</p>
-                        </div>
-                    </div>
-                </div>
-                <div class="card">
-                    <div class="card-main">
-                        <div class="card-inner">
-                            <div class="form-group form-group-label">
-                                <label class="floating-label" for="search"> 输入用户 ID 进行搜索链路搜索 </label>
-                                <input class="form-control maxwidth-edit" id="search" type="text">
-                            </div>
-                        </div>
-                        <div class="card-action">
-                            <div class="card-action-btn pull-left">
-                                <a class="btn btn-flat waves-attach waves-light" id="search_button"><span class="icon">search</span>&nbsp;搜索</a>
-                            </div>
-                        </div>
-                    </div>
-                </div>
-                <div class="table-responsive">
-                    <table class="mdl-data-table" id="table_1" cellspacing="0" width="100%">
-                        <thead>
-                        <tr>
-                            <th>端口</th>
-                            <th>始发节点</th>
-                            <th>终点节点</th>
-                            <th>途径节点</th>
-                            <th>状态</th>
-                        </tr>
-                        </thead>
-                        <tfoot>
-                        <tr>
-                            <th>端口</th>
-                            <th>始发节点</th>
-                            <th>终点节点</th>
-                            <th>途径节点</th>
-                            <th>状态</th>
-                        </tr>
-                        </tfoot>
-                        <tbody>
-                        {foreach $pathset as $path}
-                            <tr>
-                                <td>{$path->port}</td>
-                                <td>{$path->begin_node->name}</td>
-                                <td>{$path->end_node->name}</td>
-                                <td>{$path->path}</td>
-                                <td>{$path->status}</td>
-                            </tr>
-                        {/foreach}
-                        </tbody>
-                    </table>
-                </div>
-            </section>
-        </div>
-    </div>
-</main>
-
-{include file='admin/footer.tpl'}
-
-<script>
-    window.addEventListener('load', () => {
-        table = $('#table_1').DataTable({
-            "columnDefs": [{
-                targets: ['_all'],
-                className: 'mdl-data-table__cell--non-numeric'
-            }],
-            {include file='table/lang_chinese.tpl'}
-        });
-        let search = () => {
-            window.location = `/admin/relay/path_search/${ldelim}$$.getElementById('search').value{rdelim}`
-        };
-        $$.getElementById('search_button').addEventListener('click', () => {
-            if ($$.getElementById('search').value !== "") {
-                search();
-            }
-        })
-    })
-</script>

+ 1 - 24
resources/views/material/user/edit.tpl

@@ -804,29 +804,6 @@
         })
     })
 </script>
-<script>
-    $(document).ready(function () {
-        $("#relay-update").click(function () {
-            $.ajax({
-                type: "POST",
-                url: "relay",
-                dataType: "json",
-                data: {
-                    relay_enable: $$getValue('relay_enable'),
-                    relay_info: $$getValue('relay_info')
-                },
-                success: (data) => {
-                    $("#result").modal();
-                    $$.getElementById('msg').innerHTML = data.msg;
-                },
-                error: (jqXHR) => {
-                    $("#result").modal();
-                    $$.getElementById('msg').innerHTML = `${data.msg} 出现了一些错误`;
-                }
-            })
-        })
-    })
-</script>
 <script>
     $(document).ready(function () {
         $("#unblock").click(function () {
@@ -1028,4 +1005,4 @@
         $$.getElementById('msg').innerHTML = '已重置您的订阅链接,请变更或添加您的订阅链接!';
         window.setTimeout("location.href='/user/url_reset'", {$config['jump_delay']});
     });
-</script>
+</script>

+ 1 - 4
resources/views/material/user/main.tpl

@@ -100,9 +100,6 @@
                         <li>
                             <a href="/user/node"><i class="icon icon-lg">airplanemode_active</i>&nbsp;节点列表</a>
                         </li>
-                        <li>
-                            <a href="/user/relay"><i class="icon icon-lg">compare_arrows</i>&nbsp;中转规则</a>
-                        </li>
                         <li>
                             <a href="/user/lookingglass"><i class="icon icon-lg">visibility</i>&nbsp;延迟检测</a>
                         </li>
@@ -154,4 +151,4 @@
     {include file='mylivechat.tpl'}
 {elseif $config['live_chat'] === 'crisp'}
     {include file='crisp.tpl'}
-{/if}
+{/if}

+ 8 - 29
resources/views/material/user/node.tpl

@@ -167,15 +167,10 @@
                                     </p>
                                 {else}
                                     {if in_array($node['sort'], [0, 10])}
-                                        {$relay_rule = null}
-
-                                        {if $node['sort'] == 10}
-                                            {$relay_rule = $tools->pick_out_relay_rule($node['id'], $user->port, $relay_rules)}
-                                        {/if}
                                         {if $node['mu_only'] != 1}
                                             <div class="tiptitle">
-                                                <a href="javascript:void(0);" onClick="urlChange('{$node['id']}',0,{if $relay_rule != null}{$relay_rule->id}{else}0{/if})">
-                                                    {$node['name']}{if $relay_rule != null} - {$relay_rule->dist_node()->name}{/if}
+                                                <a href="javascript:void(0);" onClick="urlChange('{$node['id']}',0)">
+                                                    {$node['name']}
                                                 </a>
                                                 <div class="nodeload">
                                                     <div class="label label-brand-accent"> ↑点击节点查看配置信息</div>
@@ -191,13 +186,9 @@
                                                 {if !($single_muport['server']->node_class <= $user->class && ($single_muport['server']->node_group == 0 || $single_muport['server']->node_group == $user->node_group))}
                                                     {continue}
                                                 {/if}
-                                                {$relay_rule = null}
-                                                {if $node['sort'] == 10 && $single_muport['user']['is_multi_user'] != 2}
-                                                    {$relay_rule = $tools->pick_out_relay_rule($node['id'], $single_muport['server']->server, $relay_rules)}
-                                                {/if}
                                                 <div class="tiptitle">
-                                                    <a href="javascript:void(0);" onClick="urlChange('{$node['id']}',{$single_muport['server']->server},{if $relay_rule != null}{$relay_rule->id}{else}0{/if})">{$node['name']}
-                                                        {if $relay_rule != null} - {$relay_rule->dist_node()->name}{/if} -
+                                                    <a href="javascript:void(0);" onClick="urlChange('{$node['id']}',{$single_muport['server']->server})">{$node['name']}
+                                                        -
                                                         单端口 Shadowsocks - {$node['raw_node']->getOffsetPort($single_muport['server']->server)} 端口
                                                     </a>
                                                 </div>
@@ -298,16 +289,11 @@
                                                             <div class="card-main">
                                                                 <div class="card-inner">
                                                         {if in_array($node['sort'], [0, 10])}
-                                                            {$relay_rule = null}
                                                             <!-- 用户等级不小于节点等级 -->
-                                                            {if $node['sort'] == 10}
-                                                                {$relay_rule = $tools->pick_out_relay_rule($node['id'], $user->port, $relay_rules)}
-                                                            {/if}
                                                             {if $node['mu_only'] != 1}
                                                                     <p class="card-heading">
                                                                         <a href="javascript:void(0);"
-                                                                            onClick="urlChange('{$node['id']}',0,{if $relay_rule != null}{$relay_rule->id}{else}0{/if})">{$node['name']}
-                                                                            {if $relay_rule != null} - {$relay_rule->dist_node()->name}{/if}</a>
+                                                                            onClick="urlChange('{$node['id']}',0)">{$node['name']}</a>
                                                                         <span class="label label-brand-accent">←点击节点查看配置信息</span>
                                                                     </p>
                                                             {/if}
@@ -316,14 +302,9 @@
                                                                     {if !($single_muport['server']->node_class <= $user->class && ($single_muport['server']->node_group == 0 || $single_muport['server']->node_group == $user->node_group))}
                                                                         {continue}
                                                                     {/if}
-                                                                    {$relay_rule = null}
-                                                                    {if $node['sort'] == 10 && $single_muport['user']['is_multi_user'] != 2}
-                                                                        {$relay_rule = $tools->pick_out_relay_rule($node['id'], $single_muport['server']->server, $relay_rules)}
-                                                                    {/if}
                                                                     <p class="card-heading">
                                                                         <a href="javascript:void(0);"
-                                                                           onClick="urlChange('{$node['id']}',{$single_muport['server']->server},{if $relay_rule != null}{$relay_rule->id}{else}0{/if})">{$node['name']}
-                                                                            {if $relay_rule != null} - {$relay_rule->dist_node()->name}{/if}
+                                                                           onClick="urlChange('{$node['id']}',{$single_muport['server']->server}">{$node['name']}
                                                                             - 单端口 Shadowsocks -
                                                                             {$node['raw_node']->getOffsetPort($single_muport['server']->server)}
                                                                             端口</a><span
@@ -395,13 +376,11 @@
 {include file='user/footer.tpl'}
 
 <script>
-    function urlChange(id, is_mu, rule_id) {
+    function urlChange(id, is_mu) {
         var site = `./node/${
                 id
                 }?ismu=${
                 is_mu
-                }&relay_rule=${
-                rule_id
                 }`;
         if (id == 'guide') {
             var doc = document.getElementById('infoifram').contentWindow.document;
@@ -447,4 +426,4 @@
         }
     })();
     {/literal}
-</script>
+</script>

+ 3 - 3
resources/views/material/user/nodeinfo.tpl

@@ -43,7 +43,7 @@
                                         </nav>
                                         <div class="tab-pane fade {if $ssr_prefer}active in{/if}" id="ssr_info">
                                             {if URL::SSRCanConnect($user, $mu)}
-                                                {$ssr_item = $node->getItem($user, $mu, $relay_rule_id, 0)}
+                                                {$ssr_item = $node->getItem($user, $mu, 0)}
                                                     <p>服务器地址:{$ssr_item['address']}<br>
                                                         服务器端口:{$ssr_item['port']}<br>
                                                         加密方式:{$ssr_item['method']}<br>
@@ -60,7 +60,7 @@
                                         </div>
                                         <div class="tab-pane fade {if !$ssr_prefer}active in{/if}" id="ss_info">
                                             {if URL::SSCanConnect($user, $mu)}
-                                                {$ss_item = $node->getItem($user, $mu, $relay_rule_id, 1)}
+                                                {$ss_item = $node->getItem($user, $mu, 1)}
                                                     <p>服务器地址:{$ss_item['address']}<br>
                                                         服务器端口:{$ss_item['port']}<br>
                                                         加密方式:{$ss_item['method']}<br>
@@ -305,4 +305,4 @@
     qrcode3.clear();
     qrcode3.makeCode(text_qrcode2);
     {/if}
-</script>
+</script>

+ 0 - 133
resources/views/material/user/relay/add.tpl

@@ -1,133 +0,0 @@
-{include file='user/main.tpl'}
-
-<main class="content">
-    <div class="content-header ui-content-header">
-        <div class="container"><h1 class="content-heading">添加中转规则</h1></div>
-    </div>
-    <div class="container">
-        <div class="col-lg-12 col-sm-12">
-            <section class="content-inner margin-top-no">
-                <form id="main_form">
-                    <div class="card">
-                        <div class="card-main">
-                            <div class="card-inner">
-                                <div class="form-group form-group-label control-highlight-custom dropdown">
-                                    <label class="floating-label" for="source_node">起源节点</label>
-                                    <button id="source_node" class="form-control maxwidth-edit" name="source_node"
-                                            data-toggle="dropdown">
-                                        请选择起源节点
-                                    </button>
-                                    <ul class="dropdown-menu" aria-labelledby="source_node">
-                                        {foreach $source_nodes as $source_node}
-                                            <li>
-                                                <a href="#" class="dropdown-option" onclick="return false;"
-                                                   val="{$source_node->id}" data="source_node">{$source_node->name}</a>
-                                            </li>
-                                        {/foreach}
-                                    </ul>
-                                </div>
-                                <div class="form-group form-group-label control-highlight-custom dropdown">
-                                    <label class="floating-label" for="dist_node">目标节点</label>
-                                    <button id="dist_node" class="form-control maxwidth-edit" name="dist_node"
-                                            data-toggle="dropdown">
-                                        请选择目标节点
-                                    </button>
-                                    <ul class="dropdown-menu" aria-labelledby="dist_node">
-                                        <li>
-                                            <a href="#" class="dropdown-option" onclick="return false;" val="-1"
-                                               data="dist_node">不进行中转</a>
-                                        </li>
-                                        {foreach $dist_nodes as $dist_node}
-                                            <li>
-                                                <a href="#" class="dropdown-option" onclick="return false;"
-                                                   val="{$dist_node->id}" data="dist_node">{$dist_node->name}</a>
-                                            </li>
-                                        {/foreach}
-                                    </ul>
-                                </div>
-                                <div class="form-group form-group-label control-highlight-custom dropdown">
-                                    <label class="floating-label" for="port">端口</label>
-                                    <button id="port" class="form-control maxwidth-edit" name="port"
-                                            data-toggle="dropdown">
-                                        请选择端口
-                                    </button>
-                                    <ul class="dropdown-menu" aria-labelledby="port">
-                                        {foreach $ports as $port}
-                                            <li><a href="#" class="dropdown-option" onclick="return false;"
-                                                   val="{$port}" data="port">{$port}</a></li>
-                                        {/foreach}
-                                    </ul>
-                                </div>
-                                <div class="form-group form-group-label">
-                                    <label class="floating-label" for="priority">优先级</label>
-                                    <input class="form-control maxwidth-edit" id="priority" name="priority" type="text"
-                                           value="0">
-                                </div>
-                            </div>
-                        </div>
-                    </div>
-                    <div class="card">
-                        <div class="card-main">
-                            <div class="card-inner">
-                                <div class="form-group">
-                                    <div class="row">
-                                        <div class="col-md-10 col-md-push-1">
-                                            <button id="submit" type="submit" class="btn btn-block btn-brand">添加
-                                            </button>
-                                        </div>
-                                    </div>
-                                </div>
-                            </div>
-                        </div>
-                    </div>
-                </form>
-                {include file='dialog.tpl'}
-                <section>
-        </div>
-    </div>
-</main>
-
-{include file='user/footer.tpl'}
-
-{literal}
-<script>
-    $('#main_form').validate({
-        rules: {
-            priority: {required: true}
-        },
-        submitHandler: () => {
-            $.ajax({
-                type: "POST",
-                url: "/user/relay",
-                dataType: "json",
-                {/literal}
-                data: {
-                    source_node: $$getValue('source_node'),
-                    dist_node: $$getValue('dist_node'),
-                    port: $$getValue('port'),
-                    priority: $$getValue('priority')
-                    {literal}
-                },
-                success: (data) => {
-                    if (data.ret) {
-                        $("#result").modal();
-                        $$.getElementById('msg').innerHTML = data.msg;
-                        {/literal}
-                        window.setTimeout("location.href=top.document.referrer", {$config['jump_delay']});
-                        {literal}
-                    } else {
-                        $("#result").modal();
-                        $$.getElementById('msg').innerHTML = data.msg;
-                    }
-                },
-                error: (jqXHR) => {
-                    $("#result").modal();
-                    $$.getElementById('msg').innerHTML = `${
-                            data.msg
-                            } 发生错误了`;
-                }
-            });
-        }
-    });
-</script>
-{/literal}

+ 0 - 137
resources/views/material/user/relay/edit.tpl

@@ -1,137 +0,0 @@
-{include file='user/main.tpl'}
-
-<main class="content">
-    <div class="content-header ui-content-header">
-        <div class="container">
-            <h1 class="content-heading"> 编辑规则 #{$rule->id}</h1>
-        </div>
-    </div>
-    <div class="container">
-        <div class="col-lg-12 col-sm-12">
-            <section class="content-inner margin-top-no">
-                <form id="main_form">
-                    <div class="card">
-                        <div class="card-main">
-                            <div class="card-inner">
-                                <div class="form-group form-group-label control-highlight-custom dropdown">
-                                    <label class="floating-label" for="source_node">起源节点</label>
-                                    <button id="source_node" class="form-control maxwidth-edit" name="source_node"
-                                            data-toggle="dropdown" value="{$rule->source_node_id}">
-                                        {foreach $source_nodes as $source_node}
-                                            {if $rule->source_node_id == $source_node->id}{$source_node->name}{/if}
-                                        {/foreach}
-                                    </button>
-                                    <ul class="dropdown-menu" aria-labelledby="source_node">
-                                        {foreach $source_nodes as $source_node}
-                                            <li>
-                                                <a href="#" class="dropdown-option" onclick="return false;"
-                                                   val="{$source_node->id}" data="source_node">{$source_node->name}</a>
-                                            </li>
-                                        {/foreach}
-                                    </ul>
-                                </div>
-                                <div class="form-group form-group-label control-highlight-custom dropdown">
-                                    <label class="floating-label" for="dist_node">目标节点</label>
-                                    <button id="dist_node" class="form-control maxwidth-edit" name="dist_node"
-                                            data-toggle="dropdown" value="{$rule->dist_node_id}">
-                                        {foreach $dist_nodes as $dist_node}
-                                            {if $rule->dist_node_id == $dist_node->id}{$dist_node->name}{/if}
-                                        {/foreach}
-                                    </button>
-                                    <ul class="dropdown-menu" aria-labelledby="dist_node">
-                                        <li><a href="#" class="dropdown-option" onclick="return false;" val="-1"
-                                               data="dist_node">不进行中转</a></li>
-                                        {foreach $dist_nodes as $dist_node}
-                                            <li><a href="#" class="dropdown-option" onclick="return false;"
-                                                   val="{$dist_node->id}" data="dist_node">{$dist_node->name}</a></li>
-                                        {/foreach}
-                                    </ul>
-                                </div>
-                                <div class="form-group form-group-label control-highlight-custom dropdown">
-                                    <label class="floating-label" for="port">端口</label>
-                                    <button id="port" class="form-control maxwidth-edit" name="port"
-                                            data-toggle="dropdown" value="{$rule->port}">
-                                        {foreach $ports as $port}
-                                            {if $rule->port == $port}{$rule->port}{/if}
-                                        {/foreach}
-                                    </button>
-                                    <ul class="dropdown-menu" aria-labelledby="port">
-                                        {foreach $ports as $port}
-                                            <li><a href="#" class="dropdown-option" onclick="return false;"
-                                                   val="{$port}" data="port">{$port}</a></li>
-                                        {/foreach}
-                                    </ul>
-                                </div>
-                                <div class="form-group form-group-label">
-                                    <label class="floating-label" for="priority">优先级</label>
-                                    <input class="form-control maxwidth-edit" id="priority" name="priority" type="text"
-                                           value="{$rule->priority}">
-                                </div>
-                            </div>
-                        </div>
-                    </div>
-                    <div class="card">
-                        <div class="card-main">
-                            <div class="card-inner">
-                                <div class="form-group">
-                                    <div class="row">
-                                        <div class="col-md-10 col-md-push-1">
-                                            <button id="submit" type="submit" class="btn btn-block btn-brand">修改
-                                            </button>
-                                        </div>
-                                    </div>
-                                </div>
-                            </div>
-                        </div>
-                    </div>
-                </form>
-                {include file='dialog.tpl'}
-                <section>
-        </div>
-    </div>
-</main>
-
-{include file='user/footer.tpl'}
-
-{literal}
-<script>
-    $('#main_form').validate({
-        rules: {
-            priority: {required: true}
-        },
-        submitHandler: () => {
-            $.ajax({
-                {/literal}
-                type: 'PUT',
-                url: '/user/relay/{$rule->id}',
-                dataType: 'json',
-                data: {
-                    source_node: $$getValue('source_node'),
-                    dist_node: $$getValue('dist_node'),
-                    port: $$getValue('port'),
-                    priority: $$getValue('priority')
-                    {literal}
-                },
-                success: (data) => {
-                    if (data.ret) {
-                        $("#result").modal();
-                        $$.getElementById('msg').innerHTML = data.msg;
-                        {/literal}
-                        window.setTimeout("location.href=top.document.referrer", {$config['jump_delay']});
-                        {literal}
-                    } else {
-                        $("#result").modal();
-                        $$.getElementById('msg').innerHTML = data.msg;
-                    }
-                },
-                error: (jqXHR) => {
-                    $("#result").modal();
-                    $$.getElementById('msg').innerHTML = `${
-                            data.msg
-                            } 发生错误了`;
-                }
-            });
-        }
-    });
-</script>
-{/literal}

+ 0 - 192
resources/views/material/user/relay/index.tpl

@@ -1,192 +0,0 @@
-{include file='user/main.tpl'}
-
-<main class="content">
-    <div class="content-header ui-content-header">
-        <div class="container">
-            <h1 class="content-heading">中转规则</h1>
-        </div>
-    </div>
-    <div class="container">
-        <div class="col-lg-12 col-md-12">
-            <section class="content-inner margin-top-no">
-                <div class="card">
-                    <div class="card-main">
-                        <div class="card-inner">
-                            <p>中转规则一般由中国中转至其他国外节点</p>
-                            <p>请设置端口号为您自己的端口</p>
-                            <p>优先级越大,代表其在多个符合条件的规则并存时会被优先采用,当优先级一致时,先添加的规则会被采用。</p>
-                            <p>节点不设置中转时,这个节点就可以当作一个普通的节点来做代理使用。</p>
-                        </div>
-                    </div>
-                </div>
-                <div class="card">
-                    <div class="card-main">
-                        <div class="card-relayinner">
-                            {if $is_relay_able}
-                            <nav class="tab-nav">
-                                <ul class="nav nav-justified">
-                                    <li class="active">
-                                        <a class="" data-toggle="tab" href="#rule_table">规则表</a>
-                                    </li>
-                                    <li>
-                                        <a class="" data-toggle="tab" href="#link_table">链路表</a>
-                                    </li>
-                                </ul>
-                            </nav>
-                        </div>
-                        <div class="tab-content">
-                            <div class="tab-pane fade active in" id="rule_table">
-                                <div class="table-responsive table-user">
-                                    {$render}
-                                    <table class="table table-user">
-                                        <tr>
-                                            <!--	<th>ID</th>   -->
-                                            <th>起源节点</th>
-                                            <th>目标节点</th>
-                                            <th>端口</th>
-                                            <th>优先级</th>
-                                            <th>操作</th>
-                                        </tr>
-                                        {foreach $rules as $rule}
-                                            <tr>
-                                                <!--<td>#{$rule->id}</td>-->
-                                                {if $rule->source_node_id == 0}
-                                                    <td>所有节点</td>
-                                                {else}
-                                                    <td>{$rule->Source_Node()->name}</td>
-                                                {/if}
-
-                                                {if $rule->Dist_Node() == null}
-                                                    <td>不进行中转</td>
-                                                {else}
-                                                    <td>{$rule->Dist_Node()->name}</td>
-                                                {/if}
-
-                                                <td>{if $rule->port == 0}所有端口{else}{$rule->port}{/if}</td>
-                                                <td>{$rule->priority}</td>
-                                                <td>
-                                                    <a class="btn btn-brand"
-                                                       {if $rule->user_id == 0}disabled{else}href="/user/relay/{$rule->id}/edit"{/if}>编辑</a>
-                                                    <a class="btn btn-brand-accent" id="delete" value="{$rule->id}"
-                                                       {if $rule->user_id == 0}disabled{else}href="javascript:void(0);"
-                                                       onClick="delete_modal_show('{$rule->id}')"{/if}>删除</a>
-                                                </td>
-                                            </tr>
-                                        {/foreach}
-                                    </table>
-                                    {$render}
-                                </div>
-                            </div>
-                            <div class="tab-pane fade" id="link_table">
-                                <div class="table-responsive table-user">
-                                    <table class="table">
-                                        <tr>
-                                            <th>端口</th>
-                                            <th>始发节点</th>
-                                            <th>终点节点</th>
-                                            <th>途径节点</th>
-                                            <th>状态</th>
-                                        </tr>
-                                        {foreach $pathset as $path}
-                                            <tr>
-                                                <td>{$path->port}</td>
-                                                <td>{$path->begin_node->name}</td>
-                                                <td>{$path->end_node->name}</td>
-                                                <td>{$path->path}</td>
-                                                <td>{$path->status}</td>
-                                            </tr>
-                                        {/foreach}
-                                    </table>
-                                </div>
-                            </div>
-                        </div>
-                        {/if}
-                    </div>
-                </div>
-                 <div class="card">
-							<div class="card-main">
-								<div class="card-inner">
-									<div class="form-group">
-										<div class="row">
-											<div class="col-md-10 col-md-push-1">
-												<button class="btn btn-block btn-brand waves-attach waves-light" onclick="location.href='/user/relay/create'">新建中转规则</button>
-											</div>
-										</div>
-									</div>
-								</div>
-							</div>
-						</div>
-                <div aria-hidden="true" class="modal modal-va-middle fade" id="delete_modal" role="dialog"
-                     tabindex="-1">
-                    <div class="modal-dialog modal-xs">
-                        <div class="modal-content">
-                            <div class="modal-heading">
-                                <a class="modal-close" data-dismiss="modal">×</a>
-                                <h2 class="modal-title">确认要删除?</h2>
-                            </div>
-                            <div class="modal-inner">
-                                <p>请您确认</p>
-                            </div>
-                            <div class="modal-footer">
-                                <p class="text-right">
-                                    <button class="btn btn-flat btn-brand-accent waves-attach waves-effect"
-                                            data-dismiss="modal" type="button">
-                                        取消
-                                    </button>
-                                    <button class="btn btn-flat btn-brand-accent waves-attach" data-dismiss="modal"
-                                            id="delete_input" type="button">
-                                        确定
-                                    </button>
-                                </p>
-                            </div>
-                        </div>
-                    </div>
-                </div>
-                {include file='dialog.tpl'}
-        </div>
-    </div>
-</main>
-
-{include file='user/footer.tpl'}
-
-<script>
-    function delete_modal_show(id) {
-        deleteid = id;
-        $("#delete_modal").modal();
-    }
-    $(document).ready(() => {
-        {if !$is_relay_able}
-        $("#result").modal();
-        $$.getElementById('msg').innerHTML = `为了中转的稳定,您需要在<a href='/user/edit'>资料编辑</a>处设置协议为以下协议之一: <br>{foreach $relay_able_protocol_list as $single_text}{$single_text}<br>{/foreach}后方可设置中转规则!`
-        {/if}
-        function delete_id() {
-            $.ajax({
-                type: "DELETE",
-                url: "/user/relay",
-                dataType: "json",
-                data: {
-                    id: deleteid
-                },
-                success: (data) => {
-                    if (data.ret) {
-                        $("#result").modal();
-                        $$.getElementById('msg').innerHTML = data.msg;
-                        window.setTimeout("location.href=window.location.href", {$config['jump_delay']});
-                    } else {
-                        $("#result").modal();
-                        $$.getElementById('msg').innerHTML = data.msg;
-                    }
-                },
-                error: (jqXHR) => {
-                    $("#result").modal();
-                    $$.getElementById('msg').innerHTML = `${
-                            data.msg
-                            } 发生错误了`;
-                }
-            });
-        }
-        $("#delete_input").click(() => {
-            delete_id();
-        });
-    })
-</script>

+ 2 - 20
sql/glzjin_all.sql

@@ -361,11 +361,11 @@ CREATE TABLE IF NOT EXISTS `auto` (
 ) ENGINE = InnoDB CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
 
 ALTER TABLE `auto`
-  ADD `sign` LONGTEXT NOT NULL AFTER `value`;ALTER TABLE `user` ADD `relay_enable` INT NOT NULL DEFAULT '0' AFTER `auto_reset_bandwidth`, ADD `relay_info` LONGTEXT NULL AFTER `relay_enable`;
+  ADD `sign` LONGTEXT NOT NULL AFTER `value`;
 ALTER TABLE `ss_node`
   ADD `custom_rss` INT NOT NULL DEFAULT '0' AFTER `node_group`;
 ALTER TABLE `user`
-  ADD `protocol` VARCHAR(128) NOT NULL DEFAULT 'origin' AFTER `relay_info`, ADD `protocol_param` VARCHAR(128) NULL DEFAULT NULL AFTER `protocol`, ADD `obfs` VARCHAR(128) NOT NULL DEFAULT 'plain' AFTER `protocol_param`, ADD `obfs_param` VARCHAR(128) NULL DEFAULT NULL AFTER `obfs`;
+  ADD `protocol` VARCHAR(128) NOT NULL DEFAULT 'origin' AFTER `node_group`, ADD `protocol_param` VARCHAR(128) NULL DEFAULT NULL AFTER `protocol`, ADD `obfs` VARCHAR(128) NOT NULL DEFAULT 'plain' AFTER `protocol_param`, ADD `obfs_param` VARCHAR(128) NULL DEFAULT NULL AFTER `obfs`;
 ALTER TABLE `user`
   ADD `forbidden_ip` varchar(182) NULL DEFAULT '' AFTER `obfs_param`, ADD `forbidden_port` LONGTEXT NULL DEFAULT '' AFTER `forbidden_ip`;
 
@@ -373,9 +373,6 @@ ALTER TABLE `user`
   CHANGE `node_speedlimit` `node_speedlimit` DECIMAL(12,2) NOT NULL DEFAULT '0.00';
 ALTER TABLE `ss_node`
   CHANGE `node_speedlimit` `node_speedlimit` DECIMAL(12,2) NOT NULL DEFAULT '0.00';
-ALTER TABLE `user`
-  DROP `relay_enable`,
-  DROP `relay_info`;
 ALTER TABLE `user`
   CHANGE `protocol` `protocol` VARCHAR(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT 'origin', CHANGE `obfs` `obfs` VARCHAR(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT 'plain';
 
@@ -418,21 +415,6 @@ ALTER TABLE `ss_node`
 ALTER TABLE `ss_node`
   ADD `online` BOOLEAN NOT NULL DEFAULT TRUE AFTER `mu_only`, ADD `gfw_block` BOOLEAN NOT NULL DEFAULT FALSE AFTER `online`;
 
-CREATE TABLE IF NOT EXISTS `relay` (
-  `id`             bigint(20)   NOT NULL,
-  `user_id`        bigint(20)   NOT NULL,
-  `source_node_id` bigint(20)   NOT NULL,
-  `dist_node_id`   bigint(20)   NOT NULL,
-  `dist_ip`        varchar(182) NOT NULL,
-  `port`           int(11)      NOT NULL,
-  `priority`       int(11)      NOT NULL
-) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-
-ALTER TABLE `relay`
-  ADD PRIMARY KEY (`id`);
-ALTER TABLE `relay`
-  MODIFY `id` bigint(20) NOT NULL AUTO_INCREMENT;
-
 CREATE TABLE IF NOT EXISTS `telegram_session` (
   `id`              BIGINT NOT NULL AUTO_INCREMENT,
   `user_id`         BIGINT NOT NULL,

+ 1 - 1
src/Command/Backup.php

@@ -43,7 +43,7 @@ class Backup extends Command
             system('mysqldump --user=' . $_ENV['db_username'] . ' --password=' . $_ENV['db_password'] . ' --host=' . $db_address_array[0] . ' ' . (isset($db_address_array[1]) ? '-P ' . $db_address_array[1] : '') . ' ' . $_ENV['db_database'] . ' > /tmp/ssmodbackup/mod.sql');
         } else {
             system(
-                'mysqldump --user=' . $_ENV['db_username'] . ' --password=' . $_ENV['db_password'] . ' --host=' . $db_address_array[0] . ' ' . (isset($db_address_array[1]) ? '-P ' . $db_address_array[1] : '') . ' ' . $_ENV['db_database'] . ' announcement auto blockip bought code coupon link login_ip payback shop speedtest ss_invite_code ss_node ss_password_reset ticket unblockip user user_token email_verify detect_list relay paylist> /tmp/ssmodbackup/mod.sql',
+                'mysqldump --user=' . $_ENV['db_username'] . ' --password=' . $_ENV['db_password'] . ' --host=' . $db_address_array[0] . ' ' . (isset($db_address_array[1]) ? '-P ' . $db_address_array[1] : '') . ' ' . $_ENV['db_database'] . ' announcement auto blockip bought code coupon link login_ip payback shop speedtest ss_invite_code ss_node ss_password_reset ticket unblockip user user_token email_verify detect_list paylist> /tmp/ssmodbackup/mod.sql',
                 $ret
             );
             system(

+ 0 - 10
src/Command/Job.php

@@ -349,18 +349,8 @@ class Job extends Command
                 if (!Tools::is_ip($server) && $node->changeNodeIp($server)) {
                     $node->save();
                 }
-                if (in_array($node->sort, array(0, 10, 12))) {
-                    Tools::updateRelayRuleIp($node);
-                }
             }
         }
-
-        // 删除无效的中转
-        $allNodeID = implode(', ', $allNodeID);
-        $datatables = new DatatablesHelper();
-        $datatables->query(
-            'DELETE FROM `relay` WHERE `source_node_id` NOT IN(' . $allNodeID . ') OR `dist_node_id` NOT IN(' . $allNodeID . ')'
-        );       
     }
     /**
      * 用户账户相关任务,每小时

+ 1 - 32
src/Command/User.php

@@ -2,7 +2,6 @@
 
 namespace App\Command;
 
-use App\Models\Relay;
 use App\Models\User as ModelsUser;
 use App\Services\Config;
 use App\Utils\GA;
@@ -21,8 +20,7 @@ class User extends Command
         . '│ ├─ resetAllPort            - 重置所有用户端口' . PHP_EOL
         . '│ ├─ resetTraffic            - 重置所有用户流量' . PHP_EOL
         . '│ ├─ generateUUID            - 为所有用户生成新的 UUID' . PHP_EOL
-        . '│ ├─ generateGa              - 为所有用户生成新的 Ga Secret' . PHP_EOL
-        . '│ ├─ cleanRelayRule          - 清除所有中转规则' . PHP_EOL;
+        . '│ ├─ generateGa              - 为所有用户生成新的 Ga Secret' . PHP_EOL;
 
     public function boot()
     {
@@ -50,11 +48,6 @@ class User extends Command
         if ($user !== null) {
             $origin_port = $user->port;
             $user->port  = Tools::getAvPort();
-            $relay_rules = Relay::where('user_id', $user->id)->where('port', $origin_port)->get();
-            foreach ($relay_rules as $rule) {
-                $rule->port = $user->port;
-                $rule->save();
-            }
             if ($user->save()) {
                 echo '重置成功!' . PHP_EOL;
             }
@@ -136,30 +129,6 @@ class User extends Command
         echo 'generate Ga Secret successful' . PHP_EOL;
     }
 
-    /**
-     * 清理所有中转规则
-     *
-     * @return void
-     */
-    public function cleanRelayRule()
-    {
-        $rules = Relay::all();
-        foreach ($rules as $rule) {
-            echo ($rule->id . "\n");
-            if ($rule->source_node_id == 0) {
-                echo ($rule->id . "被删除!\n");
-                $rule->delete();
-                continue;
-            }
-            $ruleset = Relay::where('user_id', $rule->user_id)->orwhere('user_id', 0)->get();
-            $maybe_rule_id = Tools::has_conflict_rule($rule, $ruleset, $rule->id);
-            if ($maybe_rule_id != 0) {
-                echo ($rule->id . "被删除!\n");
-                $rule->delete();
-            }
-        }
-    }
-
     /**
      * 创建 Admin 账户
      *

+ 0 - 10
src/Controllers/Admin/NodeController.php

@@ -213,10 +213,6 @@ class NodeController extends AdminController
             );
         }
 
-        if (in_array($node->sort, array(0, 10, 11, 12))) {
-            Tools::updateRelayRuleIp($node);
-        }
-
         $node->status                     = $request->getParam('status');
         $node->node_class                 = $request->getParam('class');
         $node->node_bandwidth_limit       = $request->getParam('node_bandwidth_limit') * 1024 * 1024 * 1024;
@@ -346,15 +342,9 @@ class NodeController extends AdminController
                 case 9:
                     $sort = 'Shadowsocks - 单端口多用户';
                     break;
-                case 10:
-                    $sort = 'Shadowsocks - 中转';
-                    break;
                 case 11:
                     $sort = 'V2Ray 节点';
                     break;
-                case 12:
-                    $sort = 'V2Ray - 中转';
-                    break;
                 case 13:
                     $sort = 'Shadowsocks - V2Ray-Plugin&Obfs';
                     break;

+ 0 - 385
src/Controllers/Admin/RelayController.php

@@ -1,385 +0,0 @@
-<?php
-
-namespace App\Controllers\Admin;
-
-use App\Controllers\AdminController;
-use App\Models\{
-    Node,
-    User,
-    Relay
-};
-use App\Utils\{
-    Tools,
-    DatatablesHelper
-};
-use App\Services\Auth;
-use Ozdemir\Datatables\Datatables;
-use ArrayObject;
-
-class RelayController extends AdminController
-{
-    public function index($request, $response, $args)
-    {
-        $table_config['total_column'] = array(
-            'op' => '操作', 'id' => 'ID', 'user_id' => '用户ID',
-            'user_name' => '用户名', 'source_node_name' => '起源节点',
-            'dist_node_name' => '目标节点', 'port' => '端口', 'priority' => '优先级'
-        );
-        $table_config['default_show_column'] = array();
-        foreach ($table_config['total_column'] as $column => $value) {
-            $table_config['default_show_column'][] = $column;
-        }
-        $table_config['ajax_url'] = 'relay/ajax';
-        return $this->view()->assign('table_config', $table_config)->display('admin/relay/index.tpl');
-    }
-
-    public function create($request, $response, $args)
-    {
-        $user = Auth::getUser();
-        $source_nodes = Node::where(
-            static function ($query) {
-                $query->Where('sort', 10)
-                    ->orWhere('sort', 12);
-            }
-        )->orderBy('name')->get();
-        foreach ($source_nodes as $node) {
-            if ($node->sort == 12) {
-                $node->name .= 'V2Ray 中转,Port 代表中转监听端口';
-            }
-        }
-        $dist_nodes = Node::where(
-            static function ($query) {
-                $query->Where('sort', 0)
-                    ->orWhere('sort', 10)
-                    ->orWhere('sort', 11)
-                    ->orWhere('sort', 12);
-            }
-        )->orderBy('name')->get();
-
-        foreach ($dist_nodes as $node) {
-            if ($node->sort == 11 || $node->sort == 12) {
-                $node->name = $node->name;
-            } else {
-                $node->name .= ' 如果是 V2Ray 中转,无法食用';
-            }
-        }
-
-        return $this->view()->assign('source_nodes', $source_nodes)->assign('dist_nodes', $dist_nodes)->display('admin/relay/add.tpl');
-    }
-
-    public function add($request, $response, $args)
-    {
-        $dist_node_id = $request->getParam('dist_node');
-        $source_node_id = $request->getParam('source_node');
-        $port = $request->getParam('port');
-        $priority = $request->getParam('priority');
-        $user_id = $request->getParam('user_id');
-
-        $source_node = Node::where('id', $source_node_id)->first();
-        if ($source_node == null) {
-            $rs['ret'] = 0;
-            $rs['msg'] = '起源节点错误。';
-            return $response->getBody()->write(json_encode($rs));
-        }
-
-        if ($source_node->sort == 12) {
-            $rules = Relay::Where('source_node_id', $source_node_id)->get();
-            if (!Tools::relayRulePortCheck($rules)) {
-                $rs['ret'] = 0;
-                $rs['msg'] = '端口冲突请,请更换一个';
-                return $response->getBody()->write(json_encode($rs));
-            }
-        }
-        $dist_node = Node::where('id', $dist_node_id)->first();
-        if ($dist_node == null) {
-            $rs['ret'] = 0;
-            $rs['msg'] = '目标节点错误。';
-            return $response->getBody()->write(json_encode($rs));
-        }
-
-        $rule = new Relay();
-        $rule->user_id = $user_id;
-        $rule->dist_node_id = $dist_node_id;
-
-        $dist_node_ip = Tools::getRelayNodeIp($source_node, $dist_node);
-        $rule->dist_ip = $dist_node_ip;
-
-        $rule->source_node_id = $source_node_id;
-        $rule->port = $port;
-        $rule->priority = $priority;
-
-        if ($user_id == 0) {
-            $ruleset = Relay::all();
-        } else {
-            $ruleset = Relay::where('user_id', $user_id)->orwhere('user_id', 0)->get();
-        }
-        $maybe_rule_id = Tools::has_conflict_rule($rule, $ruleset, 0, $rule->source_node_id);
-        if ($maybe_rule_id != 0) {
-            $rs['ret'] = 0;
-            $rs['msg'] = '您即将添加的规则与规则 ID:' . $maybe_rule_id . ' 冲突!';
-            if ($maybe_rule_id == -1) {
-                $rs['msg'] = '您即将添加的规则可能会造成冲突!';
-            }
-            return $response->getBody()->write(json_encode($rs));
-        }
-
-        if (!$rule->save()) {
-            $rs['ret'] = 0;
-            $rs['msg'] = '添加失败';
-            return $response->getBody()->write(json_encode($rs));
-        }
-
-        $rs['ret'] = 1;
-        $rs['msg'] = '添加成功';
-        return $response->getBody()->write(json_encode($rs));
-    }
-
-    public function edit($request, $response, $args)
-    {
-        $id = $args['id'];
-
-        $user = Auth::getUser();
-        $rule = Relay::where('id', $id)->first();
-
-        if ($rule == null) {
-            exit(0);
-        }
-
-        $source_nodes = Node::where(
-            static function ($query) {
-                $query->Where('sort', 10)
-                    ->orWhere('sort', 12);
-            }
-        )->orderBy('name')->get();
-        foreach ($source_nodes as $node) {
-            if ($node->sort == 12) {
-                $node->name .= ' 正在使用 V2Ray 后端 ';
-            }
-        }
-
-        $dist_nodes = Node::where(
-            static function ($query) {
-                $query->Where('sort', 0)
-                    ->orWhere('sort', 10)
-                    ->orWhere('sort', 11)
-                    ->orWhere('sort', 12);
-            }
-        )->orderBy('name')->get();
-
-        foreach ($dist_nodes as $node) {
-            if ($node->sort == 11 || $node->sort == 12) {
-                $node->name = $node->name . ' V2Ray 中转,Port 代表中转监听端口';
-            } else {
-                $node->name .= ' 如果是 V2Ray 中转,无法食用';
-            }
-        }
-
-        return $this->view()->assign('rule', $rule)->assign('source_nodes', $source_nodes)->assign('dist_nodes', $dist_nodes)->display('admin/relay/edit.tpl');
-    }
-
-    public function update($request, $response, $args)
-    {
-        $id = $args['id'];
-        $rule = Relay::where('id', $id)->first();
-
-        if ($rule == null) {
-            exit(0);
-        }
-
-        $dist_node_id = $request->getParam('dist_node');
-        $source_node_id = $request->getParam('source_node');
-        $port = $request->getParam('port');
-        $user_id = $request->getParam('user_id');
-        $priority = $request->getParam('priority');
-
-        $source_node = Node::where('id', $source_node_id)->first();
-        if ($source_node == null && $source_node_id != 0) {
-            $rs['ret'] = 0;
-            $rs['msg'] = '起源节点 ID 错误。';
-            return $response->getBody()->write(json_encode($rs));
-        }
-
-        $dist_node = Node::where('id', $dist_node_id)->first();
-        if ($dist_node == null) {
-            $rs['ret'] = 0;
-            $rs['msg'] = '目标节点 ID 错误。';
-            return $response->getBody()->write(json_encode($rs));
-        }
-
-        $rule->user_id = $user_id;
-        $rule->dist_node_id = $dist_node_id;
-
-        $dist_node_ip = Tools::getRelayNodeIp($source_node, $dist_node);
-        $rule->dist_ip = $dist_node_ip;
-
-        $rule->source_node_id = $source_node_id;
-        $rule->port = $port;
-        $rule->priority = $priority;
-
-        if ($user_id == 0) {
-            $ruleset = Relay::all();
-        } else {
-            $ruleset = Relay::where('user_id', $user_id)->orwhere('user_id', 0)->get();
-        }
-        $maybe_rule_id = Tools::has_conflict_rule($rule, $ruleset, $rule->id, $rule->source_node_id);
-        if ($maybe_rule_id != 0) {
-            $rs['ret'] = 0;
-            $rs['msg'] = '您即将添加的规则与规则 ID:' . $maybe_rule_id . ' 冲突!';
-            if ($maybe_rule_id == -1) {
-                $rs['msg'] = '您即将添加的规则可能会造成冲突!';
-            }
-            return $response->getBody()->write(json_encode($rs));
-        }
-
-
-        if (!$rule->save()) {
-            $rs['ret'] = 0;
-            $rs['msg'] = '修改失败';
-            return $response->getBody()->write(json_encode($rs));
-        }
-
-        $rs['ret'] = 1;
-        $rs['msg'] = '修改成功';
-        return $response->getBody()->write(json_encode($rs));
-    }
-
-
-    public function delete($request, $response, $args)
-    {
-        $id = $request->getParam('id');
-        $user = Auth::getUser();
-        $rule = Relay::where('id', $id)->first();
-
-        if ($rule == null) {
-            exit(0);
-        }
-
-        if (!$rule->delete()) {
-            $rs['ret'] = 0;
-            $rs['msg'] = '删除失败';
-            return $response->getBody()->write(json_encode($rs));
-        }
-        $rs['ret'] = 1;
-        $rs['msg'] = '删除成功';
-        return $response->getBody()->write(json_encode($rs));
-    }
-
-    public function path_search($request, $response, $args)
-    {
-        $uid = $args['id'];
-
-        $user = User::find($uid);
-
-        if ($user == null) {
-            $pathset = new ArrayObject();
-            return $this->view()->assign('pathset', $pathset)->display('admin/relay/search.tpl');
-        }
-
-        $nodes = Node::where(
-            static function ($query) use ($user) {
-                $query->Where('node_group', '=', $user->node_group)
-                    ->orWhere('node_group', '=', 0);
-            }
-        )->where(
-            static function ($query) {
-                $query->Where('sort', 10)
-                    ->orWhere('sort', 12);
-            }
-        )->where('node_class', '<=', $user->class)->orderBy('name')->get();
-
-        $pathset = new ArrayObject();
-
-        $relay_rules = Relay::where('user_id', $user->id)->orwhere('user_id', 0)->get();
-        $mu_nodes = Node::where('sort', 9)->where('node_class', '<=', $user->class)->where('type', '1')->where(
-            static function ($query) use ($user) {
-                $query->where('node_group', '=', $user->node_group)
-                    ->orWhere('node_group', '=', 0);
-            }
-        )->get();
-
-        foreach ($nodes as $node) {
-            if ($node->mu_only == 0 || $node->mu_only == -1) {
-                $relay_rule = Tools::pick_out_relay_rule($node->id, $user->port, $relay_rules);
-
-                if ($relay_rule != null) {
-                    $pathset = Tools::insertPathRule($relay_rule, $pathset, $user->port);
-                }
-            }
-
-            if ($node->custom_rss == 1 || $node->mu_only == -1) {
-                foreach ($mu_nodes as $mu_node) {
-                    $mu_user = User::where('port', '=', $mu_node->server)->first();
-
-                    if ($mu_user == null) {
-                        continue;
-                    }
-
-                    if (!($mu_user->class >= $node->node_class && ($node->node_group == 0 || $node->node_group == $mu_user->node_group))) {
-                        continue;
-                    }
-
-                    if ($mu_user->is_multi_user != 2) {
-                        $relay_rule = Tools::pick_out_relay_rule($node->id, $mu_user->port, $relay_rules);
-
-                        if ($relay_rule != null) {
-                            $pathset = Tools::insertPathRule($relay_rule, $pathset, $mu_user->port);
-                        }
-                    }
-                }
-            }
-        }
-
-        foreach ($pathset as $path) {
-            foreach ($pathset as $index => $single_path) {
-                if ($path != $single_path && $path->port == $single_path->port) {
-                    if ($single_path->end_node->id == $path->begin_node->id) {
-                        $path->begin_node = $single_path->begin_node;
-                        if ($path->begin_node->isNodeAccessable() == false) {
-                            $path->path = '<font color="#FF0000">' . $single_path->begin_node->name . '</font>' . ' → ' . $path->path;
-                            $path->status = '阻断';
-                        } else {
-                            $path->path = $single_path->begin_node->name . ' → ' . $path->path;
-                            $path->status = '通畅';
-                        }
-
-                        $pathset->offsetUnset($index);
-                        continue;
-                    }
-
-                    if ($path->end_node->id == $single_path->begin_node->id) {
-                        $path->end_node = $single_path->end_node;
-                        if ($single_path->end_node->isNodeAccessable() == false) {
-                            $path->path = $path->path . ' → ' . '<font color="#FF0000">' . $single_path->end_node->name . '</font>';
-                            $path->status = '阻断';
-                        } else {
-                            $path->path = $path->path . ' → ' . $single_path->end_node->name;
-                        }
-
-                        $pathset->offsetUnset($index);
-                        continue;
-                    }
-                }
-            }
-        }
-
-        return $this->view()->assign('pathset', $pathset)->display('admin/relay/search.tpl');
-    }
-
-    public function ajax_relay($request, $response, $args)
-    {
-        $datatables = new Datatables(new DatatablesHelper());
-        $datatables->query('Select relay.id as op,relay.id,relay.user_id,user.user_name,source_node.name as source_node_name,dist_node.name as dist_node_name,relay.port,relay.priority from relay,user,ss_node as source_node,ss_node as dist_node WHERE (relay.user_id = user.id or relay.user_id = 0) and source_node.id = relay.source_node_id and dist_node.id = relay.dist_node_id group by id');
-
-        $datatables->edit('op', static function ($data) {
-            return '<a class="btn btn-brand" href="/admin/relay/' . $data['id'] . '/edit">编辑</a>
-                    <a class="btn btn-brand-accent" id="delete" value="' . $data['id'] . '" href="javascript:void(0);" onClick="delete_modal_show(\'' . $data['id'] . '\')">删除</a>';
-        });
-
-        $datatables->edit('user_name', static function ($data) {
-            return ($data['user_id'] == 0 ? '全体用户' : $data['user_name']);
-        });
-
-        $body = $response->getBody();
-        $body->write($datatables->generate());
-    }
-}

+ 0 - 7
src/Controllers/Admin/UserController.php

@@ -7,7 +7,6 @@ use App\Models\{
     Ip,
     User,
     Shop,
-    Relay,
     Bought,
     DetectBanLog
 };
@@ -335,12 +334,6 @@ class UserController extends AdminController
         $origin_port = $user->port;
         $user->port = $request->getParam('port');
 
-        $relay_rules = Relay::where('user_id', $user->id)->where('port', $origin_port)->get();
-        foreach ($relay_rules as $rule) {
-            $rule->port = $user->port;
-            $rule->save();
-        }
-
         $user->addMoneyLog($request->getParam('money') - $user->money);
 
         $user->passwd           = $request->getParam('passwd');

+ 0 - 42
src/Controllers/Mod_Mu/FuncController.php

@@ -6,7 +6,6 @@ use App\Controllers\BaseController;
 use App\Models\{
     Auto,
     Node,
-    Relay,
     BlockIp,
     UnblockIp,
     Speedtest,
@@ -45,47 +44,6 @@ class FuncController extends BaseController
         return $node;
     }
 
-    public function get_relay_rules($request, $response, $args)
-    {
-        $params = $request->getQueryParams();
-        $node_id = $params['node_id'];
-        if ($node_id == '0') {
-            $node = Node::where('node_ip', $_SERVER['REMOTE_ADDR'])->first();
-            $node_id = $node->id;
-        } else {
-            $node = Node::where('id', $node_id)->first();
-        }
-        $rules = Relay::Where('source_node_id', $node_id)->get();
-        if (count($rules) > 0) {
-            if ($rules[0]['dist_node_id'] == -1) {
-                $server = null;
-            }
-            foreach ($rules as $rule) {
-                $dis = $this->get_dis_node_info($rule['dist_node_id']);
-                if ($dis != null) {
-                    $rule['source_node_sort'] = $node->sort;
-                    $rule['dist_node_sort'] = $dis->sort;
-                    $rule['dist_node_server'] = $dis->server;
-                } else {
-                    $rule['source_node_sort'] = $node->sort;
-                    $rule['dist_node_sort'] = null;
-                    $rule['dist_node_server'] = null;
-                }
-            }
-            $res = [
-                'ret' => 1,
-                'data' => $rules,
-            ];
-        } else {
-            $res = [
-                'ret' => 1,
-                'data' => array(),
-            ];
-        }
-
-        return $this->echoJson($response, $res);
-    }
-
     public function get_blockip($request, $response, $args)
     {
         $block_ips = BlockIp::Where('datetime', '>', time() - 60)->get();

+ 0 - 1
src/Controllers/Mod_Mu/UserController.php

@@ -12,7 +12,6 @@ use App\Models\{
     NodeOnlineLog
 };
 use App\Utils\Tools;
-use ArrayObject;
 
 class UserController extends BaseController
 {

+ 3 - 16
src/Controllers/User/NodeController.php

@@ -5,8 +5,7 @@ namespace App\Controllers\User;
 use App\Controllers\UserController;
 use App\Models\{
     Node,
-    User,
-    Relay
+    User
 };
 use App\Utils\{
     URL,
@@ -33,11 +32,6 @@ class NodeController extends UserController
     {
         $user        = $this->user;
         $nodes       = Node::where('type', 1)->orderBy('node_class')->orderBy('name')->get();
-        $relay_rules = Relay::where('user_id', $this->user->id)->orwhere('user_id', 0)->orderBy('id', 'asc')->get();
-
-        if (!Tools::is_protocol_relay($user)) {
-            $relay_rules = [];
-        }
 
         $db = new DatatablesHelper();
         $infoLogs = $db->query('SELECT * FROM ( SELECT * FROM `ss_node_info` WHERE log_time > ' . (time() - 300) . ' ORDER BY id DESC LIMIT 999999999999 ) t GROUP BY node_id ORDER BY id DESC');
@@ -136,7 +130,6 @@ class NodeController extends UserController
             $this->view()
                 ->assign('nodes', $array_nodes)
                 ->assign('nodes_muport', $nodes_muport)
-                ->assign('relay_rules', $relay_rules)
                 ->assign('tools', new Tools())
                 ->assign('user', $user)
                 ->registerClass('URL', URL::class)
@@ -173,7 +166,6 @@ class NodeController extends UserController
         $user          = $this->user;
         $id            = $args['id'];
         $mu            = $request->getQueryParams()['ismu'];
-        $relay_rule_id = $request->getQueryParams()['relay_rule'];
         $node          = Node::find($id);
         if ($node == null) {
             return null;
@@ -182,17 +174,12 @@ class NodeController extends UserController
         switch ($node->sort) {
             case 0:
                 if ((($user->class >= $node->node_class && ($user->node_group == $node->node_group || $node->node_group == 0)) || $user->is_admin) && ($node->node_bandwidth_limit == 0 || $node->node_bandwidth < $node->node_bandwidth_limit)) {
-                    return $this->view()->assign('node', $node)->assign('user', $user)->assign('mu', $mu)->assign('relay_rule_id', $relay_rule_id)->registerClass('URL', URL::class)->display('user/nodeinfo.tpl');
-                }
-                break;
-            case 10:
-                if ((($user->class >= $node->node_class && ($user->node_group == $node->node_group || $node->node_group == 0)) || $user->is_admin) && ($node->node_bandwidth_limit == 0 || $node->node_bandwidth < $node->node_bandwidth_limit)) {
-                    return $this->view()->assign('node', $node)->assign('user', $user)->assign('mu', $mu)->assign('relay_rule_id', $relay_rule_id)->registerClass('URL', URL::class)->display('user/nodeinfo.tpl');
+                    return $this->view()->assign('node', $node)->assign('user', $user)->assign('mu', $mu)->registerClass('URL', URL::class)->display('user/nodeinfo.tpl');
                 }
                 break;
             case 13:
                 if ((($user->class >= $node->node_class && ($user->node_group == $node->node_group || $node->node_group == 0)) || $user->is_admin) && ($node->node_bandwidth_limit == 0 || $node->node_bandwidth < $node->node_bandwidth_limit)) {
-                    return $this->view()->assign('node', $node)->assign('user', $user)->assign('mu', $mu)->assign('relay_rule_id', $relay_rule_id)->registerClass('URL', URL::class)->display('user/nodeinfo.tpl');
+                    return $this->view()->assign('node', $node)->assign('user', $user)->assign('mu', $mu)->registerClass('URL', URL::class)->display('user/nodeinfo.tpl');
                 }
                 break;
             default:

+ 0 - 658
src/Controllers/User/RelayController.php

@@ -1,658 +0,0 @@
-<?php
-
-namespace App\Controllers\User;
-
-use App\Controllers\UserController;
-use App\Models\{
-    Node,
-    User,
-    Relay
-};
-use App\Services\Config;
-use App\Utils\Tools;
-use ArrayObject;
-use Slim\Http\{
-    Request,
-    Response
-};
-use Psr\Http\Message\ResponseInterface;
-
-class RelayController extends UserController
-{
-    /**
-     * @param Request   $request
-     * @param Response  $response
-     * @param array     $args
-     */
-    public function index($request, $response, $args): ResponseInterface
-    {
-        $pageNum = 1;
-        $user    = $this->user;
-        if (isset($request->getQueryParams()['page'])) {
-            $pageNum = $request->getQueryParams()['page'];
-        }
-        $logs          = Relay::where('user_id', $user->id)->orwhere('user_id', 0)->paginate(15, ['*'], 'page', $pageNum);
-        $is_relay_able = Tools::is_protocol_relay($user);
-
-        //链路表部分
-
-        $nodes = Node::where(
-            static function ($query) use ($user) {
-                $query->Where('node_group', '=', $user->node_group)
-                    ->orWhere('node_group', '=', 0);
-            }
-        )
-            ->where('type', 1)
-            ->where(
-                static function ($query) {
-                    $query->Where('sort', 10)
-                        ->orWhere('sort', 12);
-                }
-            )
-            ->where('node_class', '<=', $user->class)
-            ->orderBy('name')
-            ->get();
-
-        $pathset     = new ArrayObject();
-        $relay_rules = Relay::where('user_id', $user->id)->orwhere('user_id', 0)->get();
-        $mu_nodes    = Node::where('sort', 9)
-            ->where('node_class', '<=', $user->class)
-            ->where('type', '1')
-            ->where(
-                static function ($query) use ($user) {
-                    $query->where('node_group', '=', $user->node_group)
-                        ->orWhere('node_group', '=', 0);
-                }
-            )->get();
-
-        foreach ($nodes as $node) {
-            if ($node->mu_only == 0 || $node->mu_only == -1) {
-                $relay_rule = Tools::pick_out_relay_rule($node->id, $user->port, $relay_rules);
-
-                if ($relay_rule != null) {
-                    $pathset = Tools::insertPathRule($relay_rule, $pathset, $user->port);
-                }
-            }
-
-            if ($node->custom_rss == 1 || $node->mu_only == -1) {
-                foreach ($mu_nodes as $mu_node) {
-                    $mu_user = User::where('port', '=', $mu_node->server)->first();
-
-                    if ($mu_user == null) {
-                        continue;
-                    }
-
-                    if (!($mu_user->class >= $node->node_class && ($node->node_group == 0 || $node->node_group == $mu_user->node_group))) {
-                        continue;
-                    }
-
-                    if ($mu_user->is_multi_user != 2) {
-                        $relay_rule = Tools::pick_out_relay_rule($node->id, $mu_user->port, $relay_rules);
-
-                        if ($relay_rule != null) {
-                            $pathset = Tools::insertPathRule($relay_rule, $pathset, $mu_user->port);
-                        }
-                    }
-                }
-            }
-        }
-
-        foreach ($pathset as $path) {
-            foreach ($pathset as $index => $single_path) {
-                if ($path != $single_path && $path->port == $single_path->port) {
-                    if ($single_path->end_node->id == $path->begin_node->id) {
-                        $path->begin_node = $single_path->begin_node;
-                        if ($path->begin_node->isNodeAccessable() == false) {
-                            $path->path = '<font color="#FF0000">' . $single_path->begin_node->name . '</font>' . ' → ' . $path->path;
-                            $path->status = '阻断';
-                        } else {
-                            $path->path = $single_path->begin_node->name . ' → ' . $path->path;
-                            $path->status = '通畅';
-                        }
-
-                        $pathset->offsetUnset($index);
-                        continue;
-                    }
-
-                    if ($path->end_node->id == $single_path->begin_node->id) {
-                        $path->end_node = $single_path->end_node;
-                        if ($single_path->end_node->isNodeAccessable() == false) {
-                            $path->path = $path->path . ' → ' . '<font color="#FF0000">' . $single_path->end_node->name . '</font>';
-                            $path->status = '阻断';
-                        } else {
-                            $path->path = $path->path . ' → ' . $single_path->end_node->name;
-                        }
-
-                        $pathset->offsetUnset($index);
-                        continue;
-                    }
-                }
-            }
-        }
-
-        if ($request->getParam('json') == 1) {
-            $res['ret'] = 1;
-            foreach ($logs as $log) {
-                $log->name          = $log->source_node_id == 0 ? '所有节点' : $log->Source_Node()->name;
-                $log->dist_name     = $log->Dist_Node() == null ? '不进行中转' : $log->Dist_Node()->name;
-                $log->port          = $log->port == 0 ? '所有端口' : $log->port;
-                $log->source_class  = $log->Source_Node()->node_class;
-                $log->dist_class    = $log->Dist_Node()->node_class;
-            }
-            $res['rules'] = $logs;
-            $res['relay_able_protocol_list'] = Config::getSupportParam('relay_able_protocol');
-            $res['is_relay_able'] = $is_relay_able;
-            $res['pathset'] = $pathset;
-            return $response->withJson($res);
-        }
-
-        $logs->setPath('/user/relay');
-        $render = Tools::paginate_render($logs);
-
-        return $response->write(
-            $this->view()
-                ->assign('rules', $logs)
-                ->assign('relay_able_protocol_list', Config::getSupportParam('relay_able_protocol'))
-                ->assign('is_relay_able', $is_relay_able)
-                ->assign('pathset', $pathset)
-                ->assign('render', $render)
-                ->display('user/relay/index.tpl')
-        );
-    }
-
-    /**
-     * @param Request   $request
-     * @param Response  $response
-     * @param array     $args
-     */
-    public function create($request, $response, $args): ResponseInterface
-    {
-        $user         = $this->user;
-        $source_nodes = Node::where(
-            static function ($query) use ($user) {
-                $query->Where('node_group', '=', $user->node_group)
-                    ->orWhere('node_group', '=', 0);
-            }
-        )
-            ->where('type', 1)
-            ->where(
-                static function ($query) {
-                    $query->Where('sort', 10);
-                }
-            )
-            ->where('node_class', '<=', $user->class)
-            ->orderBy('name')
-            ->get();
-
-        $dist_nodes = Node::where(
-            static function ($query) use ($user) {
-                $query->Where('node_group', '=', $user->node_group)
-                    ->orWhere('node_group', '=', 0);
-            }
-        )
-            ->where('type', 1)
-            ->where(
-                static function ($query) {
-                    $query->Where('sort', 0)
-                        ->orWhere('sort', 10);
-                }
-            )
-            ->where('node_class', '<=', $user->class)
-            ->orderBy('name')
-            ->get();
-
-        $ports_raw = Node::where(
-            static function ($query) use ($user) {
-                $query->Where('node_group', '=', $user->node_group)
-                    ->orWhere('node_group', '=', 0);
-            }
-        )
-            ->where('type', 1)
-            ->where('sort', 9)
-            ->where('node_class', '<=', $user->class)
-            ->orderBy('name')
-            ->get();
-
-        $ports = [];
-        foreach ($ports_raw as $port_raw) {
-            $mu_user = User::where('port', $port_raw->server)->first();
-            if ($mu_user->is_multi_user == 1) {
-                $ports[] = $port_raw->server;
-            }
-        }
-
-        $ports[] = $user->port;
-        $ports   = array_unique($ports);
-
-        if ($request->getParam('json') == 1) {
-            $res['ret']           = 1;
-            $res['source_nodes']  = $source_nodes;
-            $res['dist_nodes']    = $dist_nodes;
-            $res['ports']         = $ports;
-            return $response->withJson($res);
-        }
-
-        return $response->write(
-            $this->view()
-                ->assign('source_nodes', $source_nodes)
-                ->assign('dist_nodes', $dist_nodes)
-                ->assign('ports', $ports)
-                ->display('user/relay/add.tpl')
-        );
-    }
-
-    /**
-     * @param Request   $request
-     * @param Response  $response
-     * @param array     $args
-     */
-    public function add($request, $response, $args): ResponseInterface
-    {
-        $user           = $this->user;
-        $dist_node_id   = $request->getParam('dist_node');
-        $source_node_id = $request->getParam('source_node');
-        $port           = $request->getParam('port');
-        $priority       = $request->getParam('priority');
-
-        $source_node = Node::where('id', $source_node_id)
-            ->where(
-                static function ($query) use ($user) {
-                    $query->Where('node_group', '=', $user->node_group)
-                        ->orWhere('node_group', '=', 0);
-                }
-            )
-            ->where('type', 1)
-            ->where(
-                static function ($query) {
-                    $query->Where('sort', 10);
-                }
-            )
-            ->where('node_class', '<=', $user->class)
-            ->first();
-        if ($source_node == null) {
-            return $response->withJson(
-                [
-                    'ret' => 0,
-                    'msg' => '起源节点错误'
-                ]
-            );
-        }
-        if ($source_node->sort == 12) {
-            $rules = Relay::Where('source_node_id', $source_node_id)->get();
-            foreach ($rules as $rule) {
-                if ($rule['user_id'] == 0 || $rule['user_id'] = $user->id) {
-                    return $response->withJson(
-                        [
-                            'ret' => 0,
-                            'msg' => 'V2Ray 中转一个起点一个 Rule'
-                        ]
-                    );
-                }
-            }
-        }
-        $dist_node = Node::where('id', $dist_node_id)
-            ->where(
-                static function ($query) use ($user) {
-                    $query->Where('node_group', '=', $user->node_group)
-                        ->orWhere('node_group', '=', 0);
-                }
-            )
-            ->where('type', 1)
-            ->where(
-                static function ($query) {
-                    $query->Where('sort', 0)
-                        ->orWhere('sort', 10)
-                        ->orWhere('sort', 11);
-                }
-            )
-            ->where('node_class', '<=', $user->class)
-            ->first();
-
-        if ($dist_node_id == -1) {
-            $dist_node          = new Node();
-            $dist_node->id      = -1;
-            $dist_node->node_ip = '0.0.0.0';
-            $dist_node->sort    = 10;
-        }
-
-        if ($dist_node == null) {
-            return $response->withJson(
-                [
-                    'ret' => 0,
-                    'msg' => '目标节点错误'
-                ]
-            );
-        }
-
-        $port_raw = Node::where('server', $port)->where(
-            static function ($query) use ($user) {
-                $query->Where('node_group', '=', $user->node_group)
-                    ->orWhere('node_group', '=', 0);
-            }
-        )
-            ->where('type', 1)
-            ->where('sort', 9)
-            ->where('node_class', '<=', $user->class)
-            ->first();
-        if (($port_raw == null && $port != $user->port)) {
-            return $response->withJson(
-                [
-                    'ret' => 0,
-                    'msg' => '端口错误'
-                ]
-            );
-        }
-
-        if (!Tools::is_protocol_relay($user)) {
-            return $response->withJson(
-                [
-                    'ret' => 0,
-                    'msg' => '为了中转的稳定,您需要在<a href="/user/edit">资料编辑</a>处设置协议为 auth_aes128_md5 或 auth_aes128_sha1 后方可设置中转规则!'
-                ]
-            );
-        }
-
-        $rule                 = new Relay();
-        $rule->user_id        = $user->id;
-        $rule->dist_node_id   = $dist_node_id;
-
-        $dist_node_ip         = Tools::getRelayNodeIp($source_node, $dist_node);
-        $rule->dist_ip        = $dist_node_ip;
-
-        $rule->source_node_id = $source_node_id;
-        $rule->port           = $port;
-        $rule->priority       = min($priority, 99998);
-
-        $ruleset              = Relay::where('user_id', $user->id)->orwhere('user_id', 0)->get();
-        $maybe_rule_id        = Tools::has_conflict_rule($rule, $ruleset, 0, $rule->source_node_id);
-        if ($maybe_rule_id != 0) {
-            $rs['ret'] = 0;
-            $rs['msg'] = '您即将添加的规则与规则 ID:' . $maybe_rule_id . ' 冲突!';
-            if ($maybe_rule_id == -1) {
-                $rs['msg'] = '您即将添加的规则可能会造成冲突!';
-            }
-            return $response->withJson($rs);
-        }
-
-        if (!$rule->save()) {
-            return $response->withJson(
-                [
-                    'ret' => 0,
-                    'msg' => '添加失败'
-                ]
-            );
-        }
-        return $response->withJson(
-            [
-                'ret' => 1,
-                'msg' => '添加成功'
-            ]
-        );
-    }
-
-    /**
-     * @param Request   $request
-     * @param Response  $response
-     * @param array     $args
-     */
-    public function edit($request, $response, $args): ?ResponseInterface
-    {
-        $id   = $args['id'];
-        $user = $this->user;
-        $rule = Relay::where('id', $id)->where('user_id', $user->id)->first();
-
-        if ($rule == null) {
-            return null;
-        }
-
-        $source_nodes = Node::where(
-            static function ($query) use ($user) {
-                $query->Where('node_group', '=', $user->node_group)
-                    ->orWhere('node_group', '=', 0);
-            }
-        )
-            ->where('type', 1)
-            ->where(
-                static function ($query) {
-                    $query->Where('sort', 10);
-                }
-            )
-            ->where('node_class', '<=', $user->class)
-            ->orderBy('name')
-            ->get();
-
-        $dist_nodes = Node::where(
-            static function ($query) use ($user) {
-                $query->Where('node_group', '=', $user->node_group)
-                    ->orWhere('node_group', '=', 0);
-            }
-        )
-            ->where('type', 1)
-            ->where(
-                static function ($query) {
-                    $query->Where('sort', 0)
-                        ->orWhere('sort', 10)
-                        ->orWhere('sort', 11);
-                }
-            )
-            ->where('node_class', '<=', $user->class)
-            ->orderBy('name')
-            ->get();
-
-        $ports_raw = Node::where(
-            static function ($query) use ($user) {
-                $query->Where('node_group', '=', $user->node_group)
-                    ->orWhere('node_group', '=', 0);
-            }
-        )
-            ->where('type', 1)
-            ->where('sort', 9)
-            ->where('node_class', '<=', $user->class)
-            ->orderBy('name')
-            ->get();
-
-        $ports = [];
-        foreach ($ports_raw as $port_raw) {
-            $mu_user = User::where('port', $port_raw->server)->first();
-            if ($mu_user->is_multi_user == 1) {
-                $ports[] = $port_raw->server;
-            }
-        }
-
-        $ports[] = $user->port;
-        $ports   = array_unique($ports);
-
-        if ($request->getParam('json') == 1) {
-            $res['ret']           = 1;
-            $res['source_nodes']  = $source_nodes;
-            $res['dist_nodes']    = $dist_nodes;
-            $res['ports']         = $ports;
-            $res['rule']          = $rule;
-            return $response->withJson($res);
-        }
-
-        return $response->write(
-            $this->view()
-                ->assign('rule', $rule)
-                ->assign('source_nodes', $source_nodes)
-                ->assign('dist_nodes', $dist_nodes)
-                ->assign('ports', $ports)
-                ->display('user/relay/edit.tpl')
-        );
-    }
-
-    /**
-     * @param Request   $request
-     * @param Response  $response
-     * @param array     $args
-     */
-    public function update($request, $response, $args): ?ResponseInterface
-    {
-        $id   = $args['id'];
-        $user = $this->user;
-        $rule = Relay::where('id', $id)->where('user_id', $user->id)->first();
-
-        if ($rule == null) {
-            return null;
-        }
-
-        $dist_node_id   = $request->getParam('dist_node');
-        $source_node_id = $request->getParam('source_node');
-        $port           = $request->getParam('port');
-        $priority       = $request->getParam('priority');
-
-        $source_node = Node::where('id', $source_node_id)
-            ->where(
-                static function ($query) use ($user) {
-                    $query->Where('node_group', '=', $user->node_group)
-                        ->orWhere('node_group', '=', 0);
-                }
-            )
-            ->where('type', 1)->where(
-                static function ($query) {
-                    $query->Where('sort', 10);
-                }
-            )
-            ->where('node_class', '<=', $user->class)
-            ->first();
-        if ($source_node == null) {
-            return $response->withJson(
-                [
-                    'ret' => 0,
-                    'msg' => '起源节点错误'
-                ]
-            );
-        }
-
-        $dist_node = Node::where('id', $dist_node_id)
-            ->where(
-                static function ($query) use ($user) {
-                    $query->Where('node_group', '=', $user->node_group)
-                        ->orWhere('node_group', '=', 0);
-                }
-            )
-            ->where('type', 1)->where(
-                static function ($query) {
-                    $query->Where('sort', 0)
-                        ->orWhere('sort', 10)
-                        ->orWhere('sort', 11);
-                }
-            )
-            ->where('node_class', '<=', $user->class)
-            ->first();
-
-        if ($dist_node_id == -1) {
-            $dist_node          = new Node();
-            $dist_node->id      = -1;
-            $dist_node->node_ip = '0.0.0.0';
-            $dist_node->sort    = 10;
-        }
-
-        if ($dist_node == null) {
-            return $response->withJson(
-                [
-                    'ret' => 0,
-                    'msg' => '目标节点错误'
-                ]
-            );
-        }
-
-        $port_raw = Node::where('server', $port)
-            ->where(
-                static function ($query) use ($user) {
-                    $query->Where('node_group', '=', $user->node_group)
-                        ->orWhere('node_group', '=', 0);
-                }
-            )
-            ->where('type', 1)
-            ->where('sort', 9)
-            ->where('node_class', '<=', $user->class)
-            ->first();
-        $v2ray_port_raw = '';
-        if ($dist_node->sort == 12 || $dist_node->sort == 11) {
-            $node_explode = Tools::ssv2Array($dist_node->server);
-            $v2ray_port_raw = $node_explode['port'];
-        }
-        if (($port_raw == null && $port != $user->port && $v2ray_port_raw == '') || ($v2ray_port_raw != '' && ($port != $user->port && $port != $v2ray_port_raw))) {
-            return $response->withJson(
-                [
-                    'ret' => 0,
-                    'msg' => '端口错误'
-                ]
-            );
-        }
-
-        if (!Tools::is_protocol_relay($user)) {
-            return $response->withJson(
-                [
-                    'ret' => 0,
-                    'msg' => '为了中转的稳定,您需要在<a href="/user/edit">资料编辑</a>处设置协议为 auth_aes128_md5 或 auth_aes128_sha1 后方可设置中转规则!'
-                ]
-            );
-        }
-
-        $rule->user_id        = $user->id;
-        $rule->dist_node_id   = $dist_node_id;
-
-        $dist_node_ip         = Tools::getRelayNodeIp($source_node, $dist_node);
-        $rule->dist_ip        = $dist_node_ip;
-
-        $rule->source_node_id = $source_node_id;
-        $rule->port           = $port;
-        $rule->priority       = min($priority, 99998);
-
-        $ruleset              = Relay::where('user_id', $user->id)->orwhere('user_id', 0)->get();
-        $maybe_rule_id        = Tools::has_conflict_rule($rule, $ruleset, $rule->id, $rule->source_node_id);
-        if ($maybe_rule_id != 0) {
-            $rs['ret'] = 0;
-            $rs['msg'] = '您即将添加的规则与规则 ID:' . $maybe_rule_id . ' 冲突!';
-            if ($maybe_rule_id == -1) {
-                $rs['msg'] = '您即将添加的规则可能会造成冲突!';
-            }
-            return $response->withJson($rs);
-        }
-
-        if (!$rule->save()) {
-            return $response->withJson(
-                [
-                    'ret' => 0,
-                    'msg' => '修改失败'
-                ]
-            );
-        }
-        return $response->withJson(
-            [
-                'ret' => 1,
-                'msg' => '修改成功'
-            ]
-        );
-    }
-
-    /**
-     * @param Request   $request
-     * @param Response  $response
-     * @param array     $args
-     */
-    public function delete($request, $response, $args): ?ResponseInterface
-    {
-        $id   = $request->getParam('id');
-        $user = $this->user;
-        $rule = Relay::where('id', $id)->where('user_id', $user->id)->first();
-
-        if ($rule == null) {
-            return null;
-        }
-        if (!$rule->delete()) {
-            $rs = [
-                'ret' => 0,
-                'msg' => '删除失败'
-            ];
-        } else {
-            $rs = [
-                'ret' => 1,
-                'msg' => '删除成功'
-            ];
-        }
-        return $response->withJson($rs);
-    }
-}

+ 0 - 1
src/Controllers/UserController.php

@@ -16,7 +16,6 @@ use App\Models\{
     Shop,
     User,
     Token,
-    Relay,
     Bought,
     Coupon,
     Ticket,

+ 5 - 22
src/Models/Node.php

@@ -216,26 +216,12 @@ class Node extends Model
      *
      * @param User $user
      * @param int  $mu_port
-     * @param int  $relay_rule_id
      * @param int  $is_ss
      * @param bool $emoji
      */
-    public function getItem(User $user, int $mu_port = 0, int $relay_rule_id = 0, int $is_ss = 0, bool $emoji = false):? array
+    public function getItem(User $user, int $mu_port = 0, int $is_ss = 0, bool $emoji = false):? array
     {
-        $relay_rule = Relay::where('id', $relay_rule_id)
-            ->where(
-                static function ($query) use ($user) {
-                    $query->Where('user_id', '=', $user->id)
-                        ->orWhere('user_id', '=', 0);
-                }
-            )
-            ->orderBy('priority', 'DESC')
-            ->orderBy('id')
-            ->first();
         $node_name = $this->name;
-        if ($relay_rule != null) {
-            $node_name .= ' - ' . $relay_rule->dist_node()->name;
-        }
         if ($mu_port != 0) {
             $mu_user = User::where('port', '=', $mu_port)->where('is_multi_user', '<>', 0)->first();
             if ($mu_user == null) {
@@ -282,7 +268,7 @@ class Node extends Model
         $return_array['remark'] = ($emoji ? Tools::addEmoji($node_name) : $node_name);
         $return_array['class']  = $this->node_class;
         $return_array['group']  = $_ENV['appName'];
-        $return_array['ratio']  = ($relay_rule != null ? $this->traffic_rate + $relay_rule->dist_node()->traffic_rate : $this->traffic_rate);
+        $return_array['ratio']  = $this->traffic_rate;
 
         return $return_array;
     }
@@ -292,11 +278,10 @@ class Node extends Model
      *
      * @param User $user
      * @param int  $mu_port
-     * @param int  $relay_rule_id
      * @param int  $is_ss
      * @param bool $emoji
      */
-    public function getV2RayItem(User $user, int $mu_port = 0, int $relay_rule_id = 0, int $is_ss = 0, bool $emoji = false): array
+    public function getV2RayItem(User $user, int $mu_port = 0, int $is_ss = 0, bool $emoji = false): array
     {
         $item           = Tools::v2Array($this->server);
         $item['type']   = 'vmess';
@@ -311,13 +296,12 @@ class Node extends Model
      *
      * @param User $user 用户
      * @param int  $mu_port
-     * @param int  $relay_rule_id
      * @param int  $is_ss
      * @param bool $emoji
      *
      * @return array|null
      */
-    public function getV2RayPluginItem(User $user, int $mu_port = 0, int $relay_rule_id = 0, int $is_ss = 0, bool $emoji = false)
+    public function getV2RayPluginItem(User $user, int $mu_port = 0, int $is_ss = 0, bool $emoji = false)
     {
         $return_array = Tools::ssv2Array($this->server);
         // 非 AEAD 加密无法使用
@@ -356,11 +340,10 @@ class Node extends Model
      *
      * @param User $user 用户
      * @param int  $mu_port
-     * @param int  $relay_rule_id
      * @param int  $is_ss
      * @param bool $emoji
      */
-    public function getTrojanItem(User $user, int $mu_port = 0, int $relay_rule_id = 0, int $is_ss = 0, bool $emoji = false): array
+    public function getTrojanItem(User $user, int $mu_port = 0, int $is_ss = 0, bool $emoji = false): array
     {
         $server = explode(';', $this->server);
         $opt    = [];

+ 0 - 15
src/Models/User.php

@@ -734,11 +734,6 @@ class User extends Model
         }
         $origin_port    = $this->port;
         $this->port     = $Port;
-        $relay_rules    = Relay::where('user_id', $this->id)->where('port', $origin_port)->get();
-        foreach ($relay_rules as $rule) {
-            $rule->port = $this->port;
-            $rule->save();
-        }
         $this->save();
         return [
             'ok'  => true,
@@ -945,14 +940,4 @@ class User extends Model
                 break;
         }
     }
-
-    /**
-     * 获取转发规则
-     */
-    public function getRelays()
-    {
-        return (!Tools::is_protocol_relay($this)
-            ? []
-            : Relay::where('user_id', $this->id)->orwhere('user_id', 0)->orderBy('id', 'asc')->get());
-    }
 }

+ 1 - 13
src/Services/Config.php

@@ -107,7 +107,7 @@ class Config
             'prefix'        => $_ENV['db_prefix'],
         ];
     }
-    
+
     public static function getMuKey()
     {
         $muKeyList = array_key_exists('muKeyList', $_ENV) ? $_ENV['muKeyList'] : [' '];
@@ -160,18 +160,6 @@ class Config
                     'auth_chain_f'
                 );
                 return $list;
-            case 'relay_able_protocol':
-                $list = array(
-                    'auth_aes128_md5',
-                    'auth_aes128_sha1',
-                    'auth_chain_a',
-                    'auth_chain_b',
-                    'auth_chain_c',
-                    'auth_chain_d',
-                    'auth_chain_e',
-                    'auth_chain_f'
-                );
-                return $list;
             case 'ss_aead_method':
                 $list = array(
                     'aes-128-gcm',

+ 1 - 110
src/Utils/Tools.php

@@ -2,7 +2,7 @@
 
 namespace App\Utils;
 
-use App\Models\{Model, User, Node, Relay};
+use App\Models\{Model, User, Node};
 use App\Services\Config;
 use DateTime;
 
@@ -225,65 +225,6 @@ class Tools
         return !preg_match($pattern, $str);
     }
 
-    public static function is_relay_rule_avaliable($rule, $ruleset, $node_id)
-    {
-        $cur_id = $rule->id;
-
-        foreach ($ruleset as $single_rule) {
-            if (($rule->port == $single_rule->port || $single_rule->port == 0) && ($node_id == $single_rule->source_node_id || $single_rule->source_node_id == 0) && (($rule->id != $single_rule->id && $rule->priority < $single_rule->priority) || ($rule->id < $single_rule->id && $rule->priority == $single_rule->priority))) {
-                $cur_id = $single_rule->id;
-            }
-        }
-
-        return !($cur_id != $rule->id);
-    }
-
-    public static function pick_out_relay_rule($relay_node_id, $port, $ruleset)
-    {
-        /*
-        for id in self.relay_rule_list:
-            if ((self.relay_rule_list[id]['user_id'] == user_id or self.relay_rule_list[id]['user_id'] == 0) or row['is_multi_user'] != 0) and (self.relay_rule_list[id]['port'] == 0 or self.relay_rule_list[id]['port'] == port):
-                has_higher_priority = False
-                for priority_id in self.relay_rule_list:
-                    if ((self.relay_rule_list[priority_id]['priority'] > self.relay_rule_list[id]['priority'] and self.relay_rule_list[id]['id'] != self.relay_rule_list[priority_id]['id']) or (self.relay_rule_list[priority_id]['priority'] == self.relay_rule_list[id]['priority'] and self.relay_rule_list[id]['id'] > self.relay_rule_list[priority_id]['id'])) and (self.relay_rule_list[id]['user_id'] == self.relay_rule_list[priority_id]['user_id'] or self.relay_rule_list[priority_id]['user_id'] == 0) and (self.relay_rule_list[id]['port'] == self.relay_rule_list[priority_id]['port'] or self.relay_rule_list[priority_id]['port'] == 0):
-                        has_higher_priority = True
-                        continue
-
-                if has_higher_priority:
-                    continue
-
-            temp_relay_rules[id] = self.relay_rule_list[id]
-        */
-
-        $match_rule = null;
-
-        foreach ($ruleset as $single_rule) {
-            if (($single_rule->port == $port || $single_rule->port == 0) && ($single_rule->source_node_id == 0 || $single_rule->source_node_id == $relay_node_id)) {
-                $has_higher_priority = false;
-                foreach ($ruleset as $priority_rule) {
-                    if (($priority_rule->port == $port || $priority_rule->port == 0) && ($priority_rule->source_node_id == 0 || $priority_rule->source_node_id == $relay_node_id)) {
-                        if (($priority_rule->priority > $single_rule->priority && $priority_rule->id != $single_rule->id) || ($priority_rule->priority == $single_rule->priority && $priority_rule->id < $single_rule->id)) {
-                            $has_higher_priority = true;
-                            continue;
-                        }
-                    }
-                }
-
-                if ($has_higher_priority) {
-                    continue;
-                }
-
-                $match_rule = $single_rule;
-            }
-        }
-
-        if (($match_rule != null) && $match_rule->dist_node_id == -1) {
-            return null;
-        }
-
-        return $match_rule;
-    }
-
     public static function get_middle_text($origin_text, $begin_text, $end_text)
     {
         $begin_pos = strpos($origin_text, $begin_text);
@@ -308,15 +249,6 @@ class Tools
         return false;
     }
 
-    public static function is_protocol_relay($user)
-    {
-        return true;
-
-        $relay_able_list = Config::getSupportParam('relay_able_protocol');
-
-        return in_array($user->protocol, $relay_able_list) || $_ENV['relay_insecure_mode'] == true;
-    }
-
     public static function has_conflict_rule(
         $input_rule,
         $ruleset,
@@ -442,47 +374,6 @@ class Tools
         return $object;
     }
 
-    public static function relayRulePortCheck($rules)
-    {
-        $res = [];
-        foreach ($rules as $value) {
-            $res[$value->port][] = $value->port;
-        }
-        return count($res) == count($rules);
-    }
-
-    public static function getRelayNodeIp($source_node, $dist_node)
-    {
-        $dist_ip_str = $dist_node->node_ip;
-        $dist_ip_array = explode(',', $dist_ip_str);
-        $return_ip = null;
-        foreach ($dist_ip_array as $single_dist_ip_str) {
-            $child1_array = explode('#', $single_dist_ip_str);
-            if ($child1_array[0] == $single_dist_ip_str) {
-                $return_ip = $child1_array[0];
-            } elseif (isset($child1_array[1])) {
-                $node_id_array = explode('|', $child1_array[1]);
-                if (in_array($source_node->id, $node_id_array)) {
-                    $return_ip = $child1_array[0];
-                }
-            }
-        }
-
-        return $return_ip;
-    }
-
-    public static function updateRelayRuleIp($dist_node)
-    {
-        $rules = Relay::where('dist_node_id', $dist_node->id)->get();
-
-        foreach ($rules as $rule) {
-            $source_node = Node::where('id', $rule->source_node_id)->first();
-
-            $rule->dist_ip = self::getRelayNodeIp($source_node, $dist_node);
-            $rule->save();
-        }
-    }
-
     public static function checkNoneProtocol($user)
     {
         return !($user->method == 'none' && !in_array($user->protocol, Config::getSupportParam('allow_none_protocol')));

+ 3 - 48
src/Utils/URL.php

@@ -4,8 +4,7 @@ namespace App\Utils;
 
 use App\Models\{
     User,
-    Node,
-    Relay
+    Node
 };
 use App\Services\Config;
 use App\Controllers\{
@@ -242,9 +241,6 @@ class URL
             $mu_nodes = $mu_node_query->get();
         }
 
-        // 获取适用于用户的中转规则
-        $relay_rules = $user->getRelays();
-
         $return_array = [];
         foreach ($nodes as $node) {
             if (isset($Rule['content']['regex']) && $Rule['content']['regex'] != '') {
@@ -288,18 +284,7 @@ class URL
                 // 节点非只启用单端口 && 只获取普通端口
                 if ($node->mu_only != 1 && ($is_mu == 0 || ($is_mu != 0 && $_ENV['mergeSub'] === true))) {
                     foreach ($is_ss as $ss) {
-                        if ($node->sort == 10) {
-                            // SS 中转
-                            $relay_rule_id = 0;
-                            $relay_rule = Tools::pick_out_relay_rule($node->id, $user->port, $relay_rules);
-                            if ($relay_rule != null && $relay_rule->dist_node() != null) {
-                                $relay_rule_id = $relay_rule->id;
-                            }
-                            $item = $node->getItem($user, 0, $relay_rule_id, $ss, $emoji);
-                        } else {
-                            // SS 非中转
-                            $item = $node->getItem($user, 0, 0, $ss, $emoji);
-                        }
+                        $item = $node->getItem($user, 0, 0, $ss, $emoji);
                         if ($item != null) {
                             $return_array[] = $item;
                         }
@@ -311,18 +296,7 @@ class URL
                 if ($node->mu_only != -1 && $is_mu != 0) {
                     foreach ($is_ss as $ss) {
                         foreach ($mu_nodes as $mu_node) {
-                            if ($node->sort == 10) {
-                                // SS 中转
-                                $relay_rule_id = 0;
-                                $relay_rule = Tools::pick_out_relay_rule($node->id, $mu_node->server, $relay_rules);
-                                if ($relay_rule != null && $relay_rule->dist_node() != null) {
-                                    $relay_rule_id = $relay_rule->id;
-                                }
-                                $item = $node->getItem($user, $mu_node->server, $relay_rule_id, $ss, $emoji);
-                            } else {
-                                // SS 非中转
-                                $item = $node->getItem($user, $mu_node->server, 0, $ss, $emoji);
-                            }
+                            $item = $node->getItem($user, $mu_node->server, 0, $ss, $emoji);
                             if ($item != null) {
                                 $return_array[] = $item;
                             }
@@ -457,25 +431,6 @@ class URL
         $tmp_nodes = array();
         foreach ($nodes as $node) {
             $tmp_nodes[] = $node;
-            if ($node->sort == 12) {
-                $relay_rule = Relay::where('source_node_id', $node->id)->where(
-                    static function ($query) {
-                        $query->Where('user_id', '=', 0);
-                    }
-                )->orderBy('priority', 'DESC')->orderBy('id')->first();
-                if ($relay_rule != null) {
-                    //是中转起源节点
-                    $tmp_node = $relay_rule->dist_node();
-                    $server = explode(';', $tmp_node->server);
-                    $source_server = Tools::v2Array($node->server);
-                    if (count($server) < 6) {
-                        $tmp_node->server .= str_repeat(';', 6 - count($server));
-                    }
-                    $tmp_node->server .= 'relayserver=' . $source_server['add'] . '|' . 'outside_port=' . $source_server['port'];
-                    $tmp_node->name = $node->name . '=>' . $tmp_node->name;
-                    $tmp_nodes[] = $tmp_node;
-                }
-            }
         }
         $nodes = $tmp_nodes;
         if (!$arrout) {