feat: add bark encrypt message

This commit is contained in:
engigu
2026-01-22 19:16:24 +08:00
parent f0bbef5541
commit ea6af44f0c
4 changed files with 65 additions and 3 deletions
+56 -2
View File
@@ -2,6 +2,9 @@ package message
import (
"bytes"
"crypto/aes"
"crypto/cipher"
"encoding/base64"
"encoding/json"
"fmt"
"io"
@@ -22,10 +25,11 @@ type Bark struct {
Icon string
Level string
URL string
Key string
IV string
}
func (b *Bark) Request(title, content string) ([]byte, error) {
url := b.getURL()
data := map[string]interface{}{
"title": title,
"body": content,
@@ -49,7 +53,34 @@ func (b *Bark) Request(title, content string) ([]byte, error) {
data["url"] = b.URL
}
jsonData, err := json.Marshal(data)
var postData interface{}
url := b.getURL()
if b.Key != "" && b.IV != "" {
// Use encryption
jsonData, err := json.Marshal(data)
if err != nil {
return nil, err
}
ciphertext, err := b.encryptPayload(string(jsonData))
if err != nil {
return nil, fmt.Errorf("encryption failed: %v", err)
}
postData = map[string]interface{}{
"ciphertext": ciphertext,
"device_key": b.PushKey,
"sound": b.Sound,
}
// When using encryption, use the push endpoint if PushKey is just a key
if !strings.HasPrefix(b.PushKey, "http") {
url = "https://api.day.app/push"
}
} else {
// Normal request
postData = data
}
jsonData, err := json.Marshal(postData)
if err != nil {
return nil, err
}
@@ -84,3 +115,26 @@ func (b *Bark) getURL() string {
}
return fmt.Sprintf("https://api.day.app/%s", pushKey)
}
func (b *Bark) encryptPayload(payload string) (string, error) {
key := []byte(b.Key)
iv := []byte(b.IV)
block, err := aes.NewCipher(key)
if err != nil {
return "", err
}
paddedPayload := b.pkcs7Pad([]byte(payload), aes.BlockSize)
mode := cipher.NewCBCEncrypter(block, iv)
ciphertext := make([]byte, len(paddedPayload))
mode.CryptBlocks(ciphertext, paddedPayload)
return base64.StdEncoding.EncodeToString(ciphertext), nil
}
func (b *Bark) pkcs7Pad(data []byte, blockSize int) []byte {
padding := blockSize - len(data)%blockSize
padtext := bytes.Repeat([]byte{byte(padding)}, padding)
return append(data, padtext...)
}
@@ -37,6 +37,8 @@ func (c *BarkChannel) SendUnified(msgObj interface{}, ins models.SendTasksIns, c
Icon: auth.Icon,
Level: auth.Level,
URL: auth.URL,
Key: auth.Key,
IV: auth.IV,
}
res, err := cli.Request(content.Title, content.Text)
+5 -1
View File
@@ -297,6 +297,8 @@ type WayDetailBark struct {
Icon string `json:"icon" validate:"max=200" label:"推送图标"`
Level string `json:"level" validate:"max=20" label:"推送时效性"`
URL string `json:"url" validate:"max=200" label:"推送跳转URL"`
Key string `json:"key" validate:"max=100" label:"加密Key"`
IV string `json:"iv" validate:"max=100" label:"加密IV"`
}
func (w *WayDetailBark) Validate(authJson string) (string, interface{}) {
@@ -319,6 +321,8 @@ func (w *WayDetailBark) Test() (string, string) {
Icon: w.Icon,
Level: w.Level,
URL: w.URL,
Key: w.Key,
IV: w.IV,
}
res, err := cli.Request("Test Message", testMsg)
if err != nil {
@@ -376,7 +380,7 @@ func (sw *SendWay) Delete() error {
for _, task := range tasks {
names = append(names, task.Name)
}
return errors.New(fmt.Sprintf("已经存在使用的任务,删除失败!任务名:%s", strings.Join(names, ", ")))
return fmt.Errorf("已经存在使用的任务,删除失败!任务名:%s", strings.Join(names, ", "))
}
return models.DeleteMsgWay(sw.ID)
}
+2
View File
@@ -213,6 +213,8 @@ const CONSTANT = {
{ subLabel: '推送图标', value: '', col: 'icon', desc: "推送图标URL,可选" },
{ subLabel: '推送时效', value: '', col: 'level', desc: "active/timeSensitive/passive,可选" },
{ subLabel: '跳转URL', value: '', col: 'url', desc: "点击推送跳转的URL,可选" },
{ subLabel: '加密Key', value: '', col: 'key', desc: "AES加密Key16位,可选" },
{ subLabel: '加密IV', value: '', col: 'iv', desc: "AES加密IV16位,可选" },
{ subLabel: '渠道名', value: '', col: 'name', desc: "想要设置的渠道名字" },
],
tips: {