Revision 15dfcd45

b/monitor.c
1579 1579
        monitor_printf(mon, "balloon: actual=%d\n", (int)(actual >> 20));
1580 1580
}
1581 1581

  
1582
static void do_acl(Monitor *mon,
1583
                   const char *command,
1584
                   const char *aclname,
1585
                   const char *match,
1586
                   int has_index,
1587
                   int index)
1582
static qemu_acl *find_acl(Monitor *mon, const char *name)
1588 1583
{
1589
    qemu_acl *acl;
1584
    qemu_acl *acl = qemu_acl_find(name);
1590 1585

  
1591
    acl = qemu_acl_find(aclname);
1592 1586
    if (!acl) {
1593
        monitor_printf(mon, "acl: unknown list '%s'\n", aclname);
1594
        return;
1587
        monitor_printf(mon, "acl: unknown list '%s'\n", name);
1595 1588
    }
1589
    return acl;
1590
}
1591

  
1592
static void do_acl_show(Monitor *mon, const char *aclname)
1593
{
1594
    qemu_acl *acl = find_acl(mon, aclname);
1595
    qemu_acl_entry *entry;
1596
    int i = 0;
1596 1597

  
1597
    if (strcmp(command, "show") == 0) {
1598
        int i = 0;
1599
        qemu_acl_entry *entry;
1598
    if (acl) {
1600 1599
        monitor_printf(mon, "policy: %s\n",
1601 1600
                       acl->defaultDeny ? "deny" : "allow");
1602 1601
        TAILQ_FOREACH(entry, &acl->entries, next) {
1603 1602
            i++;
1604 1603
            monitor_printf(mon, "%d: %s %s\n", i,
1605
                           entry->deny ? "deny" : "allow",
1606
                           entry->match);
1604
                           entry->deny ? "deny" : "allow", entry->match);
1607 1605
        }
1608
    } else if (strcmp(command, "reset") == 0) {
1606
    }
1607
}
1608

  
1609
static void do_acl_reset(Monitor *mon, const char *aclname)
1610
{
1611
    qemu_acl *acl = find_acl(mon, aclname);
1612

  
1613
    if (acl) {
1609 1614
        qemu_acl_reset(acl);
1610 1615
        monitor_printf(mon, "acl: removed all rules\n");
1611
    } else if (strcmp(command, "policy") == 0) {
1612
        if (!match) {
1613
            monitor_printf(mon, "acl: missing policy parameter\n");
1614
            return;
1615
        }
1616
    }
1617
}
1618

  
1619
static void do_acl_policy(Monitor *mon, const char *aclname,
1620
                          const char *policy)
