The following BASH script contains a number of "curl" calls to the Nextcloud API in order to validate a basic synchronization algorithm. ```text #!/usr/bin/bash # OpenProject -> Nextcloud Sync Algorithm: # # We represent OpenProject project membership by sharing the project folder # with the respective users or groups in Nextcloud: # # Go through the list of OpenProject Projects: # Identify the project folder below the OpenProject root in Nextcloud # Create a project folder (using WebDAV Folder API) if it doesn't exist yet # Go through the list of OpenProject project members (groups an users from LDAP) # and their permissions and compare with Nextcloud shares # Create a new Nextcloud share for the user or group if necessary # Delete an old NC share if not in OpenProject # # Synchroneous operation (as part of the GUI): # New project: Sync the new project # New project member: Just sync the specific share # # Special cases: # New group member in LDAP: # This could be an issue in the case of a new employee # because both systems need to be synced with LDAP. # Implement getting/setting of "Advanced Permissions" (ACL) via OCS API #1256 # https://github.com/nextcloud/groupfolders/issues/1256 # - Managing # ------------------------------------------------------- # Run Nextcloud OCC CLI commands # Taken from nextcloud-link - Node.js interface for Nextcloud including Group Folders # From: https://github.com/tentwentyfour/nextcloud-link/blob/master/tests/groupfolders-jest.ts # # docker exec -u 33 -it integration_openproject_nc bash -c 'php occ list' # docker exec -u 33 -it integration_openproject_nc bash -c 'php occ app:install groupfolders' # ------------------------------------------------------- # Get the list of users: curl -u admin:admin -H "OCS-APIRequest: true" -H 'Accept: application/json' -X GET 'http://localhost/ocs/v1.php/cloud/users' # {"ocs":{...},"data":{"users":["admin","user1","user2","user3"]}}} # Get detailed information about one user: curl -u admin:admin -H "OCS-APIRequest: true" -H 'Accept: application/json' -X GET 'http://localhost/ocs/v1.php/cloud/users/admin' # {"ocs":{...},"data":{"enabled":true,"storageLocation":"\/var\/www\/html\/data\/admin","id":"admin","email":"admin@example.com","displayname":"admin","groups":["admin"],"language":"en", ...}}} # ------------------------------------------------------- # Capabilities API: curl -u admin:admin -X GET -H "OCS-APIRequest: true" -H 'Accept: application/json' 'http://localhost/ocs/v1.php/cloud/capabilities' # {"ocs":{"meta":{"status":"ok","statuscode":100,"message":"OK","totalitems":"","itemsperpage":""},"data":{"version":{"major":23,"minor":0,"micro":2,"string":"23.0.2","edition":"","extendedSupport":false}, ...} # ------------------------------------------------------- # Group Folders API: # Not working: # curl -u admin:admin -H "OCS-APIRequest: true" -H 'Accept: application/json' -X GET 'http://localhost/ocs/v2.php/apps/groupfolders/folders' # Not working: # curl -u admin:admin -H "OCS-APIRequest: true" -H 'Accept: application/json' -X GET 'http://localhost/ocs/v2.php/apps/groupfolders/folders/1' # Working: # curl -u admin:admin -H "OCS-APIRequest: true" -H 'Accept: application/json' -X GET 'http://localhost/ocs/v2.php/apps/activity/api/v2/activity' # Get the list of group folders (working): # curl -u admin:admin -H "OCS-APIRequest: true" -H 'Accept: application/json' -X GET 'http://localhost/index.php/apps/groupfolders/folders' # {"ocs":{"meta":{...},"data":{"1":{"id":1,"mount_point":"My Group Folder","groups":{"Test Group":31,"admin":31},"quota":-3,"size":0,"acl":true,"manage":[{"type":"group","id":"admin","displayname":"admin"}]}}}} # Get details for one folder (working): curl -u admin:admin -H "OCS-APIRequest: true" -H 'Accept: application/json' -X GET 'http://localhost/index.php/apps/groupfolders/folders/1' # {"ocs":{"meta":{...},"data":{"id":1,"mount_point":"My Group Folder","groups":{"Test Group":31,"admin":31},"quota":-3,"size":0,"acl":true}}} # Not Working (error page): curl -u admin:admin -H "OCS-APIRequest: true" -H 'Accept: application/json' -H "Content-Type: application/json" \ # -X POST 'http://localhost/index.php/apps/groupfolders/folders' --data-raw '{"mount_point":"My Group Folder 2"}' # Group Folders set ACL (not working): curl -u admin:admin -X POST -H "OCS-APIRequest: true" -H 'Accept: application/json' 'http://localhost/index.php/apps/groupfolders/folders/1/acs' --data-raw '{"acl":0}' curl -u admin:admin -X POST -H "OCS-APIRequest: true" -H 'Accept: application/json' 'http://localhost/index.php/apps/groupfolders/folders/1/acs' --data-raw '{"acl":"0"}' curl -u admin:admin -X POST -H "OCS-APIRequest: true" -H 'Accept: application/json' 'http://localhost/index.php/apps/groupfolders/folders/1/acs' --data-raw '{"acl":"false"}' curl -u admin:admin -X POST -H "OCS-APIRequest: true" -H 'Accept: application/json' 'http://localhost/index.php/apps/groupfolders/folders/1/acs' --data-raw '{"acl":false}' # Check if acs:true still set in folder info curl -u admin:admin -H "OCS-APIRequest: true" -H 'Accept: application/json' -X GET 'http://localhost/index.php/apps/groupfolders/folders/1' # ------------------------------------------------------- # WebDAV Protocol for Nextcloud: # https://docs.nextcloud.com/server/latest/developer_manual/client_apis/WebDAV/basic.html # Get the list of files for user admin in user's home directory curl -u admin:admin -X PROPFIND 'http://localhost/remote.php/dav/files/admin/' | xml_pp # Get the list only for Depth=1 curl -u admin:admin -X PROPFIND -H "Depth: 1" 'http://localhost/remote.php/dav/files/admin/' | xml_pp # List directory with specific attributes with proper XML namespaces curl -u admin:admin -X PROPFIND \ -d '' \ 'http://localhost/remote.php/dav/files/admin/' # List directory with specific attributes with abbreviated namespaces curl -u admin:admin -X PROPFIND \ -d '' \ 'http://localhost/remote.php/dav/files/admin/' | xml_pp # Download a file curl -u admin:admin -X GET 'http://localhost/remote.php/dav/files/admin/Nextcloud.png' --output Nextcloud.png # Create a new folder curl -u admin:admin -X MKCOL 'http://localhost/remote.php/dav/files/admin/TestFolder' # Upload same file with different name curl -u admin:admin -X PUT 'http://localhost/remote.php/dav/files/admin/TestFolder/Nextcloud2.png' --upload-file Nextcloud.png # ------------------------------------------------------- # Nextcloud Shares API: # https://docs.nextcloud.com/server/latest/developer_manual/client_apis/OCS/ocs-share-api.html # Get the list of all shares for a given user: curl -u admin:admin -H 'Accept: application/json' -H 'OCS-APIRequest: true' http://localhost/ocs/v2.php/apps/files_sharing/api/v1/shares # {"ocs":{"meta":{"status":"ok","statuscode":200,"message":"OK"},"data":[ # {"id":"2","share_type":0,"uid_owner":"admin","displayname_owner":"admin","permissions":19,"can_edit":true,"can_delete":true,"stime":1646926576,"parent":null,"expiration":null,"token":null,"uid_file_owner":"admin","note":"","label":null,"displayname_file_owner":"admin","path":"\/test.txt","item_type":"file","mimetype":"text\/plain","has_preview":true,"storage_id":"home::admin","storage":2,"item_source":348,"file_source":348,"file_parent":6,"file_target":"\/test-user1.txt","share_with":"user1","share_with_displayname":"User1","share_with_displayname_unique":"user1@example.com","status":{"status":"offline","message":null,"icon":null,"clearAt":null},"mail_send":0,"hide_download":0}, # {"id":"1","share_type":3,"uid_owner":"admin","displayname_owner":"admin","permissions":17,"can_edit":true,"can_delete":true,"stime":1646923228,"parent":null,"expiration":null,"token":"KDSfefYx8cycGoG","uid_file_owner":"admin","note":"","label":"","displayname_file_owner":"admin","path":"\/Photos\/Readme.md","item_type":"file","mimetype":"text\/markdown","has_preview":true,"storage_id":"home::admin","storage":2,"item_source":29,"file_source":29,"file_parent":28,"file_target":"\/Readme.md","share_with":null,"share_with_displayname":"(Shared link)","password":null,"send_password_by_talk":false,"url":"http:\/\/localhost\/s\/KDSfefYx8cycGoG","mail_send":0,"hide_download":0} # ]}} ```