* 修改首页卡片间距

* 修改普通用户分享资产时只能查看到普通用户 close #133

* 修复普通用户访问非自己创建的资产无法打开原生ssh的bug

* release v0.4.1

* 修复使用命令修改加密key失败的问题

* 修改初始化RDP属性「禁用字形缓存」为打开

* 增加kubernetes协议的筛选

* 修改安装文档&修复首页链接限制无效的问题

* 修改guacd版本为1.3.0

* 支持导入资产时带标签的数据

* - 修改原生安装文档中guacamole版本为1.3.0
- 修改点击名称为编辑

* release 0.5.0
This commit is contained in:
dushixiang 2021-06-01 23:14:55 +08:00 committed by GitHub
parent 969abe2202
commit b0891a7c38
16 changed files with 106 additions and 31 deletions

View File

@ -12,7 +12,8 @@ RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g' /etc/apk/repositorie
RUN apk add gcc g++
RUN go env && CGO_ENABLED=1 GOOS=linux GOARCH=amd64 go build -a -ldflags '-linkmode external -extldflags "-static"' -o next-terminal main.go
FROM guacamole/guacd:1.2.0
FROM guacamole/guacd:1.3.0
USER root
LABEL MAINTAINER="helloworld1024@foxmail.com"

View File

@ -52,6 +52,13 @@ docker rm <container-id> -f
</details>
<details>
<summary>ssh协议中文字体乱码怎么办</summary>
参考[安装字体](install-naive.md)章节,给系统安装中文字体。
</details>
<details>
<summary>ssh协议类型的资产连接模式有什么区别</summary>

View File

@ -22,9 +22,9 @@ sudo apt-get install libcairo2-dev libjpeg62-turbo-dev libpng-dev libtool-bin li
下载&解压&configure
```shell
wget https://mirror.bit.edu.cn/apache/guacamole/1.2.0/source/guacamole-server-1.2.0.tar.gz
tar -xzf guacamole-server-1.2.0.tar.gz
cd guacamole-server-1.2.0
wget https://archive.apache.org/dist/guacamole/1.3.0/source/guacamole-server-1.3.0.tar.gz
tar -xzf guacamole-server-1.3.0.tar.gz
cd guacamole-server-1.3.0
./configure --with-init-dir=/etc/init.d
```
@ -32,7 +32,7 @@ cd guacamole-server-1.2.0
```shell
------------------------------------------------
guacamole-server version 1.2.0
guacamole-server version 1.3.0
------------------------------------------------
Library status:
@ -49,13 +49,13 @@ guacamole-server version 1.2.0
libVNCServer ........ yes
libvorbis ........... yes
libpulse ............ yes
libwebsockets ....... no
libwebsockets ....... yes
libwebp ............. yes
wsock32 ............. no
Protocol support:
Kubernetes .... no
Kubernetes .... yes
RDP ........... yes
SSH ........... yes
Telnet ........ yes
@ -72,7 +72,6 @@ guacamole-server version 1.2.0
Systemd units: no
Type "make" to compile guacamole-server.
```
编译和安装

View File

