Hi Pearl,

Thanks that helped a lot! Although the ListResourceDetailsCmd does not have a 
ResponseView, I was able to use the calling context and check the requested 
resourcetype to specifically deny access if not a root admin. This seems to 
work well in some light testing and is a good approach to the problem I think.

Thanks again!

Tom.

> On Oct 22, 2024, at 14:32, Pearl d'Silva <pearl.dsi...@shapeblue.com> wrote:
> 
> Hi Tom,
> 
> You could try using the logic : 
> https://github.com/apache/cloudstack/blob/main/server/src/main/java/com/cloud/api/query/QueryManagerImpl.java#L1159-L1165.
> Essentially, there are 2 response views - Restricted and Full, and based on 
> the user role, you could set the appropriate response view . This way you 
> should be able to hide ObjectStoreDetails from being returned for users who 
> aren't Root Admin.
> 
> 
> Hope this helps.
> 
> Regards,
> Pearl
> 
> 
> 
> 
> 
> 
> 
> ________________________________
> From: Tom O'Dowd <tpod...@cloudian.com.INVALID>
> Sent: October 22, 2024 1:06 AM
> To: dev@cloudstack.apache.org <dev@cloudstack.apache.org>
> Subject: Re: Updating Object Store Configuration
> 
> Hi guys,
> 
> Really could do with some feedback here.
> 
> I got editing object store details working fully. However, I think there is a 
> problem regarding permissions. I am using the `ListResourceDetailsCmd` API. 
> Using this API from the vue file, I can get the details that I need and 
> provide a way to edit them.
> 
> However, it seems that the `ListResourceDetailsCmd` API can by ANY user and 
> not just administrators. This is a problem as objectStoreDetails are 
> sensitive and contain secrets. My question is:
> 
> 1. Is there a way to restrict ObjectStoreDetails to only when an admin calls 
> the API? If so, can you explain that here so I can try it out?
> 
> 2. If not, then I guess I’ll disable ObjectStoreDetails from being returned 
> by ListResourceDetailsCmd and instead I’ll create another admin API to get 
> the ObjectStoreDetails. I presume this sounds ok?
> 
> Thanks,
> 
> Tom.
> 
>> On Oct 17, 2024, at 21:51, Tom O'Dowd <tpod...@cloudian.com> wrote:
>> 
>> I spent more time trying to understand the code today. What I said before 
>> was an incorrect understanding of what was happening. Anyway, I found an API 
>> called `ListResourceDetailsCmd` which I can call with a resourceid of the 
>> object store and a resourcetype of ‘objectstore’. This doesn’t work out of 
>> the box but just a few changes and I was able to get it to return details 
>> for the particular object store.
>> 
>> My question however is if it is ok to do this as looking at the signature of 
>> ListResourceDetailsCmd, it doesn’t seem to have any setting values for 
>> authorized… this implies I think that anyone can call this API and not just 
>> Admins? If this is true, then maybe I should not add support for 
>> ObjectStorageDetails via the ListResourceDetailsCmd as authorization 
>> information is kept there and it would be better to have a custom API that 
>> is only allowed by the admin to retrieve this information. Or should 
>> ListResourceDetailsCmd actually be more restricted? I’m not clear what all 
>> the use cases are for what this API is used for. Actually, I didn’t find any 
>> users of the API in the UI code so maybe it would be no harm to lock it 
>> down? Please advise.
>> 
>> Then again, I also noticed that none of the API commands for objectstorage 
>> pools currently restrict the roles that can call those APIs? I do think the 
>> default is open so perhaps this is wrong and I can also fix that.
>> 
>> Another question. the interface for the driver has a listBuckets() function:
>> 
>> public interface ObjectStoreDriver extends DataStoreDriver {
>> ...
>>    List<Bucket> listBuckets(long storeId);
>> ...
>> }
>> 
>> I can only find 1 caller to this function and that is from the 
>> UpdateObjectStoragePoolCmd API call which uses that driver function to 
>> validate the new URL (and soon other settings)… I’m not sure what the 
>> original purpose of that command is but there is no real reason to return a 
>> list of buckets to validate if the storage is working. My idea is to add a 
>> new “lighter” function called something like
>> 
>>   boolean isConnectionValid(long storeId);
>> 
>> This is more obviously named in its purpose and should provide a better 
>> check of the different parts of the system that the updated settings cover. 
>> For HyperStore for example, I need to validate connectivity to 3 urls (2 of 
>> which I don’t use to listBuckets).
>> 
>> Thanks,
>> 
>> Tom.
>> 
>>> On Oct 11, 2024, at 21:15, Tom O'Dowd <tpod...@cloudian.com> wrote:
>>> 
>>> Hi Vishesh/all,
>>> 
>>> I had a go at this but I need a bit of help/guidance I think.
>>> 
>>> I figured out how to create and hook in a updateObjectStorage.vue file. I 
>>> wanted to get a basic one working first.
>>> 
>>> The issue I’m having next is I cannot get the “details” map out to the GUI 
>>> as part of UpdateObjectStoragePoolCmd.java as that command is defined like 
>>> this:
>>> 
>>> @APICommand(name = UpdateObjectStoragePoolCmd.APINAME, description = 
>>> "Updates object storage pool", responseObject = ObjectStoreResponse.class, 
>>> entityType = {ObjectStore.class},
>>>        requestHasSensitiveInfo = false, responseHasSensitiveInfo = false, 
>>> since = "4.19.0")
>>> public class UpdateObjectStoragePoolCmd extends BaseCmd {
>>>    public static final String APINAME = "updateObjectStoragePool";
>>> 
>>> 
>>> The key here seems to be the EntityType which is ObjectStore.class.
>>> 
>>> If I understand correctly, that is an interface that only has the basic 
>>> properties such as name, providerName, url, id. So even if I add a map 
>>> parameter to the API, I think that will only be for when the api is called 
>>> to update?
>>> 
>>> If I log the resource in the js console I get:
>>> 
>>> this.resource:  Proxy(Object) {id: 'fcad9cc0-7985-483b-aa31-988a03815db6', 
>>> name: 'Cloudian', url: 'https://s3-admin.name.or.jp:19443', providername: 
>>> 'Cloudian HyperStore', key: 0}
>>> 
>>> What should I do to get the details map? Perhaps there are 3 ways?
>>> 1. Add details (yuck?) to ObjectStore?
>>> 2. Create another type of object just for this?
>>> 3. Call another API that pulls the details from the vue script on loading - 
>>> involves creating another API for this also?
>>> 
>>> I’m not really a front end guy so struggling with the js/vue stuff also but 
>>> am making my way through it. Also just looking at the API stuff for the 
>>> first time so new to that also.
>>> 
>>> Any help appreciated.
>>> 
>>> Tom.
>>> 
>>>> On Oct 10, 2024, at 17:47, Vishesh Jindal <vishesh.jin...@shapeblue.com> 
>>>> wrote:
>>>> 
>>>> Hi Tom,
>>>> 
>>>> This is the right place for the discussion.
>>>> 
>>>> I think what you are suggesting makes sense. If the user wants to update 
>>>> the accessKey and secretKey, it should be allowed.
>>>> 
>>>> We can create a validation function for the Storage Plugins as per the 
>>>> selected provider to validate the details map. And if for some reason, the 
>>>> provider doesn't support the update for a particular key, the request will 
>>>> fail.
>>>> 
>>>> If you raise a PR for the changes, I can review it.
>>>> 
>>>> Regards
>>>> Vishesh
>>>> 
>>>> 
>>>> 
>>>> 
>>>> ________________________________
>>>> From: Tom O'Dowd <tpod...@cloudian.com.INVALID>
>>>> Sent: Thursday, October 10, 2024 11:02 AM
>>>> To: dev@cloudstack.apache.org <dev@cloudstack.apache.org>
>>>> Subject: Updating Object Store Configuration
>>>> 
>>>> I have a question about updating the Object Store Information.
>>>> 
>>>> The current code only allows updating either the Name or the Object Store 
>>>> URL.
>>>> 
>>>> https://github.com/apache/cloudstack/blame/d6181d542108d02cca31daa758234bb29e1b317a/server/src/main/java/com/cloud/storage/StorageManagerImpl.java#L4180
>>>> 
>>>> I think it is necessary to also update the other fields, namely accessKey 
>>>> and secretKey of the admin user of the different object stores. Currently 
>>>> there is no way to update them. I’m sure MinIO and Ceph will need this as 
>>>> well as Cloudian.
>>>> 
>>>> For our Cloudian implementation I would also like to be able to update 
>>>> other store details which are the S3 URL and the IAM URL and whether or 
>>>> not the SSL Certificate should be validated.
>>>> 
>>>> When the object store is first created, this information is sent in a 
>>>> “details” map. Therefore, it might make sense to ask the object store that 
>>>> is being updated for its “details" Map, the GUI can be changed to allow 
>>>> editing these and new details then passed back to this method which asks 
>>>> the object store to set and validate them (rather than what it is doing 
>>>> here where the update method itself is actually updating the store with 
>>>> potentially bad data, then checking if it works before reverting it on 
>>>> failure.
>>>> 
>>>> So something like:
>>>> 
>>>> User clicks Edit Object Storage
>>>> GUI requests Object Storage Info (url, name, details map etc)
>>>>     (should ask the Object Storage Implementation for its configuration 
>>>> information new function - details map)
>>>>     displays the fields appropriate to the providerName (similar to create 
>>>> Object Storage) using the details map.
>>>> When GUI updates, the details map is also posted along with the URL and 
>>>> name.
>>>> a new Object Storage Implementation update configuration function is 
>>>> called which validates and saves the information if good.
>>>> 
>>>> Anyway this probably needs some kind of formal discussion to make 
>>>> progress? Is that this thread or does that happen elsewhere?
>>>> 
>>>> Thanks,
>>>> 
>>>> Tom.
>>>> 
>>>> 
>>> 
>> 
> 

Reply via email to