Can the OneNote API copy a notebook or section from one user to another user in Office 365 - onenote

I'm trying to copy section of a notebook, or even notebook itself, from a notebook in one user's OneDrive to another user's notebook in their OneDrive. The user I'm logged in as has permissions to read and write both notebooks. I'm getting the error response:
message=The specified resource ID does not exist.
#api.url=http://aka.ms/onenote-errors#C20102
code=20102
Where the path I'm using is of the form https://www.onenote.com/api/v1.0/users/{id}/notes/sections/{id}/copyToNotebook where the ids in that are for the source section.
which is presumably because the id in the post request represents a notebook under a different user.
If I was copying to a SharePoint site or group then the post request can have additional ids to identify that, so it be logical if there was a argument to identify the user to copy to.
Copying works perfectly when both notebooks are within the same user's OneDrive.
Is there any way of doing it between users in Office 365 OneDrive?

Yes, you can copy a section from one notebook to another user's notebook, as long as you have write permission to that user's notebook (or a notebook under another site).
In you scenario, the destination/post body has to contain the ID to the notebook, as well as the siteCollectionId and siteId, or the groupId of the site where the notebook is stored. (Checkout the message body format here). If you want to copy the section to another user's notebook, you will need the siteCollectionId and siteId of that user's OneDrive for Business; if you want to copy it to a notebook stored in a site, you will need the IDs for that site.
The reason you need those extra IDs is because by default the copy API will consider the destination notebook is stored in your OneDrive for Business. By specifying those IDs you tell the API that the destination is in another location. I'm assuming you didn't provide those IDs that you got the error.
You get get more information about obtaining the siteCollectionId and siteId here.

Related

How can I know or construct the permanent url to a given file

We have an internal application that owns the folders for a given topic; topic subscribers are added as collaborators via the api. When a message to the topic contains an attachment, we upload it to the folder, where is can be accessed by the topic subscribers via a link we show in the rendered message.
The problem we have is partially an organizational issue:
Our users are restricted to shared links of a maximum time frame
This application uses a generic account from which it shares out these files, but there's no way to exclude it from the policy of shared links expiration
Our idea was to get the file url (eg. https://acme.app.box.com/files/0/f/689840703/1/f_17027007623 ) and display that link instead of a shared collaboration. It's not obvious from the documentation how to do so ...
Assuming the URL format doesn't change, you can template it as:
https://acme.app.box.com/files/0/f/$FolderId/1/f_$FileId
$FolderId is already known to you because you're programmatically uploading files to that folder.
$FileId can be derived from the File object that's returned to you as a result of the upload.

Copy a file across Box accounts

I am working on integrating my application with Box. I am providing a way for a user to send files to the server, and the server will upload to a managed enterprise Box account.
I would like to support users who already have a file in Box so that they can select a file from their Box account and transfer it to the server's Box account. I can do this by having the user download the file, upload it to the server, and having the server upload it to its Box account.
It seems silly to download and re-upload the file. Is there a way to simply copy the file from the user account to the server's account (with the user's approval)?
So let's say you have user A and user B. If you want to copy a file from user A's "outbox" folder to user B's "inbox" folder. You can do it one of two ways.
Either user B can make user A a collaborator with Editor access to the "inbox" folder. Then from user A's account they can do the copy API (POST /files//copy documentation here) and "push" the file into B's inbox.
Or
Via a "pull" model. User A can give user B access to their "outbox" folder, and user B can run the copy API, and copy the content to their "inbox" folder.

Google Drive API permission propagation and the File userPermission property

I am not sure if I am experiencing bugs or if I am doing something wrong. I am developing an app that allows users to create and share a folder on their Google Drive so they can collaborate on the contents of the folder. The folder is created at the root of the user's Google Drive and initially contains a couple of files and one sub-folder with more files.
The first issue is that after inserting a new permission on the main folder, the permission will usually propagate down to all the files and sub-folders, but sometimes it fails to insert the permission on one of the files in the sub directory. Is this feature of propagating permissions to sub-directories something that is officially supported or am i suppose to insert a permission into all the files separately?
The second issue I am experiencing involves the use of the File's userPermission property to check if the role of the current user has changed. It seems that the userPermission property sometimes contains the permission of a recent user and not the current user. The feature I am trying to implement is the ability for a user with whom a folder was shared to check periodically if their permission role has changed. For example has the users permission role changed from "reader" to "writer" or vice-versa. This usually works by listing the folder with the fileId and checking the role property of the userPermission property of the file. However if I am testing this feature with both the user who shares and the user with whom it is shared working within the same client, the get file result will often list the userPermission as the last one to access the file and not the current user. I have tested if this was because I was using the wrong oauth information in the request header but I have ruled this possibility out, the oauth headers are correct for each separate call to get file. I added a test call to about witch lists the users permissionId, just before a call to get file to confirm who the authorized user is. Sill the userPermission with the "me" name appears for the wrong user.
The workaround I have found is to use list files which returns the file in the list with the correct userPermission.
In the reference located at https://developers.google.com/drive/v2/reference/files#resource for the description of the userPermission property is "The permissions for the authenticated user on this file."
I am wrong to interpret this to mean the userPermission will always show the role of the current user? And if it is showing the wrong permission, what could be the cause??
userPermission and me represents the current authenticated user, if it's showing the wrong permission you're authenticating the user with the wrong token.
the permission will usually propagate down to all the files and sub-folders
This case may not be true for sub folders and files with their own explicit permissions.
With regard to the first problem, which was that after sharing a folder, only one of its contents would consistently not get shared, I have discovered the cause. The file that was not getting shared is actually a Fusion Tables file and in my script, immediately after inserting the permission, a call is made to insert a new row into the Fusion table file which seems to prevent the permission from being added to that file at that time, or ever. So the workaround I found is to wait a couple of seconds after making the insert permission call, then check that the permission is already in place using a list permission call before calling the Fusion Tables query.
Now with regard to the second problem, this is probably a bug of some sort since I confirmed that I am using the correct oauth token, and by the fact that the workaround I have found works, which is to use a call to list file instead of get file. The only difference is that the file name or other query parameter is required to make the call in addition to the file id. In my case the file object returned with the list file will always contain the correct values in the userPermission field whereas with get file, the userPermission will sometimes contain information for an other user.

