func TestIPNSHostnameRedirect(t *testing.T) { ns := mockNamesys{} ts, n := newTestServerAndNode(t, ns) t.Logf("test server url: %s", ts.URL) defer ts.Close() // create /ipns/example.net/foo/index.html _, dagn1, err := coreunix.AddWrapped(n, strings.NewReader("_"), "_") if err != nil { t.Fatal(err) } _, dagn2, err := coreunix.AddWrapped(n, strings.NewReader("_"), "index.html") if err != nil { t.Fatal(err) } dagn1.AddNodeLink("foo", dagn2) if err != nil { t.Fatal(err) } err = n.DAG.AddRecursive(dagn1) if err != nil { t.Fatal(err) } k, err := dagn1.Key() if err != nil { t.Fatal(err) } t.Logf("k: %s\n", k) ns["/ipns/example.net"] = path.FromString("/ipfs/" + k.String()) // make request to directory containing index.html req, err := http.NewRequest("GET", ts.URL+"/foo", nil) if err != nil { t.Fatal(err) } req.Host = "example.net" res, err := doWithoutRedirect(req) if err != nil { t.Fatal(err) } // expect 302 redirect to same path, but with trailing slash if res.StatusCode != 302 { t.Errorf("status is %d, expected 302", res.StatusCode) } hdr := res.Header["Location"] if len(hdr) < 1 { t.Errorf("location header not present") } else if hdr[0] != "/foo/" { t.Errorf("location header is %v, expected /foo/", hdr[0]) } }
func addFile(n *core.IpfsNode, file files.File, out chan interface{}, progress bool, wrap bool, useTrickle bool) (*dag.Node, error) { if file.IsDirectory() { return addDir(n, file, out, progress, useTrickle) } // if the progress flag was specified, wrap the file so that we can send // progress updates to the client (over the output channel) var reader io.Reader = file if progress { reader = &progressReader{file: file, out: out} } if wrap { p, dagnode, err := coreunix.AddWrapped(n, reader, path.Base(file.FileName())) if err != nil { return nil, err } out <- &AddedObject{ Hash: p, Name: file.FileName(), } return dagnode, nil } dagnode, err := add(n, reader, useTrickle) if err != nil { return nil, err } log.Infof("adding file: %s", file.FileName()) if err := outputDagnode(out, file.FileName(), dagnode); err != nil { return nil, err } return dagnode, nil }
// Add the given file while respecting the params. func (params *adder) addFile(file files.File) (*dag.Node, error) { // Check if file is hidden if fileIsHidden := files.IsHidden(file); fileIsHidden && !params.hidden { log.Debugf("%s is hidden, skipping", file.FileName()) return nil, &hiddenFileError{file.FileName()} } // Check if "file" is actually a directory if file.IsDirectory() { return params.addDir(file) } // if the progress flag was specified, wrap the file so that we can send // progress updates to the client (over the output channel) var reader io.Reader = file if params.progress { reader = &progressReader{file: file, out: params.out} } if params.wrap { p, dagnode, err := coreunix.AddWrapped(params.node, reader, path.Base(file.FileName())) if err != nil { return nil, err } params.out <- &AddedObject{ Hash: p, Name: file.FileName(), } return dagnode, nil } dagnode, err := add(params.node, reader, params.trickle) if err != nil { return nil, err } log.Infof("adding file: %s", file.FileName()) if err := outputDagnode(params.out, file.FileName(), dagnode); err != nil { return nil, err } return dagnode, nil }
func TestLs(t *testing.T) { ctx := context.Background() node, api, err := makeAPI(ctx) if err != nil { t.Error(err) } r := strings.NewReader("content-of-file") p, _, err := coreunix.AddWrapped(node, r, "name-of-file") if err != nil { t.Error(err) } parts := strings.Split(p, "/") if len(parts) != 2 { t.Errorf("unexpected path:", p) } k := parts[0] links, err := api.Ls(ctx, k) if err != nil { t.Error(err) } if len(links) != 1 { t.Fatalf("expected 1 link, got %d", len(links)) } if links[0].Size != 23 { t.Fatalf("expected size = 23, got %d", links[0].Size) } if links[0].Name != "name-of-file" { t.Fatalf("expected name = name-of-file, got %s", links[0].Name) } if links[0].Cid.String() != "QmX3qQVKxDGz3URVC3861Z3CKtQKGBn6ffXRBBWGMFz9Lr" { t.Fatalf("expected cid = QmX3qQVKxDGz3URVC3861Z3CKtQKGBn6ffXRBBWGMFz9Lr, got %s", links[0].Cid.String()) } }
func TestIPNSHostnameBacklinks(t *testing.T) { ns := mockNamesys{} ts, n := newTestServerAndNode(t, ns) t.Logf("test server url: %s", ts.URL) defer ts.Close() // create /ipns/example.net/foo/ _, dagn1, err := coreunix.AddWrapped(n, strings.NewReader("1"), "file.txt") if err != nil { t.Fatal(err) } _, dagn2, err := coreunix.AddWrapped(n, strings.NewReader("2"), "file.txt") if err != nil { t.Fatal(err) } _, dagn3, err := coreunix.AddWrapped(n, strings.NewReader("3"), "file.txt") if err != nil { t.Fatal(err) } dagn2.AddNodeLink("bar", dagn3) dagn1.AddNodeLink("foo? #<'", dagn2) if err != nil { t.Fatal(err) } _, err = n.DAG.Add(dagn3) if err != nil { t.Fatal(err) } _, err = n.DAG.Add(dagn2) if err != nil { t.Fatal(err) } _, err = n.DAG.Add(dagn1) if err != nil { t.Fatal(err) } k, err := dagn1.Key() if err != nil { t.Fatal(err) } t.Logf("k: %s\n", k) ns["/ipns/example.net"] = path.FromString("/ipfs/" + k.String()) // make request to directory listing req, err := http.NewRequest("GET", ts.URL+"/foo%3F%20%23%3C%27/", nil) if err != nil { t.Fatal(err) } req.Host = "example.net" res, err := doWithoutRedirect(req) if err != nil { t.Fatal(err) } // expect correct backlinks body, err := ioutil.ReadAll(res.Body) if err != nil { t.Fatalf("error reading response: %s", err) } s := string(body) t.Logf("body: %s\n", string(body)) if !strings.Contains(s, "Index of /foo? #<'/") { t.Fatalf("expected a path in directory listing") } if !strings.Contains(s, "<a href=\"/\">") { t.Fatalf("expected backlink in directory listing") } if !strings.Contains(s, "<a href=\"/foo%3F%20%23%3C%27/file.txt\">") { t.Fatalf("expected file in directory listing") } // make request to directory listing at root req, err = http.NewRequest("GET", ts.URL, nil) if err != nil { t.Fatal(err) } req.Host = "example.net" res, err = doWithoutRedirect(req) if err != nil { t.Fatal(err) } // expect correct backlinks at root body, err = ioutil.ReadAll(res.Body) if err != nil { t.Fatalf("error reading response: %s", err) } s = string(body) t.Logf("body: %s\n", string(body)) if !strings.Contains(s, "Index of /") { t.Fatalf("expected a path in directory listing") } if !strings.Contains(s, "<a href=\"/\">") { t.Fatalf("expected backlink in directory listing") } if !strings.Contains(s, "<a href=\"/file.txt\">") { t.Fatalf("expected file in directory listing") } // make request to directory listing req, err = http.NewRequest("GET", ts.URL+"/foo%3F%20%23%3C%27/bar/", nil) if err != nil { t.Fatal(err) } req.Host = "example.net" res, err = doWithoutRedirect(req) if err != nil { t.Fatal(err) } // expect correct backlinks body, err = ioutil.ReadAll(res.Body) if err != nil { t.Fatalf("error reading response: %s", err) } s = string(body) t.Logf("body: %s\n", string(body)) if !strings.Contains(s, "Index of /foo? #<'/bar/") { t.Fatalf("expected a path in directory listing") } if !strings.Contains(s, "<a href=\"/foo%3F%20%23%3C%27/\">") { t.Fatalf("expected backlink in directory listing") } if !strings.Contains(s, "<a href=\"/foo%3F%20%23%3C%27/bar/file.txt\">") { t.Fatalf("expected file in directory listing") } // make request to directory listing with prefix req, err = http.NewRequest("GET", ts.URL, nil) if err != nil { t.Fatal(err) } req.Host = "example.net" req.Header.Set("X-Ipfs-Gateway-Prefix", "/good-prefix") res, err = doWithoutRedirect(req) if err != nil { t.Fatal(err) } // expect correct backlinks with prefix body, err = ioutil.ReadAll(res.Body) if err != nil { t.Fatalf("error reading response: %s", err) } s = string(body) t.Logf("body: %s\n", string(body)) if !strings.Contains(s, "Index of /good-prefix") { t.Fatalf("expected a path in directory listing") } if !strings.Contains(s, "<a href=\"/good-prefix/\">") { t.Fatalf("expected backlink in directory listing") } if !strings.Contains(s, "<a href=\"/good-prefix/file.txt\">") { t.Fatalf("expected file in directory listing") } // make request to directory listing with illegal prefix req, err = http.NewRequest("GET", ts.URL, nil) if err != nil { t.Fatal(err) } req.Host = "example.net" req.Header.Set("X-Ipfs-Gateway-Prefix", "/bad-prefix") res, err = doWithoutRedirect(req) if err != nil { t.Fatal(err) } // make request to directory listing with evil prefix req, err = http.NewRequest("GET", ts.URL, nil) if err != nil { t.Fatal(err) } req.Host = "example.net" req.Header.Set("X-Ipfs-Gateway-Prefix", "//good-prefix/foo") res, err = doWithoutRedirect(req) if err != nil { t.Fatal(err) } // expect correct backlinks without illegal prefix body, err = ioutil.ReadAll(res.Body) if err != nil { t.Fatalf("error reading response: %s", err) } s = string(body) t.Logf("body: %s\n", string(body)) if !strings.Contains(s, "Index of /") { t.Fatalf("expected a path in directory listing") } if !strings.Contains(s, "<a href=\"/\">") { t.Fatalf("expected backlink in directory listing") } if !strings.Contains(s, "<a href=\"/file.txt\">") { t.Fatalf("expected file in directory listing") } }