(share *drive.Share)
| 114 | } |
| 115 | |
| 116 | func (s *FileSystemForRemote) buildChild(share *drive.Share) *compositedav.Child { |
| 117 | getTokenAndAddr := func(shareName string) (string, string, error) { |
| 118 | s.mu.RLock() |
| 119 | var share *drive.Share |
| 120 | i, shareFound := slices.BinarySearchFunc(s.shares, shareName, func(s *drive.Share, name string) int { |
| 121 | return strings.Compare(s.Name, name) |
| 122 | }) |
| 123 | if shareFound { |
| 124 | share = s.shares[i] |
| 125 | } |
| 126 | userServers := s.userServers |
| 127 | fileServerTokenAndAddr := s.fileServerTokenAndAddr |
| 128 | s.mu.RUnlock() |
| 129 | |
| 130 | if !shareFound { |
| 131 | return "", "", fmt.Errorf("unknown share %v", shareName) |
| 132 | } |
| 133 | |
| 134 | var tokenAndAddr string |
| 135 | if !drive.AllowShareAs() { |
| 136 | tokenAndAddr = fileServerTokenAndAddr |
| 137 | } else { |
| 138 | userServer, found := userServers[share.As] |
| 139 | if found { |
| 140 | userServer.mu.RLock() |
| 141 | tokenAndAddr = userServer.tokenAndAddr |
| 142 | userServer.mu.RUnlock() |
| 143 | } |
| 144 | } |
| 145 | |
| 146 | if tokenAndAddr == "" { |
| 147 | return "", "", fmt.Errorf("unable to determine address for share %v", shareName) |
| 148 | } |
| 149 | |
| 150 | parts := strings.Split(tokenAndAddr, "|") |
| 151 | if len(parts) != 2 { |
| 152 | return "", "", fmt.Errorf("invalid address for share %v", shareName) |
| 153 | } |
| 154 | |
| 155 | return parts[0], parts[1], nil |
| 156 | } |
| 157 | |
| 158 | return &compositedav.Child{ |
| 159 | Child: &dirfs.Child{ |
| 160 | Name: share.Name, |
| 161 | }, |
| 162 | BaseURL: func() (string, error) { |
| 163 | secretToken, _, err := getTokenAndAddr(share.Name) |
| 164 | if err != nil { |
| 165 | return "", err |
| 166 | } |
| 167 | return fmt.Sprintf("http://%s/%s/%s", hex.EncodeToString([]byte(share.Name)), secretToken, url.PathEscape(share.Name)), nil |
| 168 | }, |
| 169 | Transport: &http.Transport{ |
| 170 | DialContext: func(ctx context.Context, _, shareAddr string) (net.Conn, error) { |
| 171 | shareNameHex, _, err := net.SplitHostPort(shareAddr) |
| 172 | if err != nil { |
| 173 | return nil, fmt.Errorf("unable to parse share address %v: %w", shareAddr, err) |
no test coverage detected