1621
{
1622
    qemu_acl *acl = find_acl(mon, aclname);
1616 1623

  
1617
        if (strcmp(match, "allow") == 0) {
1624
    if (acl) {
1625
        if (strcmp(policy, "allow") == 0) {
1618 1626
            acl->defaultDeny = 0;
1619 1627
            monitor_printf(mon, "acl: policy set to 'allow'\n");
1620
        } else if (strcmp(match, "deny") == 0) {
1628
        } else if (strcmp(policy, "deny") == 0) {
1621 1629
            acl->defaultDeny = 1;
1622 1630
            monitor_printf(mon, "acl: policy set to 'deny'\n");
1623 1631
        } else {
1624
            monitor_printf(mon, "acl: unknown policy '%s', expected 'deny' or 'allow'\n", match);
1632
            monitor_printf(mon, "acl: unknown policy '%s', "
1633
                           "expected 'deny' or 'allow'\n", policy);
1625 1634
        }
1626
    } else if ((strcmp(command, "allow") == 0) ||
1627
               (strcmp(command, "deny") == 0)) {
1628
        int deny = strcmp(command, "deny") == 0 ? 1 : 0;
1629
        int ret;
1635
    }
1636
}
1630 1637

  
1631
        if (!match) {
1632
            monitor_printf(mon, "acl: missing match parameter\n");
1638
static void do_acl_add(Monitor *mon, const char *aclname,
1639
                       const char *match, const char *policy,
1640
                       int has_index, int index)
1641
{
1642
    qemu_acl *acl = find_acl(mon, aclname);
1643
    int deny, ret;
1644

  
1645
    if (acl) {
1646
        if (strcmp(policy, "allow") == 0) {
1647
            deny = 0;
1648
        } else if (strcmp(policy, "deny") == 0) {
1649
            deny = 1;
1650
        } else {
1651
            monitor_printf(mon, "acl: unknown policy '%s', "
1652
                           "expected 'deny' or 'allow'\n", policy);
1633 1653
            return;
1634 1654
        }
1635

  
1636 1655
        if (has_index)
1637 1656
            ret = qemu_acl_insert(acl, deny, match, index);
1638 1657
        else
......
1641 1660
            monitor_printf(mon, "acl: unable to add acl entry\n");
1642 1661
        else
1643 1662
            monitor_printf(mon, "acl: added rule at position %d\n", ret);
1644
    } else if (strcmp(command, "remove") == 0) {
1645
        int ret;
1663
    }
1664
}
1646 1665

  
1647
        if (!match) {
1648
            monitor_printf(mon, "acl: missing match parameter\n");
1649
            return;
1650
        }
1666
static void do_acl_remove(Monitor *mon, const char *aclname, const char *match)
1667
{
1668
    qemu_acl *acl = find_acl(mon, aclname);
1669
    int ret;
1651 1670

  
1671
    if (acl) {
1652 1672
        ret = qemu_acl_remove(acl, match);
1653 1673
        if (ret < 0)
1654 1674
            monitor_printf(mon, "acl: no matching acl entry\n");
1655 1675
        else
1656 1676
            monitor_printf(mon, "acl: removed rule at position %d\n", ret);
1657
    } else {
1658
        monitor_printf(mon, "acl: unknown command '%s'\n", command);
1659 1677
    }
1660 1678
}
1661 1679

  
b/qemu-monitor.hx
569 569
Change watchdog action.
570 570
ETEXI
571 571

  
572
    { "acl", "sss?i?", do_acl, "<command> <aclname> [<match> [<index>]]\n",
573
                               "acl show vnc.username\n"
574
                               "acl policy vnc.username deny\n"
575
                               "acl allow vnc.username fred\n"
576
                               "acl deny vnc.username bob\n"
577
                               "acl reset vnc.username\n" },
572
    { "acl_show", "s", do_acl_show, "aclname",
573
      "list rules in the access control list" },
578 574
STEXI
579
@item acl @var{subcommand} @var{aclname} @var{match} @var{index}
580

  
581
Manage access control lists for network services. There are currently
582
two named access control lists, @var{vnc.x509dname} and @var{vnc.username}
583
matching on the x509 client certificate distinguished name, and SASL
584
username respectively.
575
@item acl_show @var{aclname}
576
List all the matching rules in the access control list, and the default
577
policy. There are currently two named access control lists,
578
@var{vnc.x509dname} and @var{vnc.username} matching on the x509 client
579
certificate distinguished name, and SASL username respectively.
580
ETEXI
585 581

  
586
@table @option
587
@item acl show <aclname>
588
list all the match rules in the access control list, and the default
589
policy
590
@item acl policy <aclname> @code{allow|deny}
591
set the default access control list policy, used in the event that
582
    { "acl_policy", "ss", do_acl_policy, "aclname allow|deny",
583
      "set default access control list policy" },
584
STEXI
585
@item acl_policy @var{aclname] @code{allow|deny}
586
Set the default access control list policy, used in the event that
592 587
none of the explicit rules match. The default policy at startup is
593
always @code{deny}
594
@item acl allow <aclname> <match> [<index>]
595
add a match to the access control list, allowing access. The match will
596
normally be an exact username or x509 distinguished name, but can
597
optionally include wildcard globs. eg @code{*@@EXAMPLE.COM} to allow
598
all users in the @code{EXAMPLE.COM} kerberos realm. The match will
599
normally be appended to the end of the ACL, but can be inserted
600
earlier in the list if the optional @code{index} parameter is supplied.
601
@item acl deny <aclname> <match> [<index>]
602
add a match to the access control list, denying access. The match will
603
normally be an exact username or x509 distinguished name, but can
604
optionally include wildcard globs. eg @code{*@@EXAMPLE.COM} to allow
605
all users in the @code{EXAMPLE.COM} kerberos realm. The match will
588
always @code{deny}.
589
ETEXI
590

  
591
    { "acl_add", "sssi?", do_acl_add, "aclname match allow|deny [index]",
592
      "add a match rule to the access control list" },
593
STEXI
594
@item acl_allow @var{aclname} @var{match} @code{allow|deny} [@var{index}]
595
Add a match rule to the access control list, allowing or denying access.
596
The match will normally be an exact username or x509 distinguished name,
597
but can optionally include wildcard globs. eg @code{*@@EXAMPLE.COM} to
598
allow all users in the @code{EXAMPLE.COM} kerberos realm. The match will
606 599
normally be appended to the end of the ACL, but can be inserted
607
earlier in the list if the optional @code{index} parameter is supplied.
608
@item acl remove <aclname> <match>
609
remove the specified match rule from the access control list.
610
@item acl reset <aclname>
611
remove all matches from the access control list, and set the default
600
earlier in the list if the optional @var{index} parameter is supplied.
601
ETEXI
602

  
603
    { "acl_remove", "ss", do_acl_remove, "aclname match",
604
      "remove a match rule from the access control list" },
605
STEXI
606
@item acl_remove @var{aclname} @var{match}
607
Remove the specified match rule from the access control list.
608
ETEXI
609

  
610
    { "acl_reset", "s", do_acl_reset, "aclname",
611
      "reset the access control list" },
612
STEXI
613
@item acl_remove @var{aclname} @var{match}
614
Remove all matches from the access control list, and set the default
612 615
policy back to @code{deny}.
613
@end table
614 616
ETEXI
615 617

  
616 618
STEXI

Also available in: Unified diff