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>", |
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; |