Git Product home page Git Product logo

appanvil's Issues

Seperate allow and deny rules

Is your feature request related to a problem? Please describe.
Currently, we show allow rules and deny rules in the same table in the Profile Modify page. This is a problem, because it could potentially confuse users and make them think certain permissions are granted, that are actually prohibited.

Describe the solution you'd like
We could add a column to the beginning of the table, that lists whether the rule is allow or deny. This could be a combobox, which would allow the user to change the rule type easier.

Alternatively, we could separate allow and deny rules into separate tables. This would further distinguish these different types of rules.

The tradeoffs between the two rule types could be: space, adding an extra column would take valuable horizontal space; flexibility, adding an extra table would make it harder to switch rule types and make it impossible to compare allow rules with deny rules.

Additional context
By default, AppArmor File Rules grant access to specific files. These are called allow rules. Optionally, you can prefix "deny" to a rule to prevent access to a resource. These are called deny rules

An example of a deny rule could be: deny /var/log/syslog r.
This would prevent a process from reading the syslog, even if this was allowed by another rule.

DispatcherMiddleman has a data race

Describe the bug
The dispatcher_middleman class is used to communicate between the second thread (that calls commands) and the main GUI thread. Currently, if the second thread calls any update command twice before the main thread is able to run handle_signal, then the data from the first update call is overwritten and never used.

To Reproduce
Steps to reproduce the behavior:

  1. Make the unit tests
  2. Run ./dist/appanvil_test
  3. Examine the results of DispatcherMiddlemanTest.UPDATE_PROFILES_PROCESSES_INTERLOCKING

Expected behavior
Whenever an update method is called from a second thread of dispatcher_middleman, we expect that
whenever the main thread runs handle_signal, it is able to see the data that was saved in the update method.

Instead of using two variables to store data, we should use a blocking_queue to store the data from each update call. Then,
in the handle_signal method, we can pop the data from the queue and use this. We may be even able to remove the mutex from dispatcher_middleman using this approach.

Additional context
This bug is unlikely to ever present itself in a practical situation, but eventually be fixed. This can happen if the Main thread sends two commands, then waits for a while before finally running handle_signal. With the current state of the code, we rarely send two commands to console_thread in quick succession like this.

Fix incorrectly parsed logs

Describe the bug
Certain types of logs are not being parsed correctly. For example, logs of the DENIED type often display the profile and status in the wrong column. We should improve how logs are parsed to fix this bug.

To Reproduce
Steps to reproduce the behavior:

  1. Start AppAnvil
  2. Open the Logs tab
  3. Click on the magnifying glass, and type: DENIED
  4. Observe the incorrectly parsed logs

Expected behavior
The relevant profile name should be listed for each row in the 'Name' column. It may be fine to leave the 'Status' row empty for these logs.

Screenshots
Here is a screenshot of the incorrectly parsed logs:
image

For reference, here is a screenshot of correctly parsed logs:
image

Additional context
I believe this issue has existed since the Logs tab was first created.

Allow addition/deletion of Profile rules

Is your feature request related to a problem? Please describe.
Currently there is no way to add/delete rules from the "Profile Modify" page. Users need a way to add/remove abstractions and file rules from a profile.

Describe the solution you'd like
I imagine that there could be buttons at the bottom of the screen for adding/deleting a row from the table.

When the delete button is clicked, it should show a popup which will confirm that the user wants to delete a particular rule.
When the add button is clicked, it should show a popup with a form that allows the user to configure the new rule.

Describe alternatives you've considered
We could additionally trigger addition/deletion operations with accelerator keys. For example, we may want to trigger the deletion popup when the user presses backspace and a row is selected. We could allow inserting a row if the 'i' key is pressed

Additional context
I first mentioned this problem in #56

Finish progress on 'Modify Profile'

Is your feature request related to a problem? Please describe.
The goal of the 'Modify Profile' page is to allow users to visualize and configure the permissions for individual profiles on their system. Currently, the page shows information about abstractions and file rules. However, no changes are actually saved to a profile.

Describe the solution you'd like
When the user makes a change to a profile, it should either: save the change immediately and update the profile (allowing the user to undo the change), or have an apply/save button that triggers the update. This update would prompt the user through pkexec.

