fix: auto accept block ask process
This commit is contained in:
@@ -45,6 +45,70 @@ func NewService(config *config.Config, app *application.App, port int) *Service
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *Service) GetLocalIPs() ([]string, bool) {
|
||||||
|
interfaces, err := net.Interfaces()
|
||||||
|
if err != nil {
|
||||||
|
slog.Error("Failed to get network interfaces", "error", err, "component", "discovery")
|
||||||
|
return nil, false
|
||||||
|
}
|
||||||
|
var ips []string
|
||||||
|
for _, iface := range interfaces {
|
||||||
|
// 过滤掉 Down 的接口和 Loopback 接口
|
||||||
|
if iface.Flags&net.FlagUp == 0 || iface.Flags&net.FlagLoopback != 0 {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
// 获取该接口的地址
|
||||||
|
addrs, err := iface.Addrs()
|
||||||
|
if err != nil {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
for _, addr := range addrs {
|
||||||
|
ip, _, err := net.ParseCIDR(addr.String())
|
||||||
|
if err != nil {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if ip.To4() == nil {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
ips = append(ips, ip.String())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ips, true
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *Service) GetLocalIPInSameSubnet(receiverIP string) (string, bool) {
|
||||||
|
interfaces, err := net.Interfaces()
|
||||||
|
if err != nil {
|
||||||
|
slog.Error("Failed to get network interfaces", "error", err, "component", "discovery")
|
||||||
|
return "", false
|
||||||
|
}
|
||||||
|
for _, iface := range interfaces {
|
||||||
|
// 过滤掉 Down 的接口和 Loopback 接口
|
||||||
|
if iface.Flags&net.FlagUp == 0 || iface.Flags&net.FlagLoopback != 0 {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
// 获取该接口的地址
|
||||||
|
addrs, err := iface.Addrs()
|
||||||
|
if err != nil {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
for _, addr := range addrs {
|
||||||
|
ip, ipNet, err := net.ParseCIDR(addr.String())
|
||||||
|
if err != nil {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if ip.To4() == nil {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if ipNet.Contains(net.ParseIP(receiverIP)) {
|
||||||
|
return ip.String(), true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
slog.Error("Failed to get local IP in same subnet", "receiverIP", receiverIP, "component", "discovery")
|
||||||
|
return "", false
|
||||||
|
}
|
||||||
|
|
||||||
func (s *Service) startBroadcasting() {
|
func (s *Service) startBroadcasting() {
|
||||||
ticker := time.NewTicker(HeartbeatRate)
|
ticker := time.NewTicker(HeartbeatRate)
|
||||||
for range ticker.C {
|
for range ticker.C {
|
||||||
|
|||||||
@@ -44,10 +44,11 @@ func (s *Service) SendFile(target *discovery.Peer, targetIP string, filePath str
|
|||||||
|
|
||||||
task := NewTransfer(
|
task := NewTransfer(
|
||||||
taskID,
|
taskID,
|
||||||
Sender{
|
NewSender(
|
||||||
ID: s.discoveryService.GetID(),
|
s.discoveryService.GetID(),
|
||||||
Name: s.config.GetHostName(),
|
s.config.GetHostName(),
|
||||||
},
|
WithReceiverIP(targetIP, s.discoveryService),
|
||||||
|
),
|
||||||
WithFileName(filepath.Base(filePath)),
|
WithFileName(filepath.Base(filePath)),
|
||||||
WithFileSize(stat.Size()),
|
WithFileSize(stat.Size()),
|
||||||
WithType(TransferTypeSend),
|
WithType(TransferTypeSend),
|
||||||
@@ -105,10 +106,11 @@ func (s *Service) SendFolder(target *discovery.Peer, targetIP string, folderPath
|
|||||||
|
|
||||||
task := NewTransfer(
|
task := NewTransfer(
|
||||||
taskID,
|
taskID,
|
||||||
Sender{
|
NewSender(
|
||||||
ID: s.discoveryService.GetID(),
|
s.discoveryService.GetID(),
|
||||||
Name: s.config.GetHostName(),
|
s.config.GetHostName(),
|
||||||
},
|
WithReceiverIP(targetIP, s.discoveryService),
|
||||||
|
),
|
||||||
WithFileName(filepath.Base(folderPath)),
|
WithFileName(filepath.Base(folderPath)),
|
||||||
WithFileSize(size),
|
WithFileSize(size),
|
||||||
WithType(TransferTypeSend),
|
WithType(TransferTypeSend),
|
||||||
@@ -152,10 +154,11 @@ func (s *Service) SendText(target *discovery.Peer, targetIP string, text string)
|
|||||||
r := bytes.NewReader([]byte(text))
|
r := bytes.NewReader([]byte(text))
|
||||||
task := NewTransfer(
|
task := NewTransfer(
|
||||||
taskID,
|
taskID,
|
||||||
Sender{
|
NewSender(
|
||||||
ID: s.discoveryService.GetID(),
|
s.discoveryService.GetID(),
|
||||||
Name: s.config.GetHostName(),
|
s.config.GetHostName(),
|
||||||
},
|
WithReceiverIP(targetIP, s.discoveryService),
|
||||||
|
),
|
||||||
WithFileSize(int64(len(text))),
|
WithFileSize(int64(len(text))),
|
||||||
WithType(TransferTypeSend),
|
WithType(TransferTypeSend),
|
||||||
WithContentType(ContentTypeText),
|
WithContentType(ContentTypeText),
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
package transfer
|
package transfer
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"log/slog"
|
||||||
|
"mesh-drop/internal/discovery"
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -57,6 +59,7 @@ func NewTransfer(id string, sender Sender, opts ...TransferOption) *Transfer {
|
|||||||
CreateTime: time.Now().UnixMilli(),
|
CreateTime: time.Now().UnixMilli(),
|
||||||
Sender: sender,
|
Sender: sender,
|
||||||
Status: TransferStatusPending, // Default status
|
Status: TransferStatusPending, // Default status
|
||||||
|
DecisionChan: make(chan Decision, 1),
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, opt := range opts {
|
for _, opt := range opts {
|
||||||
@@ -123,6 +126,36 @@ func WithToken(token string) TransferOption {
|
|||||||
type Sender struct {
|
type Sender struct {
|
||||||
ID string `json:"id" binding:"required"` // 发送者 ID
|
ID string `json:"id" binding:"required"` // 发送者 ID
|
||||||
Name string `json:"name" binding:"required"` // 发送者名称
|
Name string `json:"name" binding:"required"` // 发送者名称
|
||||||
|
IP string `json:"ip" binding:"required"` // 发送者 IP
|
||||||
|
}
|
||||||
|
|
||||||
|
type NewSenderOption func(*Sender)
|
||||||
|
|
||||||
|
func NewSender(id string, name string, opts ...NewSenderOption) Sender {
|
||||||
|
s := &Sender{
|
||||||
|
ID: id,
|
||||||
|
Name: name,
|
||||||
|
}
|
||||||
|
for _, opt := range opts {
|
||||||
|
opt(s)
|
||||||
|
}
|
||||||
|
return *s
|
||||||
|
}
|
||||||
|
|
||||||
|
func WithIP(ip string) NewSenderOption {
|
||||||
|
return func(s *Sender) {
|
||||||
|
s.IP = ip
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func WithReceiverIP(ip string, discoveryService *discovery.Service) NewSenderOption {
|
||||||
|
return func(s *Sender) {
|
||||||
|
ip, ok := discoveryService.GetLocalIPInSameSubnet(ip)
|
||||||
|
if !ok {
|
||||||
|
slog.Error("Failed to get local IP in same subnet", "ip", ip, "component", "transfer-client")
|
||||||
|
}
|
||||||
|
s.IP = ip
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Progress 用户前端传输进度
|
// Progress 用户前端传输进度
|
||||||
|
|||||||
@@ -40,7 +40,6 @@ func (s *Service) handleAsk(c *gin.Context) {
|
|||||||
// 存储请求
|
// 存储请求
|
||||||
task.Type = TransferTypeReceive
|
task.Type = TransferTypeReceive
|
||||||
task.Status = TransferStatusPending
|
task.Status = TransferStatusPending
|
||||||
task.DecisionChan = make(chan Decision)
|
|
||||||
s.StoreTransferToList(&task)
|
s.StoreTransferToList(&task)
|
||||||
|
|
||||||
if s.config.GetAutoAccept() {
|
if s.config.GetAutoAccept() {
|
||||||
@@ -50,10 +49,11 @@ func (s *Service) handleAsk(c *gin.Context) {
|
|||||||
SavePath: s.config.GetSavePath(),
|
SavePath: s.config.GetSavePath(),
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
// 发送系统通知
|
||||||
_ = s.notifier.SendNotification(notifications.NotificationOptions{
|
_ = s.notifier.SendNotification(notifications.NotificationOptions{
|
||||||
ID: uuid.New().String(),
|
ID: uuid.New().String(),
|
||||||
Title: "File Transfer Request",
|
Title: "File Transfer Request",
|
||||||
Body: fmt.Sprintf("%s wants to transfer %s", task.Sender, task.FileName),
|
Body: fmt.Sprintf("%s(%s) wants to transfer %s", task.Sender.Name, task.Sender.IP, task.FileName),
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user