| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051 |
- package service
- import (
- "encoding/json"
- "fmt"
- "github.com/mhsanaei/3x-ui/v3/internal/amneziawg"
- "github.com/mhsanaei/3x-ui/v3/internal/amneziawgnet"
- json_util "github.com/mhsanaei/3x-ui/v3/internal/util/json_util"
- "github.com/mhsanaei/3x-ui/v3/internal/xray"
- )
- // transformAmneziaWGOutbounds swaps each template "amneziawg" outbound for
- // its socks bridge; unbridgeable entries fail generation rather than skip.
- func transformAmneziaWGOutbounds(cfg *xray.Config) error {
- if len(cfg.OutboundConfigs) == 0 {
- return nil
- }
- var outbounds []json.RawMessage
- if err := json.Unmarshal(cfg.OutboundConfigs, &outbounds); err != nil {
- return err
- }
- changed := false
- for i, raw := range outbounds {
- if !amneziawg.IsAmneziaWGOutbound(raw) {
- continue
- }
- var probe struct {
- Tag string `json:"tag"`
- }
- tagErr := json.Unmarshal(raw, &probe)
- replacement, ok := amneziawgnet.BuildSocksBridge(raw)
- if !ok {
- if tagErr != nil {
- return fmt.Errorf("amneziawg outbound %d: unreadable tag: %w", i, tagErr)
- }
- return fmt.Errorf("amneziawg outbound %d (%q): cannot bridge: tag must be a non-empty string", i, probe.Tag)
- }
- outbounds[i] = replacement
- changed = true
- }
- if !changed {
- return nil
- }
- bs, err := json.Marshal(outbounds)
- if err != nil {
- return err
- }
- cfg.OutboundConfigs = json_util.RawMessage(bs)
- return nil
- }
|