Additional context
One reason why this has taken a while, is that performing these actions require super-user permissions. For previous issues, we have used pkexec to call aa-caller when prompting the user for permission, but that would be difficult here, because we want the permission to write an arbitrary string to a file. This would be a little annoying to do through aa-caller, even if it is our best approach.

Improve automatic formatting

Is your feature request related to a problem? Please describe.
Currently, we are using clang-format to automatically format our code. Unfortunately, the version provided by Ubuntu LTS is very outdated (Version 10.0). Furthermore, the settings specified in .clang-format are very poor. The auto-formatted code can look very gross, especially with initialization lists, and other one-liners.

Describe potential solutions
We should probably move to a newer version of clang-format (or another code formatting tool). We use a git submodule and compile the tool, but that seems gross. Probably the best solution is to tell the user to build clang-format from source, if they want to use it.

We could alternatively use another formatting tool like astyle.

Whatever solution we take, we will want to create a GitHub action which either updates the code to match formatting, or to check if code is updated.

Long load times for logs

Describe the bug
The Logs tab usually takes a while to load (and refresh). This is because it calls journalctl every 5 seconds to parse all the system logs.

To Reproduce
Steps to reproduce the behavior:

  1. Build and run AppAnvil
  2. Click on the Logs tab on the top of the screen
  3. Observe that it takes a significant amount of time for the logs to load

Expected behavior
The Logs tab should display some information relatively quickly, within a couple of seconds. We also don't need to refresh the entire cache of logs every few seconds. We only really need to check for the next set of logs, that might've been sent in the time since the last refresh.

Additional context
We could also parse the logs in batches. For example, we may be able to add logs in batches of 1,000.

Fix issues reading auditd logs

In #80, we also talked about current issues reading auditd logs. This should be investigated further, to discover the exact issue.

We should also consider restoring the implementation of journalctl and activating that implementation when appropriate (taking care to avoid duplicate log entries).

Fix 'Load Profile' page

Describe the bug
Currently, the Load Profile page withing the Profiles tab does not work. It allows you to select a file, but that file will never actually be loaded as a profile.

Really we need to overhaul the entire page to make it more user friendly, but this bug should (hopefully) be straightforward to fix.

To Reproduce
Steps to reproduce the behavior:

  1. Create or download a profile manually on your system
  2. Open AppAnvil
  3. Go to Load Profile in the Profiles tab
  4. Select a file using the File Chooser button
  5. Click Apply profile to system
  6. Observe that nothing happens

Expected behavior
There should be some sort of feedback when the Apply Profile button is pressed, regardless if it was successful or not. Furthermore, the button should actually copy and enable the profile, which it doesn't for some reason.

Honestly, I think the UI for this page needs to be overhauled, but I'll save that for a separate issue.

Additional context
This issue affects all distributions I tested.

Fails to build

Describe the bug
AppAnvil fails to install.

To Reproduce

  1. Install Dependencies for both libappanvil and appanvil
  2. Install libappanvil
  3. Run cmake . in appanvil directory.

Expected behavior
Program installs

System
OS: ArchLinux
AppAnvil version commit hash: de8b071
libappanvil version commit hash: 52a071232483d17d4e3c171e79529422934979ce

Instead, it errors with this error:
error.log

Can't build. Please help

HI. I am very interested in your project. But I can't build it on Arch from AUR.
libappanvil builts ok, but appanvil fails