@ -13,7 +13,7 @@ import (
"github.com/labstack/gommon/log"
)
const Version = "v0.4.1"
const Version = "v0.5.0"
func main() {
err := Run()

View File

@ -227,7 +227,7 @@ func (r PropertyService) InitProperties() error {
if len(propertyMap[guacd.DisableGlyphCaching]) == 0 {
property := model.Property{
Name: guacd.DisableGlyphCaching,
Value: "false",
Value: "true",
}
if err := r.propertyRepository.Create(&property); err != nil {
return err

View File

@ -99,6 +99,11 @@ func AssetImportEndpoint(c echo.Context) error {
Owner: account.ID,
}
if len(record) >= 10 {
tags := strings.ReplaceAll(record[9], "|", ",")
asset.Tags = tags
}
err := assetRepository.Create(&asset)
if err != nil {
errorCount++

View File

@ -1,6 +1,6 @@
{
"name": "next-terminal",
"version": "0.4.1",
"version": "0.5.0",
"private": true,
"dependencies": {
"@ant-design/icons": "^4.3.0",

View File

@ -470,11 +470,22 @@ class Asset extends Component {
if (short && short.length > 20) {
short = short.substring(0, 20) + " ...";
}
return (
<Tooltip placement="topLeft" title={name}>
{short}
</Tooltip>
);
if (hasPermission(record['owner'])) {
return (
<Button type="link" size='small' onClick={() => this.update(record.id)}>
<Tooltip placement="topLeft" title={name}>
{short}
</Tooltip>
</Button>
);
} else {
return (
<Tooltip placement="topLeft" title={name}>
{short}
</Tooltip>
);
}
},
sorter: true,
}, {
@ -688,6 +699,7 @@ class Asset extends Component {
<Select.Option value="ssh">ssh</Select.Option>
<Select.Option value="vnc">vnc</Select.Option>
<Select.Option value="telnet">telnet</Select.Option>
<Select.Option value="kubernetes">kubernetes</Select.Option>
</Select>
<Tooltip title='重置查询'>
@ -876,7 +888,7 @@ class Asset extends Component {
<Button type="primary" onClick={() => {
let csvString = 'name,ssh,127.0.0.1,22,username,password,privateKey,passphrase,description';
let csvString = 'name,ssh,127.0.0.1,22,username,password,privateKey,passphrase,description,tag1|tag2|tag3';
//前置的"\uFEFF"为“零宽不换行空格”,可处理中文乱码问题
const blob = new Blob(["\uFEFF" + csvString], {type: 'text/csv;charset=gb2312;'});
let a = document.createElement('a');

View File

@ -370,11 +370,21 @@ class DynamicCommand extends Component {
if (short && short.length > 20) {
short = short.substring(0, 20) + " ...";
}
return (
<Tooltip placement="topLeft" title={name}>
{short}
</Tooltip>
);
if (hasPermission(record['owner'])) {
return (
<Button type="link" size='small' onClick={() => this.showModal('更新指令', record)}>
<Tooltip placement="topLeft" title={name}>
{short}
</Tooltip>
</Button>
);
} else {
return (
<Tooltip placement="topLeft" title={name}>
{short}
</Tooltip>
);
}
},
sorter: true,
}, {

View File

@ -335,16 +335,27 @@ class Credential extends Component {
title: '凭证名称',
dataIndex: 'name',
key: 'name',
render: (name, record) => {
render: (name, record, index) => {
let short = name;
if (short && short.length > 20) {
short = short.substring(0, 20) + " ...";
}
return (
<Tooltip placement="topLeft" title={name}>
{short}
</Tooltip>
);
if (hasPermission(record['owner'])) {
return (
<Button type="link" size='small' loading={this.state.items[index].updateBtnLoading}
onClick={() => this.showModal('更新凭证', record.id, index)}>
<Tooltip placement="topLeft" title={name}>
{short}
</Tooltip>
</Button>
);
} else {
return (
<Tooltip placement="topLeft" title={name}>
{short}
</Tooltip>
);
}
},
sorter: true,
}, {

View File

@ -1,4 +1,7 @@
.text-center{
width: 100px;
text-align: center;
}
.disable-link {
pointer-events: none;
}

View File

@ -5,7 +5,6 @@ import request from "../../common/request";
import './Dashboard.css'
import {Link} from "react-router-dom";
import {Area} from '@ant-design/charts';
import {isAdmin} from "../../service/permission";
class Dashboard extends Component {
@ -50,6 +49,12 @@ class Dashboard extends Component {
}, () => this.getD())
}
handleLinkClick = (e) => {
if (!isAdmin()) {
e.preventDefault();
}
}
render() {
const config = {
@ -71,7 +76,7 @@ class Dashboard extends Component {
<Row gutter={16}>
<Col span={6}>
<Card bordered={true}>
<Link to={'/user'} disabled={!isAdmin()}>
<Link to={'/user'} onClick={this.handleLinkClick}>
<Statistic title="在线用户" value={this.state.counter['user']}
prefix={<UserOutlined/>}/>
</Link>
@ -96,7 +101,7 @@ class Dashboard extends Component {
</Col>
<Col span={6}>
<Card bordered={true}>
<Link to={'/online-session'} disabled={!isAdmin()}>
<Link to={'/online-session'} onClick={this.handleLinkClick}>
<Statistic title="在线会话" value={this.state.counter['onlineSession']}
prefix={<LinkOutlined/>}/>
</Link>

View File

@ -403,6 +403,7 @@ class OfflineSession extends Component {
<Select.Option value="ssh">ssh</Select.Option>
<Select.Option value="vnc">vnc</Select.Option>
<Select.Option value="telnet">telnet</Select.Option>
<Select.Option value="kubernetes">kubernetes</Select.Option>
</Select>
<Tooltip title='重置查询'>

View File

@ -374,6 +374,7 @@ class OnlineSession extends Component {
<Select.Option value="ssh">ssh</Select.Option>
<Select.Option value="vnc">vnc</Select.Option>
<Select.Option value="telnet">telnet</Select.Option>
<Select.Option value="kubernetes">kubernetes</Select.Option>
</Select>
<Tooltip title='重置查询'>

View File

@ -304,6 +304,19 @@ class User extends Component {
dataIndex: 'username',
key: 'username',
sorter: true,
render: (username, record, index) => {
return (
<Button type="link" size='small'
onClick={async () => {
let result = await request.get(`/users/${record['id']}`);
if (result['code'] !== 1) {
message.error(result['message']);
return;
}
this.showModal('更新用户', result['data']);
}}>{username}</Button>
);
}
}, {
title: '用户昵称',
dataIndex: 'nickname',

View File

@ -269,6 +269,13 @@ class UserGroup extends Component {
title: '名称',
dataIndex: 'name',
sorter: true,
render: (name, record, index) => {
return (
<Button type="link" size='small'
loading={this.state.items[index].updateBtnLoading}
onClick={() => this.showModal('更新用户组', record['id'], index)}>{name}</Button>
);
}
}, {
title: '授权资产',
dataIndex: 'assetCount',