Transfer ownership for ALL files in user's google drive - using google-api-java-client and the Drive SDK

We have a google corporate account and need to transfer ALL of a user's google drive files to another account in certain instances. We want to do what is described at the following link for "all files" but programatically via the latest Drive API http://support.google.com/a/bin/answer.py?hl=en&answer=1247799
We are currently using the following API version(s) below, coupled with domain wide authority delegation as described at https://developers.google.com/drive/delegation and are able to see a user's files, iterate over them etc.
google-api-services-drive 1.14.2-beta
google-api-client 1.14.1-beta
My question is this: it appears that the only way to change permissions is by fileId by fileId etc. Instead of having to traverse and iterate over an entire set of user's files, if we just want to transfer ALL of a user's files to another particular user: is there a way in the API to do this (ownership transfer for ALL files) rather than individual requests file/by file?
Also when transferring ownershisp, must the transferee be in the same #domain or can it be another #domain we manage? I read somewhere that you can only transfer to owners in the same domain. Does this still hold true? For instance we manage #myCompany.com and have our corporate account registered under that, however that shell account has several sub-domains within it. We would like to transfer files from users in the sub-domains to a central user in the #myCompany domain.
You need to change permissions file by file, there is no updateAll type of functionality at the moment.
You cant transfer the ownership to another domain's user. Ownership can only be transferred to another user in the same domain as the current owner.
This answer doesn't directly answer your question, but it could be helpful for both you and future visitors.
As of now, you can mass transfer files to new users with Google's new Admin console. It doesn't let you filter for specific folders, but it does allow you to transfer all of one user's Drive files to a second user.
I know you were trying to create something which uses the API to iterate through folders and files, and you probably have a very specific use-case in mind. However, in the case where you have employees leaving, or you need to transfer everything, using the following method is fast and simple.
Open the Google Admin console
Go to Google Apps > Drive
Click on "Transfer ownership"
Fill out both user fields and submit
This process will even email both users once the process is completed.
You can do this with a single call to the Data Transfer API
Exactly what is needed but only with API!
Open the Google Admin console
Go to Google Apps > Drive
Click on "Transfer ownership"
Fill out both user fields and submit
This process will even email both users once the process is completed.
If this is not possible via API calls, then there is no point deleting a user using API.

How to transfer shared files of user who leaves a google domain? (impersonate user)?

I've noticed the doclist api has become deprecated and I'm trying to transfer shared files from 1 user to another.
In Doclist(depricated):
https://developers.google.com/google-apps/documents-list/#using_google_apps_administrative_access_to_impersonate_other_domain_users
Example :
Employee A: Stopped working at the company.
Employee B: New owner of Employee A's files.
Employee C:Admin
I know the admin(User C) has a menu where he can transfer the ownership of the files from user A to user B. But this does not transfer the files that used to be shared with user A.
I would like to make an application wich transfers the files shared with user A and shares them to user C. This has to be done by the admin(user C).
I already know how to transfer the ownership if user A is logged on. But in most cases this is not possible.
*I would like to know if there's a way to get the files shared with user A to be shared with user B without authenticating user A?*
If files are shared with User A, it should be the owner or other editors that share the file with user B again. If user A is only reader on a file, user A can't re-share the file. Also if the owner of the file set the sharing permissions not to allow editors to share the file again, user A could not share the file.
The best way to resolve this would be by procedure:
If the files are shared using folders or groups, swap out user A for user B
If you can logon as user A, run a script to create a listing of all documents shared with A and share this listing with B and have B request access to the documents from the document owners.
The technical option to do this, which is quite nasty, is to write some code (i.e. in Java) that:
impersonates the user using a service account (some sample code here:
Google Drive service account returns 403 usageLimits),
get all the files
(https://developers.google.com/drive/v2/reference/files/list),
determine the owner
impersonate every owner to reshare the file with the user (https://developers.google.com/drive/v2/reference/permissions/update)