/usr/src/debug/appanvil-git/AppAnvil/src/tabs/controller/profile_modify_controller.cc:124:(.text.unlikely+0x12b7): undefined reference to AppArmor::Tree::FileMode::getExecuteMode[abi:cxx11]() const' /usr/bin/ld: /tmp/ccggFwdE.ltrans3.ltrans.o: in function ProfileModifyController::handle_file_rule_changed(std::__cxx11::basic_string<char, std::char_traits, std::allocator > const&) [clone .cold]':
/usr/include/libappanvil/tree/FileRule.hh:10:(.text.unlikely+0x137e): undefined reference to vtable for AppArmor::Tree::FileRule' /usr/bin/ld: /tmp/ccggFwdE.ltrans3.ltrans.o: in function ProfileModifyController::handle_file_rule_changed(std::__cxx11::basic_string<char, std::char_traits, std::allocator > const&) [clone .cold]':
/usr/include/libappanvil/tree/RuleNode.hh:16:(.text.unlikely+0x14ae): undefined reference to vtable for AppArmor::Tree::RuleNode' /usr/bin/ld: /tmp/ccggFwdE.ltrans4.ltrans.o: in function ProfileModifyImplAppArmor::Parser::update_profile_text()':
/usr/src/debug/appanvil-git/AppAnvil/src/tabs/view/profile_modify.cc:49:(.text+0x1409): undefined reference to AppArmor::Parser::operator std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >() const' /usr/bin/ld: /tmp/ccggFwdE.ltrans4.ltrans.o: in function ProfileModifyImplAppArmor::Parser::handle_raw_profile_text_change()':
/usr/src/debug/appanvil-git/AppAnvil/src/tabs/view/profile_modify.cc:56:(.text+0x1821): undefined reference to AppArmor::Parser::operator std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >() const' /usr/bin/ld: /tmp/ccggFwdE.ltrans4.ltrans.o: in function ProfileModifyImplAppArmor::Parser::apply_raw_profile_text_change()':
/usr/src/debug/appanvil-git/AppAnvil/src/tabs/view/profile_modify.cc:67:(.text+0x19e6): undefined reference to AppArmor::Parser::updateFromString(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)' /usr/bin/ld: /tmp/ccggFwdE.ltrans4.ltrans.o: in function Profiles::handle_modify_profile_toggle()':
/usr/src/debug/appanvil-git/AppAnvil/src/tabs/view/profile_modify.cc:93:(.text+0x936c): undefined reference to AppArmor::Tree::ProfileRule::name[abi:cxx11]() const' /usr/bin/ld: /usr/src/debug/appanvil-git/AppAnvil/src/tabs/view/profile_modify.cc:43:(.text+0x978f): undefined reference to AppArmor::Parser::hasChanges()'
/usr/bin/ld: /tmp/ccggFwdE.ltrans5.ltrans.o: in function void std::__cxx11::list<AppArmor::Tree::ProfileRule, std::allocator<AppArmor::Tree::ProfileRule> >::_M_assign_dispatch<std::_List_const_iterator<AppArmor::Tree::ProfileRule> >(std::_List_const_iterator<AppArmor::Tree::ProfileRule>, std::_List_const_iterator<AppArmor::Tree::ProfileRule>, std::__false_type) [clone .isra.0]': /usr/include/libappanvil/tree/ProfileRule.hh:10:(.text+0x545e): undefined reference to vtable for AppArmor::Tree::ProfileRule'
/usr/bin/ld: warning: creating DT_TEXTREL in a PIE
collect2: error: ld returned 1 exit status
make[2]: *** [CMakeFiles/appanvil.dir/build.make:558: dist/appanvil] Error 1
make[1]: *** [CMakeFiles/Makefile2:148: CMakeFiles/appanvil.dir/all] Error 2
make: *** [Makefile:166: all] Error 2
==> ERROR: A failure occurred in package().
Aborting...
error: failed to build 'appanvil-git-r619.2df0101-1':

IT's something in code or Makefile. Please help fix it

Cross-distribution testing with GitHub Actions

Is your feature request related to a problem? Please describe.
The workflows for GitHub actions only build and test our code on Ubuntu 20.04 LTS. We would like to test the code across a variety of distributions that include AppArmor.

Describe the solution you'd like
It would be nice if we could specify other Linux distributions directly in the workflow. However according to this documentation, GitHub only provides flavors of Ubuntu. We could get around this by installing docker in the workflow, and building AppAnvil inside a container.

We may also be able to save the state of a docker container and reuse it across workflows.

Describe alternatives you've considered
We could also use tools like LXD or systemd-nspawn, but they are less popular and do not seem to provide any extra benefit in this case.

Additional context
We will want to develop integration tests to better verify when builds are successful.

Create .desktop file

Is your feature request related to a problem? Please describe.
This was recently mentioned to me by @54m43lJ, but it would probably be a good time to create a .desktop file for our application. A desktop entry would allow users to start AppAnvil from their application menu, instead of just the command-line.

A while ago, I experimented with creating a .desktop file for AppAnvil, but didn't spend enough time to refine it for the repository. I can't seem to find this work, and starting from scratch wouldn't be very difficult.

Describe the solution you'd like
We would need to create a .desktop file (put it in ./resources) and have it automatically configured/installed by CMake.

We could also use the configure_file() function of CMake to automatically configure this file to point to AppAnvil's install location, which could be different depending on CMAKE_INSTALL_PREFIX.

