dav/main.c

changeset 498
37af2eac3e6a
parent 494
3aed354185eb
child 500
0fe1514667e6
equal deleted inserted replaced
497:411bd1098175 498:37af2eac3e6a
120 ret = cmd_mkdir(args); 120 ret = cmd_mkdir(args);
121 } else if(!strcasecmp(cmd, "copy") || !strcasecmp(cmd, "cp")) { 121 } else if(!strcasecmp(cmd, "copy") || !strcasecmp(cmd, "cp")) {
122 ret = cmd_move(args, true); 122 ret = cmd_move(args, true);
123 } else if(!strcasecmp(cmd, "move") || !strcasecmp(cmd, "mv")) { 123 } else if(!strcasecmp(cmd, "move") || !strcasecmp(cmd, "mv")) {
124 ret = cmd_move(args, false); 124 ret = cmd_move(args, false);
125 } else if(!strcasecmp(cmd, "rename")) {
126 ret = cmd_rename(args);
125 } else if(!strcasecmp(cmd, "export")) { 127 } else if(!strcasecmp(cmd, "export")) {
126 ret = cmd_get(args, TRUE); 128 ret = cmd_get(args, TRUE);
127 } else if(!strcasecmp(cmd, "import")) { 129 } else if(!strcasecmp(cmd, "import")) {
128 ret = cmd_put(args, TRUE); 130 ret = cmd_put(args, TRUE);
129 } else if(!strcasecmp(cmd, "date")) { 131 } else if(!strcasecmp(cmd, "date")) {
211 "put [-pcR] [-k <key>] [-L <lock>] <url> <file>", 213 "put [-pcR] [-k <key>] [-L <lock>] <url> <file>",
212 "mkdir [-pc] [-k <key>] [-L <lock>] <url>", 214 "mkdir [-pc] [-k <key>] [-L <lock>] <url>",
213 "remove [-pc] [-L <lock>] <url>", 215 "remove [-pc] [-L <lock>] <url>",
214 "copy [-pcO] [-L <lock>] <url> <url>", 216 "copy [-pcO] [-L <lock>] <url> <url>",
215 "move [-pcO] [-L <lock>] <url> <url>", 217 "move [-pcO] [-L <lock>] <url> <url>",
218 "rename [-pcO] [-L <lock>] <url> <name>",
216 "export [-pc] [-o <file>] [-u <date>] <url>", 219 "export [-pc] [-o <file>] [-u <date>] <url>",
217 "import [-pc] [-k <key>] [-L <lock>] <url> <file>", 220 "import [-pc] [-k <key>] [-L <lock>] <url> <file>",
218 "get-property [-pcx] [-V <version>] [-n <uri>] <url> <property>", 221 "get-property [-pcx] [-V <version>] [-n <uri>] <url> <property>",
219 "set-property [-pcx] [-L <lock>] [-n <uri>] <url> <property> [value]", 222 "set-property [-pcx] [-L <lock>] [-n <uri>] <url> <property> [value]",
220 "remove-property [-pc] [-n <uri>] <url> <property>", 223 "remove-property [-pc] [-n <uri>] <url> <property>",
1529 // TODO: free 1532 // TODO: free
1530 return -1; 1533 return -1;
1531 } 1534 }
1532 1535
1533 free(path); 1536 free(path);
1537 dav_session_destroy(sn);
1534 return 0; 1538 return 0;
1535 } 1539 }
1536 1540
1537 int cmd_move(CmdArgs *a, int cp) { 1541 int cmd_move(CmdArgs *a, int cp) {
1538 const char* actionstr = cp ? "copy" : "move"; 1542 const char* actionstr = cp ? "copy" : "move";
1600 } 1604 }
1601 1605
1602 dav_session_destroy(srcsn); 1606 dav_session_destroy(srcsn);
1603 1607
1604 return 0; 1608 return 0;
1609 }
1610
1611 int cmd_rename(CmdArgs *a) {
1612 if(a->argc != 2) {
1613 // TODO: change, when creation of multiple dirs is supported
1614 fprintf(stderr, "Too %s arguments\n", a->argc < 2 ? "few":"many");
1615 fprintf(stderr, "Usage: dav %s\n", find_usage_str("rename"));
1616 return -1;
1617 }
1618
1619 char *name = a->argv[1];
1620 size_t namelen = strlen(name);
1621 for(size_t i=0;i<namelen;i++) {
1622 char c = name[i];
1623 if(c == '/') {
1624 fprintf(stderr, "Illegal character in name: '/'\n");
1625 return 1;
1626 }
1627 }
1628
1629 char *url = a->argv[0];
1630 char *path = NULL;
1631 Repository *repo = url2repo(url, &path);
1632 DavSession *sn = connect_to_repo(repo, path, a);
1633
1634 if(set_session_config(sn, a)) {
1635 return -1;
1636 }
1637 set_session_lock(sn, a);
1638
1639 int ret = 0;
1640 DavResource *res = dav_get(sn, path, NULL);
1641 if(res) {
1642 char *cryptoname = dav_get_string_property_ns(res, DAV_NS, "crypto-name");
1643 char *cryptokey = dav_get_string_property_ns(res, DAV_NS, "crypto-key");
1644 if(cryptoname && cryptokey) {
1645 // encrypted resource with an encrypted name
1646 // renaming is done by simply setting the crypto-name property
1647
1648 DavKey *key = dav_context_get_key(ctx, cryptokey);
1649 if(key) {
1650 // check if a resource with this name already exists
1651 char *parent = util_parent_path(res->path);
1652 char *newpath = util_concat_path(parent, name);
1653 DavResource *testres = dav_resource_new(sn, newpath);
1654 if(dav_exists(testres)) {
1655 fprintf(stderr, "A resource with this name already exists.\nAbort.\n");
1656 ret = 1;
1657 } else {
1658 char *crname = aes_encrypt(name, namelen, key);
1659 dav_set_string_property_ns(res, DAV_NS, "crypto-name", crname);
1660 free(crname);
1661 if(dav_store(res)) {
1662 print_resource_error(sn, res->path);
1663 fprintf(stderr, "Cannot store crypto-name property.\n");
1664 ret = 1;
1665 }
1666 }
1667 free(parent);
1668 free(newpath);
1669 } else {
1670 fprintf(stderr, "Key %s not found.\n", cryptokey);
1671 }
1672 } else {
1673 // rename the resource by changing the url mapping with MOVE
1674
1675 char *parent = util_parent_path(res->href);
1676 char *new_href = util_concat_path(parent, name);
1677 char *dest = util_get_url(sn, new_href);
1678 free(parent);
1679 free(new_href);
1680 if(dav_moveto(res, dest, false)) {
1681 print_resource_error(sn, path);
1682 fprintf(stderr, "Cannot rename resource.\n");
1683 ret = 1;
1684 }
1685 free(dest);
1686 }
1687 } else {
1688 print_resource_error(sn, path);
1689 fprintf(stderr, "Cannot rename resource.\n");
1690 ret = 1;
1691 }
1692
1693
1694 dav_session_destroy(sn);
1695 free(path);
1696 return ret;
1605 } 1697 }
1606 1698
1607 1699
1608 static size_t get_date_header_cb(void *header, int s, int n, void *data) { 1700 static size_t get_date_header_cb(void *header, int s, int n, void *data) {
1609 char **date_str = (char**)data; 1701 char **date_str = (char**)data;

mercurial