Changeset 654dcb897e49908a958dae55cf29793412c4b390

Show
Ignore:
Timestamp:
03/06/10 16:56:24 (5 months ago)
Author:
Joshua Brindle <method@manicmethod.com>
Committer:
Joshua Brindle <method@manicmethod.com> 1267916184 -0500
Parent:

[660f70f4c4c169214da8ac670fbecfb37ce3d2d5]

Message:

Last attempt at upstreaming semodule_disable patch.

This patch allows you to disable/Enable policy modules.

It never seems to get upstreamed. :(

Signed-off-by: Joshua Brindle <method@manicmethod.com>

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • libsemanage/include/semanage/modules.h

    rdf77db4 r654dcb8  
    4141int semanage_module_install_base_file(semanage_handle_t *, 
    4242                                      const char *module_name); 
     43int semanage_module_enable(semanage_handle_t *, char *module_name); 
     44int semanage_module_disable(semanage_handle_t *, char *module_name); 
    4345int semanage_module_remove(semanage_handle_t *, char *module_name); 
    4446 
    4547/* semanage_module_info is for getting information on installed 
    46    modules, only name and version at this time */ 
     48   modules, only name and version, and enabled/disabled flag at this time */ 
    4749typedef struct semanage_module_info semanage_module_info_t; 
    4850 
     
    5456const char *semanage_module_get_name(semanage_module_info_t *); 
    5557const char *semanage_module_get_version(semanage_module_info_t *); 
     58int semanage_module_get_enabled(semanage_module_info_t *); 
    5659 
    5760#endif 
  • libsemanage/src/direct_api.c

    rc8d100b r654dcb8  
    6767                                        size_t data_len); 
    6868static int semanage_direct_install_base_file(semanage_handle_t * sh, const char *module_name); 
     69static int semanage_direct_enable(semanage_handle_t * sh, char *module_name); 
     70static int semanage_direct_disable(semanage_handle_t * sh, char *module_name); 
    6971static int semanage_direct_remove(semanage_handle_t * sh, char *module_name); 
    7072static int semanage_direct_list(semanage_handle_t * sh, 
     
    8486        .install_base = semanage_direct_install_base, 
    8587        .install_base_file = semanage_direct_install_base_file, 
     88        .enable = semanage_direct_enable, 
     89        .disable = semanage_direct_disable, 
    8690        .remove = semanage_direct_remove, 
    8791        .list = semanage_direct_list 
     
    349353                return -1; 
    350354        } 
    351         if (asprintf(filename, "%s/%s.pp", module_path, *module_name) == -1) { 
     355        if (asprintf(filename, "%s/%s.pp%s", module_path, *module_name, DISABLESTR) == -1) { 
    352356                ERR(sh, "Out of memory!"); 
    353357                return -1; 
    354358        } 
     359 
     360        if (access(*filename, F_OK) == -1) { 
     361                char *ptr = *filename; 
     362                int len = strlen(ptr) - strlen(DISABLESTR); 
     363                if (len > 0) ptr[len]='\0'; 
     364        } 
     365 
    355366        return 0; 
    356367} 
     
    12741285} 
    12751286 
    1276 /* Removes a module from the sandbox.  Returns 0 on success, -1 if out 
    1277  * of memory, -2 if module not found or could not be removed. */ 
    1278 static int semanage_direct_remove(semanage_handle_t * sh, char *module_name) 
     1287/* Enables a module from the sandbox.  Returns 0 on success, -1 if out 
     1288 * of memory, -2 if module not found or could not be enabled. */ 
     1289static int semanage_direct_enable(semanage_handle_t * sh, char *module_name) 
    12791290{ 
    12801291        int i, retval = -1; 
     
    12951306                base++; 
    12961307                if (memcmp(module_name, base, name_len) == 0 && 
     1308                    strcmp(base + name_len + 3, DISABLESTR) == 0) { 
     1309                        int len = strlen(module_filenames[i]) - strlen(DISABLESTR); 
     1310                        char *enabled_name = calloc(1, len+1); 
     1311                        if (!enabled_name) { 
     1312                                ERR(sh, "Could not allocate memory"); 
     1313                                retval = -1; 
     1314                                goto cleanup; 
     1315                        } 
     1316 
     1317                        strncpy(enabled_name, module_filenames[i],len); 
     1318 
     1319                        if (rename(module_filenames[i], enabled_name) == -1) { 
     1320                                ERR(sh, "Could not enable module file %s.", 
     1321                                    enabled_name); 
     1322                                retval = -2; 
     1323                        } 
     1324                        retval = 0; 
     1325                        free(enabled_name); 
     1326                        goto cleanup; 
     1327                } 
     1328        } 
     1329        ERR(sh, "Module %s was not found.", module_name); 
     1330        retval = -2;            /* module not found */ 
     1331      cleanup: 
     1332        for (i = 0; module_filenames != NULL && i < num_mod_files; i++) { 
     1333                free(module_filenames[i]); 
     1334        } 
     1335        free(module_filenames); 
     1336        return retval; 
     1337} 
     1338 
     1339/* Enables a module from the sandbox.  Returns 0 on success, -1 if out 
     1340 * of memory, -2 if module not found or could not be enabled. */ 
     1341static int semanage_direct_disable(semanage_handle_t * sh, char *module_name) 
     1342{ 
     1343        int i, retval = -1; 
     1344        char **module_filenames = NULL; 
     1345        int num_mod_files; 
     1346        size_t name_len = strlen(module_name); 
     1347        if (semanage_get_modules_names(sh, &module_filenames, &num_mod_files) == 
     1348            -1) { 
     1349                return -1; 
     1350        } 
     1351        for (i = 0; i < num_mod_files; i++) { 
     1352                char *base = strrchr(module_filenames[i], '/'); 
     1353                if (base == NULL) { 
     1354                        ERR(sh, "Could not read module names."); 
     1355                        retval = -2; 
     1356                        goto cleanup; 
     1357                } 
     1358                base++; 
     1359                if (memcmp(module_name, base, name_len) == 0 && 
    12971360                    strcmp(base + name_len, ".pp") == 0) { 
     1361                        char disabled_name[PATH_MAX]; 
     1362                        if (snprintf(disabled_name, PATH_MAX, "%s%s",  
     1363                                     module_filenames[i], DISABLESTR) == PATH_MAX) { 
     1364                                ERR(sh, "Could not disable module file %s.", 
     1365                                    module_filenames[i]); 
     1366                                retval = -2; 
     1367                                goto cleanup; 
     1368                        } 
     1369                        if (rename(module_filenames[i], disabled_name) == -1) { 
     1370                                ERR(sh, "Could not disable module file %s.", 
     1371                                    module_filenames[i]); 
     1372                                retval = -2; 
     1373                        } 
     1374                        retval = 0; 
     1375                        goto cleanup; 
     1376                } 
     1377        } 
     1378        ERR(sh, "Module %s was not found.", module_name); 
     1379        retval = -2;            /* module not found */ 
     1380      cleanup: 
     1381        for (i = 0; module_filenames != NULL && i < num_mod_files; i++) { 
     1382                free(module_filenames[i]); 
     1383        } 
     1384        free(module_filenames); 
     1385        return retval; 
     1386} 
     1387 
     1388/* Removes a module from the sandbox.  Returns 0 on success, -1 if out 
     1389 * of memory, -2 if module not found or could not be removed. */ 
     1390static int semanage_direct_remove(semanage_handle_t * sh, char *module_name) 
     1391{ 
     1392        int i, retval = -1; 
     1393        char **module_filenames = NULL; 
     1394        int num_mod_files; 
     1395        size_t name_len = strlen(module_name); 
     1396        if (semanage_get_modules_names(sh, &module_filenames, &num_mod_files) == 
     1397            -1) { 
     1398                return -1; 
     1399        } 
     1400        for (i = 0; i < num_mod_files; i++) { 
     1401                char *base = strrchr(module_filenames[i], '/'); 
     1402                if (base == NULL) { 
     1403                        ERR(sh, "Could not read module names."); 
     1404                        retval = -2; 
     1405                        goto cleanup; 
     1406                } 
     1407                base++; 
     1408                if (memcmp(module_name, base, name_len) == 0) { 
    12981409                        if (unlink(module_filenames[i]) == -1) { 
    12991410                                ERR(sh, "Could not remove module file %s.", 
     
    13701481                ssize_t size; 
    13711482                char *data = NULL; 
     1483                int enabled = semanage_module_enabled(module_filenames[i]); 
    13721484 
    13731485                if ((size = bunzip(sh, fp, &data)) > 0) { 
     
    13901502                        (*modinfo)[*num_modules].name = name; 
    13911503                        (*modinfo)[*num_modules].version = version; 
     1504                        (*modinfo)[*num_modules].enabled = enabled; 
    13921505                        (*num_modules)++; 
    13931506                } else { 
  • libsemanage/src/libsemanage.map

    rbd74c23 r654dcb8  
    77          semanage_module_upgrade; semanage_module_upgrade_file; 
    88          semanage_module_install_base; semanage_module_install_base_file; 
     9          semanage_module_enable; 
     10          semanage_module_disable; 
    911          semanage_module_remove; 
    1012          semanage_module_list; semanage_module_info_datum_destroy; 
    1113          semanage_module_list_nth; semanage_module_get_name; 
    1214          semanage_module_get_version; semanage_select_store; 
     15          semanage_module_get_enabled; 
    1316          semanage_reload_policy; semanage_set_reload; semanage_set_rebuild; 
    1417          semanage_user_*; semanage_bool_*; semanage_seuser_*; 
  • libsemanage/src/module_internal.h

    r13cd4c8 r654dcb8  
    77hidden_proto(semanage_module_get_name) 
    88    hidden_proto(semanage_module_get_version) 
     9    hidden_proto(semanage_module_get_enabled) 
    910    hidden_proto(semanage_module_info_datum_destroy) 
    1011    hidden_proto(semanage_module_list_nth) 
  • libsemanage/src/modules.c

    rc282c40 r654dcb8  
    155155} 
    156156 
     157int semanage_module_enable(semanage_handle_t * sh, char *module_name) 
     158{ 
     159        if (sh->funcs->enable == NULL) { 
     160                ERR(sh, "No enable function defined for this connection type."); 
     161                return -1; 
     162        } else if (!sh->is_connected) { 
     163                ERR(sh, "Not connected."); 
     164                return -1; 
     165        } else if (!sh->is_in_transaction) { 
     166                if (semanage_begin_transaction(sh) < 0) { 
     167                        return -1; 
     168                } 
     169        } 
     170        sh->modules_modified = 1; 
     171        return sh->funcs->enable(sh, module_name); 
     172} 
     173 
     174int semanage_module_disable(semanage_handle_t * sh, char *module_name) 
     175{ 
     176        if (sh->funcs->disable == NULL) { 
     177                ERR(sh, "No disable function defined for this connection type."); 
     178                return -1; 
     179        } else if (!sh->is_connected) { 
     180                ERR(sh, "Not connected."); 
     181                return -1; 
     182        } else if (!sh->is_in_transaction) { 
     183                if (semanage_begin_transaction(sh) < 0) { 
     184                        return -1; 
     185                } 
     186        } 
     187        sh->modules_modified = 1; 
     188        return sh->funcs->disable(sh, module_name); 
     189} 
     190 
    157191int semanage_module_remove(semanage_handle_t * sh, char *module_name) 
    158192{ 
     
    210244hidden_def(semanage_module_get_name) 
    211245 
     246int semanage_module_get_enabled(semanage_module_info_t * modinfo) 
     247{ 
     248        return modinfo->enabled; 
     249} 
     250 
     251hidden_def(semanage_module_get_enabled) 
     252 
    212253const char *semanage_module_get_version(semanage_module_info_t * modinfo) 
    213254{ 
  • libsemanage/src/modules.h

    r13cd4c8 r654dcb8  
    2727        char *name;             /* Key */ 
    2828        char *version; 
     29        int enabled; 
    2930}; 
    3031 
  • libsemanage/src/policy.h

    rdf77db4 r654dcb8  
    5959        int (*upgrade_file) (struct semanage_handle *, const char *); 
    6060 
     61        /* Enable a policy module */ 
     62        int (*enable) (struct semanage_handle *, char *); 
     63 
     64        /* Disable a policy module */ 
     65        int (*disable) (struct semanage_handle *, char *); 
     66 
    6167        /* Remove a policy module */ 
    6268        int (*remove) (struct semanage_handle *, char *); 
  • libsemanage/src/semanage_store.c

    r0b2f9ef r654dcb8  
    5757 
    5858#include "debug.h" 
     59 
     60const char *DISABLESTR=".disabled"; 
    5961 
    6062#define SEMANAGE_CONF_FILE "semanage.conf" 
     
    434436} 
    435437 
     438int semanage_module_enabled(const char *file) { 
     439        int len = strlen(file) - strlen(DISABLESTR); 
     440        return (len < 0 || strcmp(&file[len], DISABLESTR) != 0); 
     441} 
     442 
     443static int semanage_modulename_select(const struct dirent *d) 
     444{ 
     445        if (d->d_name[0] == '.' 
     446            && (d->d_name[1] == '\0' 
     447                || (d->d_name[1] == '.' && d->d_name[2] == '\0'))) 
     448                return 0; 
     449 
     450        return semanage_module_enabled(d->d_name); 
     451} 
     452 
    436453/* Copies a file from src to dst.  If dst already exists then 
    437454 * overwrite it.  Returns 0 on success, -1 on error. */ 
     
    600617} 
    601618 
    602 /* Scans the modules directory for the current semanage handler.  This 
    603  * might be the active directory or sandbox, depending upon if the 
    604  * handler has a transaction lock.  Allocates and fills in *filenames 
    605  * with an array of module filenames; length of array is stored in 
    606  * *len.  The caller is responsible for free()ing *filenames and its 
    607  * individual elements.  Upon success returns 0, -1 on error. 
    608  */ 
    609 int semanage_get_modules_names(semanage_handle_t * sh, char ***filenames, 
    610                                int *len) 
     619static int semanage_get_modules_names_filter(semanage_handle_t * sh, char ***filenames, 
     620                                      int *len, int (*filter)(const struct dirent *)) 
    611621{ 
    612622        const char *modules_path; 
     
    623633        *len = 0; 
    624634        if ((num_files = scandir(modules_path, &namelist, 
    625                                  semanage_filename_select, alphasort)) == -1) { 
     635                                 filter, alphasort)) == -1) { 
    626636                ERR(sh, "Error while scanning directory %s.", modules_path); 
    627637                goto cleanup; 
     
    662672        free(namelist); 
    663673        return retval; 
     674} 
     675 
     676/* Scans the modules directory for the current semanage handler.  This 
     677 * might be the active directory or sandbox, depending upon if the 
     678 * handler has a transaction lock.  Allocates and fills in *filenames 
     679 * with an array of module filenames; length of array is stored in 
     680 * *len.  The caller is responsible for free()ing *filenames and its 
     681 * individual elements.  Upon success returns 0, -1 on error. 
     682 */ 
     683int semanage_get_modules_names(semanage_handle_t * sh, char ***filenames, 
     684                               int *len) 
     685{ 
     686        return semanage_get_modules_names_filter(sh, filenames, 
     687                                                 len, semanage_filename_select); 
     688} 
     689 
     690/* Scans the modules directory for the current semanage handler.  This 
     691 * might be the active directory or sandbox, depending upon if the 
     692 * handler has a transaction lock.  Allocates and fills in *filenames 
     693 * with an array of module filenames; length of array is stored in 
     694 * *len.  The caller is responsible for free()ing *filenames and its 
     695 * individual elements.  Upon success returns 0, -1 on error. 
     696 */ 
     697int semanage_get_active_modules_names(semanage_handle_t * sh, char ***filenames, 
     698                               int *len) 
     699{ 
     700        return semanage_get_modules_names_filter(sh, filenames, 
     701                                                 len, semanage_modulename_select); 
    664702} 
    665703 
     
    15861624 
    15871625        /* get list of modules and load them */ 
    1588         if (semanage_get_modules_names(sh, &module_filenames, &num_modules) == 
     1626        if (semanage_get_active_modules_names(sh, &module_filenames, &num_modules) == 
    15891627            -1 || semanage_load_module(sh, base_filename, base) == -1) { 
    15901628                goto cleanup; 
  • libsemanage/src/semanage_store.h

    r200efad r654dcb8  
    129129                     char **sorted_buf, size_t * sorted_buf_len); 
    130130 
     131extern const char *DISABLESTR; 
     132 
    131133#endif 
  • policycoreutils/semodule/semodule.8

    rc282c40 r654dcb8  
    3535.B  \-b,\-\-base=MODULE_PKG    
    3636install/replace base module package 
     37.TP 
     38.B  \-d,\-\-disable=MODULE_NAME 
     39disable existing module 
     40.TP 
     41.B  \-e,\-\-enable=MODULE_NAME 
     42enable existing module 
    3743.TP 
    3844.B  \-r,\-\-remove=MODULE_NAME 
  • policycoreutils/semodule/semodule.c

    rc282c40 r654dcb8  
    2323#include <semanage/modules.h> 
    2424 
    25 enum client_modes { NO_MODE, INSTALL_M, UPGRADE_M, BASE_M, REMOVE_M, 
     25enum client_modes { NO_MODE, INSTALL_M, UPGRADE_M, BASE_M, ENABLE_M, DISABLE_M, REMOVE_M, 
    2626        LIST_M, RELOAD 
    2727}; 
    2828/* list of modes in which one ought to commit afterwards */ 
    2929static const int do_commit[] = { 
    30         0, 1, 1, 1, 1, 
     30        0, 1, 1, 1, 1, 1, 1, 
    3131        0, 0 
    3232}; 
     
    105105        printf("  -B, --build               build and reload policy\n"); 
    106106        printf("  -i,--install=MODULE_PKG   install a new module\n"); 
    107         printf("  -u,--upgrade=MODULE_PKG   upgrades or install module to a newer version\n"); 
     107        printf("  -u,--upgrade=MODULE_PKG   upgrade existing module\n"); 
    108108        printf("  -b,--base=MODULE_PKG      install new base module\n"); 
    109         printf("  -r,--remove=MODULE_NAME   remove existing module\n"); 
     109        printf("  -e,--enable=MODULE_PKG    enable existing module\n"); 
     110        printf("  -d,--disable=MODULE_PKG   disable existing module\n"); 
     111        printf("  -r,--remove=MODULE_NAME   remove existing module\n"); 
    110112        printf 
    111113            ("  -l,--list-modules         display list of installed modules\n"); 
     
    153155                {"list-modules", 0, NULL, 'l'}, 
    154156                {"verbose", 0, NULL, 'v'}, 
     157                {"enable", required_argument, NULL, 'e'}, 
     158                {"disable", required_argument, NULL, 'd'}, 
    155159                {"remove", required_argument, NULL, 'r'}, 
    156160                {"upgrade", required_argument, NULL, 'u'}, 
     
    167171        create_store = 0; 
    168172        while ((i = 
    169                 getopt_long(argc, argv, "s:b:hi:lvqr:u:RnBD", opts, 
     173                getopt_long(argc, argv, "s:b:hi:lvqe:d:r:u:RnBD", opts, 
    170174                            NULL)) != -1) { 
    171175                switch (i) { 
     
    185189                case 'v': 
    186190                        verbose = 1; 
     191                        break; 
     192                case 'e': 
     193                        set_mode(ENABLE_M, optarg); 
     194                        break; 
     195                case 'd': 
     196                        set_mode(DISABLE_M, optarg); 
    187197                        break; 
    188198                case 'r': 
     
    239249                } else if (commands && commands[num_commands - 1].mode == REMOVE_M) { 
    240250                        mode = REMOVE_M; 
     251                } else if (commands && commands[num_commands - 1].mode == ENABLE_M) { 
     252                        mode = ENABLE_M; 
     253                } else if (commands && commands[num_commands - 1].mode == DISABLE_M) { 
     254                        mode = DISABLE_M; 
    241255                } else { 
    242256                        fprintf(stderr, "unknown additional arguments:\n"); 
     
    351365                                result = 
    352366                                    semanage_module_install_base_file(sh, mode_arg); 
     367                                break; 
     368                        } 
     369                case ENABLE_M:{ 
     370                                if (verbose) { 
     371                                        printf 
     372                                            ("Attempting to enable module '%s':\n", 
     373                                             mode_arg); 
     374                                } 
     375                                result = semanage_module_enable(sh, mode_arg); 
     376                                if ( result == -2 ) {  
     377                                        continue; 
     378                                } 
     379                                break; 
     380                        } 
     381                case DISABLE_M:{ 
     382                                if (verbose) { 
     383                                        printf 
     384                                            ("Attempting to disable module '%s':\n", 
     385                                             mode_arg); 
     386                                } 
     387                                result = semanage_module_disable(sh, mode_arg); 
     388                                if ( result == -2 ) {  
     389                                        continue; 
     390                                } 
    353391                                break; 
    354392                        } 
     
    383421                                                    semanage_module_list_nth 
    384422                                                    (modinfo, j); 
    385                                                 printf("%s\t%s\n", 
     423                                                printf("%s\t%s\t%s\n", 
    386424                                                       semanage_module_get_name 
    387425                                                       (m), 
    388426                                                       semanage_module_get_version 
    389                                                        (m)); 
     427                                                       (m),  
     428                                                       (semanage_module_get_enabled(m) ? "" : "Disabled")); 
    390429                                                semanage_module_info_datum_destroy 
    391430                                                    (m);