We could also use the install() function of CMake to copy the file over to the correct directory. However, different distributions might handle installing desktop files differently. We could also look into using something like the desktop-file-install command.

Improve timestamps

Is your feature request related to a problem? Please describe.
Currently, the timestamps in the Logs tab are displayed in a format similar to ISO 8601: yyyy-MM-dd HH:mm:ss

We put it in this format because it is the easiest to sort. However, I personally find it difficult to read.

Describe the solution you'd like
Ideally, the timestamps would be in a localized format, or some other format which is more legible. If we cannot localize timestamps, we might want to continue using a 24 hour clock, because that seems more widespread in most parts of the world.

Regardless of the chosen format, we would want to ensure that the sorting behavior for the column does not change.

Additional context
Implementers may have to change the format_timestamp() function in log_adapter.cc, or move it to status_column_record.cc. Additionally, they may consider creating a new ColumnType in column_header.h and a custom CellRenderer in status_column_record.cc similar to what we did for the LogEntry type.

Add help information for "Profile Modify"

Is your feature request related to a problem? Please describe.
Previously, in #58 we created a popup box which will give (hopefully) helpful information when the user presses the "Help" button. Currently, no additional help information is given for the "Profile Modify" page, despite it being rather complicated.

Describe the solution you'd like
Ideally, help information should be tailored to each section of the "Profile Modify" page. It should explain what abstractions and file rules are. Additionally, it should explain the difference between allow/deny file rules, the different types of execute permissions, and what link/lock permissions are.

Additional context
Much of this information can be found through man apparmor.d or the Arch wiki, but we want to minimize the amount of outside research required to understand our application.

Status.filter has unexpected behavior

Describe the bug
Status.filter has unexpected behavior when use_regex == true and match_case == false.

Currently, in order to ignore case when filtering base on some rule: we convert the rule to lower case, before matching it to our rule. This approach does not always work when using regular expressions as our rule.

For example, the regular expression "\S{8}" matches any non-whitespace-character 8 times, while "\s{8}" matches any non-whitespace-character 8 times. The current approach to ignoring cases converts \S{8} to \s{8} which changes the meaning of the regular expression in an unexpected way.

To Reproduce
Steps to reproduce the behavior:

  1. Make the unit-tests (need to install googletest first)
  2. Run ./dist/appanvil_test
  3. Examine the result of Status.FILTER_REGEX_TOLOWER

Expected behavior
We probably don't want to be able to ignore case when using regular expressions, because it is easy to create regular expressions that ignore case. We should probably throw an exception when Status.filter is called with use_regex == true and match_case == false. In the GUI, the button for ignore case button should be either invisible or disabled when the regex button is enabled.

Additional context
This bug was originally found by Zixin Yang

Refactor polkit configuration

Is your feature request related to a problem? Please describe.
I find the application repeatedly asking for authentication each time it does something (e.g. refreshing) annoying.

Describe the solution you'd like
Something persistent that authenticates once and a) wakes up after a given interval and pushes information to the frontend, or b) runs like a background service that has some APIs you can call.

Describe alternatives you've considered
None.

Additional context
None.

It's a lot of work, but this mildly infuriating quirk is just driving me nuts and I really wanna see it gone.

I imagine it can simply become a daemon program that listens on a socket or something. This has other implications too: we can turn this into a full blown AppAnvil service that handles all the privileged code.

For example, the current log parsing works on Ubuntu because the user account is assigned adm group which grants the user read permission to kernel log files. However, in Arch Linux those logs go to systemd, and they are not stored in plaintext format unless you enable the auditing framework, in which case the logs are stored in /var/log/audit/audit.log, only accessible to the root user. So for maximum compatibility the log reading code should ideally be run by root user and separate from the graphical interface.

It wasn't built on ArchLinux

OS:
Linux user-pc 6.7.9-arch1-1 #1 SMP PREEMPT_DYNAMIC Fri, 08 Mar 2024

