On 2016-07-01 03:30, Ahmed S. Darwish wrote: > Hi David, > > [ Thanks a lot for chiming back in! ] Anytime :-) > > On Fri, Jun 24, 2016 at 05:21:53PM +0200, David Henningsson wrote: >> >> On 2016-06-24 02:30, Ahmed S. Darwish wrote: >>> Hi, >>> >>> Apologies for resurrecting this year-old thread. [*] Hopefully we >>> can finish this, with Flatpak integration as an access-control >>> module, before v10.0 ;-) [1] [2] [3] >>> >>> Some questions below.. >>> >>> On 2015-07-17 13:02, David Henningsson wrote: >>>> >>>> On 2015-04-07 17:13, Wim Taymans wrote: >>>>> This is a new patch series that preplaces the previous patches regarding >>>>> access control. >>>>> >>> ... >>>>> >>>>> There is an example access control module that shows how one could implement >>>>> client specific access control checks. >>>>> >>>> >>> ... >>>> >>>> A few design thoughts that I think we need to resolve first before >>>> reviewing details: >>>> >>>> 1. Coupling between core and native-protocol. Right now the hooks are in >>>> core, and mapped 1-to-1 (or? are there exceptions?) to PA_COMMAND_*. >>>> >>>> Other options would be: >>>> - Just have a "pa_hook access[PA_COMMAND_MAX]" in pa_core instead? >>>> Then we could skip the long list of PA_ACCESS_HOOK_ constants. However, >>>> the increased dependency between the native protocol and the pa_core >>>> object might be undesirable. >>>> - On the other side, we could have the "pa_hook >>>> access[PA_COMMAND_MAX]" in pa_native_protocol instead. However, native >>>> protocol instances could - at least in theory - come and go, so they >>>> probably need stored somewhere more reachable anyhow... >>>> >>>> To sum up, I feel that since the hooks are specific to the native >>>> protocol, they should be put closer to that protocol, but I can't point >>>> to a better place to put it. >>>> >>> >>> After looking at this, isn't protocol-native a right place for >>> the hooks? We're only protecting the protocol-native commands >>> anyway. >>> >>> There's also a precedent in having hooks in pa_protocol_native. >>> Namely at protocol-native.c: >>> >>> struct pa_native_protocol { >>> PA_REFCNT_DECLARE; >>> pa_core *core; >>> ... >>> pa_hook hooks[PA_NATIVE_HOOK_MAX]; // <-- here >>> ... >>> }; >>> >>> pa_hook *pa_native_protocol_hooks(pa_native_protocol *p) { >>> ... >>> return p->hooks; >>> } >>> >>> And modules can get access to the hooks directly using the >>> pa_native_protocol_hooks() accessor above. This is how it's done >>> in module device-manager, module device-restore, and module >>> stream-restore, etc. >>> >>> Anything blocking us from doing the same for the access control >>> hooks? This would indeed save us from the 1-to-1 mapping table. >>> >>> _ at diwic_: You mention that native protocol instances could at >>> least in theory come and go. But if that happened, what would be >>> the dangers of freeing the hooks along with protocol-native and >>> be done with it? In a sense, the access-control hooks themselves >>> won't make any sense without protocol-native anyway? >> >> Suppose the following chain of events: >> >> 1. Protocol-native loads >> 2. Access control module loads, puts hooks into existing protocol-native >> instance >> 3. Protocol-native unloads >> 4. Another Protocol-native loads >> >> At this point the new protocol-native is unprotected, which is probably not >> what you want? >> >> Also we have to make sure we don't get use-after-free errors, no matter >> which order the modules are unloaded. But that's certainly solvable, just an >> additional thing to remember. >> > > Can we solve the above two points by by introducing a pulse module > dependencies feature, just like what the linux kernel does? [1] > > If so, we can do the following: > > (a) Introduce module dependencies > > (b) Put the access-control hooks inside protocol-native itself, > and thus remove the 1-to-1 mappings [2] and avoid making core > dependent on protocol-native (even implicitly) > > (c) Make all policy modules, which contains all the hooks > implementations, hard-dependent on protocol-native > > In the first point raised, to unload protocol-native, user will > have to unload the dependent protocol-native-policy-X first. So if > the user loads protocol-native again, he/she will know that the > policy module will need to be reloaded as well .. > > In the second point raised, hopefully module dependencies will > simplify the relationship: use-after-free errors can be eliminated > given proper cleanup by the policy modules .. > > Any thoughts on this? > Just looking at core.h there seems to be both PA_CORE_HOOK_MODULE_NEW and PA_CORE_HOOK_MODULE_UNLINK hooks, perhaps it could be as simple as just requiring any access control module to listen to these and take the appropriate action? As for whether or not a generic "module dependencies" feature would be good or bad: I would find it more user friendly myself if the user would not have to manually reload access control modules, but since I'm not that involved anymore, I don't think I should have decision power on that matter. :-) > thanks, > > [1] http://man7.org/linux/man-pages/man5/modules.dep.5.html > > [2] For details on the 1-to-1 mapping, check the pa_access_hook > enumerations + these hooks placement inside struct pa_core, > at patch #3 and the map_table[] at patch #4 >