mirror of
https://github.com/sairson/Yasso.git
synced 2026-02-04 19:13:26 +08:00
106 lines
2.3 KiB
Go
106 lines
2.3 KiB
Go
package plugin
|
|
|
|
import (
|
|
"Yasso/config"
|
|
"Yasso/core/logger"
|
|
"fmt"
|
|
"net"
|
|
"strings"
|
|
"time"
|
|
)
|
|
|
|
func RedisAuthConn(info config.ServiceConn, user, pass string) (net.Conn, bool, error) {
|
|
var flag = false
|
|
conn, err := net.DialTimeout("tcp", fmt.Sprintf("%s:%v", info.Hostname, info.Port), info.Timeout)
|
|
if err != nil {
|
|
return conn, false, err
|
|
}
|
|
err = conn.SetReadDeadline(time.Now().Add(time.Duration(info.Timeout)))
|
|
if err != nil {
|
|
return conn, false, err
|
|
}
|
|
// 认证
|
|
_, err = conn.Write([]byte(fmt.Sprintf("auth %s\r\n", pass)))
|
|
if err != nil {
|
|
return conn, false, err
|
|
}
|
|
reply, err := RedisReply(conn)
|
|
if err != nil {
|
|
return conn, false, err
|
|
}
|
|
if strings.Contains(reply, "+OK") {
|
|
flag = true
|
|
dbfilename := redisInfo(conn, reply)
|
|
logger.Info(fmt.Sprintf("Redis %s:%v Login Success dbfilename:[%v]", info.Hostname, info.Port, dbfilename))
|
|
}
|
|
return conn, flag, nil
|
|
}
|
|
|
|
func RedisUnAuthConn(info config.ServiceConn, user, pass string) (net.Conn, bool, error) {
|
|
_, _ = user, pass
|
|
var flag = false
|
|
conn, err := net.DialTimeout("tcp", fmt.Sprintf("%s:%v", info.Hostname, info.Port), info.Timeout)
|
|
if err != nil {
|
|
return conn, false, err
|
|
}
|
|
err = conn.SetReadDeadline(time.Now().Add(time.Duration(info.Timeout)))
|
|
if err != nil {
|
|
return conn, false, err
|
|
}
|
|
_, err = conn.Write([]byte("info\r\n"))
|
|
if err != nil {
|
|
return conn, false, err
|
|
}
|
|
reply, err := RedisReply(conn)
|
|
if err != nil {
|
|
return conn, false, err
|
|
}
|
|
if strings.Contains(reply, "redis_version") {
|
|
flag = true
|
|
dbfilename := redisInfo(conn, reply)
|
|
logger.Success(fmt.Sprintf("Redis %s:%v unauthorized dbfilename:[%v] ", info.Hostname, info.Port, dbfilename))
|
|
}
|
|
return conn, flag, nil
|
|
}
|
|
|
|
func RedisReply(conn net.Conn) (string, error) {
|
|
var (
|
|
r string
|
|
err error
|
|
)
|
|
buf := make([]byte, 5*1024)
|
|
for {
|
|
count, err := conn.Read(buf)
|
|
if err != nil {
|
|
break
|
|
}
|
|
r += string(buf[0:count])
|
|
if count < 5*1024 {
|
|
break
|
|
}
|
|
}
|
|
return r, err
|
|
}
|
|
|
|
func redisInfo(conn net.Conn, reply string) string {
|
|
var (
|
|
dbfilename string
|
|
)
|
|
// 读取filename
|
|
_, err := conn.Write([]byte(fmt.Sprintf("CONFIG GET dbfilename\r\n")))
|
|
if err != nil {
|
|
return ""
|
|
}
|
|
text, err := RedisReply(conn)
|
|
if err != nil {
|
|
return ""
|
|
}
|
|
text1 := strings.Split(text, "\r\n")
|
|
if len(text1) > 2 {
|
|
dbfilename = text1[len(text1)-2]
|
|
} else {
|
|
dbfilename = text1[0]
|
|
}
|
|
return dbfilename
|
|
}
|