[ 83%] Linking CXX executable dist/appanvil /usr/bin/ld: CMakeFiles/appanvil.dir/src/threads/command_caller.cc.o: warning: relocation against `_ZTVN8AppArmor4Tree8LinkRuleE' in read-only section `.text._ZN8AppArmor4Tree8LinkRuleC2ERKS1_[_ZN8AppArmor4Tree8LinkRuleC5ERKS1_]' /usr/bin/ld: CMakeFiles/appanvil.dir/src/threads/command_caller.cc.o: in function `CommandCaller::get_profiles(std::initializer_list<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&)': command_caller.cc:(.text+0x23ed): undefined reference to `AppArmor::Parser::Parser(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)' /usr/bin/ld: command_caller.cc:(.text+0x2415): undefined reference to `AppArmor::Parser::getProfileList[abi:cxx11]() const' /usr/bin/ld: command_caller.cc:(.text+0x24a3): undefined reference to `AppArmor::Tree::ProfileRule::name[abi:cxx11]() const' /usr/bin/ld: CMakeFiles/appanvil.dir/src/threads/command_caller.cc.o: in function `AppArmor::Tree::RuleNode::~RuleNode()': command_caller.cc:(.text._ZN8AppArmor4Tree8RuleNodeD2Ev[_ZN8AppArmor4Tree8RuleNodeD5Ev]+0xf): undefined reference to `vtable for AppArmor::Tree::RuleNode' /usr/bin/ld: CMakeFiles/appanvil.dir/src/threads/command_caller.cc.o: in function `AppArmor::Tree::ProfileRule::~ProfileRule()': command_caller.cc:(.text._ZN8AppArmor4Tree11ProfileRuleD2Ev[_ZN8AppArmor4Tree11ProfileRuleD5Ev]+0xf): undefined reference to `vtable for AppArmor::Tree::ProfileRule' /usr/bin/ld: CMakeFiles/appanvil.dir/src/threads/command_caller.cc.o: in function `AppArmor::Tree::RuleNode::RuleNode(AppArmor::Tree::RuleNode const&)': command_caller.cc:(.text._ZN8AppArmor4Tree8RuleNodeC2ERKS1_[_ZN8AppArmor4Tree8RuleNodeC5ERKS1_]+0x27): undefined reference to `vtable for AppArmor::Tree::RuleNode' /usr/bin/ld: CMakeFiles/appanvil.dir/src/threads/command_caller.cc.o: in function `AppArmor::Tree::ProfileRule::ProfileRule(AppArmor::Tree::ProfileRule const&)': command_caller.cc:(.text._ZN8AppArmor4Tree11ProfileRuleC2ERKS1_[_ZN8AppArmor4Tree11ProfileRuleC5ERKS1_]+0x27): undefined reference to `vtable for AppArmor::Tree::ProfileRule' /usr/bin/ld: CMakeFiles/appanvil.dir/src/threads/command_caller.cc.o: in function `AppArmor::Tree::FileRule::FileRule(AppArmor::Tree::FileRule const&)': command_caller.cc:(.text._ZN8AppArmor4Tree8FileRuleC2ERKS1_[_ZN8AppArmor4Tree8FileRuleC5ERKS1_]+0x27): undefined reference to `vtable for AppArmor::Tree::FileRule' /usr/bin/ld: CMakeFiles/appanvil.dir/src/threads/command_caller.cc.o: in function `AppArmor::Tree::LinkRule::LinkRule(AppArmor::Tree::LinkRule const&)': command_caller.cc:(.text._ZN8AppArmor4Tree8LinkRuleC2ERKS1_[_ZN8AppArmor4Tree8LinkRuleC5ERKS1_]+0x27): undefined reference to `vtable for AppArmor::Tree::LinkRule' /usr/bin/ld: CMakeFiles/appanvil.dir/src/threads/command_caller.cc.o: in function `AppArmor::Tree::AbstractionRule::AbstractionRule(AppArmor::Tree::AbstractionRule const&)': command_caller.cc:(.text._ZN8AppArmor4Tree15AbstractionRuleC2ERKS1_[_ZN8AppArmor4Tree15AbstractionRuleC5ERKS1_]+0x27): undefined reference to `vtable for AppArmor::Tree::AbstractionRule' /usr/bin/ld: CMakeFiles/appanvil.dir/src/threads/command_caller.cc.o:(.data.rel.ro._ZTVN8AppArmor4Tree8RuleListE[_ZTVN8AppArmor4Tree8RuleListE]+0x20): undefined reference to `AppArmor::Tree::RuleNode::operator==(AppArmor::Tree::RuleNode const&) const' /usr/bin/ld: CMakeFiles/appanvil.dir/src/threads/command_caller.cc.o:(.data.rel.ro._ZTVN8AppArmor4Tree8RuleListE[_ZTVN8AppArmor4Tree8RuleListE]+0x28): undefined reference to `AppArmor::Tree::RuleNode::operator!=(AppArmor::Tree::RuleNode const&) const' /usr/bin/ld: CMakeFiles/appanvil.dir/src/threads/command_caller.cc.o:(.data.rel.ro._ZTVN8AppArmor4Tree8RuleListE[_ZTVN8AppArmor4Tree8RuleListE]+0x30): undefined reference to `AppArmor::Tree::RuleNode::operator std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >() const' /usr/bin/ld: CMakeFiles/appanvil.dir/src/threads/command_caller.cc.o:(.data.rel.ro._ZTIN8AppArmor4Tree8RuleListE[_ZTIN8AppArmor4Tree8RuleListE]+0x10): undefined reference to `typeinfo for AppArmor::Tree::RuleNode' /usr/bin/ld: CMakeFiles/appanvil.dir/src/tabs/controller/profile_modify_controller.cc.o: in function `ProfileModifyController::intialize_abstractions()': profile_modify_controller.cc:(.text+0x95): undefined reference to `AppArmor::Tree::ProfileRule::getAbstractions[abi:cxx11]() const' /usr/bin/ld: profile_modify_controller.cc:(.text+0x100): undefined reference to `AppArmor::Tree::AbstractionRule::getPath[abi:cxx11]() const' /usr/bin/ld: CMakeFiles/appanvil.dir/src/tabs/controller/profile_modify_controller.cc.o: in function `ProfileModifyController::intialize_file_rules()': profile_modify_controller.cc:(.text+0x2e3): undefined reference to `AppArmor::Tree::ProfileRule::getFileRules[abi:cxx11]() const' /usr/bin/ld: profile_modify_controller.cc:(.text+0x36a): undefined reference to `AppArmor::Tree::FileRule::getFilename[abi:cxx11]() const' /usr/bin/ld: profile_modify_controller.cc:(.text+0x383): undefined reference to `AppArmor::Tree::FileRule::getFilemode() const' /usr/bin/ld: profile_modify_controller.cc:(.text+0x39c): undefined reference to `AppArmor::Tree::RuleNode::getPrefix() const' /usr/bin/ld: profile_modify_controller.cc:(.text+0x439): undefined reference to `AppArmor::Tree::FileMode::getRead() const' /usr/bin/ld: profile_modify_controller.cc:(.text+0x477): undefined reference to `AppArmor::Tree::FileMode::getWrite() const' /usr/bin/ld: profile_modify_controller.cc:(.text+0x4b5): undefined reference to `AppArmor::Tree::FileMode::getLink() const' /usr/bin/ld: profile_modify_controller.cc:(.text+0x4f3): undefined reference to `AppArmor::Tree::FileMode::getLock() const' /usr/bin/ld: profile_modify_controller.cc:(.text+0x53b): undefined reference to `AppArmor::Tree::FileMode::getExecuteMode[abi:cxx11]() const' /usr/bin/ld: profile_modify_controller.cc:(.text+0x58c): undefined reference to `AppArmor::Tree::PrefixNode::operator std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >() const' /usr/bin/ld: CMakeFiles/appanvil.dir/src/tabs/controller/profile_modify_controller.cc.o: in function `ProfileModifyController::handle_profile_changed()': profile_modify_controller.cc:(.text+0x805): undefined reference to `AppArmor::Parser::getProfileList[abi:cxx11]() const' /usr/bin/ld: profile_modify_controller.cc:(.text+0x87e): undefined reference to `AppArmor::Tree::ProfileRule::name[abi:cxx11]() const' /usr/bin/ld: profile_modify_controller.cc:(.text+0x894): undefined reference to `AppArmor::Tree::ProfileRule::name[abi:cxx11]() const' /usr/bin/ld: CMakeFiles/appanvil.dir/src/tabs/controller/profile_modify_controller.cc.o: in function `ProfileModifyController::handle_file_rule_changed(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)': profile_modify_controller.cc:(.text+0xaed): undefined reference to `AppArmor::Tree::FileRule::getFilename[abi:cxx11]() const' /usr/bin/ld: profile_modify_controller.cc:(.text+0xb11): undefined reference to `AppArmor::Tree::FileRule::getFilemode() const' /usr/bin/ld: profile_modify_controller.cc:(.text+0xb20): undefined reference to `AppArmor::Tree::FileMode::getRead() const' /usr/bin/ld: profile_modify_controller.cc:(.text+0xb35): undefined reference to `AppArmor::Tree::FileMode::getWrite() const' /usr/bin/ld: profile_modify_controller.cc:(.text+0xb4a): undefined reference to `AppArmor::Tree::FileMode::getAppend() const' /usr/bin/ld: profile_modify_controller.cc:(.text+0xb5f): undefined reference to `AppArmor::Tree::FileMode::getMemoryMap() const' /usr/bin/ld: profile_modify_controller.cc:(.text+0xb74): undefined reference to `AppArmor::Tree::FileMode::getLink() const' /usr/bin/ld: profile_modify_controller.cc:(.text+0xb89): undefined reference to `AppArmor::Tree::FileMode::getLock() const' /usr/bin/ld: profile_modify_controller.cc:(.text+0xcbf): undefined reference to `AppArmor::Tree::FileMode::FileMode(bool, bool, bool, bool, bool, bool, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)' /usr/bin/ld: profile_modify_controller.cc:(.text+0xcd2): undefined reference to `AppArmor::Tree::FileMode::empty() const' /usr/bin/ld: profile_modify_controller.cc:(.text+0xd23): undefined reference to `AppArmor::Tree::FileRule::getExecTarget[abi:cxx11]() const' /usr/bin/ld: profile_modify_controller.cc:(.text+0xd47): undefined reference to `AppArmor::Tree::FileRule::getFilename[abi:cxx11]() const' /usr/bin/ld: profile_modify_controller.cc:(.text+0xd80): undefined reference to `AppArmor::Tree::FileRule::FileRule(unsigned long, unsigned long, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, AppArmor::Tree::FileMode const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)' /usr/bin/ld: profile_modify_controller.cc:(.text+0xfab): undefined reference to `AppArmor::Tree::FileMode::getExecuteMode[abi:cxx11]() const' /usr/bin/ld: CMakeFiles/appanvil.dir/src/tabs/controller/profile_modify_controller.cc.o: in function `ProfileModifyController::handle_edit_rule(AppArmor::Tree::FileRule&, AppArmor::Tree::FileRule const&)': profile_modify_controller.cc:(.text+0x114c): undefined reference to `AppArmor::Parser::editRule(AppArmor::Tree::ProfileRule&, AppArmor::Tree::FileRule&, AppArmor::Tree::FileRule const&, std::ostream&)' /usr/bin/ld: CMakeFiles/appanvil.dir/src/tabs/controller/profile_modify_controller.cc.o: in function `ProfileModifyController::handle_remove_rule(AppArmor::Tree::FileRule&)': profile_modify_controller.cc:(.text+0x11f7): undefined reference to `AppArmor::Tree::FileRule::getFilename[abi:cxx11]() const' /usr/bin/ld: profile_modify_controller.cc:(.text+0x1268): undefined reference to `void AppArmor::Parser::removeRule<AppArmor::Tree::FileRule>(AppArmor::Tree::ProfileRule&, AppArmor::Tree::FileRule&, std::ostream&)' /usr/bin/ld: CMakeFiles/appanvil.dir/src/tabs/controller/profile_modify_controller.cc.o: in function `ProfileModifyController::handle_cancel_called()': profile_modify_controller.cc:(.text+0x12e8): undefined reference to `AppArmor::Parser::cancelChanges()' /usr/bin/ld: CMakeFiles/appanvil.dir/src/tabs/controller/profile_modify_controller.cc.o: in function `ProfileModifyController::handle_apply_called()': profile_modify_controller.cc:(.text+0x131e): undefined reference to `AppArmor::Parser::saveChanges()' /usr/bin/ld: CMakeFiles/appanvil.dir/src/tabs/controller/profile_modify_controller.cc.o: in function `AppArmor::Tree::FileRule::~FileRule()': profile_modify_controller.cc:(.text._ZN8AppArmor4Tree8FileRuleD2Ev[_ZN8AppArmor4Tree8FileRuleD5Ev]+0xf): undefined reference to `vtable for AppArmor::Tree::FileRule' /usr/bin/ld: CMakeFiles/appanvil.dir/src/tabs/view/profiles.cc.o: in function `Profiles::find_path(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)': profiles.cc:(.text+0x1b0): undefined reference to `AppArmor::Parser::getPath[abi:cxx11]() const' /usr/bin/ld: CMakeFiles/appanvil.dir/src/tabs/view/profile_modify.cc.o: in function `ProfileModifyImpl<AppArmor::Parser>::ProfileModifyImpl(std::shared_ptr<AppArmor::Parser>, std::shared_ptr<AppArmor::Tree::ProfileRule> const&)': profile_modify.cc:(.text._ZN17ProfileModifyImplIN8AppArmor6ParserEEC2ESt10shared_ptrIS1_ERKS3_INS0_4Tree11ProfileRuleEE[_ZN17ProfileModifyImplIN8AppArmor6ParserEEC2ESt10shared_ptrIS1_ERKS3_INS0_4Tree11ProfileRuleEE]+0x71e): undefined reference to `AppArmor::Tree::ProfileRule::name[abi:cxx11]() const' /usr/bin/ld: CMakeFiles/appanvil.dir/src/tabs/view/profile_modify.cc.o: in function `ProfileModifyImpl<AppArmor::Parser>::ProfileModifyImpl(std::shared_ptr<AppArmor::Parser>, std::shared_ptr<AppArmor::Tree::ProfileRule> const&)': profile_modify.cc:(.text._ZN17ProfileModifyImplIN8AppArmor6ParserEEC1ESt10shared_ptrIS1_ERKS3_INS0_4Tree11ProfileRuleEE[_ZN17ProfileModifyImplIN8AppArmor6ParserEEC1ESt10shared_ptrIS1_ERKS3_INS0_4Tree11ProfileRuleEE]+0x71e): undefined reference to `AppArmor::Tree::ProfileRule::name[abi:cxx11]() const' /usr/bin/ld: CMakeFiles/appanvil.dir/src/tabs/view/profile_modify.cc.o: in function `ProfileModifyImpl<AppArmor::Parser>::handle_apply_visible()': profile_modify.cc:(.text._ZN17ProfileModifyImplIN8AppArmor6ParserEE20handle_apply_visibleEv[_ZN17ProfileModifyImplIN8AppArmor6ParserEE20handle_apply_visibleEv]+0x36): undefined reference to `AppArmor::Parser::hasChanges()' /usr/bin/ld: CMakeFiles/appanvil.dir/src/tabs/view/profile_modify.cc.o: in function `ProfileModifyImpl<AppArmor::Parser>::update_profile_text()': profile_modify.cc:(.text._ZN17ProfileModifyImplIN8AppArmor6ParserEE19update_profile_textEv[_ZN17ProfileModifyImplIN8AppArmor6ParserEE19update_profile_textEv]+0x3c): undefined reference to `AppArmor::Parser::operator std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >() const' /usr/bin/ld: CMakeFiles/appanvil.dir/src/tabs/view/profile_modify.cc.o: in function `ProfileModifyImpl<AppArmor::Parser>::handle_raw_profile_text_change()': profile_modify.cc:(.text._ZN17ProfileModifyImplIN8AppArmor6ParserEE30handle_raw_profile_text_changeEv[_ZN17ProfileModifyImplIN8AppArmor6ParserEE30handle_raw_profile_text_changeEv]+0x45): undefined reference to `AppArmor::Parser::operator std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >() const' /usr/bin/ld: CMakeFiles/appanvil.dir/src/tabs/view/profile_modify.cc.o: in function `ProfileModifyImpl<AppArmor::Parser>::apply_raw_profile_text_change()': profile_modify.cc:(.text._ZN17ProfileModifyImplIN8AppArmor6ParserEE29apply_raw_profile_text_changeEv[_ZN17ProfileModifyImplIN8AppArmor6ParserEE29apply_raw_profile_text_changeEv]+0xac): undefined reference to `AppArmor::Parser::updateFromString(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)' /usr/bin/ld: warning: creating DT_TEXTREL in a PIE collect2: error: ld returned 1 exit status make[2]: *** [CMakeFiles/appanvil.dir/build.make:558: dist/appanvil] Error 1 make[1]: *** [CMakeFiles/Makefile2:148: CMakeFiles/appanvil.dir/all] Error 2 make: *** [Makefile:166: all] Error 2

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.