28 #include <core/dbus/object.h>
29 #include <core/dbus/property.h>
30 #include <core/dbus/stub.h>
31 #include <core/dbus/asio/executor.h>
33 namespace dbus = core::dbus;
34 namespace media = core::ubuntu::media;
40 object(
impl->access_service()->add_object_for_path(session)),
44 object->get_property<mpris::Player::Properties::CanPlay>(),
45 object->get_property<mpris::Player::Properties::CanPause>(),
46 object->get_property<mpris::Player::Properties::CanSeek>(),
47 object->get_property<mpris::Player::Properties::CanControl>(),
48 object->get_property<mpris::Player::Properties::CanGoNext>(),
49 object->get_property<mpris::Player::Properties::CanGoPrevious>(),
50 object->get_property<mpris::Player::Properties::IsVideoSource>(),
51 object->get_property<mpris::Player::Properties::IsAudioSource>(),
52 object->get_property<mpris::Player::Properties::PlaybackStatus>(),
53 object->get_property<mpris::Player::Properties::LoopStatus>(),
54 object->get_property<mpris::Player::Properties::PlaybackRate>(),
55 object->get_property<mpris::Player::Properties::Shuffle>(),
56 object->get_property<mpris::Player::Properties::MetaData>(),
57 object->get_property<mpris::Player::Properties::Volume>(),
58 object->get_property<mpris::Player::Properties::Position>(),
59 object->get_property<mpris::Player::Properties::Duration>(),
60 object->get_property<mpris::Player::Properties::MinimumRate>(),
61 object->get_property<mpris::Player::Properties::MaximumRate>()
65 object->get_signal<mpris::Player::Signals::Seeked>(),
66 object->get_signal<mpris::Player::Signals::EndOfStream>(),
67 object->get_signal<mpris::Player::Signals::PlaybackStatusChanged>()
75 auto reply = dbus::Message::make_method_return(msg);
76 impl->access_bus()->send(reply);
82 auto reply = dbus::Message::make_method_return(msg);
83 impl->access_bus()->send(reply);
89 auto reply = dbus::Message::make_method_return(msg);
90 impl->access_bus()->send(reply);
100 auto reply = dbus::Message::make_method_return(msg);
101 impl->access_bus()->send(reply);
107 auto reply = dbus::Message::make_method_return(msg);
108 impl->access_bus()->send(reply);
114 in->reader() >> ticks;
115 impl->seek_to(std::chrono::microseconds(ticks));
117 auto reply = dbus::Message::make_method_return(in);
118 impl->access_bus()->send(reply);
128 in->reader() >> texture_id;
129 impl->create_video_sink(texture_id);
131 auto reply = dbus::Message::make_method_return(in);
132 impl->access_bus()->send(reply);
137 auto bus = std::shared_ptr<dbus::Bus>(
new dbus::Bus(core::dbus::WellKnownBus::session));
138 bus->install_executor(dbus::asio::make_executor(bus));
140 auto stub_service = dbus::Service::use_service(bus, dbus::traits::Service<core::Apparmor>::interface_name());
141 apparmor_session = stub_service->object_for_path(dbus::types::ObjectPath(
"/org/freedesktop/DBus"));
144 if (result.is_error())
146 std::cout <<
"Error getting apparmor profile: " << result.error().print() << std::endl;
147 return std::string();
150 return result.value();
155 if (context.empty() || uri.empty())
157 std::cout <<
"Client denied access since context or uri are empty" << std::endl;
161 if (context ==
"unconfined")
163 std::cout <<
"Client allowed access since it's unconfined" << std::endl;
167 size_t pos = context.find_first_of(
'_');
168 if (pos == std::string::npos)
170 std::cout <<
"Client denied access since it's an invalid apparmor security context" << std::endl;
174 const std::string pkgname = context.substr(0, pos);
175 std::cout <<
"client pkgname: " << pkgname << std::endl;
176 std::cout <<
"uri: " << uri << std::endl;
179 if (uri.find(std::string(
".local/share/" + pkgname +
"/")) != std::string::npos
180 || uri.find(std::string(
".cache/" + pkgname +
"/")) != std::string::npos)
182 std::cout <<
"Client can access content in ~/.local/share/" << pkgname <<
" or ~/.cache/" << pkgname << std::endl;
185 else if (uri.find(std::string(
"opt/click.ubuntu.com/")) != std::string::npos
186 && uri.find(pkgname) != std::string::npos)
188 std::cout <<
"Client can access content in own opt directory" << std::endl;
191 else if ((uri.find(std::string(
"/system/media/audio/ui/")) != std::string::npos
192 || uri.find(std::string(
"/android/system/media/audio/ui/")) != std::string::npos)
193 && pkgname ==
"com.ubuntu.camera")
195 std::cout <<
"Camera app can access ui sounds" << std::endl;
203 else if ((pkgname ==
"com.ubuntu.music" || pkgname ==
"com.ubuntu.gallery") &&
204 (uri.find(std::string(
"Music/")) != std::string::npos
205 || uri.find(std::string(
"Videos/")) != std::string::npos
206 || uri.find(std::string(
"/media")) != std::string::npos))
208 std::cout <<
"Client can access content in ~/Music or ~/Videos" << std::endl;
211 else if (uri.find(std::string(
"http://")) != std::string::npos
212 || uri.find(std::string(
"rtsp://")) != std::string::npos)
214 std::cout <<
"Client can access streaming content" << std::endl;
219 std::cout <<
"Client denied access to open_uri()" << std::endl;
226 auto reply = dbus::Message::make_method_return(in);
227 reply->writer() <<
impl->key();
228 impl->access_bus()->send(reply);
239 auto reply = dbus::Message::make_method_return(in);
241 reply->writer() <<
impl->open_uri(uri);
243 reply->writer() <<
false;
244 impl->access_bus()->send(reply);
252 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::CanPlay>>
can_play;
253 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::CanPause>>
can_pause;
254 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::CanSeek>>
can_seek;
255 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::CanControl>>
can_control;
256 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::CanGoNext>>
can_go_next;
257 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::CanGoPrevious>>
can_go_previous;
258 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::IsVideoSource>>
is_video_source;
259 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::IsAudioSource>>
is_audio_source;
261 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::PlaybackStatus>>
playback_status;
262 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::LoopStatus>>
loop_status;
263 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::PlaybackRate>>
playback_rate;
264 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::Shuffle>>
is_shuffle;
266 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::Volume>>
volume;
267 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::Position>>
position;
268 std::shared_ptr<core::dbus::Property<mpris::Player::Properties::Duration>>
duration;
275 typedef core::dbus::Signal<mpris::Player::Signals::Seeked, mpris::Player::Signals::Seeked::ArgumentType>
DBusSeekedToSignal;
276 typedef core::dbus::Signal<mpris::Player::Signals::EndOfStream, mpris::Player::Signals::EndOfStream::ArgumentType>
DBusEndOfStreamSignal;
277 typedef core::dbus::Signal<mpris::Player::Signals::PlaybackStatusChanged, mpris::Player::Signals::PlaybackStatusChanged::ArgumentType>
DBusPlaybackStatusChangedSignal;
279 Signals(
const std::shared_ptr<DBusSeekedToSignal>& seeked,
280 const std::shared_ptr<DBusEndOfStreamSignal>& eos,
281 const std::shared_ptr<DBusPlaybackStatusChangedSignal>& status)
292 seeked_to.connect([
this](std::uint64_t value)
322 const core::dbus::types::ObjectPath& session_path)
324 d(new
Private{
this, session_path})
326 d->object->install_method_handler<mpris::Player::Next>(
329 std::placeholders::_1));
330 d->object->install_method_handler<mpris::Player::Previous>(
333 std::placeholders::_1));
334 d->object->install_method_handler<mpris::Player::Pause>(
337 std::placeholders::_1));
338 d->object->install_method_handler<mpris::Player::Stop>(
341 std::placeholders::_1));
342 d->object->install_method_handler<mpris::Player::Play>(
345 std::placeholders::_1));
346 d->object->install_method_handler<mpris::Player::Seek>(
349 std::placeholders::_1));
350 d->object->install_method_handler<mpris::Player::SetPosition>(
353 std::placeholders::_1));
354 d->object->install_method_handler<mpris::Player::CreateVideoSink>(
357 std::placeholders::_1));
358 d->object->install_method_handler<mpris::Player::Key>(
361 std::placeholders::_1));
362 d->object->install_method_handler<mpris::Player::OpenUri>(
365 std::placeholders::_1));
374 return *d->properties.can_play;
379 return *d->properties.can_pause;
384 return *d->properties.can_seek;
389 return *d->properties.can_go_previous;
394 return *d->properties.can_go_next;
399 return *d->properties.is_video_source;
404 return *d->properties.is_audio_source;
409 return *d->properties.playback_status;
414 return *d->properties.loop_status;
419 return *d->properties.playback_rate;
424 return *d->properties.is_shuffle;
429 return *d->properties.meta_data_for_current_track;
434 return *d->properties.volume;
439 return *d->properties.position;
444 return *d->properties.duration;
449 return *d->properties.minimum_playback_rate;
454 return *d->properties.maximum_playback_rate;
459 return *d->properties.loop_status;
464 return *d->properties.playback_rate;
469 return *d->properties.is_shuffle;
474 return *d->properties.volume;
479 return *d->properties.position;
484 return *d->properties.duration;
489 return *d->properties.playback_status;
494 return *d->properties.can_play;
499 return *d->properties.can_pause;
504 return *d->properties.can_seek;
509 return *d->properties.can_go_previous;
514 return *d->properties.can_go_next;
519 return *d->properties.is_video_source;
524 return *d->properties.is_audio_source;
530 return *d->properties.meta_data_for_current_track;
535 return *d->properties.minimum_playback_rate;
540 return *d->properties.maximum_playback_rate;
545 return d->signals.seeked_to;
550 return d->signals.seeked_to;
555 return d->signals.end_of_stream;
560 return d->signals.end_of_stream;
565 return d->signals.playback_status_changed;
core::dbus::Bus::Ptr the_session_bus()