11 Commits

Author SHA1 Message Date
ssongliu
5222388ba1 fix: 解决中文插件下 ufw 防火墙获取端口列表失败的问题 (#746) 2023-04-21 08:45:22 +00:00
ssongliu
549ccbe6a0 fix: 解决 ufw 防火墙版本加载失败问题 (#742) 2023-04-21 04:28:11 +00:00
邓小明
7fd6afb17f 为了安全,使面板首页禁止搜索引擎收录 (#721) 2023-04-21 10:28:59 +08:00
zhengkunwang223
2ff4da5e46 feat: 静态网站默认页增加禁止搜索引擎收录 (#741) 2023-04-21 02:26:11 +00:00
ssongliu
0f6e98be20 fix: 验证码错误后清空验证码输入框 (#740) 2023-04-21 02:08:10 +00:00
ssongliu
4399ffa9a4 fix: 延长备份下载超时时间 (#739) 2023-04-20 15:16:18 +00:00
ssongliu
44a1d9d16c fix: 防火墙端口添加支持输入网段 (#738) 2023-04-20 15:10:17 +00:00
ssongliu
565fd1c605 fix: ufw 增加中文适配 2023-04-20 22:34:50 +08:00
ssongliu
09ac40846f fix: ufw 防火墙增加 sudo 判断 (#733) 2023-04-20 10:44:17 +00:00
zhengkunwang223
a0b820649e fix: 解决网站设置用户/组报错的问题 (#710) 2023-04-19 03:17:00 +00:00
zhengkunwang223
6cee4bfe7c feat: 修改伪静态配置存储目录 (#703) 2023-04-18 15:27:00 +00:00
9 changed files with 78 additions and 28 deletions

View File

@@ -368,7 +368,11 @@ func (u *FirewallService) pingStatus() string {
if _, err := os.Stat("/etc/sysctl.conf"); err != nil {
return constant.StatusNone
}
stdout, _ := cmd.Exec("sudo cat /etc/sysctl.conf | grep net/ipv4/icmp_echo_ignore_all= ")
commond := "cat /etc/sysctl.conf | grep net/ipv4/icmp_echo_ignore_all= "
if cmd.HasNoPasswordSudo() {
commond = "sudo cat /etc/sysctl.conf | grep net/ipv4/icmp_echo_ignore_all= "
}
stdout, _ := cmd.Exec(commond)
if stdout == "net/ipv4/icmp_echo_ignore_all=1\n" {
return constant.StatusEnable
}
@@ -404,7 +408,11 @@ func (u *FirewallService) updatePingStatus(enabel string) error {
return err
}
stdout, err := cmd.Exec("sudo sysctl -p")
commond := "sysctl -p"
if cmd.HasNoPasswordSudo() {
commond = "sudo sysctl -p"
}
stdout, err := cmd.Exec(commond)
if err != nil {
return fmt.Errorf("update ping status failed, err: %v", stdout)
}

View File

@@ -1092,7 +1092,13 @@ func (w WebsiteService) UpdateSitePermission(req request.WebsiteUpdateDirPermiss
absoluteIndexPath = path.Join(absoluteIndexPath, website.SiteDir)
}
chownCmd := fmt.Sprintf("chown -R %s:%s %s", req.User, req.Group, absoluteIndexPath)
if _, err := cmd.ExecWithTimeOut(chownCmd, 1*time.Second); err != nil {
if cmd.HasNoPasswordSudo() {
chownCmd = fmt.Sprintf("sudo %s", chownCmd)
}
if out, err := cmd.ExecWithTimeOut(chownCmd, 1*time.Second); err != nil {
if out != "" {
return errors.New(out)
}
return err
}
website.User = req.User

View File

@@ -4,10 +4,11 @@ import (
"bytes"
"context"
"fmt"
"github.com/1Panel-dev/1Panel/backend/buserr"
"github.com/1Panel-dev/1Panel/backend/constant"
"os/exec"
"time"
"github.com/1Panel-dev/1Panel/backend/buserr"
"github.com/1Panel-dev/1Panel/backend/constant"
)
func Exec(cmdStr string) (string, error) {
@@ -88,3 +89,14 @@ func Execf(cmdStr string, a ...interface{}) (string, error) {
}
return stdout.String(), nil
}
func HasNoPasswordSudo() bool {
cmd := exec.Command("sudo", "-v")
err := cmd.Run()
if err != nil {
return false
}
cmd2 := exec.Command("sudo", "-n", "ls")
err2 := cmd2.Run()
return err2 == nil
}

View File

@@ -7,10 +7,18 @@ import (
"github.com/1Panel-dev/1Panel/backend/utils/cmd"
)
type Ufw struct{}
type Ufw struct {
CmdStr string
}
func NewUfw() (*Ufw, error) {
return &Ufw{}, nil
var ufw Ufw
if cmd.HasNoPasswordSudo() {
ufw.CmdStr = "sudo ufw"
} else {
ufw.CmdStr = "ufw"
}
return &ufw, nil
}
func (f *Ufw) Name() string {
@@ -18,18 +26,19 @@ func (f *Ufw) Name() string {
}
func (f *Ufw) Status() (string, error) {
stdout, err := cmd.Exec("sudo ufw status | grep Status")
if err != nil {
return "", fmt.Errorf("load the firewall status failed, err: %s", stdout)
}
stdout, _ := cmd.Execf("%s status | grep Status", f.CmdStr)
if stdout == "Status: active\n" {
return "running", nil
}
stdout1, _ := cmd.Execf("%s status | grep 状态", f.CmdStr)
if stdout1 == "状态: 激活\n" {
return "running", nil
}
return "not running", nil
}
func (f *Ufw) Version() (string, error) {
stdout, err := cmd.Exec("sudo ufw version | grep ufw")
stdout, err := cmd.Execf("%s version | grep ufw", f.CmdStr)
if err != nil {
return "", fmt.Errorf("load the firewall status failed, err: %s", stdout)
}
@@ -38,7 +47,7 @@ func (f *Ufw) Version() (string, error) {
}
func (f *Ufw) Start() error {
stdout, err := cmd.Exec("echo y | sudo ufw enable")
stdout, err := cmd.Execf("echo y | %s enable", f.CmdStr)
if err != nil {
return fmt.Errorf("enable the firewall failed, err: %s", stdout)
}
@@ -46,7 +55,7 @@ func (f *Ufw) Start() error {
}
func (f *Ufw) Stop() error {
stdout, err := cmd.Exec("sudo ufw disable")
stdout, err := cmd.Execf("%s disable", f.CmdStr)
if err != nil {
return fmt.Errorf("stop the firewall failed, err: %s", stdout)
}
@@ -58,7 +67,7 @@ func (f *Ufw) Reload() error {
}
func (f *Ufw) ListPort() ([]FireInfo, error) {
stdout, err := cmd.Exec("sudo ufw status verbose")
stdout, err := cmd.Execf("%s status verbose", f.CmdStr)
if err != nil {
return nil, err
}
@@ -66,7 +75,7 @@ func (f *Ufw) ListPort() ([]FireInfo, error) {
var datas []FireInfo
isStart := false
for _, line := range portInfos {
if strings.HasPrefix(line, "--") {
if strings.HasPrefix(line, "-") {
isStart = true
continue
}
@@ -83,7 +92,7 @@ func (f *Ufw) ListPort() ([]FireInfo, error) {
}
func (f *Ufw) ListAddress() ([]FireInfo, error) {
stdout, err := cmd.Exec("sudo ufw status verbose")
stdout, err := cmd.Execf("%s status verbose", f.CmdStr)
if err != nil {
return nil, err
}
@@ -91,7 +100,7 @@ func (f *Ufw) ListAddress() ([]FireInfo, error) {
var datas []FireInfo
isStart := false
for _, line := range portInfos {
if strings.HasPrefix(line, "--") {
if strings.HasPrefix(line, "-") {
isStart = true
continue
}
@@ -123,9 +132,9 @@ func (f *Ufw) Port(port FireInfo, operation string) error {
return fmt.Errorf("unsupport strategy %s", port.Strategy)
}
command := fmt.Sprintf("sudo ufw %s %s", port.Strategy, port.Port)
command := fmt.Sprintf("%s %s %s", f.CmdStr, port.Strategy, port.Port)
if operation == "remove" {
command = fmt.Sprintf("sudo ufw delete %s %s", port.Strategy, port.Port)
command = fmt.Sprintf("%s delete %s %s", f.CmdStr, port.Strategy, port.Port)
}
if len(port.Protocol) != 0 {
command += fmt.Sprintf("/%s", port.Protocol)
@@ -147,9 +156,9 @@ func (f *Ufw) RichRules(rule FireInfo, operation string) error {
return fmt.Errorf("unsupport strategy %s", rule.Strategy)
}
ruleStr := fmt.Sprintf("sudo ufw %s ", rule.Strategy)
ruleStr := fmt.Sprintf("%s %s ", f.CmdStr, rule.Strategy)
if operation == "remove" {
ruleStr = fmt.Sprintf("sudo ufw delete %s ", rule.Strategy)
ruleStr = fmt.Sprintf("%s delete %s ", f.CmdStr, rule.Strategy)
}
if len(rule.Protocol) != 0 {
ruleStr += fmt.Sprintf("proto %s ", rule.Protocol)

View File

@@ -2,6 +2,7 @@
<html>
<head>
<meta charset="utf-8">
<meta name="robots" content="noindex,nofollow" />
<title>恭喜,站点创建成功!</title>
<style>
.container {

View File

@@ -3,6 +3,7 @@
<head>
<meta charset="UTF-8" />
<link rel="icon" href="/fav/favicon.png" />
<meta name="robots" content="noindex,nofollow" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>loading...</title>
</head>

View File

@@ -54,16 +54,16 @@ export const loadBaseDir = () => {
// backup
export const handleBackup = (params: Backup.Backup) => {
return http.post(`/settings/backup/backup`, params, 400000);
return http.post(`/settings/backup/backup`, params, 600000);
};
export const handleRecover = (params: Backup.Recover) => {
return http.post(`/settings/backup/recover`, params, 400000);
return http.post(`/settings/backup/recover`, params, 600000);
};
export const handleRecoverByUpload = (params: Backup.Recover) => {
return http.post(`/settings/backup/recover/byupload`, params, 400000);
return http.post(`/settings/backup/recover/byupload`, params, 600000);
};
export const downloadBackupRecord = (params: Backup.RecordDownload) => {
return http.post<string>(`/settings/backup/record/download`, params);
return http.post<string>(`/settings/backup/record/download`, params, 600000);
};
export const deleteBackupRecord = (params: { ids: number[] }) => {
return http.post(`/settings/backup/record/del`, params);

View File

@@ -70,7 +70,7 @@ import DrawerHeader from '@/components/drawer-header/index.vue';
import { MsgError, MsgSuccess } from '@/utils/message';
import { Host } from '@/api/interface/host';
import { operatePortRule, updatePortRule } from '@/api/modules/host';
import { checkPort, deepCopy } from '@/utils/util';
import { checkIp, checkPort, deepCopy } from '@/utils/util';
const loading = ref();
const oldRule = ref<Host.RulePort>();
@@ -107,7 +107,7 @@ const handleClose = () => {
const rules = reactive({
protocol: [Rules.requiredSelect],
port: [Rules.requiredInput],
address: [Rules.ip],
address: [Rules.requiredInput],
});
type FormInstance = InstanceType<typeof ElForm>;
@@ -121,6 +121,18 @@ const onSubmit = async (formEl: FormInstance | undefined) => {
if (!dialogData.value.rowData) return;
if (dialogData.value.rowData.source === 'anyWhere') {
dialogData.value.rowData.address = '';
} else {
if (dialogData.value.rowData.address.indexOf('/') !== -1) {
if (checkIp(dialogData.value.rowData.address.split('/')[0])) {
MsgError(i18n.global.t('firewall.addressFormatError'));
return;
}
} else {
if (checkIp(dialogData.value.rowData.address)) {
MsgError(i18n.global.t('firewall.addressFormatError'));
return;
}
}
}
let ports = [];
if (dialogData.value.rowData.port.indexOf('-') !== -1 && !dialogData.value.rowData.port.startsWith('-')) {

View File

@@ -303,6 +303,7 @@ const login = (formEl: FormInstance | undefined) => {
const res = await loginApi(requestLoginForm);
if (res.code === 406) {
if (res.message === 'ErrCaptchaCode') {
loginForm.captcha = '';
errCaptcha.value = true;
errAuthInfo.value = false;
}