moved pythonrewrite branch to trunk
|
@ -532,7 +532,7 @@ if ( ! &check_ssl()) {
|
|||
if ($device eq '') {
|
||||
&debug_msg(DEBUG_INFO, "invalid device: " . $query->param('device'));
|
||||
$pagedata->setValue('Data.Warning', 'InvalidDevice');
|
||||
$pagedata->setValue('Data.Action', 'empty');
|
||||
$pagedata->setValue('Data.Action', 'emptu');
|
||||
} elsif ( ! &check_config()) {
|
||||
$pagedata->setValue('Data.Warning', 'NotInitialized');
|
||||
$pagedata->setValue('Data.Action', 'form_init');
|
276
bin/CryptoBox.py
Executable file
|
@ -0,0 +1,276 @@
|
|||
#!/usr/bin/env python2.4
|
||||
'''
|
||||
This is the web interface for a fileserver managing encrypted filesystems.
|
||||
|
||||
It was originally written in bash/perl. Now a complete rewrite is in
|
||||
progress. So things might be confusing here. Hopefully not for long.
|
||||
:)
|
||||
'''
|
||||
|
||||
# check python version
|
||||
import sys
|
||||
(ver_major, ver_minor, ver_sub, ver_desc, ver_subsub) = sys.version_info
|
||||
if (ver_major < 2) or ((ver_major == 2) and (ver_minor < 4)):
|
||||
sys.stderr.write("You need a python version >= 2.4\nCurrent version is:\n %s\n" % sys.version)
|
||||
sys.exit(1)
|
||||
|
||||
import CryptoBoxContainer
|
||||
from CryptoBoxExceptions import *
|
||||
import re
|
||||
import os
|
||||
import CryptoBoxTools
|
||||
import subprocess
|
||||
|
||||
|
||||
|
||||
class CryptoBox:
|
||||
'''this class rules them all!
|
||||
|
||||
put things like logging, conf and oter stuff in here,
|
||||
that might be used by more classes, it will be passed on to them'''
|
||||
|
||||
VERSION = "0.3~1"
|
||||
|
||||
def __init__(self, config_file=None):
|
||||
import CryptoBoxSettings
|
||||
self.log = self.__getStartupLogger()
|
||||
self.prefs = CryptoBoxSettings.CryptoBoxSettings(config_file)
|
||||
self.__runTests()
|
||||
|
||||
|
||||
def __getStartupLogger(self):
|
||||
import logging
|
||||
'''initialises the logging system
|
||||
|
||||
use it with: 'self.log.[debug|info|warning|error|critical](logmessage)'
|
||||
all classes should get the logging instance during __init__:
|
||||
self.log = logging.getLogger("CryptoBox")
|
||||
|
||||
first we output all warnings/errors to stderr
|
||||
as soon as we opened the config file successfully, we redirect debug output
|
||||
to the configured destination'''
|
||||
## basicConfig(...) needs python >= 2.4
|
||||
try:
|
||||
log_handler = logging.getLogger("CryptoBox")
|
||||
logging.basicConfig(
|
||||
format='%(asctime)s CryptoBox %(levelname)s: %(message)s',
|
||||
stderr=sys.stderr)
|
||||
log_handler.setLevel(logging.ERROR)
|
||||
log_handler.info("loggingsystem is up'n running")
|
||||
## from now on everything can be logged via self.log...
|
||||
except:
|
||||
raise CBEnvironmentError("couldn't initialise the loggingsystem. I give up.")
|
||||
return log_handler
|
||||
|
||||
|
||||
# do some initial checks
|
||||
def __runTests(self):
|
||||
self.__runTestUID()
|
||||
self.__runTestRootPriv()
|
||||
|
||||
|
||||
def __runTestUID(self):
|
||||
if os.geteuid() == 0:
|
||||
raise CBEnvironmentError("you may not run the cryptobox as root")
|
||||
|
||||
|
||||
def __runTestRootPriv(self):
|
||||
"""try to run 'super' with 'CryptoBoxRootActions'"""
|
||||
try:
|
||||
devnull = open(os.devnull, "w")
|
||||
except IOError:
|
||||
raise CBEnvironmentError("could not open %s for writing!" % os.devnull)
|
||||
try:
|
||||
prog_super = self.prefs["Programs"]["super"]
|
||||
except KeyError:
|
||||
raise CBConfigUndefinedError("Programs", "super")
|
||||
try:
|
||||
prog_rootactions = self.prefs["Programs"]["CryptoBoxRootActions"]
|
||||
except KeyError:
|
||||
raise CBConfigUndefinedError("Programs", "CryptoBoxRootActions")
|
||||
try:
|
||||
proc = subprocess.Popen(
|
||||
shell = False,
|
||||
stdout = devnull,
|
||||
stderr = devnull,
|
||||
args = [prog_super, prog_rootactions, "check"])
|
||||
except OSError:
|
||||
raise CBEnvironmentError("failed to execute 'super' (%s)" % self.prefs["Programs"]["super"])
|
||||
proc.wait()
|
||||
if proc.returncode != 0:
|
||||
raise CBEnvironmentError("failed to call CryptoBoxRootActions (%s) via 'super' - maybe you did not add the appropriate line to /etc/super.tab?" % prog_rootactions)
|
||||
|
||||
|
||||
# this method just demonstrates inheritance effects - may be removed
|
||||
def cbx_inheritance_test(self, string="you lucky widow"):
|
||||
self.log.info(string)
|
||||
|
||||
|
||||
# RFC: why should CryptoBoxProps inherit CryptoBox? [l]
|
||||
# RFC: shouldn't we move all useful functions of CryptoBoxProps to CryptoBox? [l]
|
||||
class CryptoBoxProps(CryptoBox):
|
||||
'''Get and set the properties of a CryptoBox
|
||||
|
||||
This class contains all available devices that may be accessed.
|
||||
All properties of the cryptobox can be accessed by this class.
|
||||
'''
|
||||
|
||||
def __init__(self, config_file=None):
|
||||
'''read config and fill class variables'''
|
||||
CryptoBox.__init__(self, config_file)
|
||||
self.reReadContainerList()
|
||||
|
||||
|
||||
def reReadContainerList(self):
|
||||
self.log.debug("rereading container list")
|
||||
self.containers = []
|
||||
for device in CryptoBoxTools.getAvailablePartitions():
|
||||
if self.isDeviceAllowed(device) and not self.isConfigPartition(device):
|
||||
self.containers.append(CryptoBoxContainer.CryptoBoxContainer(device, self))
|
||||
## sort by container name
|
||||
self.containers.sort(cmp = lambda x,y: x.getName() < y.getName() and -1 or 1)
|
||||
|
||||
|
||||
def isConfigPartition(self, device):
|
||||
proc = subprocess.Popen(
|
||||
shell = False,
|
||||
stdout = subprocess.PIPE,
|
||||
args = [
|
||||
self.prefs["Programs"]["blkid"],
|
||||
"-c", os.path.devnull,
|
||||
"-o", "value",
|
||||
"-s", "LABEL",
|
||||
device])
|
||||
(output, error) = proc.communicate()
|
||||
return output.strip() == self.prefs["Main"]["ConfigVolumeLabel"]
|
||||
|
||||
|
||||
def isDeviceAllowed(self, devicename):
|
||||
"check if a device is white-listed for being used as cryptobox containers"
|
||||
import types
|
||||
allowed = self.prefs["Main"]["AllowedDevices"]
|
||||
if type(allowed) == types.StringType: allowed = [allowed]
|
||||
for a_dev in allowed:
|
||||
"remove double dots and so on ..."
|
||||
real_device = os.path.realpath(devicename)
|
||||
if a_dev and re.search('^' + a_dev, real_device): return True
|
||||
return False
|
||||
|
||||
|
||||
def getLogData(self, lines=None, maxSize=None):
|
||||
"""get the most recent log entries of the cryptobox
|
||||
|
||||
the maximum number and size of these entries can be limited by 'lines' and 'maxSize'
|
||||
"""
|
||||
# return nothing if the currently selected log output is not a file
|
||||
try:
|
||||
if self.prefs["Log"]["Destination"].upper() != "FILE": return []
|
||||
log_file = self.prefs["Log"]["Details"]
|
||||
except KeyError:
|
||||
self.log.error("could not evaluate one of the following config settings: [Log]->Destination or [Log]->Details")
|
||||
return []
|
||||
try:
|
||||
fd = open(log_file, "r")
|
||||
if maxSize: fd.seek(-maxSize, 2) # seek relative to the end of the file
|
||||
content = fd.readlines()
|
||||
fd.close()
|
||||
except IOError:
|
||||
self.log.warn("failed to read the log file (%s)" % log_file)
|
||||
return []
|
||||
if lines: content = content[-lines:]
|
||||
content.reverse()
|
||||
return content
|
||||
|
||||
|
||||
def getContainerList(self, filterType=None, filterName=None):
|
||||
"retrieve the list of all containers of this cryptobox"
|
||||
try:
|
||||
result = self.containers[:]
|
||||
if filterType != None:
|
||||
if filterType in range(len(CryptoBoxContainer.Types)):
|
||||
return [e for e in self.containers if e.getType() == filterType]
|
||||
else:
|
||||
self.log.info("invalid filterType (%d)" % filterType)
|
||||
result.clear()
|
||||
if filterName != None:
|
||||
result = [e for e in self.containers if e.getName() == filterName]
|
||||
return result
|
||||
except AttributeError:
|
||||
return []
|
||||
|
||||
|
||||
def getContainer(self, device):
|
||||
"retrieve the container element for this device"
|
||||
all = [e for e in self.getContainerList() if e.device == device]
|
||||
if all:
|
||||
return all[0]
|
||||
else:
|
||||
return None
|
||||
|
||||
|
||||
def setNameForUUID(self, uuid, name):
|
||||
"assign a name to a uuid in the ContainerNameDatabase"
|
||||
used_uuid = self.getUUIDForName(name)
|
||||
"first remove potential conflicting uuid/name combination"
|
||||
if used_uuid:
|
||||
## remember the container which name was overriden
|
||||
for e in self.containers:
|
||||
if e.getName() == name:
|
||||
forcedRename = e
|
||||
break
|
||||
del self.prefs.nameDB[used_uuid]
|
||||
self.prefs.nameDB[uuid] = name
|
||||
self.prefs.nameDB.write()
|
||||
## rename the container that lost its name (necessary while we use cherrypy)
|
||||
if used_uuid:
|
||||
## this is surely not the best way to regenerate the name
|
||||
dev = e.getDevice()
|
||||
old_index = self.containers.index(e)
|
||||
self.containers.remove(e)
|
||||
self.containers.insert(old_index, CryptoBoxContainer.CryptoBoxContainer(dev,self))
|
||||
## there should be no reason for any failure
|
||||
return True
|
||||
|
||||
|
||||
def getNameForUUID(self, uuid):
|
||||
"get the name belonging to a specified key (usually the UUID of a fs)"
|
||||
try:
|
||||
return self.prefs.nameDB[uuid]
|
||||
except KeyError:
|
||||
return None
|
||||
|
||||
|
||||
def getUUIDForName(self, name):
|
||||
""" get the key belonging to a value in the ContainerNameDatabase
|
||||
this is the reverse action of 'getNameForUUID' """
|
||||
for key in self.prefs.nameDB.keys():
|
||||
if self.prefs.nameDB[key] == name: return key
|
||||
"the uuid was not found"
|
||||
return None
|
||||
|
||||
|
||||
def removeUUID(self, uuid):
|
||||
if uuid in self.prefs.nameDB.keys():
|
||||
del self.prefs.nameDB[uuid]
|
||||
return True
|
||||
else:
|
||||
return False
|
||||
|
||||
|
||||
def getAvailableLanguages(self):
|
||||
'''reads all files in path LangDir and returns a list of
|
||||
basenames from existing hdf files, that should are all available
|
||||
languages'''
|
||||
languages = [ f.rstrip(".hdf")
|
||||
for f in os.listdir(self.prefs["Locations"]["LangDir"])
|
||||
if f.endswith(".hdf") ]
|
||||
if len(languages) < 1:
|
||||
self.log.error("No .hdf files found! The website won't render properly.")
|
||||
return languages
|
||||
|
||||
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
cb = CryptoBoxProps()
|
||||
|
607
bin/CryptoBoxContainer.py
Executable file
|
@ -0,0 +1,607 @@
|
|||
#!/usr/bin/env python2.4
|
||||
|
||||
## check python version
|
||||
import sys
|
||||
(ver_major, ver_minor, ver_sub, ver_desc, ver_subsub) = sys.version_info
|
||||
if (ver_major < 2) or ((ver_major == 2) and (ver_minor < 4)):
|
||||
sys.stderr.write("You need a python version >= 2.4\nCurrent version is:\n %s\n" % sys.version)
|
||||
sys.exit(1)
|
||||
|
||||
import subprocess
|
||||
import os
|
||||
import re
|
||||
import logging
|
||||
from CryptoBoxExceptions import *
|
||||
|
||||
"""exceptions:
|
||||
VolumeIsActive
|
||||
NameActivelyUsed
|
||||
InvalidName
|
||||
InvalidPassword
|
||||
InvalidType
|
||||
CreateError
|
||||
MountError
|
||||
ChangePasswordError
|
||||
"""
|
||||
|
||||
class CryptoBoxContainer:
|
||||
|
||||
Types = {
|
||||
"unused":0,
|
||||
"plain":1,
|
||||
"luks":2,
|
||||
"swap":3}
|
||||
|
||||
|
||||
__fsTypes = {
|
||||
"plain":["ext3", "ext2", "vfat", "reiser"],
|
||||
"swap":["swap"]}
|
||||
# TODO: more filesystem types? / check 'reiser'
|
||||
|
||||
__dmDir = "/dev/mapper"
|
||||
|
||||
|
||||
def __init__(self, device, cbox):
|
||||
self.device = device
|
||||
self.cbox = cbox
|
||||
self.log = logging.getLogger("CryptoBox")
|
||||
self.resetObject()
|
||||
|
||||
|
||||
def getName(self):
|
||||
return self.name
|
||||
|
||||
|
||||
def setName(self, new_name):
|
||||
if new_name == self.name: return
|
||||
if self.isMounted():
|
||||
raise CBVolumeIsActive("the container must be inactive during renaming")
|
||||
if not re.search(r'^[a-zA-Z0-9_\.\- ]+$', new_name):
|
||||
raise CBInvalidName("the supplied new name contains illegal characters")
|
||||
"check for active partitions with the same name"
|
||||
prev_name_owner = self.cbox.getContainerList(filterName=new_name)
|
||||
if prev_name_owner:
|
||||
for a in prev_name_owner:
|
||||
if a.isMounted():
|
||||
raise CBNameActivelyUsed("the supplied new name is already in use for an active partition")
|
||||
if not self.cbox.setNameForUUID(self.uuid, new_name):
|
||||
raise CBContainerError("failed to change the volume name for unknown reasons")
|
||||
self.name = new_name
|
||||
|
||||
|
||||
def getDevice(self):
|
||||
return self.device
|
||||
|
||||
|
||||
def getType(self):
|
||||
return self.type
|
||||
|
||||
|
||||
def isMounted(self):
|
||||
return os.path.ismount(self.__getMountPoint())
|
||||
|
||||
|
||||
def getCapacity(self):
|
||||
"""return the current capacity state of the volume
|
||||
|
||||
the volume may not be mounted
|
||||
the result is a tuple of values in megabyte:
|
||||
(size, available, used)
|
||||
"""
|
||||
info = os.statvfs(self.__getMountPoint())
|
||||
return (
|
||||
int(info.f_bsize*info.f_blocks/1024/1024),
|
||||
int(info.f_bsize*info.f_bavail/1024/1024),
|
||||
int(info.f_bsize*(info.f_blocks-info.f_bavail)/1024/1024))
|
||||
|
||||
|
||||
def getSize(self):
|
||||
"""return the size of the block device (_not_ of the filesystem)
|
||||
|
||||
the result is a value in megabyte
|
||||
an error is indicated by "-1"
|
||||
"""
|
||||
import CryptoBoxTools
|
||||
return CryptoBoxTools.getBlockDeviceSize(self.device)
|
||||
|
||||
|
||||
def resetObject(self):
|
||||
""" recheck the information about this container
|
||||
this is especially useful after changing the type via 'create' """
|
||||
self.uuid = self.__getUUID()
|
||||
self.type = self.__getTypeOfPartition()
|
||||
self.name = self.__getNameOfContainer()
|
||||
if self.type == self.Types["luks"]:
|
||||
self.mount = self.__mountLuks
|
||||
self.umount = self.__umountLuks
|
||||
elif self.type == self.Types["plain"]:
|
||||
self.mount = self.__mountPlain
|
||||
self.umount = self.__umountPlain
|
||||
|
||||
|
||||
def create(self, type, password=None):
|
||||
old_name = self.getName()
|
||||
if type == self.Types["luks"]:
|
||||
self.__createLuks(password)
|
||||
elif type == self.Types["plain"]:
|
||||
self.__createPlain()
|
||||
else:
|
||||
raise CBInvalidType("invalid container type (%d) supplied" % (type, ))
|
||||
## no exception was raised during creation -> we can continue
|
||||
## reset the properties (encryption state, ...) of the device
|
||||
self.resetObject()
|
||||
## restore the old name (must be after resetObject)
|
||||
self.setName(old_name)
|
||||
|
||||
|
||||
def changePassword(self, oldpw, newpw):
|
||||
if self.type != self.Types["luks"]:
|
||||
raise CBInvalidType("changing of password is possible only for luks containers")
|
||||
if not oldpw:
|
||||
raise CBInvalidPassword("no old password supplied for password change")
|
||||
if not newpw:
|
||||
raise CBInvalidPassword("no new password supplied for password change")
|
||||
"return if new and old passwords are the same"
|
||||
if oldpw == newpw: return
|
||||
if self.isMounted():
|
||||
raise CBVolumeIsActive("this container is currently active")
|
||||
devnull = None
|
||||
try:
|
||||
devnull = open(os.devnull, "w")
|
||||
except IOError:
|
||||
self.log.warn("Could not open %s" % (os.devnull, ))
|
||||
"remove any potential open luks mapping"
|
||||
self.__umountLuks()
|
||||
"create the luks header"
|
||||
proc = subprocess.Popen(
|
||||
shell = False,
|
||||
stdin = subprocess.PIPE,
|
||||
stdout = subprocess.PIPE,
|
||||
stderr = subprocess.PIPE,
|
||||
args = [
|
||||
self.cbox.prefs["Programs"]["super"],
|
||||
self.cbox.prefs["Programs"]["CryptoBoxRootActions"],
|
||||
"cryptsetup",
|
||||
"luksAddKey",
|
||||
self.device,
|
||||
"--batch-mode"])
|
||||
proc.stdin.write("%s\n%s" % (oldpw, newpw))
|
||||
(output, errout) = proc.communicate()
|
||||
if proc.returncode != 0:
|
||||
errorMsg = "Could not add a new luks key: %s - %s" % (output.strip(), errout.strip(), )
|
||||
self.log.error(errorMsg)
|
||||
raise CBChangePasswordError(errorMsg)
|
||||
## retrieve the key slot we used for unlocking
|
||||
keys_found = re.search(r'key slot (\d{1,3}) unlocked', output).groups()
|
||||
if keys_found:
|
||||
keyslot = int(keys_found[0])
|
||||
else:
|
||||
raise CBChangePasswordError("could not get the old key slot")
|
||||
"remove the old key"
|
||||
proc = subprocess.Popen(
|
||||
shell = False,
|
||||
stdin = None,
|
||||
stdout = devnull,
|
||||
stderr = subprocess.PIPE,
|
||||
args = [
|
||||
self.cbox.prefs["Programs"]["cryptsetup"],
|
||||
"--batch-mode",
|
||||
"luksDelKey",
|
||||
self.device,
|
||||
"%d" % (keyslot, )])
|
||||
proc.wait()
|
||||
if proc.returncode != 0:
|
||||
errorMsg = "Could not remove the old luks key: %s" % (proc.stderr.read().strip(), )
|
||||
self.log.error(errorMsg)
|
||||
raise CBChangePasswordError(errorMsg)
|
||||
|
||||
|
||||
|
||||
" ****************** internal stuff ********************* "
|
||||
|
||||
def __getNameOfContainer(self):
|
||||
"retrieve the name of the container by querying the database"
|
||||
def_name = self.cbox.getNameForUUID(self.uuid)
|
||||
if def_name: return def_name
|
||||
"there is no name defined for this uuid - we will propose a good one"
|
||||
prefix = self.cbox.prefs["Main"]["DefaultVolumePrefix"]
|
||||
unused_found = False
|
||||
counter = 1
|
||||
while not unused_found:
|
||||
guess = prefix + str(counter)
|
||||
if self.cbox.getUUIDForName(guess):
|
||||
counter += 1
|
||||
else:
|
||||
unused_found = True
|
||||
self.cbox.setNameForUUID(self.uuid, guess)
|
||||
return guess
|
||||
|
||||
|
||||
def __getUUID(self):
|
||||
if self.__getTypeOfPartition() == self.Types["luks"]:
|
||||
guess = self.__getLuksUUID()
|
||||
else:
|
||||
guess = self.__getNonLuksUUID()
|
||||
## did we get a valid value?
|
||||
if guess:
|
||||
return guess
|
||||
else:
|
||||
## emergency default value
|
||||
return self.device.replace(os.path.sep, "_")
|
||||
|
||||
|
||||
def __getLuksUUID(self):
|
||||
"""get uuid for luks devices"""
|
||||
proc = subprocess.Popen(
|
||||
shell = False,
|
||||
stdout = subprocess.PIPE,
|
||||
stderr = subprocess.PIPE,
|
||||
args = [self.cbox.prefs["Programs"]["cryptsetup"],
|
||||
"luksUUID",
|
||||
self.device])
|
||||
(stdout, stderr) = proc.communicate()
|
||||
if proc.returncode != 0:
|
||||
self.cbox.log.info("could not retrieve luks uuid (%s): %s", (self.device, stderr.strip()))
|
||||
return None
|
||||
return stdout.strip()
|
||||
|
||||
|
||||
def __getNonLuksUUID(self):
|
||||
"""return UUID for ext2/3 and vfat filesystems"""
|
||||
try:
|
||||
devnull = open(os.devnull, "w")
|
||||
except IOError:
|
||||
self.warn("Could not open %s" % (os.devnull, ))
|
||||
proc = subprocess.Popen(
|
||||
shell=False,
|
||||
stdout=subprocess.PIPE,
|
||||
stderr=subprocess.PIPE,
|
||||
args=[self.cbox.prefs["Programs"]["blkid"],
|
||||
"-s", "UUID",
|
||||
"-o", "value",
|
||||
"-c", os.devnull,
|
||||
"-w", os.devnull,
|
||||
self.device])
|
||||
(stdout, stderr) = proc.communicate()
|
||||
devnull.close()
|
||||
## execution failed?
|
||||
if proc.returncode != 0:
|
||||
self.log.info("retrieving of partition type (%s) via 'blkid' failed: %s - maybe it is encrypted?" % (self.device, stderr.strip()))
|
||||
return None
|
||||
## return output of blkid
|
||||
return stdout.strip()
|
||||
|
||||
|
||||
def __getTypeOfPartition(self):
|
||||
"retrieve the type of the given partition (see CryptoBoxContainer.Types)"
|
||||
if self.__isLuksPartition(): return self.Types["luks"]
|
||||
typeOfPartition = self.__getTypeIdOfPartition()
|
||||
if typeOfPartition in self.__fsTypes["plain"]:
|
||||
return self.Types["plain"]
|
||||
if typeOfPartition in self.__fsTypes["swap"]:
|
||||
return self.Types["swap"]
|
||||
return self.Types["unused"]
|
||||
|
||||
|
||||
def __getTypeIdOfPartition(self):
|
||||
"returns the type of the partition (see 'man blkid')"
|
||||
devnull = None
|
||||
try:
|
||||
devnull = open(os.devnull, "w")
|
||||
except IOError:
|
||||
self.log.warn("Could not open %s" % (os.devnull, ))
|
||||
proc = subprocess.Popen(
|
||||
shell=False,
|
||||
stdin=None,
|
||||
stdout=subprocess.PIPE,
|
||||
stderr=subprocess.PIPE,
|
||||
args=[self.cbox.prefs["Programs"]["blkid"],
|
||||
"-s", "TYPE",
|
||||
"-o", "value",
|
||||
"-c", os.devnull,
|
||||
"-w", os.devnull,
|
||||
self.device])
|
||||
proc.wait()
|
||||
output = proc.stdout.read().strip()
|
||||
if proc.returncode != 0:
|
||||
self.log.warn("retrieving of partition type via 'blkid' failed: %s" % (proc.stderr.read().strip(), ))
|
||||
return None
|
||||
devnull.close()
|
||||
return output
|
||||
|
||||
|
||||
def __isLuksPartition(self):
|
||||
"check if the given device is a luks partition"
|
||||
devnull = None
|
||||
try:
|
||||
devnull = open(os.devnull, "w")
|
||||
except IOError:
|
||||
self.log.warn("Could not open %s" % (os.devnull, ))
|
||||
proc = subprocess.Popen(
|
||||
shell = False,
|
||||
stdin = None,
|
||||
stdout = devnull,
|
||||
stderr = devnull,
|
||||
args = [
|
||||
self.cbox.prefs["Programs"]["cryptsetup"],
|
||||
"--batch-mode",
|
||||
"isLuks",
|
||||
self.device])
|
||||
proc.wait()
|
||||
devnull.close()
|
||||
return proc.returncode == 0
|
||||
|
||||
|
||||
def __getMountPoint(self):
|
||||
"return the name of the mountpoint of this volume"
|
||||
return os.path.join(self.cbox.prefs["Locations"]["MountParentDir"], self.name)
|
||||
|
||||
|
||||
def __mountLuks(self, password):
|
||||
"mount a luks partition"
|
||||
if not password:
|
||||
raise CBInvalidPassword("no password supplied for luksOpen")
|
||||
if self.isMounted(): raise CBVolumeIsActive("this container is already active")
|
||||
self.__umountLuks()
|
||||
try:
|
||||
devnull = open(os.devnull, "w")
|
||||
except IOError:
|
||||
self.log.warn("Could not open %s" % (os.devnull, ))
|
||||
self.__cleanMountDirs()
|
||||
if not os.path.exists(self.__getMountPoint()):
|
||||
os.mkdir(self.__getMountPoint())
|
||||
if not os.path.exists(self.__getMountPoint()):
|
||||
errorMsg = "Could not create mountpoint (%s)" % (self.__getMountPoint(), )
|
||||
self.log.error(errorMsg)
|
||||
raise CBMountError(errorMsg)
|
||||
proc = subprocess.Popen(
|
||||
shell = False,
|
||||
stdin = subprocess.PIPE,
|
||||
stdout = devnull,
|
||||
stderr = subprocess.PIPE,
|
||||
args = [
|
||||
self.cbox.prefs["Programs"]["super"],
|
||||
self.cbox.prefs["Programs"]["CryptoBoxRootActions"],
|
||||
"cryptsetup",
|
||||
"luksOpen",
|
||||
self.device,
|
||||
self.name,
|
||||
"--batch-mode"])
|
||||
proc.stdin.write(password)
|
||||
(output, errout) = proc.communicate()
|
||||
if proc.returncode != 0:
|
||||
errorMsg = "Could not open the luks mapping: %s" % (errout.strip(), )
|
||||
self.log.warn(errorMsg)
|
||||
raise CBMountError(errorMsg)
|
||||
proc = subprocess.Popen(
|
||||
shell = False,
|
||||
stdin = None,
|
||||
stdout = devnull,
|
||||
stderr = subprocess.PIPE,
|
||||
args = [
|
||||
self.cbox.prefs["Programs"]["super"],
|
||||
self.cbox.prefs["Programs"]["CryptoBoxRootActions"],
|
||||
"mount",
|
||||
os.path.join(self.__dmDir, self.name),
|
||||
self.__getMountPoint()])
|
||||
proc.wait()
|
||||
if proc.returncode != 0:
|
||||
errorMsg = "Could not mount the filesystem: %s" % (proc.stderr.read().strip(), )
|
||||
self.log.warn(errorMsg)
|
||||
raise CBMountError(errorMsg)
|
||||
devnull.close()
|
||||
|
||||
|
||||
def __umountLuks(self):
|
||||
"umount a luks partition"
|
||||
devnull = None
|
||||
try:
|
||||
devnull = open(os.devnull, "w")
|
||||
except IOError:
|
||||
self.log.warn("Could not open %s" % (os.devnull, ))
|
||||
if self.isMounted():
|
||||
proc = subprocess.Popen(
|
||||
shell = False,
|
||||
stdin = None,
|
||||
stdout = devnull,
|
||||
stderr = subprocess.PIPE,
|
||||
args = [
|
||||
self.cbox.prefs["Programs"]["super"],
|
||||
self.cbox.prefs["Programs"]["CryptoBoxRootActions"],
|
||||
"umount",
|
||||
self.__getMountPoint()])
|
||||
proc.wait()
|
||||
if proc.returncode != 0:
|
||||
errorMsg = "Could not umount the filesystem: %s" % (proc.stderr.read().strip(), )
|
||||
self.log.warn(errorMsg)
|
||||
raise CBUmountError(errorMsg)
|
||||
if os.path.exists(os.path.join(self.__dmDir, self.name)):
|
||||
proc = subprocess.Popen(
|
||||
shell = False,
|
||||
stdin = None,
|
||||
stdout = devnull,
|
||||
stderr = subprocess.PIPE,
|
||||
args = [
|
||||
self.cbox.prefs["Programs"]["super"],
|
||||
self.cbox.prefs["Programs"]["CryptoBoxRootActions"],
|
||||
"cryptsetup",
|
||||
"luksClose",
|
||||
self.name,
|
||||
"--batch-mode"])
|
||||
proc.wait()
|
||||
if proc.returncode != 0:
|
||||
errorMsg = "Could not remove the luks mapping: %s" % (proc.stderr.read().strip(), )
|
||||
self.log.warn(errorMsg)
|
||||
raise CBUmountError(errorMsg)
|
||||
devnull.close()
|
||||
|
||||
|
||||
def __mountPlain(self):
|
||||
"mount a plaintext partition"
|
||||
if self.isMounted(): raise CBVolumeIsActive("this container is already active")
|
||||
devnull = None
|
||||
try:
|
||||
devnull = open(os.devnull, "w")
|
||||
except IOError:
|
||||
self.log.warn("Could not open %s" % (os.devnull, ))
|
||||
self.__cleanMountDirs()
|
||||
if not os.path.exists(self.__getMountPoint()):
|
||||
os.mkdir(self.__getMountPoint())
|
||||
if not os.path.exists(self.__getMountPoint()):
|
||||
errorMsg = "Could not create mountpoint (%s)" % (self.__getMountPoint(), )
|
||||
self.log.error(errorMsg)
|
||||
raise CBMountError(errorMsg)
|
||||
proc = subprocess.Popen(
|
||||
shell = False,
|
||||
stdin = None,
|
||||
stdout = devnull,
|
||||
stderr = subprocess.PIPE,
|
||||
args = [
|
||||
self.cbox.prefs["Programs"]["super"],
|
||||
self.cbox.prefs["Programs"]["CryptoBoxRootActions"],
|
||||
"mount",
|
||||
self.device,
|
||||
self.__getMountPoint()])
|
||||
proc.wait()
|
||||
if proc.returncode != 0:
|
||||
errorMsg = "Could not mount the filesystem: %s" % (proc.stderr.read().strip(), )
|
||||
self.log.warn(errorMsg)
|
||||
raise CBMountError(errorMsg)
|
||||
devnull.close()
|
||||
|
||||
|
||||
def __umountPlain(self):
|
||||
"umount a plaintext partition"
|
||||
devnull = None
|
||||
try:
|
||||
devnull = open(os.devnull, "w")
|
||||
except IOError:
|
||||
self.log.warn("Could not open %s" % (os.devnull, ))
|
||||
if self.isMounted():
|
||||
proc = subprocess.Popen(
|
||||
shell = False,
|
||||
stdin = None,
|
||||
stdout = devnull,
|
||||
stderr = subprocess.PIPE,
|
||||
args = [
|
||||
self.cbox.prefs["Programs"]["super"],
|
||||
self.cbox.prefs["Programs"]["CryptoBoxRootActions"],
|
||||
"umount",
|
||||
self.__getMountPoint()])
|
||||
proc.wait()
|
||||
if proc.returncode != 0:
|
||||
errorMsg = "Could not umount the filesystem: %s" % (proc.stderr.read().strip(), )
|
||||
self.log.warn(errorMsg)
|
||||
raise CBUmountError(errorMsg)
|
||||
devnull.close()
|
||||
|
||||
|
||||
def __createPlain(self):
|
||||
"make a plaintext partition"
|
||||
if self.isMounted():
|
||||
raise CBVolumeIsActive("deactivate the partition before filesystem initialization")
|
||||
devnull = None
|
||||
try:
|
||||
devnull = open(os.devnull, "w")
|
||||
except IOError:
|
||||
self.log.warn("Could not open %s" % (os.devnull, ))
|
||||
proc = subprocess.Popen(
|
||||
shell = False,
|
||||
stdin = None,
|
||||
stdout = devnull,
|
||||
stderr = subprocess.PIPE,
|
||||
args = [
|
||||
self.cbox.prefs["Programs"]["mkfs-data"],
|
||||
self.device])
|
||||
proc.wait()
|
||||
if proc.returncode != 0:
|
||||
errorMsg = "Could not create the filesystem: %s" % (proc.stderr.read().strip(), )
|
||||
self.log.error(errorMsg)
|
||||
raise CBCreateError(errorMsg)
|
||||
devnull.close()
|
||||
|
||||
|
||||
def __createLuks(self, password):
|
||||
"make a luks partition"
|
||||
if not password:
|
||||
raise CBInvalidPassword("no password supplied for new luks mapping")
|
||||
if self.isMounted():
|
||||
raise CBVolumeIsActive("deactivate the partition before filesystem initialization")
|
||||
devnull = None
|
||||
try:
|
||||
devnull = open(os.devnull, "w")
|
||||
except IOError:
|
||||
self.log.warn("Could not open %s" % (os.devnull, ))
|
||||
"remove any potential open luks mapping"
|
||||
self.__umountLuks()
|
||||
"create the luks header"
|
||||
proc = subprocess.Popen(
|
||||
shell = False,
|
||||
stdin = subprocess.PIPE,
|
||||
stdout = devnull,
|
||||
stderr = subprocess.PIPE,
|
||||
args = [
|
||||
self.cbox.prefs["Programs"]["super"],
|
||||
self.cbox.prefs["Programs"]["CryptoBoxRootActions"],
|
||||
"cryptsetup",
|
||||
"luksFormat",
|
||||
self.device,
|
||||
"--batch-mode",
|
||||
"--cipher", self.cbox.prefs["Main"]["DefaultCipher"],
|
||||
"--iter-time", "2000"])
|
||||
proc.stdin.write(password)
|
||||
(output, errout) = proc.communicate()
|
||||
if proc.returncode != 0:
|
||||
errorMsg = "Could not create the luks header: %s" % (errout.strip(), )
|
||||
self.log.error(errorMsg)
|
||||
raise CBCreateError(errorMsg)
|
||||
"open the luks container for mkfs"
|
||||
proc = subprocess.Popen(
|
||||
shell = False,
|
||||
stdin = subprocess.PIPE,
|
||||
stdout = devnull,
|
||||
stderr = subprocess.PIPE,
|
||||
args = [
|
||||
self.cbox.prefs["Programs"]["super"],
|
||||
self.cbox.prefs["Programs"]["CryptoBoxRootActions"],
|
||||
"cryptsetup",
|
||||
"luksOpen",
|
||||
self.device,
|
||||
self.name,
|
||||
"--batch-mode"])
|
||||
proc.stdin.write(password)
|
||||
(output, errout) = proc.communicate()
|
||||
if proc.returncode != 0:
|
||||
errorMsg = "Could not open the new luks mapping: %s" % (errout.strip(), )
|
||||
self.log.error(errorMsg)
|
||||
raise CBCreateError(errorMsg)
|
||||
"make the filesystem"
|
||||
proc = subprocess.Popen(
|
||||
shell = False,
|
||||
stdin = None,
|
||||
stdout = devnull,
|
||||
stderr = subprocess.PIPE,
|
||||
args = [
|
||||
self.cbox.prefs["Programs"]["mkfs-data"],
|
||||
os.path.join(self.__dmDir, self.name)])
|
||||
proc.wait()
|
||||
"remove the mapping - for every exit status"
|
||||
self.__umountLuks()
|
||||
if proc.returncode != 0:
|
||||
errorMsg = "Could not create the filesystem: %s" % (proc.stderr.read().strip(), )
|
||||
self.log.error(errorMsg)
|
||||
"remove the luks mapping"
|
||||
raise CBCreateError(errorMsg)
|
||||
devnull.close()
|
||||
|
||||
|
||||
def __cleanMountDirs(self):
|
||||
""" remove all unnecessary subdirs of the mount parent directory
|
||||
this should be called for every (u)mount """
|
||||
subdirs = os.listdir(self.cbox.prefs["Locations"]["MountParentDir"])
|
||||
for dir in subdirs:
|
||||
abs_dir = os.path.join(self.cbox.prefs["Locations"]["MountParentDir"], dir)
|
||||
if (not os.path.islink(abs_dir)) and os.path.isdir(abs_dir) and (not os.path.ismount(abs_dir)):
|
||||
os.rmdir(abs_dir)
|
||||
|
||||
|
107
bin/CryptoBoxExceptions.py
Normal file
|
@ -0,0 +1,107 @@
|
|||
"""
|
||||
exceptions of the cryptobox package
|
||||
"""
|
||||
|
||||
|
||||
class CryptoBoxError(Exception):
|
||||
"""base class for exceptions of the cryptobox"""
|
||||
pass
|
||||
|
||||
|
||||
class CBConfigError(CryptoBoxError):
|
||||
"""any kind of error related to the configuration of a cryptobox"""
|
||||
pass
|
||||
|
||||
|
||||
class CBConfigUnavailableError(CBConfigError):
|
||||
"""config file/input was not available at all"""
|
||||
|
||||
def __init__(self, source=None):
|
||||
self.source = source
|
||||
|
||||
def __str__(self):
|
||||
if self.source:
|
||||
return "failed to access the configuration of the cryptobox: %s" % self.source
|
||||
else:
|
||||
return "failed to access the configuration of the cryptobox"
|
||||
|
||||
|
||||
class CBConfigUndefinedError(CBConfigError):
|
||||
"""a specific configuration setting was not defined"""
|
||||
|
||||
def __init__(self, section, name=None):
|
||||
self.section = section
|
||||
self.name = name
|
||||
|
||||
def __str__(self):
|
||||
# is it a settings or a section?
|
||||
if self.name:
|
||||
# setting
|
||||
return "undefined configuration setting: [%s]->%s - please check your configuration file" % (self.section, self.name)
|
||||
else:
|
||||
# section
|
||||
return "undefined configuration section: [%s] - please check your configuration file" % (self.section, )
|
||||
|
||||
|
||||
|
||||
class CBConfigInvalidValueError(CBConfigError):
|
||||
"""a configuration setting was invalid somehow"""
|
||||
|
||||
def __init__(self, section, name, value, reason):
|
||||
self.section = section
|
||||
self.name = name
|
||||
self.value = value
|
||||
self.reason = reason
|
||||
|
||||
def __str__(self):
|
||||
return "invalid configuration setting [%s]->%s (%s): %s" % (self.section, self.name, self.value, self.reason)
|
||||
|
||||
|
||||
class CBEnvironmentError(CryptoBoxError):
|
||||
"""some part of the environment of the cryptobox is broken
|
||||
e.g. the wrong version of a required program
|
||||
"""
|
||||
|
||||
def __init__(self, desc):
|
||||
self.desc = desc
|
||||
|
||||
def __str__(self):
|
||||
return "misconfiguration detected: %s" % self.desc
|
||||
|
||||
|
||||
class CBContainerError(CryptoBoxError):
|
||||
"""any error raised while manipulating a cryptobox container"""
|
||||
|
||||
def __init__(self, desc):
|
||||
self.desc = desc
|
||||
|
||||
def __str__(self):
|
||||
return self.desc
|
||||
|
||||
class CBCreateError(CBContainerError):
|
||||
pass
|
||||
|
||||
class CBVolumeIsActive(CBContainerError):
|
||||
pass
|
||||
|
||||
class CBInvalidName(CBContainerError):
|
||||
pass
|
||||
|
||||
class CBNameActivelyUsed(CBContainerError):
|
||||
pass
|
||||
|
||||
class CBInvalidType(CBContainerError):
|
||||
pass
|
||||
|
||||
class CBInvalidPassword(CBContainerError):
|
||||
pass
|
||||
|
||||
class CBChangePasswordError(CBContainerError):
|
||||
pass
|
||||
|
||||
class CBMountError(CBContainerError):
|
||||
pass
|
||||
|
||||
class CBUmountError(CBContainerError):
|
||||
pass
|
||||
|
165
bin/CryptoBoxPlugin.py
Normal file
|
@ -0,0 +1,165 @@
|
|||
# $Id$
|
||||
#
|
||||
# parent class for all plugins of the CryptoBox
|
||||
#
|
||||
|
||||
import os
|
||||
import cherrypy
|
||||
|
||||
|
||||
class CryptoBoxPlugin:
|
||||
|
||||
## default capability is "system" - the other supported capability is: "volume"
|
||||
pluginCapabilities = [ "system" ]
|
||||
|
||||
## does this plugin require admin authentification?
|
||||
requestAuth = False
|
||||
|
||||
## is this plugin enabled by default?
|
||||
enabled = True
|
||||
|
||||
## default rank (0..100) of the plugin in listings (lower value means higher priority)
|
||||
rank = 80
|
||||
|
||||
|
||||
## default icon of this plugin (relative path)
|
||||
defaultIconFileName = "plugin_icon.png"
|
||||
|
||||
|
||||
def __init__(self, cbox, pluginDir):
|
||||
self.cbox = cbox
|
||||
self.hdf = {}
|
||||
self.pluginDir = pluginDir
|
||||
self.hdf_prefix = "Data.Plugins.%s." % self.getName()
|
||||
|
||||
|
||||
def doAction(self, **args):
|
||||
"""override doAction with your plugin code"""
|
||||
raise Exception, "undefined action handler ('doAction') in plugin '%'" % self.getName()
|
||||
|
||||
|
||||
def getStatus(self):
|
||||
"""you should override this, to supply useful state information"""
|
||||
raise Exception, "undefined state handler ('getStatus') in plugin '%'" % self.getName()
|
||||
|
||||
|
||||
def getName(self):
|
||||
"""the name of the python file (module) should be the name of the plugin"""
|
||||
return self.__module__
|
||||
|
||||
|
||||
@cherrypy.expose
|
||||
def getIcon(self, image=None, **kargs):
|
||||
"""return the image data of the icon of the plugin
|
||||
|
||||
the parameter 'image' may be used for alternative image locations (relative
|
||||
to the directory of the plugin)
|
||||
'**kargs' is necessary, as a 'weblang' attribute may be specified (and ignored)"""
|
||||
import cherrypy, re
|
||||
if (image is None): # or (re.search(u'[\w-\.]', image)):
|
||||
plugin_icon_file = os.path.join(self.pluginDir, self.defaultIconFileName)
|
||||
else:
|
||||
plugin_icon_file = os.path.join(self.pluginDir, image)
|
||||
if not os.access(plugin_icon_file, os.R_OK):
|
||||
plugin_icon_file = os.path.join(self.cbox.prefs["Locations"]["PluginDir"], "plugin_icon_unknown.png")
|
||||
return cherrypy.lib.cptools.serveFile(plugin_icon_file)
|
||||
|
||||
|
||||
def getTemplateFileName(self, template_name):
|
||||
"""return the filename of the template, if it is part of this plugin
|
||||
|
||||
use this function to check, if the plugin provides the specified template
|
||||
"""
|
||||
result_file = os.path.join(self.pluginDir, template_name + ".cs")
|
||||
if os.access(result_file, os.R_OK) and os.path.isfile(result_file):
|
||||
return result_file
|
||||
else:
|
||||
return None
|
||||
|
||||
|
||||
def getLanguageData(self, lang="en"):
|
||||
try:
|
||||
import neo_cgi, neo_util
|
||||
except:
|
||||
raise CryptoBoxExceptions.CBEnvironmentError("couldn't import 'neo_*'! Try 'apt-get install python-clearsilver'.")
|
||||
langdir = os.path.abspath(os.path.join(self.pluginDir, "lang"))
|
||||
## first: the default language file (english)
|
||||
langFiles = [os.path.join(langdir, "en.hdf")]
|
||||
## maybe we have to load a translation afterwards
|
||||
if lang != "en":
|
||||
langFiles.append(os.path.join(langdir, lang + ".hdf"))
|
||||
file_found = False
|
||||
lang_hdf = neo_util.HDF()
|
||||
for langFile in langFiles:
|
||||
if os.access(langFile, os.R_OK):
|
||||
lang_hdf.readFile(langFile)
|
||||
file_found = True
|
||||
if file_found:
|
||||
return lang_hdf
|
||||
else:
|
||||
self.cbox.log.debug("Couldn't find a valid plugin language file (%s)" % str(langFiles))
|
||||
return None
|
||||
|
||||
|
||||
def loadDataSet(self, hdf):
|
||||
for (key, value) in self.hdf.items():
|
||||
hdf.setValue(key, str(value))
|
||||
|
||||
|
||||
def isAuthRequired(self):
|
||||
"""check if this plugin requires authentication
|
||||
first step: check plugin configuration
|
||||
second step: check default value of plugin"""
|
||||
try:
|
||||
if self.cbox.prefs.pluginConf[self.getName()]["requestAuth"] is None:
|
||||
return self.requestAuth
|
||||
if self.cbox.prefs.pluginConf[self.getName()]["requestAuth"]:
|
||||
return True
|
||||
else:
|
||||
return False
|
||||
except KeyError:
|
||||
return self.requestAuth
|
||||
|
||||
|
||||
def isEnabled(self):
|
||||
"""check if this plugin is enabled
|
||||
first step: check plugin configuration
|
||||
second step: check default value of plugin"""
|
||||
import types
|
||||
try:
|
||||
if self.cbox.prefs.pluginConf[self.getName()]["enabled"] is None:
|
||||
return self.enabled
|
||||
if self.cbox.prefs.pluginConf[self.getName()]["enabled"]:
|
||||
return True
|
||||
else:
|
||||
return False
|
||||
except KeyError:
|
||||
return self.enabled
|
||||
|
||||
|
||||
def getRank(self):
|
||||
"""check the rank of this plugin
|
||||
first step: check plugin configuration
|
||||
second step: check default value of plugin"""
|
||||
try:
|
||||
if self.cbox.prefs.pluginConf[self.getName()]["rank"] is None:
|
||||
return self.rank
|
||||
return int(self.cbox.prefs.pluginConf[self.getName()]["rank"])
|
||||
except KeyError, TypeError:
|
||||
return self.rank
|
||||
|
||||
|
||||
def getTestClass(self):
|
||||
import imp
|
||||
pl_file = os.path.join(self.pluginDir, "unittests.py")
|
||||
if os.access(pl_file, os.R_OK) and os.path.isfile(pl_file):
|
||||
try:
|
||||
return getattr(imp.load_source("unittests_%s" % self.getName(), pl_file), "unittests")
|
||||
except AttributeError:
|
||||
pass
|
||||
try:
|
||||
self.cbox.log.info("could not load unittests for plugin: %s" % self.getName())
|
||||
except AttributeError:
|
||||
pass
|
||||
return None
|
||||
|
386
bin/CryptoBoxRootActions.py
Executable file
|
@ -0,0 +1,386 @@
|
|||
#!/usr/bin/env python2.4
|
||||
|
||||
"""module for executing the programs, that need root privileges
|
||||
|
||||
Syntax:
|
||||
- program
|
||||
- device
|
||||
- [action]
|
||||
- [action args]
|
||||
|
||||
this script will always return with an exitcode 0 (true), if "check" is the only argument
|
||||
"""
|
||||
|
||||
import os
|
||||
import sys
|
||||
import subprocess
|
||||
import pwd
|
||||
import grp
|
||||
import types
|
||||
|
||||
allowedProgs = {
|
||||
"sfdisk": "/sbin/sfdisk",
|
||||
"cryptsetup": "/sbin/cryptsetup",
|
||||
"mount": "/bin/mount",
|
||||
"umount": "/bin/umount",
|
||||
"blkid": "/sbin/blkid",
|
||||
}
|
||||
|
||||
|
||||
DEV_TYPES = { "pipe":1, "char":2, "dir":4, "block":6, "file":8, "link":10, "socket":12}
|
||||
|
||||
|
||||
def checkIfPluginIsSafe(plugin):
|
||||
"""check if the plugin and its parents are only writeable for root"""
|
||||
#FIXME: for now we may skip this test - but users will not like it this way :)
|
||||
return True
|
||||
props = os.stat(plugin)
|
||||
## check if it is owned by non-root
|
||||
if props.st_uid != 0: return False
|
||||
## check group-write permission if gid is not zero
|
||||
if (props.st_gid != 0) and (props.st_mode % 32 / 16 > 0): return False
|
||||
## check if it is world-writeable
|
||||
if props.st_mode % 4 / 2 > 0: return False
|
||||
## are we at root-level (directory-wise)? If yes, then we are ok ...
|
||||
if plugin == os.path.sep: return True
|
||||
## check if the parent directory is ok - recursively :)
|
||||
return checkIfPluginIsSafe(os.path.dirname(os.path.abspath(plugin)))
|
||||
|
||||
|
||||
def checkIfPluginIsValid(plugin):
|
||||
import imp
|
||||
try:
|
||||
x = imp.load_source("cbox_plugin",plugin)
|
||||
except Exception:
|
||||
return False
|
||||
try:
|
||||
if getattr(x, "PLUGIN_TYPE") == "cryptobox":
|
||||
return True
|
||||
else:
|
||||
return False
|
||||
except Exception:
|
||||
return False
|
||||
|
||||
|
||||
def call_plugin(args):
|
||||
"""check if the plugin may be called - and do it finally ..."""
|
||||
plugin = os.path.abspath(args[0])
|
||||
del args[0]
|
||||
## check existence and excutability
|
||||
if not os.access(plugin, os.X_OK):
|
||||
raise Exception, "could not find executable plugin (%s)" % plugin
|
||||
## check if the plugin (and its parents) are only writeable for root
|
||||
if not checkIfPluginIsSafe(plugin):
|
||||
raise Exception, "the plugin (%s) was not safe - check its (and its parents') permissions" % plugin
|
||||
## check if the plugin is a python program, that is marked as a cryptobox plugin
|
||||
if not checkIfPluginIsValid(plugin):
|
||||
raise Exception, "the plugin (%s) is not a correctly marked python script" % plugin
|
||||
args.insert(0,plugin)
|
||||
proc = subprocess.Popen(
|
||||
shell = False,
|
||||
args = args)
|
||||
proc.wait()
|
||||
return proc.returncode == 0
|
||||
|
||||
|
||||
def isWriteable(device, force_dev_type=None):
|
||||
"""check if the calling user (not root!) has write access to the device/file
|
||||
|
||||
the real (not the effictive) user id is used for the check
|
||||
additionally the permissions of the default groups of the real uid are checked
|
||||
this check works nicely together with "super", as it changes (by default) only
|
||||
the effective uid (not the real uid)
|
||||
"""
|
||||
# first check, if the device/file exists
|
||||
if not os.path.exists(device):
|
||||
return False
|
||||
# check the type of the device - if necessary
|
||||
if not force_dev_type is None:
|
||||
dev_type = os.stat(device).st_mode % 65536 / 4096
|
||||
if dev_type != force_dev_type: return False
|
||||
# retrieve the information for the real user id
|
||||
(trustUserName, trustUID, groupsOfTrustUser) = getUserInfo(os.getuid())
|
||||
# set the default groups of the caller for the check (restore them later)
|
||||
savedGroups = os.getgroups()
|
||||
os.setgroups(groupsOfTrustUser)
|
||||
# check permissions
|
||||
result = os.access(device, os.W_OK) and os.access(device, os.R_OK)
|
||||
# reset the groups of this process
|
||||
os.setgroups(savedGroups)
|
||||
return result
|
||||
|
||||
|
||||
def run_cryptsetup(args):
|
||||
"""execute cryptsetup as root
|
||||
|
||||
@args: list of arguments - they will be treated accordingly to the first element
|
||||
of this list (the action)"""
|
||||
if not args: raise "WrongArguments", "no action for cryptsetup supplied"
|
||||
if type(args) != types.ListType: raise "WrongArguments", "invalid arguments supplied: %s" % (args, )
|
||||
try:
|
||||
action = args[0]
|
||||
del args[0]
|
||||
device = None
|
||||
cmd_args = []
|
||||
if action == "luksFormat":
|
||||
device = args[0]; del args[0]
|
||||
cmd_args.append(action)
|
||||
cmd_args.append(device)
|
||||
elif action == "luksUUID":
|
||||
device = args[0]; del args[0]
|
||||
cmd_args.append(action)
|
||||
cmd_args.append(device)
|
||||
elif action == "luksOpen":
|
||||
if len(args) < 2: raise "WrongArguments", "missing arguments"
|
||||
device = args[0]; del args[0]
|
||||
destination = args[0]; del args[0]
|
||||
cmd_args.append(action)
|
||||
cmd_args.append(device)
|
||||
cmd_args.append(destination)
|
||||
elif action == "luksClose":
|
||||
if len(args) < 1: raise "WrongArguments", "missing arguments"
|
||||
destination = args[0]; del args[0]
|
||||
# maybe add a check for the mapped device's permissions?
|
||||
# dmsetup deps self.device
|
||||
cmd_args.append(action)
|
||||
cmd_args.append(destination)
|
||||
elif action == "luksAddKey":
|
||||
device = args[0]; del args[0]
|
||||
cmd_args.append(action)
|
||||
cmd_args.append(device)
|
||||
elif action == "luksDelKey":
|
||||
if len(cs_args) < 2: raise "WrongArguments", "missing arguments"
|
||||
device = args[0]; del args[0]
|
||||
cmd_args.insert(-1, action)
|
||||
cmd_args.insert(-1, device)
|
||||
elif action == "isLuks":
|
||||
device = args[0]; del args[0]
|
||||
cmd_args.append(action)
|
||||
cmd_args.append(device)
|
||||
else: raise "WrongArguments", "invalid action supplied: %s" % (action, )
|
||||
# check if a device was defined - and check it
|
||||
if (not device is None) and (not isWriteable(device, DEV_TYPES["block"])):
|
||||
raise "WrongArguments", "%s is not a writeable block device" % (device, )
|
||||
cs_args = [allowedProgs["cryptsetup"]]
|
||||
cs_args.extend(args)
|
||||
cs_args.extend(cmd_args)
|
||||
except (TypeError, IndexError):
|
||||
raise "WrongArguments", "invalid arguments supplied: %s" % (args, )
|
||||
# execute cryptsetup with the given parameters
|
||||
proc = subprocess.Popen(
|
||||
shell = False,
|
||||
args = cs_args)
|
||||
proc.wait()
|
||||
## chown the devmapper block device to the cryptobox user
|
||||
if (proc.returncode == 0) and (action == "luksOpen"):
|
||||
os.chown(os.path.join(os.path.sep, "dev", "mapper", destination), os.getuid(), os.getgid())
|
||||
return proc.returncode == 0
|
||||
|
||||
|
||||
def run_sfdisk(args):
|
||||
"""execute sfdisk for partitioning
|
||||
|
||||
not implemented yet"""
|
||||
print "ok - you are free to call sfdisk ..."
|
||||
print " not yet implemented ..."
|
||||
return True
|
||||
|
||||
|
||||
def getFSType(device):
|
||||
"""get the filesystem type of a device"""
|
||||
proc = subprocess.Popen(
|
||||
shell = False,
|
||||
stdout = subprocess.PIPE,
|
||||
args = [ allowedProgs["blkid"],
|
||||
"-s", "TYPE",
|
||||
"-o", "value",
|
||||
"-c", os.devnull,
|
||||
"-w", os.devnull,
|
||||
device])
|
||||
(stdout, stderr) = proc.communicate()
|
||||
if proc.returncode != 0:
|
||||
return None
|
||||
return stdout.strip()
|
||||
|
||||
|
||||
def run_mount(args):
|
||||
"""execute mount
|
||||
"""
|
||||
if not args: raise "WrongArguments", "no destination for mount supplied"
|
||||
if type(args) != types.ListType: raise "WrongArguments", "invalid arguments supplied: %s" % (args, )
|
||||
try:
|
||||
device = args[0]
|
||||
del args[0]
|
||||
destination = args[0]
|
||||
del args[0]
|
||||
# check permissions for the device
|
||||
if not isWriteable(device, DEV_TYPES["block"]):
|
||||
raise "WrongArguments", "%s is not a writeable block device" % (device, )
|
||||
## check permissions for the mountpoint
|
||||
if not isWriteable(destination, DEV_TYPES["dir"]):
|
||||
raise "WrongArguments", "the mountpoint (%s) is not writeable" % (destination, )
|
||||
# check for additional (not allowed) arguments
|
||||
if len(args) != 0:
|
||||
raise "WrongArguments", "too many arguments for 'mount': %s" % (args, )
|
||||
except TypeError:
|
||||
raise "WrongArguments", "invalid arguments supplied: %s" % (args, )
|
||||
# execute mount with the given parameters
|
||||
# first overwrite the real uid, as 'mount' wants this to be zero (root)
|
||||
savedUID = os.getuid()
|
||||
os.setuid(os.geteuid())
|
||||
## we have to change the permissions of the mounted directory - otherwise it will
|
||||
## not be writeable for the cryptobox user
|
||||
## for 'vfat' we have to do this during mount
|
||||
## for ext2/3 we have to do it afterward
|
||||
## first: get the user/group of the target
|
||||
(trustUserName, trustUID, groupsOfTrustUser) = getUserInfo(savedUID)
|
||||
trustGID = groupsOfTrustUser[0]
|
||||
fsType = getFSType(device)
|
||||
## define arguments
|
||||
if fsType == "vfat":
|
||||
## add the "uid/gid" arguments to the mount call
|
||||
mount_args = [allowedProgs["mount"],
|
||||
"-o", "uid=%d,gid=%d" % (trustUID, trustGID),
|
||||
device,
|
||||
destination]
|
||||
else:
|
||||
## all other filesystem types will be handled after mount
|
||||
mount_args = [allowedProgs["mount"], device, destination]
|
||||
# execute mount
|
||||
proc = subprocess.Popen(
|
||||
shell = False,
|
||||
args = mount_args)
|
||||
proc.wait()
|
||||
## return in case of an error
|
||||
if proc.returncode != 0:
|
||||
return False
|
||||
## for vfat: we are done
|
||||
if fsType == "vfat": return True
|
||||
## for all other filesystem types: chown the mount directory
|
||||
try:
|
||||
os.chown(destination, trustUID, groupsOfTrustUser[0])
|
||||
except OSError, errMsg:
|
||||
sys.stderr.write("could not chown the mount destination (%s) to the specified user (%d/%d): %s\n" % (destination, trustUID, groupsOfTrustUser[0], errMsg))
|
||||
sys.stderr.write("UID: %d\n" % (os.geteuid(),))
|
||||
return False
|
||||
## BEWARE: it would be nice, if we could restore the previous uid (not euid) but
|
||||
## this would also override the euid (see 'man 2 setuid') - any ideas?
|
||||
return True
|
||||
|
||||
|
||||
def run_umount(args):
|
||||
"""execute mount
|
||||
"""
|
||||
if not args: raise "WrongArguments", "no mountpoint for umount supplied"
|
||||
if type(args) != types.ListType: raise "WrongArguments", "invalid arguments supplied"
|
||||
try:
|
||||
destination = args[0]
|
||||
del args[0]
|
||||
# check permissions for the destination
|
||||
if not isWriteable(os.path.dirname(destination), DEV_TYPES["dir"]):
|
||||
raise "WrongArguments", "the parent of the mountpoint (%s) is not writeable" % (destination, )
|
||||
if len(args) != 0: raise "WrongArguments", "umount does not allow arguments"
|
||||
except TypeError:
|
||||
raise "WrongArguments", "invalid arguments supplied"
|
||||
# execute umount with the given parameters
|
||||
# first overwrite the real uid, as 'umount' wants this to be zero (root)
|
||||
savedUID = os.getuid()
|
||||
os.setuid(os.geteuid())
|
||||
# execute umount (with the parameter '-l' - lazy umount)
|
||||
proc = subprocess.Popen(
|
||||
shell = False,
|
||||
args = [allowedProgs["umount"], "-l", destination])
|
||||
proc.wait()
|
||||
# restore previous real uid
|
||||
os.setuid(savedUID)
|
||||
return proc.returncode == 0
|
||||
|
||||
|
||||
def getUserInfo(user):
|
||||
"""return information about the specified user
|
||||
|
||||
@user: (uid or name)
|
||||
@return: tuple of (name, uid, (groups))
|
||||
"""
|
||||
if user is None: raise "KeyError", "no user supplied"
|
||||
# first check, if 'user' contains an id - then check for a name
|
||||
try:
|
||||
userinfo = pwd.getpwuid(user)
|
||||
except TypeError:
|
||||
# if a KeyError is raised again, then the supplied user was invalid
|
||||
userinfo = pwd.getpwnam(user)
|
||||
u_groups =[one_group.gr_gid
|
||||
for one_group in grp.getgrall()
|
||||
if userinfo.pw_name in one_group.gr_mem]
|
||||
if not userinfo.pw_gid in u_groups: u_groups.append(userinfo.pw_gid)
|
||||
return (userinfo.pw_name, userinfo.pw_uid, u_groups)
|
||||
|
||||
|
||||
# **************** main **********************
|
||||
|
||||
# prevent import
|
||||
if __name__ == "__main__":
|
||||
|
||||
# do we have root privileges (effective uid is zero)?
|
||||
if os.geteuid() != 0:
|
||||
sys.stderr.write("the effective uid is not zero - you should use 'super' to call this script (%s)" % sys.argv[0])
|
||||
sys.exit(100)
|
||||
|
||||
# remove program name
|
||||
args = sys.argv[1:]
|
||||
|
||||
# do not allow to use root permissions (real uid may not be zero)
|
||||
if os.getuid() == 0:
|
||||
sys.stderr.write("the uid of the caller is zero (root) - this is not allowed\n")
|
||||
sys.exit(100)
|
||||
|
||||
# check if there were arguments
|
||||
if (len(args) == 0):
|
||||
sys.stderr.write("No arguments supplied\n")
|
||||
sys.exit(100)
|
||||
|
||||
# did the user call the "check" action?
|
||||
if (len(args) == 1) and (args[0].lower() == "check"):
|
||||
# exit silently
|
||||
sys.exit(0)
|
||||
|
||||
if args[0].lower() == "plugin":
|
||||
del args[0]
|
||||
try:
|
||||
isOK = call_plugin(args)
|
||||
except Exception, errMsg:
|
||||
sys.stderr.write("Execution of plugin failed: %s\n" % errMsg)
|
||||
sys.exit(100)
|
||||
if isOK:
|
||||
sys.exit(0)
|
||||
else:
|
||||
sys.exit(1)
|
||||
|
||||
# check parameters count
|
||||
if len(args) < 2:
|
||||
sys.stderr.write("Not enough arguments supplied (%s)!\n" % " ".join(args))
|
||||
sys.exit(100)
|
||||
|
||||
progRequest = args[0]
|
||||
del args[0]
|
||||
|
||||
if not progRequest in allowedProgs.keys():
|
||||
sys.stderr.write("Invalid program requested: %s\n" % progRequest)
|
||||
sys.exit(100)
|
||||
|
||||
if progRequest == "cryptsetup": runner = run_cryptsetup
|
||||
elif progRequest == "sfdisk": runner = run_sfdisk
|
||||
elif progRequest == "mount": runner = run_mount
|
||||
elif progRequest == "umount": runner = run_umount
|
||||
else:
|
||||
sys.stderr.write("The interface for this program (%s) is not yet implemented!\n" % progRequest)
|
||||
sys.exit(100)
|
||||
try:
|
||||
if runner(args):
|
||||
sys.exit(0)
|
||||
else:
|
||||
sys.exit(1)
|
||||
except "WrongArguments", errstr:
|
||||
sys.stderr.write("Execution failed: %s\n" % errstr)
|
||||
sys.exit(100)
|
||||
|
481
bin/CryptoBoxSettings.py
Normal file
|
@ -0,0 +1,481 @@
|
|||
import logging
|
||||
try:
|
||||
import validate
|
||||
except:
|
||||
raise CryptoBoxExceptions.CBEnvironmentError("couldn't import 'validate'! Try 'apt-get install python-formencode'.")
|
||||
import os
|
||||
import CryptoBoxExceptions
|
||||
import subprocess
|
||||
try:
|
||||
import configobj ## needed for reading and writing of the config file
|
||||
except:
|
||||
raise CryptoBoxExceptions.CBEnvironmentError("couldn't import 'configobj'! Try 'apt-get install python-configobj'.")
|
||||
|
||||
|
||||
|
||||
class CryptoBoxSettings:
|
||||
|
||||
CONF_LOCATIONS = [
|
||||
"./cryptobox.conf",
|
||||
"~/.cryptobox.conf",
|
||||
"/etc/cryptobox/cryptobox.conf"]
|
||||
|
||||
NAMEDB_FILE = "cryptobox_names.db"
|
||||
PLUGINCONF_FILE = "cryptobox_plugins.conf"
|
||||
USERDB_FILE = "cryptobox_users.db"
|
||||
|
||||
|
||||
def __init__(self, config_file=None):
|
||||
self.log = logging.getLogger("CryptoBox")
|
||||
config_file = self.__getConfigFileName(config_file)
|
||||
self.log.info("loading config file: %s" % config_file)
|
||||
self.prefs = self.__getPreferences(config_file)
|
||||
self.__validateConfig()
|
||||
self.__configureLogHandler()
|
||||
self.__checkUnknownPreferences()
|
||||
self.preparePartition()
|
||||
self.nameDB = self.__getNameDatabase()
|
||||
self.pluginConf = self.__getPluginConfig()
|
||||
self.userDB = self.__getUserDB()
|
||||
self.misc_files = self.__getMiscFiles()
|
||||
|
||||
|
||||
def write(self):
|
||||
"""
|
||||
write all local setting files including the content of the "misc" subdirectory
|
||||
"""
|
||||
ok = True
|
||||
try:
|
||||
self.nameDB.write()
|
||||
except IOError:
|
||||
self.log.warn("could not save the name database")
|
||||
ok = False
|
||||
try:
|
||||
self.pluginConf.write()
|
||||
except IOError:
|
||||
self.log.warn("could not save the plugin configuration")
|
||||
ok = False
|
||||
try:
|
||||
self.userDB.write()
|
||||
except IOError:
|
||||
self.log.warn("could not save the user database")
|
||||
ok = False
|
||||
for misc_file in self.misc_files:
|
||||
if not misc_file.save():
|
||||
self.log.warn("could not save a misc setting file (%s)" % misc_file.filename)
|
||||
ok = False
|
||||
return ok
|
||||
|
||||
|
||||
def requiresPartition(self):
|
||||
return bool(self.prefs["Main"]["UseConfigPartition"])
|
||||
|
||||
|
||||
def getActivePartition(self):
|
||||
settings_dir = self.prefs["Locations"]["SettingsDir"]
|
||||
if not os.path.ismount(settings_dir): return None
|
||||
for line in file("/proc/mounts"):
|
||||
fields = line.split(" ")
|
||||
mount_dir = fields[1]
|
||||
try:
|
||||
if os.path.samefile(mount_dir, settings_dir): return fields[0]
|
||||
except OSError:
|
||||
pass
|
||||
## no matching entry found
|
||||
return None
|
||||
|
||||
|
||||
def mountPartition(self):
|
||||
self.log.debug("trying to mount configuration partition")
|
||||
if not self.requiresPartition():
|
||||
self.log.warn("mountConfigPartition: configuration partition is not required - mounting anyway")
|
||||
if self.getActivePartition():
|
||||
self.log.warn("mountConfigPartition: configuration partition already mounted - not mounting again")
|
||||
return False
|
||||
confPartitions = self.getAvailablePartitions()
|
||||
if not confPartitions:
|
||||
self.log.error("no configuration partitions found - you have to create it first")
|
||||
return False
|
||||
partition = confPartitions[0]
|
||||
proc = subprocess.Popen(
|
||||
shell = False,
|
||||
stdout = subprocess.PIPE,
|
||||
stderr = subprocess.PIPE,
|
||||
args = [
|
||||
self.prefs["Programs"]["super"],
|
||||
self.prefs["Programs"]["CryptoBoxRootActions"],
|
||||
"mount",
|
||||
partition,
|
||||
self.prefs["Locations"]["SettingsDir"]])
|
||||
(stdout, stderr) = proc.communicate()
|
||||
if proc.returncode != 0:
|
||||
self.log.error("failed to mount the configuration partition: %s" % partition)
|
||||
self.log.error("output of mount: %s" % (stderr,))
|
||||
return False
|
||||
self.log.info("configuration partition mounted: %s" % partition)
|
||||
return True
|
||||
|
||||
|
||||
def umountPartition(self):
|
||||
if not self.getActivePartition():
|
||||
self.log.warn("umountConfigPartition: no configuration partition mounted")
|
||||
return False
|
||||
proc = subprocess.Popen(
|
||||
shell = False,
|
||||
stdout = subprocess.PIPE,
|
||||
stderr = subprocess.PIPE,
|
||||
args = [
|
||||
self.prefs["Programs"]["super"],
|
||||
self.prefs["Programs"]["CryptoBoxRootActions"],
|
||||
"umount",
|
||||
self.prefs["Locations"]["SettingsDir"]])
|
||||
(stdout, stderr) = proc.communicate()
|
||||
if proc.returncode != 0:
|
||||
self.log.error("failed to unmount the configuration partition")
|
||||
self.log.error("output of mount: %s" % (stderr,))
|
||||
return False
|
||||
self.log.info("configuration partition unmounted")
|
||||
return True
|
||||
|
||||
|
||||
def getAvailablePartitions(self):
|
||||
"""returns a sequence of found config partitions"""
|
||||
proc = subprocess.Popen(
|
||||
shell = False,
|
||||
stdout = subprocess.PIPE,
|
||||
args = [
|
||||
self.prefs["Programs"]["blkid"],
|
||||
"-c", os.path.devnull,
|
||||
"-t", "LABEL=%s" % self.prefs["Main"]["ConfigVolumeLabel"] ])
|
||||
(output, error) = proc.communicate()
|
||||
if output:
|
||||
return [e.strip().split(":",1)[0] for e in output.splitlines()]
|
||||
else:
|
||||
return []
|
||||
|
||||
|
||||
def preparePartition(self):
|
||||
if self.requiresPartition() and not self.getActivePartition():
|
||||
self.mountPartition()
|
||||
|
||||
|
||||
def __getitem__(self, key):
|
||||
"""redirect all requests to the 'prefs' attribute"""
|
||||
return self.prefs[key]
|
||||
|
||||
|
||||
def __getPreferences(self, config_file):
|
||||
import StringIO
|
||||
config_rules = StringIO.StringIO(self.validation_spec)
|
||||
try:
|
||||
prefs = configobj.ConfigObj(config_file, configspec=config_rules)
|
||||
if prefs:
|
||||
self.log.info("found config: %s" % prefs.items())
|
||||
else:
|
||||
raise CryptoBoxExceptions.CBConfigUnavailableError("failed to load the config file: %s" % config_file)
|
||||
except IOError:
|
||||
raise CryptoBoxExceptions.CBConfigUnavailableError("unable to open the config file: %s" % config_file)
|
||||
return prefs
|
||||
|
||||
|
||||
def __validateConfig(self):
|
||||
result = self.prefs.validate(CryptoBoxSettingsValidator(), preserve_errors=True)
|
||||
error_list = configobj.flatten_errors(self.prefs, result)
|
||||
if not error_list: return
|
||||
errorMsgs = []
|
||||
for sections, key, text in error_list:
|
||||
section_name = "->".join(sections)
|
||||
if not text:
|
||||
errorMsg = "undefined configuration value (%s) in section '%s'" % (key, section_name)
|
||||
else:
|
||||
errorMsg = "invalid configuration value (%s) in section '%s': %s" % (key, section_name, text)
|
||||
errorMsgs.append(errorMsg)
|
||||
raise CryptoBoxExceptions.CBConfigError, "\n".join(errorMsgs)
|
||||
|
||||
|
||||
def __checkUnknownPreferences(self):
|
||||
import StringIO
|
||||
config_rules = configobj.ConfigObj(StringIO.StringIO(self.validation_spec), list_values=False)
|
||||
self.__recursiveConfigSectionCheck("", self.prefs, config_rules)
|
||||
|
||||
|
||||
def __recursiveConfigSectionCheck(self, section_path, section_config, section_rules):
|
||||
"""should be called by '__checkUnknownPreferences' for every section
|
||||
sends a warning message to the logger for every undefined (see validation_spec)
|
||||
configuration setting
|
||||
"""
|
||||
for e in section_config.keys():
|
||||
element_path = section_path + e
|
||||
if e in section_rules.keys():
|
||||
if isinstance(section_config[e], configobj.Section):
|
||||
if isinstance(section_rules[e], configobj.Section):
|
||||
self.__recursiveConfigSectionCheck(element_path + "->", section_config[e], section_rules[e])
|
||||
else:
|
||||
self.log.warn("configuration setting should be a value instead of a section name: %s" % element_path)
|
||||
else:
|
||||
if not isinstance(section_rules[e], configobj.Section):
|
||||
pass # good - the setting is valid
|
||||
else:
|
||||
self.log.warn("configuration setting should be a section name instead of a value: %s" % element_path)
|
||||
else:
|
||||
self.log.warn("unknown configuration setting: %s" % element_path)
|
||||
|
||||
|
||||
def __getNameDatabase(self):
|
||||
try:
|
||||
try:
|
||||
nameDB_file = os.path.join(self.prefs["Locations"]["SettingsDir"], self.NAMEDB_FILE)
|
||||
except KeyError:
|
||||
raise CryptoBoxExceptions.CBConfigUndefinedError("Locations", "SettingsDir")
|
||||
except SyntaxError:
|
||||
raise CryptoBoxExceptions.CBConfigInvalidValueError("Locations", "SettingsDir", nameDB_file, "failed to interprete the filename of the name database correctly (%s)" % nameDB_file)
|
||||
## create nameDB if necessary
|
||||
if os.path.exists(nameDB_file):
|
||||
nameDB = configobj.ConfigObj(nameDB_file)
|
||||
else:
|
||||
nameDB = configobj.ConfigObj(nameDB_file, create_empty=True)
|
||||
## check if nameDB file was created successfully?
|
||||
if not os.path.exists(nameDB_file):
|
||||
raise CryptoBoxExceptions.CBEnvironmentError("failed to create name database (%s)" % nameDB_file)
|
||||
return nameDB
|
||||
|
||||
|
||||
def __getPluginConfig(self):
|
||||
import StringIO
|
||||
plugin_rules = StringIO.StringIO(self.pluginValidationSpec)
|
||||
try:
|
||||
try:
|
||||
pluginConf_file = os.path.join(self.prefs["Locations"]["SettingsDir"], self.PLUGINCONF_FILE)
|
||||
except KeyError:
|
||||
raise CryptoBoxExceptions.CBConfigUndefinedError("Locations", "SettingsDir")
|
||||
except SyntaxError:
|
||||
raise CryptoBoxExceptions.CBConfigInvalidValueError("Locations", "SettingsDir", pluginConf_file, "failed to interprete the filename of the plugin config file correctly (%s)" % pluginConf_file)
|
||||
## create pluginConf_file if necessary
|
||||
if os.path.exists(pluginConf_file):
|
||||
pluginConf = configobj.ConfigObj(pluginConf_file, configspec=plugin_rules)
|
||||
else:
|
||||
pluginConf = configobj.ConfigObj(pluginConf_file, configspec=plugin_rules, create_empty=True)
|
||||
## validate and convert values according to the spec
|
||||
pluginConf.validate(validate.Validator())
|
||||
## check if pluginConf_file file was created successfully?
|
||||
if not os.path.exists(pluginConf_file):
|
||||
raise CryptoBoxExceptions.CBEnvironmentError("failed to create plugin configuration file (%s)" % pluginConf_file)
|
||||
return pluginConf
|
||||
|
||||
|
||||
def __getUserDB(self):
|
||||
import StringIO, sha
|
||||
userDB_rules = StringIO.StringIO(self.userDatabaseSpec)
|
||||
try:
|
||||
try:
|
||||
userDB_file = os.path.join(self.prefs["Locations"]["SettingsDir"], self.USERDB_FILE)
|
||||
except KeyError:
|
||||
raise CryptoBoxExceptions.CBConfigUndefinedError("Locations", "SettingsDir")
|
||||
except SyntaxError:
|
||||
raise CryptoBoxExceptions.CBConfigInvalidValueError("Locations", "SettingsDir", userDB_file, "failed to interprete the filename of the users database file correctly (%s)" % userDB_file)
|
||||
## create userDB_file if necessary
|
||||
if os.path.exists(userDB_file):
|
||||
userDB = configobj.ConfigObj(userDB_file, configspec=userDB_rules)
|
||||
else:
|
||||
userDB = configobj.ConfigObj(userDB_file, configspec=userDB_rules, create_empty=True)
|
||||
## validate and set default value for "admin" user
|
||||
userDB.validate(validate.Validator())
|
||||
## check if userDB file was created successfully?
|
||||
if not os.path.exists(userDB_file):
|
||||
raise CryptoBoxExceptions.CBEnvironmentError("failed to create user database file (%s)" % userDB_file)
|
||||
## define password hash function - never use "sha" directly - SPOT
|
||||
userDB.getDigest = lambda password: sha.new(password).hexdigest()
|
||||
return userDB
|
||||
|
||||
|
||||
def __getMiscFiles(self):
|
||||
misc_dir = os.path.join(self.prefs["Locations"]["SettingsDir"], "misc")
|
||||
if (not os.path.isdir(misc_dir)) or (not os.access(misc_dir, os.X_OK)):
|
||||
return []
|
||||
return [MiscConfigFile(os.path.join(misc_dir, f), self.log)
|
||||
for f in os.listdir(misc_dir)
|
||||
if os.path.isfile(os.path.join(misc_dir, f))]
|
||||
|
||||
|
||||
def __getConfigFileName(self, config_file):
|
||||
# search for the configuration file
|
||||
import types
|
||||
if config_file is None:
|
||||
# no config file was specified - we will look for it in the ususal locations
|
||||
conf_file_list = [os.path.expanduser(f)
|
||||
for f in self.CONF_LOCATIONS
|
||||
if os.path.exists(os.path.expanduser(f))]
|
||||
if not conf_file_list:
|
||||
# no possible config file found in the usual locations
|
||||
raise CryptoBoxExceptions.CBConfigUnavailableError()
|
||||
config_file = conf_file_list[0]
|
||||
else:
|
||||
# a config file was specified (e.g. via command line)
|
||||
if type(config_file) != types.StringType:
|
||||
raise CryptoBoxExceptions.CBConfigUnavailableError("invalid config file specified: %s" % config_file)
|
||||
if not os.path.exists(config_file):
|
||||
raise CryptoBoxExceptions.CBConfigUnavailableError("could not find the specified configuration file (%s)" % config_file)
|
||||
return config_file
|
||||
|
||||
|
||||
def __configureLogHandler(self):
|
||||
try:
|
||||
log_level = self.prefs["Log"]["Level"].upper()
|
||||
log_level_avail = ["DEBUG", "INFO", "WARN", "ERROR"]
|
||||
if not log_level in log_level_avail:
|
||||
raise TypeError
|
||||
except KeyError:
|
||||
raise CryptoBoxExceptions.CBConfigUndefinedError("Log", "Level")
|
||||
except TypeError:
|
||||
raise CryptoBoxExceptions.CBConfigInvalidValueError("Log", "Level", log_level, "invalid log level: only %s are allowed" % log_level_avail)
|
||||
try:
|
||||
try:
|
||||
log_handler = logging.FileHandler(self.prefs["Log"]["Details"])
|
||||
except KeyError:
|
||||
raise CryptoBoxExceptions.CBConfigUndefinedError("Log", "Details")
|
||||
except IOError:
|
||||
raise CryptoBoxExceptions.CBEnvironmentError("could not create the log file (%s)" % self.prefs["Log"]["Details"])
|
||||
log_handler.setFormatter(logging.Formatter('%(asctime)s CryptoBox %(levelname)s: %(message)s'))
|
||||
cbox_log = logging.getLogger("CryptoBox")
|
||||
## remove previous handlers
|
||||
cbox_log.handlers = []
|
||||
## add new one
|
||||
cbox_log.addHandler(log_handler)
|
||||
## do not call parent's handlers
|
||||
cbox_log.propagate = False
|
||||
## 'log_level' is a string -> use 'getattr'
|
||||
cbox_log.setLevel(getattr(logging,log_level))
|
||||
## the logger named "CryptoBox" is configured now
|
||||
|
||||
|
||||
validation_spec = """
|
||||
[Main]
|
||||
AllowedDevices = list(min=1)
|
||||
DefaultVolumePrefix = string(min=1)
|
||||
DefaultCipher = string(default="aes-cbc-essiv:sha256")
|
||||
ConfigVolumeLabel = string(min=1, default="cbox_config")
|
||||
UseConfigPartition = integer(min=0, max=1, default=0)
|
||||
|
||||
[Locations]
|
||||
MountParentDir = directoryExists(default="/var/cache/cryptobox/mnt")
|
||||
SettingsDir = directoryExists(default="/var/cache/cryptobox/settings")
|
||||
TemplateDir = directoryExists(default="/usr/share/cryptobox/template")
|
||||
LangDir = directoryExists(default="/usr/share/cryptobox/lang")
|
||||
DocDir = directoryExists(default="/usr/share/doc/cryptobox/html")
|
||||
PluginDir = directoryExists(default="/usr/share/cryptobox/plugins")
|
||||
|
||||
[Log]
|
||||
Level = option("debug", "info", "warn", "error", default="warn")
|
||||
Destination = option("file", default="file")
|
||||
Details = string(min=1)
|
||||
|
||||
[WebSettings]
|
||||
Stylesheet = string(min=1)
|
||||
Language = string(min=1, default="en")
|
||||
|
||||
[Programs]
|
||||
cryptsetup = fileExecutable(default="/sbin/cryptsetup")
|
||||
mkfs-data = fileExecutable(default="/sbin/mkfs.ext3")
|
||||
blkid = fileExecutable(default="/sbin/blkid")
|
||||
blockdev = fileExecutable(default="/sbin/blockdev")
|
||||
mount = fileExecutable(default="/bin/mount")
|
||||
umount = fileExecutable(default="/bin/umount")
|
||||
super = fileExecutable(default="/usr/bin/super")
|
||||
# this is the "program" name as defined in /etc/super.tab
|
||||
CryptoBoxRootActions = string(min=1)
|
||||
"""
|
||||
|
||||
pluginValidationSpec = """
|
||||
[__many__]
|
||||
enabled = boolean(default=None)
|
||||
requestAuth = boolean(default=None)
|
||||
rank = integer(default=None)
|
||||
"""
|
||||
|
||||
userDatabaseSpec = """
|
||||
[admins]
|
||||
admin = string(default=d033e22ae348aeb5660fc2140aec35850c4da997)
|
||||
"""
|
||||
|
||||
|
||||
class CryptoBoxSettingsValidator(validate.Validator):
|
||||
|
||||
def __init__(self):
|
||||
validate.Validator.__init__(self)
|
||||
self.functions["directoryExists"] = self.check_directoryExists
|
||||
self.functions["fileExecutable"] = self.check_fileExecutable
|
||||
self.functions["fileWriteable"] = self.check_fileWriteable
|
||||
|
||||
|
||||
def check_directoryExists(self, value):
|
||||
dir_path = os.path.abspath(value)
|
||||
if not os.path.isdir(dir_path):
|
||||
raise validate.VdtValueError("%s (not found)" % value)
|
||||
if not os.access(dir_path, os.X_OK):
|
||||
raise validate.VdtValueError("%s (access denied)" % value)
|
||||
return dir_path
|
||||
|
||||
|
||||
def check_fileExecutable(self, value):
|
||||
file_path = os.path.abspath(value)
|
||||
if not os.path.isfile(file_path):
|
||||
raise validate.VdtValueError("%s (not found)" % value)
|
||||
if not os.access(file_path, os.X_OK):
|
||||
raise validate.VdtValueError("%s (access denied)" % value)
|
||||
return file_path
|
||||
|
||||
|
||||
def check_fileWriteable(self, value):
|
||||
file_path = os.path.abspath(value)
|
||||
if os.path.isfile(file_path):
|
||||
if not os.access(file_path, os.W_OK):
|
||||
raise validate.VdtValueError("%s (not found)" % value)
|
||||
else:
|
||||
parent_dir = os.path.dirname(file_path)
|
||||
if os.path.isdir(parent_dir) and os.access(parent_dir, os.W_OK):
|
||||
return file_path
|
||||
raise validate.VdtValueError("%s (directory does not exist)" % value)
|
||||
return file_path
|
||||
|
||||
|
||||
|
||||
class MiscConfigFile:
|
||||
|
||||
maxSize = 20480
|
||||
|
||||
def __init__(self, filename, logger):
|
||||
self.filename = filename
|
||||
self.log = logger
|
||||
self.load()
|
||||
|
||||
|
||||
def load(self):
|
||||
fd = open(self.filename, "rb")
|
||||
## limit the maximum size
|
||||
self.content = fd.read(self.maxSize)
|
||||
if fd.tell() == self.maxSize:
|
||||
self.log.warn("file in misc settings directory (%s) is bigger than allowed (%s)" % (self.filename, self.maxSize))
|
||||
fd.close()
|
||||
|
||||
|
||||
def save(self):
|
||||
save_dir = os.path.dirname(self.filename)
|
||||
## create the directory, if necessary
|
||||
if not os.path.isdir(save_dir):
|
||||
try:
|
||||
os.mkdir(save_dir)
|
||||
except IOError:
|
||||
return False
|
||||
## save the content of the file
|
||||
try:
|
||||
fd = open(self.filename, "wb")
|
||||
except IOError:
|
||||
return False
|
||||
try:
|
||||
fd.write(self.content)
|
||||
fd.close()
|
||||
return True
|
||||
except IOError:
|
||||
fd.close()
|
||||
return False
|
||||
|
186
bin/CryptoBoxTools.py
Normal file
|
@ -0,0 +1,186 @@
|
|||
import logging
|
||||
import os
|
||||
import re
|
||||
|
||||
logger = logging.getLogger("CryptoBox")
|
||||
|
||||
|
||||
def getAvailablePartitions():
|
||||
"retrieve a list of all available containers"
|
||||
ret_list = []
|
||||
try:
|
||||
"the following reads all lines of /proc/partitions and adds the mentioned devices"
|
||||
fpart = open("/proc/partitions", "r")
|
||||
try:
|
||||
line = fpart.readline()
|
||||
while line:
|
||||
p_details = line.split()
|
||||
if (len(p_details) == 4):
|
||||
"the following code prevents double entries like /dev/hda and /dev/hda1"
|
||||
(p_major, p_minor, p_size, p_device) = p_details
|
||||
## ignore lines with: invalid minor/major or extend partitions (size=1)
|
||||
if re.search('^[0-9]*$', p_major) and re.search('^[0-9]*$', p_minor) and (p_size != "1"):
|
||||
p_parent = re.sub('[1-9]?[0-9]$', '', p_device)
|
||||
if p_parent == p_device:
|
||||
if [e for e in ret_list if re.search('^' + p_parent + '[1-9]?[0-9]$', e)]:
|
||||
"major partition - its children are already in the list"
|
||||
pass
|
||||
else:
|
||||
"major partition - but there are no children for now"
|
||||
ret_list.append(p_device)
|
||||
else:
|
||||
"minor partition - remove parent if necessary"
|
||||
if p_parent in ret_list: ret_list.remove(p_parent)
|
||||
ret_list.append(p_device)
|
||||
line = fpart.readline()
|
||||
finally:
|
||||
fpart.close()
|
||||
return map(getAbsoluteDeviceName, ret_list)
|
||||
except IOError:
|
||||
logger.warning("Could not read /proc/partitions")
|
||||
return []
|
||||
|
||||
|
||||
def getAbsoluteDeviceName(shortname):
|
||||
""" returns the absolute file name of a device (e.g.: "hda1" -> "/dev/hda1")
|
||||
this does also work for device mapper devices
|
||||
if the result is non-unique, one arbitrary value is returned"""
|
||||
if re.search('^/', shortname): return shortname
|
||||
default = os.path.join("/dev", shortname)
|
||||
if os.path.exists(default): return default
|
||||
result = findMajorMinorOfDevice(shortname)
|
||||
"if no valid major/minor was found -> exit"
|
||||
if not result: return default
|
||||
(major, minor) = result
|
||||
"for device-mapper devices (major == 254) ..."
|
||||
if major == 254:
|
||||
result = findMajorMinorDeviceName("/dev/mapper", major, minor)
|
||||
if result: return result[0]
|
||||
"now check all files in /dev"
|
||||
result = findMajorMinorDeviceName("/dev", major, minor)
|
||||
if result: return result[0]
|
||||
return default
|
||||
|
||||
|
||||
def findMajorMinorOfDevice(device):
|
||||
"return the major/minor numbers of a block device"
|
||||
if re.match("/", device) or not os.path.exists(os.path.join(os.path.sep,"sys","block",device)):
|
||||
## maybe it is an absolute device name
|
||||
if not os.path.exists(device): return None
|
||||
## okay - it seems to to a device node
|
||||
rdev = os.stat(device).st_rdev
|
||||
return (os.major(rdev), os.minor(rdev))
|
||||
blockdev_info_file = os.path.join(os.path.join(os.path.sep,"sys","block", device), "dev")
|
||||
try:
|
||||
f_blockdev_info = open(blockdev_info_file, "r")
|
||||
blockdev_info = f_blockdev_info.read()
|
||||
f_blockdev_info.close()
|
||||
(str_major, str_minor) = blockdev_info.split(":")
|
||||
"numeric conversion"
|
||||
try:
|
||||
major = int(str_major)
|
||||
minor = int(str_minor)
|
||||
return (major, minor)
|
||||
except ValueError:
|
||||
"unknown device numbers -> stop guessing"
|
||||
return None
|
||||
except IOError:
|
||||
pass
|
||||
return None
|
||||
|
||||
|
||||
def findMajorMinorDeviceName(dir, major, minor):
|
||||
"returns the names of devices with the specified major and minor number"
|
||||
collected = []
|
||||
try:
|
||||
subdirs = [os.path.join(dir, e) for e in os.listdir(dir) if (not os.path.islink(os.path.join(dir, e))) and os.path.isdir(os.path.join(dir, e))]
|
||||
"do a recursive call to parse the directory tree"
|
||||
for dirs in subdirs:
|
||||
collected.extend(findMajorMinorDeviceName(dirs, major, minor))
|
||||
"filter all device inodes in this directory"
|
||||
collected.extend([os.path.realpath(os.path.join(dir, e)) for e in os.listdir(dir) if (os.major(os.stat(os.path.join(dir, e)).st_rdev) == major) and (os.minor(os.stat(os.path.join(dir, e)).st_rdev) == minor)])
|
||||
## remove double entries
|
||||
result = []
|
||||
for e in collected:
|
||||
if e not in result: result.append(e)
|
||||
return result
|
||||
except OSError:
|
||||
return []
|
||||
|
||||
|
||||
def getParentBlockDevices():
|
||||
devs = []
|
||||
for line in file("/proc/partitions"):
|
||||
p_details = line.split()
|
||||
## we expect four values - otherwise continue with next iteration
|
||||
if len(p_details) != 4: continue
|
||||
(p_major, p_minor, p_size, p_device) = p_details
|
||||
## we expect numeric values in the first two columns
|
||||
if re.search(u'\D',p_major) or re.search(u'\D',p_minor): continue
|
||||
## now let us check, if it is a (parent) block device or a partition
|
||||
if not os.path.isdir(os.path.join(os.path.sep, "sys", "block", p_device)): continue
|
||||
devs.append(p_device)
|
||||
return map(getAbsoluteDeviceName, devs)
|
||||
|
||||
|
||||
def isPartOfBlockDevice(parent, subdevice):
|
||||
"""check if the given block device is a parent of 'subdevice'
|
||||
e.g. for checking if a partition belongs to a block device"""
|
||||
try:
|
||||
(par_major, par_minor) = findMajorMinorOfDevice(parent)
|
||||
(sub_major, sub_minor) = findMajorMinorOfDevice(subdevice)
|
||||
except TypeError:
|
||||
## at least one of these devices did not return a valid major/minor combination
|
||||
return False
|
||||
## search the entry below '/sys/block' belonging to the parent
|
||||
root = os.path.join(os.path.sep, 'sys', 'block')
|
||||
for bldev in os.listdir(root):
|
||||
blpath = os.path.join(root, bldev, 'dev')
|
||||
if os.access(blpath, os.R_OK):
|
||||
try:
|
||||
if (str(par_major), str(par_minor)) == tuple([e for e in file(blpath)][0].strip().split(":",1)):
|
||||
parent_path = os.path.join(root, bldev)
|
||||
break
|
||||
except IndexError, OSError:
|
||||
pass
|
||||
else:
|
||||
## no block device with this major/minor combination found below '/sys/block'
|
||||
return False
|
||||
for subbldev in os.listdir(parent_path):
|
||||
subblpath = os.path.join(parent_path, subbldev, "dev")
|
||||
if os.access(subblpath, os.R_OK):
|
||||
try:
|
||||
if (str(sub_major), str(sub_minor)) == tuple([e for e in file(subblpath)][0].strip().split(":",1)):
|
||||
## the name of the subdevice node is not important - we found it!
|
||||
return True
|
||||
except IndexError, OSError:
|
||||
pass
|
||||
return False
|
||||
|
||||
|
||||
def getBlockDeviceSize(device):
|
||||
if not device: return -1
|
||||
try:
|
||||
rdev = os.stat(device).st_rdev
|
||||
except OSError:
|
||||
return -1
|
||||
minor = os.minor(rdev)
|
||||
major = os.major(rdev)
|
||||
for f in file("/proc/partitions"):
|
||||
try:
|
||||
elements = f.split()
|
||||
if len(elements) != 4: continue
|
||||
if (int(elements[0]) == major) and (int(elements[1]) == minor):
|
||||
return int(elements[2])/1024
|
||||
except ValueError:
|
||||
pass
|
||||
return -1
|
||||
|
||||
|
||||
def getBlockDeviceSizeHumanly(device):
|
||||
size = getBlockDeviceSize(device)
|
||||
if size > 5120:
|
||||
return "%sGB" % size/1024
|
||||
else:
|
||||
return "%sMB" % size
|
||||
|
38
bin/CryptoBoxWebserver.py
Executable file
|
@ -0,0 +1,38 @@
|
|||
#!/usr/bin/env python2.4
|
||||
import os
|
||||
import WebInterfaceSites
|
||||
import sys
|
||||
|
||||
try:
|
||||
import cherrypy
|
||||
except:
|
||||
print "Could not import the cherrypy module! Try 'apt-get install python-cherrypy'."
|
||||
sys.exit(1)
|
||||
|
||||
class CryptoBoxWebserver:
|
||||
'''this class starts the cherryp webserver and serves the single sites'''
|
||||
|
||||
def __init__(self):
|
||||
cherrypy.root = WebInterfaceSites.WebInterfaceSites()
|
||||
#expose static content:
|
||||
#I currently have no idea how to cleanly extract the stylesheet path from
|
||||
#the config object without an extra CryptoBox.CryptoBoxProps instance.
|
||||
#perhaps put config handling into a seperate class in CryptoBox.py?
|
||||
#
|
||||
# the following manual mapping is necessary, as we may not use relative
|
||||
# paths in the config file
|
||||
cherrypy.config.configMap.update({
|
||||
"/cryptobox-misc": {
|
||||
"staticFilter.on" : True,
|
||||
"staticFilter.dir": os.path.abspath("../www-data" )}
|
||||
})
|
||||
|
||||
def start(self):
|
||||
# just use this config, when we're started directly
|
||||
cherrypy.config.update(file = "cryptoboxwebserver.conf")
|
||||
cherrypy.server.start()
|
||||
|
||||
if __name__ == "__main__":
|
||||
cbw = CryptoBoxWebserver()
|
||||
cbw.start()
|
||||
|
67
bin/Plugins.py
Normal file
|
@ -0,0 +1,67 @@
|
|||
# $Id$
|
||||
|
||||
import imp
|
||||
import os
|
||||
import logging
|
||||
|
||||
|
||||
class PluginManager:
|
||||
"""manage available plugins"""
|
||||
|
||||
def __init__(self, cbox, plugin_dirs="."):
|
||||
self.cbox = cbox
|
||||
self.log = logging.getLogger("CryptoBox")
|
||||
if hasattr(plugin_dirs, "__iter__"):
|
||||
self.plugin_dirs = [os.path.abspath(dir) for dir in plugin_dirs]
|
||||
else:
|
||||
self.plugin_dirs = [os.path.abspath(plugin_dirs)]
|
||||
self.pluginList = self.__getAllPlugins()
|
||||
|
||||
|
||||
def getPlugins(self):
|
||||
return self.pluginList[:]
|
||||
|
||||
|
||||
def getPlugin(self, name):
|
||||
for p in self.pluginList[:]:
|
||||
if p.getName() == name:
|
||||
return p
|
||||
return None
|
||||
|
||||
|
||||
def __getAllPlugins(self):
|
||||
list = []
|
||||
for plfile in self.__getPluginFiles():
|
||||
list.append(self.__getPluginClass(os.path.basename(plfile)[:-3]))
|
||||
return list
|
||||
|
||||
|
||||
def __getPluginClass(self, name):
|
||||
for plfile in self.__getPluginFiles():
|
||||
if name == os.path.basename(plfile)[:-3]:
|
||||
try:
|
||||
pl_class = getattr(imp.load_source(name, plfile), name)
|
||||
except AttributeError:
|
||||
return None
|
||||
return pl_class(self.cbox, os.path.dirname(plfile))
|
||||
else:
|
||||
return None
|
||||
|
||||
|
||||
def __getPluginFiles(self):
|
||||
result = []
|
||||
for dir in [os.path.abspath(e) for e in self.plugin_dirs if os.access(e, os.R_OK) and os.path.isdir(e)]:
|
||||
for plname in [f for f in os.listdir(dir)]:
|
||||
pldir = os.path.join(dir, plname)
|
||||
plfile = os.path.join(pldir, plname + ".py")
|
||||
if os.path.isfile(plfile) and os.access(plfile, os.R_OK):
|
||||
result.append(plfile)
|
||||
return result
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
x = PluginManager(None, "../plugins")
|
||||
for a in x.getPlugins():
|
||||
if not a is None:
|
||||
print "Plugin: %s" % a.getName()
|
||||
|
136
bin/WebInterfaceDataset.py
Normal file
|
@ -0,0 +1,136 @@
|
|||
import os
|
||||
import CryptoBoxContainer
|
||||
import CryptoBoxTools
|
||||
|
||||
## useful constant for some functions
|
||||
CONT_TYPES = CryptoBoxContainer.CryptoBoxContainer.Types
|
||||
|
||||
class WebInterfaceDataset(dict):
|
||||
"""this class contains all data that should be available for the clearsilver
|
||||
templates
|
||||
"""
|
||||
|
||||
def __init__(self, cbox, prefs, plugins):
|
||||
self.prefs = prefs
|
||||
self.cbox = cbox
|
||||
self.__setConfigValues()
|
||||
self.plugins = plugins
|
||||
self.setCryptoBoxState()
|
||||
self.setPluginData()
|
||||
self.setContainersState()
|
||||
|
||||
|
||||
def setCryptoBoxState(self):
|
||||
import cherrypy
|
||||
self["Data.Version"] = self.cbox.VERSION
|
||||
langs = self.cbox.getAvailableLanguages()
|
||||
langs.sort()
|
||||
for (index, lang) in enumerate(langs):
|
||||
self.cbox.log.info("language loaded: %s" % lang)
|
||||
self["Data.Languages.%d.name" % index] = lang
|
||||
self["Data.Languages.%d.link" % index] = self.__getLanguageName(lang)
|
||||
try:
|
||||
self["Data.ScriptURL.Prot"] = cherrypy.request.scheme
|
||||
host = cherrypy.request.headers["Host"]
|
||||
self["Data.ScriptURL.Host"] = host.split(":",1)[0]
|
||||
complete_url = "%s://%s" % (self["Data.ScriptURL.Prot"], self["Data.ScriptURL.Host"])
|
||||
try:
|
||||
port = int(host.split(":",1)[1])
|
||||
complete_url += ":%s" % port
|
||||
except (IndexError, ValueError):
|
||||
if cherrypy.request.scheme == "http":
|
||||
port = 80
|
||||
elif cherrypy.request.scheme == "https":
|
||||
port = 443
|
||||
else:
|
||||
## unknown scheme -> port 0
|
||||
self.cbox.log.info("unknown protocol scheme used: %s" % (cherrypy.request.scheme,))
|
||||
port = 0
|
||||
self["Data.ScriptURL.Port"] = port
|
||||
## retrieve the relative address of the CGI (or the cherrypy base address)
|
||||
## remove the last part of the url and add a slash
|
||||
path = "/".join(cherrypy.request.path.split("/")[:-1]) + "/"
|
||||
self["Data.ScriptURL.Path"] = path
|
||||
complete_url += path
|
||||
self["Data.ScriptURL"] = complete_url
|
||||
except AttributeError:
|
||||
self["Data.ScriptURL"] = ""
|
||||
|
||||
|
||||
def setCurrentDiskState(self, device):
|
||||
for container in self.cbox.getContainerList():
|
||||
if container.getDevice() == device:
|
||||
isEncrypted = (container.getType() == CONT_TYPES["luks"]) and 1 or 0
|
||||
isPlain = (container.getType() == CONT_TYPES["plain"]) and 1 or 0
|
||||
isMounted = container.isMounted() and 1 or 0
|
||||
self["Data.CurrentDisk.device"] = container.getDevice()
|
||||
self["Data.CurrentDisk.name"] = container.getName()
|
||||
self["Data.CurrentDisk.encryption"] = isEncrypted
|
||||
self["Data.CurrentDisk.plaintext"] = isPlain
|
||||
self["Data.CurrentDisk.active"] = isMounted
|
||||
self["Data.CurrentDisk.size"] = CryptoBoxTools.getBlockDeviceSizeHumanly(container.getDevice())
|
||||
if isMounted:
|
||||
(size, avail, used) = container.getCapacity()
|
||||
percent = used / size
|
||||
self["Data.CurrentDisk.capacity.used"] = used
|
||||
self["Data.CurrentDisk.capacity.free"] = avail
|
||||
self["Data.CurrentDisk.capacity.size"] = size
|
||||
self["Data.CurrentDisk.capacity.percent"] = percent
|
||||
self["Settings.LinkAttrs.device"] = device
|
||||
|
||||
|
||||
def setContainersState(self):
|
||||
avail_counter = 0
|
||||
active_counter = 0
|
||||
for container in self.cbox.getContainerList():
|
||||
## useful if the container was changed during an action
|
||||
container.resetObject()
|
||||
isEncrypted = (container.getType() == CONT_TYPES["luks"]) and 1 or 0
|
||||
isPlain = (container.getType() == CONT_TYPES["plain"]) and 1 or 0
|
||||
isMounted = container.isMounted() and 1 or 0
|
||||
self["Data.Disks.%d.device" % avail_counter] = container.getDevice()
|
||||
self["Data.Disks.%d.name" % avail_counter] = container.getName()
|
||||
self["Data.Disks.%d.encryption" % avail_counter] = isEncrypted
|
||||
self["Data.Disks.%d.plaintext" % avail_counter] = isPlain
|
||||
self["Data.Disks.%d.active" % avail_counter] = isMounted
|
||||
self["Data.Disks.%d.size" % avail_counter] = CryptoBoxTools.getBlockDeviceSizeHumanly(container.getDevice())
|
||||
if isMounted: active_counter += 1
|
||||
avail_counter += 1
|
||||
self["Data.activeDisksCount"] = active_counter
|
||||
|
||||
|
||||
def setPluginData(self):
|
||||
for p in self.plugins:
|
||||
lang_data = p.getLanguageData()
|
||||
entryName = "Settings.PluginList." + p.getName()
|
||||
self[entryName] = p.getName()
|
||||
self[entryName + ".Link"] = lang_data.getValue("Link", p.getName())
|
||||
self[entryName + ".Rank"] = p.getRank()
|
||||
self[entryName + ".RequestAuth"] = p.isAuthRequired() and "1" or "0"
|
||||
self[entryName + ".Enabled"] = p.isEnabled() and "1" or "0"
|
||||
for a in p.pluginCapabilities:
|
||||
self[entryName + ".Types." + a] = "1"
|
||||
|
||||
|
||||
def __setConfigValues(self):
|
||||
self["Settings.TemplateDir"] = os.path.abspath(self.prefs["Locations"]["TemplateDir"])
|
||||
self["Settings.LanguageDir"] = os.path.abspath(self.prefs["Locations"]["LangDir"])
|
||||
self["Settings.DocDir"] = os.path.abspath(self.prefs["Locations"]["DocDir"])
|
||||
self["Settings.Stylesheet"] = self.prefs["WebSettings"]["Stylesheet"]
|
||||
self["Settings.Language"] = self.prefs["WebSettings"]["Language"]
|
||||
self["Settings.PluginDir"] = self.prefs["Locations"]["PluginDir"]
|
||||
self["Settings.SettingsDir"] = self.prefs["Locations"]["SettingsDir"]
|
||||
|
||||
|
||||
def __getLanguageName(self, lang):
|
||||
try:
|
||||
import neo_cgi, neo_util, neo_cs
|
||||
except:
|
||||
raise CryptoBoxExceptions.CBEnvironmentError("couldn't import 'neo_*'! Try 'apt-get install python-clearsilver'.")
|
||||
hdf_path = os.path.join(self.prefs["Locations"]["LangDir"], lang + ".hdf")
|
||||
hdf = neo_util.HDF()
|
||||
hdf.readFile(hdf_path)
|
||||
return hdf.getValue("Name",lang)
|
||||
|
||||
|
||||
|
427
bin/WebInterfaceSites.py
Executable file
|
@ -0,0 +1,427 @@
|
|||
import CryptoBox
|
||||
import WebInterfaceDataset
|
||||
import re
|
||||
import Plugins
|
||||
from CryptoBoxExceptions import *
|
||||
import cherrypy
|
||||
import types
|
||||
import os
|
||||
|
||||
try:
|
||||
import neo_cgi, neo_util, neo_cs
|
||||
except ImportError:
|
||||
errorMsg = "Could not import clearsilver module. Try 'apt-get install python-clearsilver'."
|
||||
self.log.error(errorMsg)
|
||||
sys.stderr.write(errorMsg)
|
||||
raise ImportError, errorMsg
|
||||
|
||||
|
||||
|
||||
class PluginIconHandler:
|
||||
|
||||
def __init__(self, plugins):
|
||||
for plugin in plugins.getPlugins():
|
||||
if not plugin: continue
|
||||
plname = plugin.getName()
|
||||
## expose the getIcon function of this plugin
|
||||
setattr(self, plname, plugin.getIcon)
|
||||
|
||||
|
||||
|
||||
class WebInterfaceSites:
|
||||
'''
|
||||
'''
|
||||
|
||||
## this template is used under strange circumstances
|
||||
defaultTemplate = "empty"
|
||||
|
||||
|
||||
def __init__(self):
|
||||
import logging
|
||||
self.cbox = CryptoBox.CryptoBoxProps()
|
||||
self.log = logging.getLogger("CryptoBox")
|
||||
self.prefs = self.cbox.prefs
|
||||
self.__resetDataset()
|
||||
|
||||
|
||||
def __resetDataset(self):
|
||||
"""this method has to be called at the beginning of every "site" action
|
||||
important: only at the beginning of an action (to not loose information)
|
||||
important: for _every_ "site" action (cherrypy is stateful)
|
||||
also take care for the plugins, as they also contain datasets
|
||||
"""
|
||||
self.__loadPlugins()
|
||||
self.dataset = WebInterfaceDataset.WebInterfaceDataset(self.cbox, self.prefs, self.pluginList.getPlugins())
|
||||
## publish plugin icons
|
||||
self.icons = PluginIconHandler(self.pluginList)
|
||||
self.icons.exposed = True
|
||||
## check, if a configuration partition has become available
|
||||
self.cbox.prefs.preparePartition()
|
||||
|
||||
|
||||
def __loadPlugins(self):
|
||||
self.pluginList = Plugins.PluginManager(self.cbox, self.prefs["Locations"]["PluginDir"])
|
||||
for plugin in self.pluginList.getPlugins():
|
||||
if not plugin: continue
|
||||
plname = plugin.getName()
|
||||
if plugin.isEnabled():
|
||||
self.cbox.log.info("Plugin '%s' loaded" % plname)
|
||||
## this should be the "easiest" way to expose all plugins as URLs
|
||||
setattr(self, plname, self.return_plugin_action(plugin))
|
||||
setattr(getattr(self, plname), "exposed", True)
|
||||
# TODO: check, if this really works - for now the "stream_response" feature seems to be broken
|
||||
#setattr(getattr(self, plname), "stream_respones", True)
|
||||
else:
|
||||
self.cbox.log.info("Plugin '%s' is disabled" % plname)
|
||||
## remove the plugin, if it was active before
|
||||
setattr(self, plname, None)
|
||||
|
||||
|
||||
## this is a function decorator to check authentication
|
||||
## it has to be defined before any page definition requiring authentification
|
||||
def __requestAuth(self=None):
|
||||
def check_credentials(site):
|
||||
def _inner_wrapper(self, *args, **kargs):
|
||||
import base64
|
||||
## define a "non-allowed" function
|
||||
user, password = None, None
|
||||
try:
|
||||
resp = cherrypy.request.headers["Authorization"][6:] # ignore "Basic "
|
||||
(user, password) = base64.b64decode(resp).split(":",1)
|
||||
except KeyError:
|
||||
## no "authorization" header was sent
|
||||
pass
|
||||
except TypeError:
|
||||
## invalid base64 string
|
||||
pass
|
||||
except AttributeError:
|
||||
## no cherrypy response header defined
|
||||
pass
|
||||
authDict = self.cbox.prefs.userDB["admins"]
|
||||
if user in authDict.keys():
|
||||
if self.cbox.prefs.userDB.getDigest(password) == authDict[user]:
|
||||
## ok: return the choosen page
|
||||
self.cbox.log.info("access granted for: %s" % user)
|
||||
return site(self, *args, **kargs)
|
||||
else:
|
||||
self.cbox.log.info("wrong password supplied for: %s" % user)
|
||||
else:
|
||||
self.cbox.log.info("unknown user: %s" % str(user))
|
||||
## wrong credentials: return "access denied"
|
||||
cherrypy.response.headers["WWW-Authenticate"] = '''Basic realm="CryptoBox"'''
|
||||
cherrypy.response.status = 401
|
||||
return self.__render("access_denied")
|
||||
return _inner_wrapper
|
||||
return check_credentials
|
||||
|
||||
|
||||
######################################################################
|
||||
## put real sites down here and don't forget to expose them at the end
|
||||
|
||||
|
||||
@cherrypy.expose
|
||||
def index(self, weblang=""):
|
||||
self.__resetDataset()
|
||||
self.__setWebLang(weblang)
|
||||
self.__checkEnvironment()
|
||||
## do not forget the language!
|
||||
param_dict = {"weblang":weblang}
|
||||
## render "disks" plugin by default
|
||||
return self.return_plugin_action(self.pluginList.getPlugin("disks"))(**param_dict)
|
||||
|
||||
|
||||
def return_plugin_action(self, plugin):
|
||||
def handler(self, **args):
|
||||
self.__resetDataset()
|
||||
self.__checkEnvironment()
|
||||
args_orig = dict(args)
|
||||
## set web interface language
|
||||
try:
|
||||
self.__setWebLang(args["weblang"])
|
||||
del args["weblang"]
|
||||
except KeyError:
|
||||
self.__setWebLang("")
|
||||
## we always read the "device" setting - otherwise volume-plugin links
|
||||
## would not work easily (see "volume_props" linking to "format_fs")
|
||||
## it will get ignored for non-volume plugins
|
||||
try:
|
||||
plugin.device = None
|
||||
if self.__setDevice(args["device"]):
|
||||
plugin.device = args["device"]
|
||||
del args["device"]
|
||||
except KeyError:
|
||||
pass
|
||||
## check the device argument of volume plugins
|
||||
if "volume" in plugin.pluginCapabilities:
|
||||
## initialize the dataset of the selected device if necessary
|
||||
if plugin.device:
|
||||
self.dataset.setCurrentDiskState(plugin.device)
|
||||
else:
|
||||
## invalid (or missing) device setting
|
||||
return self.__render(self.defaultTemplate)
|
||||
## check if there is a "redirect" setting - this will override the return
|
||||
## value of the doAction function (e.g. useful for umount-before-format)
|
||||
try:
|
||||
if args["redirect"]:
|
||||
override_nextTemplate = { "plugin":args["redirect"] }
|
||||
if "volume" in plugin.pluginCapabilities:
|
||||
override_nextTemplate["values"] = {"device":plugin.device}
|
||||
del args["redirect"]
|
||||
except KeyError:
|
||||
override_nextTemplate = None
|
||||
## call the plugin handler
|
||||
nextTemplate = plugin.doAction(**args)
|
||||
## for 'volume' plugins: reread the dataset of the current disk
|
||||
## additionally: set the default template for plugins
|
||||
if "volume" in plugin.pluginCapabilities:
|
||||
## maybe the state of the current volume was changed?
|
||||
self.dataset.setCurrentDiskState(plugin.device)
|
||||
if not nextTemplate: nextTemplate = { "plugin":"volume_mount", "values":{"device":plugin.device}}
|
||||
else:
|
||||
## maybe a non-volume plugin changed some plugin settings (e.g. plugin_manager)
|
||||
self.dataset.setPluginData()
|
||||
## update the container hdf-dataset (maybe a plugin changed the state of a container)
|
||||
self.dataset.setContainersState()
|
||||
## default page for non-volume plugins is the disk selection
|
||||
if not nextTemplate: nextTemplate = { "plugin":"disks", "values":{} }
|
||||
## was a redirect requested?
|
||||
if override_nextTemplate:
|
||||
nextTemplate = override_nextTemplate
|
||||
## if another plugins was choosen for 'nextTemplate', then do it!
|
||||
if isinstance(nextTemplate, types.DictType) \
|
||||
and "plugin" in nextTemplate.keys() \
|
||||
and "values" in nextTemplate.keys() \
|
||||
and self.pluginList.getPlugin(nextTemplate["plugin"]):
|
||||
valueDict = dict(nextTemplate["values"])
|
||||
## force the current weblang attribute - otherwise it gets lost
|
||||
valueDict["weblang"] = self.dataset["Settings.Language"]
|
||||
new_plugin = self.pluginList.getPlugin(nextTemplate["plugin"])
|
||||
return self.return_plugin_action(new_plugin)(**valueDict)
|
||||
## save the currently active plugin name
|
||||
self.dataset["Data.ActivePlugin"] = plugin.getName()
|
||||
return self.__render(nextTemplate, plugin)
|
||||
## apply authentication?
|
||||
if plugin.isAuthRequired():
|
||||
return lambda **args: self.__requestAuth()(handler)(self, **args)
|
||||
else:
|
||||
return lambda **args: handler(self, **args)
|
||||
|
||||
|
||||
## test authentication
|
||||
@cherrypy.expose
|
||||
@__requestAuth
|
||||
def test(self, weblang=""):
|
||||
self.__resetDataset()
|
||||
self.__setWebLang(weblang)
|
||||
self.__checkEnvironment()
|
||||
return "test passed"
|
||||
|
||||
|
||||
@cherrypy.expose
|
||||
def test_stream(self):
|
||||
"""just for testing purposes - to check if the "stream_response" feature
|
||||
actually works - for now (September 02006) it does not seem to be ok"""
|
||||
import time
|
||||
yield "<html><head><title>neu</title></head><body><p><ul>"
|
||||
for a in range(10):
|
||||
yield "<li>yes: %d - %s</li>" % (a, str(time.time()))
|
||||
time.sleep(1)
|
||||
yield "</ul></p></html>"
|
||||
|
||||
|
||||
|
||||
##################### input checker ##########################
|
||||
|
||||
def __checkEnvironment(self):
|
||||
"""here we should place all interesting checks to inform the user of problems
|
||||
|
||||
examples are: non-https, readonly-config, ...
|
||||
"""
|
||||
## TODO: maybe add an option "mount"?
|
||||
if self.cbox.prefs.requiresPartition() and not self.cbox.prefs.getActivePartition():
|
||||
self.dataset["Data.EnvironmentWarning"] = "ReadOnlyConfig"
|
||||
# TODO: turn this on soon (add "not") - for now it is annoying
|
||||
if self.__checkHTTPS():
|
||||
self.dataset["Data.EnvironmentWarning"] = "NoSSL"
|
||||
|
||||
|
||||
def __checkHTTPS(self):
|
||||
## check the request scheme
|
||||
if cherrypy.request.scheme == "https": return True
|
||||
## check an environment setting - this is quite common behind proxies
|
||||
try:
|
||||
if os.environ["HTTPS"]: return True
|
||||
except KeyError:
|
||||
pass
|
||||
## check http header TODO (check pound for the name)
|
||||
try:
|
||||
if cherrypy.request.headers["TODO"]: return True
|
||||
except KeyError:
|
||||
pass
|
||||
## the connection seems to be unencrypted
|
||||
return False
|
||||
|
||||
|
||||
def __setWebLang(self, value):
|
||||
guess = value
|
||||
availLangs = self.cbox.getAvailableLanguages()
|
||||
## no language specified: check browser language
|
||||
if not guess:
|
||||
guess = self.__getPreferredBrowserLanguage(availLangs)
|
||||
## no preferred language or invalid language?
|
||||
if not guess \
|
||||
or not guess in availLangs \
|
||||
or re.search(u'\W', guess):
|
||||
## warn only for invalid languages
|
||||
if not guess is None:
|
||||
self.cbox.log.info("invalid language choosen: %s" % guess)
|
||||
guess = self.prefs["WebSettings"]["Language"]
|
||||
## maybe the language is still not valid
|
||||
if not guess in availLangs:
|
||||
self.log.warn("the configured language is invalid: %s" % guess)
|
||||
guess = "en"
|
||||
## maybe there is no english dataset???
|
||||
if not guess in availLangs:
|
||||
self.log.warn("couldn't find the english dataset")
|
||||
guess = availLangs[0]
|
||||
self.dataset["Settings.Language"] = guess
|
||||
## we only have to save it, if it was specified correctly and explicitly
|
||||
if value == guess:
|
||||
self.dataset["Settings.LinkAttrs.weblang"] = guess
|
||||
|
||||
|
||||
def __getPreferredBrowserLanguage(self, availLangs):
|
||||
"""guess the preferred language of the user (as sent by the browser)
|
||||
take the first language, that is part of 'availLangs'
|
||||
"""
|
||||
try:
|
||||
pref_lang_header = cherrypy.request.headers["Accept-Language"]
|
||||
except KeyError:
|
||||
## no language header was specified
|
||||
return None
|
||||
## this could be a typical 'Accept-Language' header:
|
||||
## de-de,de;q=0.8,en-us;q=0.5,en;q=0.3
|
||||
regex = re.compile(u"\w+(-\w+)?(;q=[\d\.]+)?$")
|
||||
pref_langs = [e.split(";",1)[0]
|
||||
for e in pref_lang_header.split(",")
|
||||
if regex.match(e)]
|
||||
## is one of these preferred languages available?
|
||||
for lang in pref_langs:
|
||||
if lang in availLangs: return lang
|
||||
## we try to be nice: also look for "de" if "de-de" was specified ...
|
||||
for lang in pref_langs:
|
||||
## use only the first part of the language
|
||||
short_lang = lang.split("-",1)[0]
|
||||
if short_lang in availLangs: return short_lang
|
||||
## we give up
|
||||
return None
|
||||
|
||||
|
||||
def __setDevice(self, device):
|
||||
if device and re.match(u'[\w /\-]+$', device) and self.cbox.getContainer(device):
|
||||
self.log.debug("select device: %s" % device)
|
||||
return True
|
||||
else:
|
||||
self.log.warn("invalid device: %s" % device)
|
||||
self.dataset["Data.Warning"] = "InvalidDevice"
|
||||
return False
|
||||
|
||||
|
||||
def __checkVolumeName(self, name):
|
||||
if name and re.match(u'[\w \-]+$', name):
|
||||
return True
|
||||
else:
|
||||
return False
|
||||
|
||||
|
||||
def __getLanguageValue(self, value):
|
||||
hdf = self.__getLanguageData(self.dataset["Settings.Language"])
|
||||
return hdf.getValue(value, "")
|
||||
|
||||
|
||||
def __getLanguageData(self, web_lang="en"):
|
||||
default_lang = "en"
|
||||
conf_lang = self.prefs["WebSettings"]["Language"]
|
||||
hdf = neo_util.HDF()
|
||||
langDir = os.path.abspath(self.prefs["Locations"]["LangDir"])
|
||||
langFiles = []
|
||||
## first: read default language (en)
|
||||
if (default_lang != conf_lang) and (default_lang != web_lang):
|
||||
langFiles.append(os.path.join(langDir, default_lang + ".hdf"))
|
||||
## second: read language as defined in the config file
|
||||
if (conf_lang != web_lang):
|
||||
langFiles.append(os.path.join(langDir, conf_lang + ".hdf"))
|
||||
## third: read language as configured via web interface
|
||||
langFiles.append(os.path.join(langDir, web_lang + ".hdf"))
|
||||
for langFile in langFiles:
|
||||
if os.access(langFile, os.R_OK):
|
||||
hdf.readFile(langFile)
|
||||
else:
|
||||
log.warn("Couldn't read language file: %s" % langFile)
|
||||
return hdf
|
||||
|
||||
|
||||
def __render(self, renderInfo, plugin=None):
|
||||
'''renders from clearsilver templates and returns the resulting html
|
||||
'''
|
||||
## is renderInfo a string (filename of the template) or a dictionary?
|
||||
if type(renderInfo) == types.DictType:
|
||||
template = renderInfo["template"]
|
||||
if renderInfo.has_key("generator"):
|
||||
generator = renderInfo["generator"]
|
||||
else:
|
||||
generator = False
|
||||
else:
|
||||
(template, generator) = (renderInfo, None)
|
||||
|
||||
## load the language data
|
||||
hdf = neo_util.HDF()
|
||||
hdf.copy("Lang", self.__getLanguageData(self.dataset["Settings.Language"]))
|
||||
|
||||
## first: assume, that the template file is in the global template directory
|
||||
self.dataset["Settings.TemplateFile"] = os.path.abspath(os.path.join(self.prefs["Locations"]["TemplateDir"], template + ".cs"))
|
||||
|
||||
if plugin:
|
||||
## check, if the plugin provides the template file -> overriding
|
||||
plugin_cs_file = plugin.getTemplateFileName(template)
|
||||
if plugin_cs_file:
|
||||
self.dataset["Settings.TemplateFile"] = plugin_cs_file
|
||||
|
||||
## add the current state of the plugins to the hdf dataset
|
||||
self.dataset["Data.Status.Plugins.%s" % plugin.getName()] = plugin.getStatus()
|
||||
## load the language data
|
||||
pl_lang = plugin.getLanguageData(self.dataset["Settings.Language"])
|
||||
if pl_lang:
|
||||
hdf.copy("Lang.Plugins.%s" % plugin.getName(), pl_lang)
|
||||
## load the dataset of the plugin
|
||||
plugin.loadDataSet(hdf)
|
||||
|
||||
self.log.info("rendering site: " + template)
|
||||
|
||||
cs_path = os.path.abspath(os.path.join(self.prefs["Locations"]["TemplateDir"], "main.cs"))
|
||||
if not os.access(cs_path, os.R_OK):
|
||||
log.error("Couldn't read clearsilver file: %s" % cs_path)
|
||||
yield "Couldn't read clearsilver file: %s" % cs_path
|
||||
return
|
||||
|
||||
self.log.debug(self.dataset)
|
||||
for key in self.dataset.keys():
|
||||
hdf.setValue(key,str(self.dataset[key]))
|
||||
cs = neo_cs.CS(hdf)
|
||||
cs.parseFile(cs_path)
|
||||
|
||||
## is there a generator containing additional information?
|
||||
if generator is None:
|
||||
## all content in one flush
|
||||
yield cs.render()
|
||||
else:
|
||||
content_generate = generator()
|
||||
dummy_line = """<!-- CONTENT_DUMMY -->"""
|
||||
## now we do it linewise - checking for the content marker
|
||||
for line in cs.render().splitlines():
|
||||
if line.find(dummy_line) != -1:
|
||||
yield line.replace(dummy_line, content_generate.next())
|
||||
else:
|
||||
yield line + "\n"
|
||||
|
||||
|
77
bin/WebInterfaceTestClass.py
Normal file
|
@ -0,0 +1,77 @@
|
|||
"""
|
||||
super class of all web interface unittests for the cryptobox
|
||||
|
||||
just inherit this class and add some test functions
|
||||
"""
|
||||
|
||||
import unittest
|
||||
import twill
|
||||
import cherrypy
|
||||
import WebInterfaceSites
|
||||
|
||||
## we do the following, for easy surfing
|
||||
## e.g. use: cbx.go(your_url)
|
||||
## commands api: http://twill.idyll.org/commands.html
|
||||
CBXHOST="localhost"
|
||||
CBXPORT=8081
|
||||
CBX_URL="http://%s:%d/" % (CBXHOST, CBXPORT)
|
||||
LOG_FILE="/tmp/twill.log"
|
||||
|
||||
class WebInterfaceTestClass(unittest.TestCase):
|
||||
'''this class checks the webserver, using "twill"
|
||||
|
||||
the tests in this class are from the browsers point of view, so not
|
||||
really unittests.
|
||||
fetch twill from: http://twill.idyll.org
|
||||
one way to manually run twill code is through the python
|
||||
interpreter commandline e.g.:
|
||||
|
||||
import twill
|
||||
twill.shell.main()
|
||||
go http://localhost:8080
|
||||
find "my very special html content"
|
||||
help
|
||||
'''
|
||||
|
||||
def setUp(self):
|
||||
'''configures the cherrypy server that it works nice with twill
|
||||
'''
|
||||
cherrypy.config.update({
|
||||
'server.logToScreen' : False,
|
||||
'autoreload.on': False,
|
||||
'server.threadPool': 1,
|
||||
'server.environment': 'production',
|
||||
})
|
||||
cherrypy.root = WebInterfaceSites.WebInterfaceSites()
|
||||
cherrypy.server.start(initOnly=True, serverClass=None)
|
||||
|
||||
from cherrypy._cpwsgi import wsgiApp
|
||||
twill.add_wsgi_intercept(CBXHOST, CBXPORT, lambda: wsgiApp)
|
||||
|
||||
# grab the output of twill commands
|
||||
self.output = open(LOG_FILE,"a")
|
||||
twill.set_output(self.output)
|
||||
self.cmd = twill.commands
|
||||
self.URL = CBX_URL
|
||||
self.cbox = cherrypy.root.cbox
|
||||
self.globals, self.locals = twill.namespaces.get_twill_glocals()
|
||||
|
||||
|
||||
def tearDown(self):
|
||||
'''clean up the room when leaving'''
|
||||
# remove intercept.
|
||||
twill.remove_wsgi_intercept(CBXHOST, CBXPORT)
|
||||
# shut down the cherrypy server.
|
||||
cherrypy.server.stop()
|
||||
self.output.close()
|
||||
|
||||
|
||||
def __get_soup():
|
||||
browser = twill.commands.get_browser()
|
||||
soup = BeautifulSoup(browser.get_html())
|
||||
return soup
|
||||
|
||||
|
||||
def register_auth(self, url, user="admin", password="admin"):
|
||||
self.cmd.add_auth("CryptoBox", url, user, password)
|
||||
|
18
bin/coding_guidelines.txt
Normal file
|
@ -0,0 +1,18 @@
|
|||
Maybe we can add some notes here to get a consistent coding experience :)
|
||||
|
||||
-------------------------------------------------------------------------------
|
||||
|
||||
comments:
|
||||
- should be usable for pydoc
|
||||
- ''' or """ at the beginning of every class/method
|
||||
- ## for longterm comments, that are useful for understanding
|
||||
- #blabla for codelines, that are out for experimenting and might be used later again
|
||||
|
||||
error handling:
|
||||
- unspecific error handling is evil (try: "grep -r except: .")
|
||||
|
||||
unit testing:
|
||||
- first write a unittest and then write the relating code until the unittest stops failing :)
|
||||
- 'unittests.ClassName.py' should contain all tests for 'ClassName.py'
|
||||
- commits with broken unit tests are evil (fix or disable the code (not the test ;) ))
|
||||
|
83
bin/cryptobox.conf
Normal file
|
@ -0,0 +1,83 @@
|
|||
[Main]
|
||||
|
||||
# comma separated list of possible prefixes for accesible devices
|
||||
# beware: .e.g "/dev/hd" grants access to _all_ harddisks
|
||||
AllowedDevices = /dev/loop, /dev/ubdb
|
||||
|
||||
# use sepepate config partition? (1=yes / 0=no)
|
||||
UseConfigPartition = 1
|
||||
|
||||
# the default name prefix of not unnamed containers
|
||||
DefaultVolumePrefix = "Disk "
|
||||
|
||||
# which cipher should cryptsetup-luks use?
|
||||
#TODO: uml does not support this module - DefaultCipher = aes-cbc-essiv:sha256
|
||||
DefaultCipher = aes-plain
|
||||
|
||||
# label of the configuration partition (you should never change this)
|
||||
ConfigVolumeLabel = cbox_config
|
||||
|
||||
|
||||
[Locations]
|
||||
# where should we mount volumes?
|
||||
# this directory must be writeable by the cryptobox user (see above)
|
||||
MountParentDir = /var/cache/cryptobox/mnt
|
||||
|
||||
# settings directory: contains name database and plugin configuration
|
||||
SettingsDir = /var/cache/cryptobox/settings
|
||||
|
||||
# where are the clearsilver templates?
|
||||
#TemplateDir = /usr/share/cryptobox/templates
|
||||
TemplateDir = ../templates
|
||||
|
||||
# path to language files
|
||||
#LangDir = /usr/share/cryptobox/lang
|
||||
LangDir = ../lang
|
||||
|
||||
# path to documentation files
|
||||
#DocDir = /usr/share/doc/cryptobox/html
|
||||
DocDir = ../doc/html
|
||||
|
||||
# path to the plugin directory
|
||||
#PluginDir = /usr/share/cryptobox/plugins
|
||||
PluginDir = ../plugins
|
||||
|
||||
|
||||
|
||||
[Log]
|
||||
# possible values are "debug", "info", "warn" and "error" or numbers from
|
||||
# 0 (debug) to 7 (error)
|
||||
Level = debug
|
||||
|
||||
# where to write the log messages to?
|
||||
# possible values are: file
|
||||
# syslog support will be added later
|
||||
Destination = file
|
||||
|
||||
# depending on the choosen destination (see above) you may select
|
||||
# details. Possible values for the different destinations are:
|
||||
# file: $FILENAME
|
||||
# syslog: $LOG_FACILITY
|
||||
#Details = /var/log/cryptobox.log
|
||||
Details = ./cryptobox.log
|
||||
|
||||
|
||||
[WebSettings]
|
||||
# URL of default stylesheet
|
||||
Stylesheet = /cryptobox-misc/cryptobox.css
|
||||
|
||||
# default language
|
||||
Language = de
|
||||
|
||||
|
||||
[Programs]
|
||||
cryptsetup = /sbin/cryptsetup
|
||||
mkfs-data = /sbin/mkfs.ext3
|
||||
blkid = /sbin/blkid
|
||||
blockdev = /sbin/blockdev
|
||||
mount = /bin/mount
|
||||
umount = /bin/umount
|
||||
super = /usr/bin/super
|
||||
# this is the "program" name as defined in /etc/super.tab
|
||||
CryptoBoxRootActions = CryptoBoxRootActions
|
||||
|
39
bin/cryptoboxd
Executable file
|
@ -0,0 +1,39 @@
|
|||
#!/bin/sh
|
||||
|
||||
#TODO: CBXPATH=/usr/lib/cryptobox
|
||||
CBXPATH=$(pwd)
|
||||
CBXSERVER=CryptoBoxWebserver.py
|
||||
PIDFILE=/var/run/cryptobox.pid
|
||||
DAEMON=/usr/bin/python2.4
|
||||
DAEMON_OPTS=${CBXPATH}/CryptoBoxWebserver.py
|
||||
NAME=cryptoboxd
|
||||
DESC="CryptoBox Daemon (webinterface)"
|
||||
#TODO: RUNAS=cryptobox
|
||||
RUNAS=$USERNAME
|
||||
|
||||
#test -x $DAEMON -a -f /etc/exports || exit 0
|
||||
|
||||
set -e
|
||||
|
||||
case "$1" in
|
||||
start)
|
||||
echo -n "Starting $DESC: "
|
||||
start-stop-daemon --background --chdir "$CBXPATH" --chuid "$RUNAS" --start --quiet --oknodo --user "$RUNAS" --make-pidfile --pidfile "$PIDFILE" --exec "$DAEMON" \
|
||||
-- $DAEMON_OPTS
|
||||
echo "$NAME."
|
||||
;;
|
||||
|
||||
stop)
|
||||
echo -n "Stopping $DESC: "
|
||||
#FIXME: this is the same as "killall python2.4"
|
||||
# using a pid file instead prevents problems, but does not kill children???
|
||||
start-stop-daemon --stop --oknodo --exec "$DAEMON"
|
||||
echo "$NAME."
|
||||
;;
|
||||
*)
|
||||
echo "Usage: $(basename $0) {start|stop}" >&2
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
|
||||
exit 0
|
17
bin/cryptoboxwebserver.conf
Normal file
|
@ -0,0 +1,17 @@
|
|||
[global]
|
||||
server.socketPort = 8080
|
||||
#server.environment = "production"
|
||||
server.environment = "development"
|
||||
server.logToScreen = True
|
||||
server.log_tracebacks = True
|
||||
server.threadPool = 1
|
||||
server.reverseDNS = False
|
||||
server.logFile = "cryptoboxwebserver.log"
|
||||
|
||||
[/favicon.ico]
|
||||
static_filter.on = True
|
||||
# TODO: use live-cd/live-cd-tree.d/var/www/favicon.ico
|
||||
static_filter.file = "/usr/share/doc/python-cherrypy/cherrypy/favicon.ico"
|
||||
|
||||
[/test_stream]
|
||||
stream_response = True
|
22
bin/do_unittests.sh
Executable file
|
@ -0,0 +1,22 @@
|
|||
#!/bin/sh
|
||||
#
|
||||
# run this script _before_ you do a commit and fix errors before uploading
|
||||
#
|
||||
|
||||
# check if /dev/loop1 is available - otherwise some tests will fail!
|
||||
if /sbin/losetup /dev/loop1 &>/dev/null
|
||||
then true
|
||||
else echo "misconfiguration detected: sorry - you need /dev/loop1 for the tests" >&2
|
||||
echo "just do the following:" >&2
|
||||
echo " dd if=/dev/zero of=test.img bs=1M count=1 seek=100" >&2
|
||||
echo " sudo /sbin/losetup /dev/loop1 test.img" >&2
|
||||
echo "then you can run the tests again ..." >&2
|
||||
echo >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# do the tests
|
||||
for a in unittests.*.py
|
||||
do testoob -v "$a"
|
||||
done
|
||||
|
2
bin/example-super.tab
Normal file
|
@ -0,0 +1,2 @@
|
|||
# adapt the following line to your local setup and add it to /etc/super.tab
|
||||
CryptoBoxRootActions /your/local/path/to/CryptoBoxRootActions.py yourUserName
|
116
bin/test.complete.CryptoBox.py
Executable file
|
@ -0,0 +1,116 @@
|
|||
#!/usr/bin/env python2.4
|
||||
|
||||
"""
|
||||
BEWARE: this script may overwrite the data of one of your loop devices. You
|
||||
should restrict the AllowedDevices directive in cryptobox.conf to exclude
|
||||
your precious black devices from being used by this script.
|
||||
|
||||
the following script runs a number of tests for different parts
|
||||
"""
|
||||
|
||||
from CryptoBox import CryptoBoxProps
|
||||
from CryptoBoxContainer import CryptoBoxContainer
|
||||
import sys
|
||||
|
||||
|
||||
def main():
|
||||
cb = CryptoBoxProps()
|
||||
|
||||
print "Confguration:"
|
||||
print "\tConfig file:\t\t%s" % (cb.prefs.prefs.filename, )
|
||||
print "\tAllowed devices:\t%s" % (cb.prefs["Main"]["AllowedDevices"], )
|
||||
|
||||
"""for e in cb.getContainerList(filterType=CryptoBoxContainer.Types["luks"]):"""
|
||||
for e in cb.getContainerList():
|
||||
print "\t\t%d\t\t%s - %s - %d" % (cb.getContainerList().index(e), e.getDevice(), e.getName(), e.getType())
|
||||
|
||||
if not cb.getContainerList() or len(cb.getContainerList()) < 1:
|
||||
print "no loop devices found for testing"
|
||||
sys.exit(1)
|
||||
|
||||
if len(cb.getContainerList()) > 1:
|
||||
print "I found more than one available loop device - I will stop now to avoid risking data loss."
|
||||
print "Please change the 'AllowedDevices' setting in 'cryptobox.conf' to reduce the number of allowed devices to only one."
|
||||
sys.exit(1)
|
||||
|
||||
testElement = cb.getContainerList()[0]
|
||||
print "\nRunning some tests now ..."
|
||||
if not plain_tests(testElement):
|
||||
print "some previous tests failed - we should stop now"
|
||||
sys.exit(1)
|
||||
luks_tests(testElement)
|
||||
|
||||
|
||||
" ***************** some functions ******************** "
|
||||
|
||||
def luks_tests(e):
|
||||
# umount if necessary
|
||||
try:
|
||||
e.umount()
|
||||
except "MountError":
|
||||
pass
|
||||
|
||||
e.create(e.Types["luks"], "alt")
|
||||
print "\tluks create:\tok"
|
||||
|
||||
e.changePassword("alt","neu")
|
||||
print "\tluks changepw:\tok"
|
||||
|
||||
e.setName("lalla")
|
||||
print "\tluks setName:\tok"
|
||||
|
||||
try:
|
||||
e.mount("neu")
|
||||
except "MountError":
|
||||
pass
|
||||
if e.isMounted(): print "\tluks mount:\tok"
|
||||
else: print "\tluks mount:\tfailed"
|
||||
|
||||
print "\tCapacity (size, free, used) [MB]:\t%s" % (e.getCapacity(), )
|
||||
|
||||
try:
|
||||
e.umount()
|
||||
except "MountError":
|
||||
pass
|
||||
if e.isMounted(): print "\tluks umount:\tfailed"
|
||||
else: print "\tluks umount:\tok"
|
||||
|
||||
if e.isMounted(): return False
|
||||
else: return True
|
||||
|
||||
|
||||
def plain_tests(e):
|
||||
# umount if necessary
|
||||
try:
|
||||
e.umount()
|
||||
except "MountError":
|
||||
pass
|
||||
|
||||
e.create(e.Types["plain"])
|
||||
print "\tplain create:\tok"
|
||||
|
||||
e.setName("plain-lili")
|
||||
print "\tplain setName:\tok"
|
||||
|
||||
try:
|
||||
e.mount()
|
||||
except "MountError":
|
||||
pass
|
||||
if e.isMounted(): print "\tplain mount:\tok"
|
||||
else: print "\tplain mount:\tfailed"
|
||||
|
||||
print "\tCapacity (size, free, used) [MB]:\t%s" % (e.getCapacity(), )
|
||||
|
||||
try:
|
||||
e.umount()
|
||||
except "MountError":
|
||||
pass
|
||||
if e.isMounted(): print "\tplain umount:\tfailed"
|
||||
else: print "\tplain umount:\tok"
|
||||
|
||||
if e.isMounted(): return False
|
||||
else: return True
|
||||
|
||||
# ************ main ****************
|
||||
|
||||
main()
|
23
bin/uml-setup.sh
Executable file
|
@ -0,0 +1,23 @@
|
|||
#!/bin/sh
|
||||
|
||||
ROOT_IMG=/home/lars/devel-stuff/devel-chroots/cryptobox.img
|
||||
TEST_IMG=test.img
|
||||
TEST_SIZE=256
|
||||
MEM_SIZE=128M
|
||||
|
||||
# Preparations:
|
||||
# echo "tun" >>/etc/modules
|
||||
# follow the instructions in /usr/share/doc/uml-utilities/README.Debian
|
||||
# add your user to the group 'uml-net'
|
||||
#
|
||||
|
||||
/sbin/ifconfig tap0 &>/dev/null || { echo "tap0 is not configured - read /usr/share/doc/uml-utilities/README.Debian for hints"; exit 1; }
|
||||
|
||||
|
||||
if [ ! -e "$TEST_IMG" ]
|
||||
then echo "Creating testing image file ..."
|
||||
dd if=/dev/zero of="$TEST_IMG" bs=1M count=$TEST_SIZE
|
||||
fi
|
||||
|
||||
linux ubd0="$ROOT_IMG" ubd1="$TEST_IMG" con=xterm hostfs=../ fakehd eth0=daemon mem=$MEM_SIZE
|
||||
|
138
bin/unittests.CryptoBox.py
Executable file
|
@ -0,0 +1,138 @@
|
|||
#!/usr/bin/env python2.4
|
||||
|
||||
import unittest
|
||||
import sys
|
||||
from CryptoBox import *
|
||||
from CryptoBoxExceptions import *
|
||||
import CryptoBoxSettings
|
||||
|
||||
class CryptoBoxPropsDeviceTests(unittest.TestCase):
|
||||
import CryptoBox
|
||||
cb = CryptoBox.CryptoBoxProps()
|
||||
|
||||
def testAllowedDevices(self):
|
||||
'''isDeviceAllowed should accept permitted devices'''
|
||||
self.assertTrue(self.cb.isDeviceAllowed("/dev/loop"))
|
||||
self.assertTrue(self.cb.isDeviceAllowed("/dev/loop1"))
|
||||
self.assertTrue(self.cb.isDeviceAllowed("/dev/loop/urgd"))
|
||||
self.assertTrue(self.cb.isDeviceAllowed("/dev/usb/../loop1"))
|
||||
|
||||
def testDeniedDevices(self):
|
||||
'''isDeviceAllowed should fail with not explicitly allowed devices'''
|
||||
self.assertFalse(self.cb.isDeviceAllowed("/dev/hda"))
|
||||
self.assertFalse(self.cb.isDeviceAllowed("/dev/loopa/../hda"))
|
||||
self.assertFalse(self.cb.isDeviceAllowed("/"))
|
||||
|
||||
|
||||
class CryptoBoxPropsConfigTests(unittest.TestCase):
|
||||
'''test here if everything with the config turns right'''
|
||||
import os
|
||||
import CryptoBox
|
||||
|
||||
files = {
|
||||
"configFileOK" : "cbox-test_ok.conf",
|
||||
"configFileBroken" : "cbox-test_broken.conf",
|
||||
"nameDBFile" : "cryptobox_names.db",
|
||||
"pluginConf" : "cryptobox_plugins.conf",
|
||||
"userDB" : "cryptobox_users.db",
|
||||
"logFile" : "cryptobox.log",
|
||||
"tmpdir" : "cryptobox-mnt" }
|
||||
tmpdirname = ""
|
||||
filenames = {}
|
||||
configContentOK = """
|
||||
[Main]
|
||||
AllowedDevices = /dev/loop
|
||||
DefaultVolumePrefix = "Data "
|
||||
DefaultCipher = aes-cbc-essiv:sha256
|
||||
[Locations]
|
||||
SettingsDir = %s
|
||||
MountParentDir = %s
|
||||
TemplateDir = ../templates
|
||||
LangDir = ../lang
|
||||
DocDir = ../doc/html
|
||||
PluginDir = ../plugins
|
||||
[Log]
|
||||
Level = debug
|
||||
Destination = file
|
||||
Details = %s/cryptobox.log
|
||||
[WebSettings]
|
||||
Stylesheet = /cryptobox-misc/cryptobox.css
|
||||
[Programs]
|
||||
blkid = /sbin/blkid
|
||||
cryptsetup = /sbin/cryptsetup
|
||||
super = /usr/bin/super
|
||||
CryptoBoxRootActions = CryptoBoxRootActions
|
||||
"""
|
||||
|
||||
|
||||
def setUp(self):
|
||||
'''generate all files in tmp and remember the names'''
|
||||
import tempfile
|
||||
os = self.os
|
||||
self.tmpdirname = tempfile.mkdtemp(prefix="cbox-")
|
||||
for file in self.files.keys():
|
||||
self.filenames[file] = os.path.join(self.tmpdirname, self.files[file])
|
||||
self.writeConfig()
|
||||
|
||||
|
||||
def tearDown(self):
|
||||
'''remove the created tmpfiles'''
|
||||
os = self.os
|
||||
# remove temp files
|
||||
for file in self.filenames.values():
|
||||
compl_name = os.path.join(self.tmpdirname, file)
|
||||
if os.path.exists(compl_name):
|
||||
os.remove(compl_name)
|
||||
# remove temp dir
|
||||
os.rmdir(self.tmpdirname)
|
||||
|
||||
|
||||
def testConfigInit(self):
|
||||
'''Check various branches of config file loading'''
|
||||
import os
|
||||
self.assertRaises(CBConfigUnavailableError, self.CryptoBox.CryptoBoxProps,"/invalid/path/to/config/file")
|
||||
self.assertRaises(CBConfigUnavailableError, self.CryptoBox.CryptoBoxProps,"/etc/shadow")
|
||||
""" check one of the following things:
|
||||
1) are we successfully using an existing config file?
|
||||
2) do we break, if no config file is there?
|
||||
depending on the existence of a config file, only one of these conditions
|
||||
can be checked - hints for more comprehensive tests are appreciated :) """
|
||||
for a in CryptoBoxSettings.CryptoBoxSettings.CONF_LOCATIONS:
|
||||
if os.path.exists(a):
|
||||
self.CryptoBox.CryptoBoxProps()
|
||||
break # this skips the 'else' clause
|
||||
else: self.assertRaises(CBConfigUnavailableError, self.CryptoBox.CryptoBoxProps)
|
||||
self.assertRaises(CBConfigUnavailableError, self.CryptoBox.CryptoBoxProps,[])
|
||||
|
||||
|
||||
def testBrokenConfigs(self):
|
||||
"""Check various broken configurations"""
|
||||
self.writeConfig("SettingsDir", "SettingsDir=/foo/bar", filename=self.filenames["configFileBroken"])
|
||||
self.assertRaises(CBConfigError, self.CryptoBox.CryptoBoxProps,self.filenames["configFileBroken"])
|
||||
self.writeConfig("Level", "Level = ho", filename=self.filenames["configFileBroken"])
|
||||
self.assertRaises(CBConfigError, self.CryptoBox.CryptoBoxProps,self.filenames["configFileBroken"])
|
||||
self.writeConfig("Details", "#out", filename=self.filenames["configFileBroken"])
|
||||
self.assertRaises(CBConfigError, self.CryptoBox.CryptoBoxProps,self.filenames["configFileBroken"])
|
||||
self.writeConfig("super", "super=/bin/invalid/no", filename=self.filenames["configFileBroken"])
|
||||
self.assertRaises(CBConfigError, self.CryptoBox.CryptoBoxProps,self.filenames["configFileBroken"])
|
||||
self.writeConfig("CryptoBoxRootActions", "#not here", filename=self.filenames["configFileBroken"])
|
||||
self.assertRaises(CBConfigError, self.CryptoBox.CryptoBoxProps,self.filenames["configFileBroken"])
|
||||
self.writeConfig("CryptoBoxRootActions", "CryptoBoxRootActions = /bin/false", filename=self.filenames["configFileBroken"])
|
||||
self.assertRaises(CBEnvironmentError, self.CryptoBox.CryptoBoxProps,self.filenames["configFileBroken"])
|
||||
|
||||
|
||||
def writeConfig(self, replace=None, newline=None, filename=None):
|
||||
"""write a config file and (optional) replace a line in it"""
|
||||
import re
|
||||
if not filename: filename = self.filenames["configFileOK"]
|
||||
content = self.configContentOK % (self.tmpdirname, self.tmpdirname, self.tmpdirname)
|
||||
if replace:
|
||||
pattern = re.compile('^' + replace + '\\s*=.*$', flags=re.M)
|
||||
content = re.sub(pattern, newline, content)
|
||||
cf = open(filename, "w")
|
||||
cf.write(content)
|
||||
cf.close()
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
48
bin/unittests.CryptoBoxTools.py
Executable file
|
@ -0,0 +1,48 @@
|
|||
#!/usr/bin/env python2.4
|
||||
|
||||
import unittest
|
||||
import CryptoBoxTools
|
||||
import os
|
||||
|
||||
|
||||
class CryptoBoxToolsTests(unittest.TestCase):
|
||||
|
||||
def testGetAbsoluteDeviceName(self):
|
||||
func = CryptoBoxTools.getAbsoluteDeviceName
|
||||
self.assertTrue(func("hda") == "/dev/hda")
|
||||
self.assertTrue(func("loop0") == "/dev/loop0")
|
||||
self.assertTrue(func(os.path.devnull) == os.path.devnull)
|
||||
|
||||
|
||||
def testFindMajorMinorOfDevice(self):
|
||||
func = CryptoBoxTools.findMajorMinorOfDevice
|
||||
self.assertTrue(func("/dev/hda") == (3,0))
|
||||
self.assertTrue(func("/dev/hda1") == (3,1))
|
||||
self.assertTrue(func(os.path.devnull) == (1,3))
|
||||
self.assertTrue(func("/dev/nothere") is None)
|
||||
|
||||
|
||||
def testFindMajorMinorDeviceName(self):
|
||||
func = CryptoBoxTools.findMajorMinorDeviceName
|
||||
dir = os.path.join(os.path.sep, "dev")
|
||||
self.assertTrue(os.path.join(dir,"hda") in func(dir,3,0))
|
||||
self.assertTrue(os.path.devnull in func(dir,1,3))
|
||||
self.assertFalse(os.path.devnull in func(dir,2,3))
|
||||
|
||||
|
||||
def testIsPartOfBlockDevice(self):
|
||||
func = CryptoBoxTools.isPartOfBlockDevice
|
||||
self.assertTrue(func("/dev/hda", "/dev/hda1"))
|
||||
self.assertFalse(func("/dev/hda", "/dev/hda"))
|
||||
self.assertFalse(func("/dev/hda1", "/dev/hda"))
|
||||
self.assertFalse(func("/dev/hda1", "/dev/hda1"))
|
||||
self.assertFalse(func("/dev/hda", "/dev/hdb1"))
|
||||
self.assertFalse(func(None, "/dev/hdb1"))
|
||||
self.assertFalse(func("/dev/hda", None))
|
||||
self.assertFalse(func(None, ""))
|
||||
self.assertFalse(func("loop0", "loop1"))
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
|
33
bin/unittests.Plugins.py
Executable file
|
@ -0,0 +1,33 @@
|
|||
#!/usr/bin/python2.4
|
||||
|
||||
import unittest
|
||||
import Plugins
|
||||
|
||||
class CheckForUndefinedTestCases(unittest.TestCase):
|
||||
"""here we will add failing test functions for every non-existing testcase"""
|
||||
|
||||
|
||||
def create_testcases():
|
||||
|
||||
plugins = Plugins.PluginManager(None, "../plugins").getPlugins()
|
||||
glob_dict = globals()
|
||||
loc_dict = locals()
|
||||
for pl in plugins:
|
||||
test_class = pl.getTestClass()
|
||||
if test_class:
|
||||
## add the testclass to the global dictionary
|
||||
glob_dict["unittest" + pl.getName()] = test_class
|
||||
else:
|
||||
subname = "test_existence_%s" % pl.getName()
|
||||
def test_existence(self):
|
||||
"""check if the plugin (%s) contains tests""" % pl.getName()
|
||||
self.fail("no tests defined for plugin: %s" % pl.getName())
|
||||
## add this function to the class above
|
||||
setattr(CheckForUndefinedTestCases, subname, test_existence)
|
||||
#FIXME: the failure output always contains the same name for all plugins
|
||||
|
||||
|
||||
create_testcases()
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
39
bin/unittests.WebSites.py
Executable file
|
@ -0,0 +1,39 @@
|
|||
#!/usr/bin/env python2.4
|
||||
|
||||
import unittest
|
||||
|
||||
## this makes assertRaises shorter
|
||||
from twill.errors import *
|
||||
from mechanize import BrowserStateError, LinkNotFoundError
|
||||
|
||||
## import the module of the common super class of all web interface test classes
|
||||
import WebInterfaceTestClass
|
||||
|
||||
|
||||
|
||||
class WebServer(WebInterfaceTestClass.WebInterfaceTestClass):
|
||||
|
||||
def test_is_server_running(self):
|
||||
'''the server should run under given name and port'''
|
||||
self.cmd.go(self.URL)
|
||||
## other URLs must not be checked, as we do not know, if they are valid
|
||||
|
||||
|
||||
class BuiltinPages(WebInterfaceTestClass.WebInterfaceTestClass):
|
||||
|
||||
|
||||
def test_goto_index(self):
|
||||
'''display all devices'''
|
||||
self.cmd.go(self.URL + "?weblang=en")
|
||||
self.cmd.find("The CryptoBox")
|
||||
self.cmd.go(self.URL + "?weblang=de")
|
||||
self.cmd.find("Die CryptoBox")
|
||||
self.cmd.go(self.URL + "?weblang=si")
|
||||
self.cmd.find("Privatnost v vsako vas")
|
||||
self.cmd.go(self.URL + "?weblang=fr")
|
||||
self.cmd.find("La CryptoBox")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
|
3
debian/README.Debian
vendored
|
@ -1,6 +1,5 @@
|
|||
CryptoBox for Debian - installation notes
|
||||
|
||||
be aware of two things:
|
||||
be aware of one thing:
|
||||
1) you need cryptsetup with luks support (for now only in unstable)
|
||||
2) the debian perl-clearsilver package is broken (at least until April 02006)
|
||||
|
||||
|
|
3
debian/control
vendored
|
@ -7,8 +7,7 @@ Standards-Version: 3.6.2
|
|||
|
||||
Package: cryptobox
|
||||
Architecture: any
|
||||
Depends: bash (>=2.0), sed (>=4.0), coreutils, grep (>=2.0), perl, httpd-cgi, hashalot, libconfigfile-perl, cryptsetup (>=20050111), dmsetup, pmount, initscripts, e2fsprogs (>= 1.27), adduser
|
||||
Recommends: perl-clearsilver
|
||||
Depends: bash (>=2.0), sed (>=4.0), coreutils, grep (>=2.0), httpd-cgi, hashalot, cryptsetup (>=20050111), dmsetup, initscripts, e2fsprogs (>= 1.27), adduser, python (>=2.4), python-clearsilver
|
||||
Suggests: cron, samba
|
||||
Description: Web interface for an encrypting fileserver
|
||||
This bundle of scripts and cgis allow you to manage an encrypted harddisk
|
||||
|
|
7
debian/rules
vendored
|
@ -74,19 +74,14 @@ binary-arch: build install
|
|||
# dh_installmenu
|
||||
# dh_installdebconf
|
||||
# dh_installlogrotate
|
||||
# dh_installemacsen
|
||||
# dh_installpam
|
||||
# dh_installmime
|
||||
dh_installinit
|
||||
# dh_installcron
|
||||
# dh_installinfo
|
||||
dh_installman
|
||||
dh_link
|
||||
dh_strip
|
||||
dh_compress
|
||||
dh_fixperms
|
||||
dh_perl
|
||||
# dh_python
|
||||
dh_python
|
||||
# dh_makeshlibs
|
||||
dh_installdeb
|
||||
dh_shlibdeps
|
||||
|
|
265
design/background_frame_corner.svg
Normal file
|
@ -0,0 +1,265 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://web.resource.org/cc/"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="210mm"
|
||||
height="297mm"
|
||||
id="svg12523"
|
||||
sodipodi:version="0.32"
|
||||
inkscape:version="0.44.1"
|
||||
sodipodi:docbase="/home/lars/subversion/cryptobox/branches/pythonrewrite/design"
|
||||
sodipodi:docname="background_frame_corner.svg"
|
||||
inkscape:export-filename="/home/lars/subversion/cryptobox/branches/pythonrewrite/www-data/background_frame_corner.png"
|
||||
inkscape:export-xdpi="76.669998"
|
||||
inkscape:export-ydpi="76.669998">
|
||||
<defs
|
||||
id="defs12525">
|
||||
<linearGradient
|
||||
id="linearGradient18003">
|
||||
<stop
|
||||
id="stop18005"
|
||||
offset="0"
|
||||
style="stop-color:#bbb;stop-opacity:1;" />
|
||||
<stop
|
||||
id="stop18007"
|
||||
offset="0.89510489"
|
||||
style="stop-color:#d6d6d6;stop-opacity:1;" />
|
||||
<stop
|
||||
id="stop18009"
|
||||
offset="1"
|
||||
style="stop-color:white;stop-opacity:0" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient6436">
|
||||
<stop
|
||||
id="stop6438"
|
||||
offset="0"
|
||||
style="stop-color:#bbb;stop-opacity:1;" />
|
||||
<stop
|
||||
id="stop6440"
|
||||
offset="0.79720283"
|
||||
style="stop-color:#d6d6d6;stop-opacity:1;" />
|
||||
<stop
|
||||
id="stop6442"
|
||||
offset="1"
|
||||
style="stop-color:white;stop-opacity:0" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient2840">
|
||||
<stop
|
||||
id="stop2842"
|
||||
offset="0"
|
||||
style="stop-color:#ececec;stop-opacity:1;" />
|
||||
<stop
|
||||
style="stop-color:#dfdfdf;stop-opacity:1;"
|
||||
offset="0.15000001"
|
||||
id="stop2844" />
|
||||
<stop
|
||||
id="stop2846"
|
||||
offset="0.5"
|
||||
style="stop-color:#bbb;stop-opacity:1;" />
|
||||
<stop
|
||||
id="stop2848"
|
||||
offset="0.85000002"
|
||||
style="stop-color:#dfdfdf;stop-opacity:1;" />
|
||||
<stop
|
||||
id="stop2850"
|
||||
offset="1"
|
||||
style="stop-color:#ececec;stop-opacity:1;" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient13418">
|
||||
<stop
|
||||
style="stop-color:#bbb;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop19661" />
|
||||
<stop
|
||||
style="stop-color:#d6d6d6;stop-opacity:1;"
|
||||
offset="0.60000002"
|
||||
id="stop19659" />
|
||||
<stop
|
||||
style="stop-color:#e8e8e8;stop-opacity:1;"
|
||||
offset="1"
|
||||
id="stop13422" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient13418"
|
||||
id="linearGradient14319"
|
||||
x1="146.42857"
|
||||
y1="295.93362"
|
||||
x2="602.14288"
|
||||
y2="615.21936"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(1.033937,0,0,0.470464,-111.0592,119.9379)" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient13418"
|
||||
id="linearGradient16109"
|
||||
x1="-698.64288"
|
||||
y1="480.93362"
|
||||
x2="-212.78571"
|
||||
y2="480.93362"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(-1.205649,0,0,-1,-80.86,1421.867)" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient13418"
|
||||
id="linearGradient4644"
|
||||
x1="-552.84717"
|
||||
y1="342.28833"
|
||||
x2="-538.43823"
|
||||
y2="747.75262"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(1.000688,0,0,0.742585,0.284584,81.76713)" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient6436"
|
||||
id="linearGradient9992"
|
||||
x1="-579.13184"
|
||||
y1="815.78918"
|
||||
x2="-449.77423"
|
||||
y2="861.64172"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient13418"
|
||||
id="linearGradient10889"
|
||||
x1="-458.1723"
|
||||
y1="815.36176"
|
||||
x2="-583.6474"
|
||||
y2="880.30389"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient6436"
|
||||
id="linearGradient11778"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x1="-579.13184"
|
||||
y1="815.78918"
|
||||
x2="-449.77423"
|
||||
y2="861.64172"
|
||||
gradientTransform="translate(197.7436,-1.863711)" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient13418"
|
||||
id="linearGradient11780"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x1="-458.1723"
|
||||
y1="815.36176"
|
||||
x2="-583.6474"
|
||||
y2="880.30389"
|
||||
gradientTransform="translate(197.7436,-1.863711)" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient13418"
|
||||
id="linearGradient15346"
|
||||
x1="269.42987"
|
||||
y1="-1149.713"
|
||||
x2="277.02573"
|
||||
y2="-889.35199"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(0.998222,0,0,1.625694,0.597727,563.6477)" />
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="0.45801722"
|
||||
inkscape:cx="132.53452"
|
||||
inkscape:cy="-117.51501"
|
||||
inkscape:document-units="px"
|
||||
inkscape:current-layer="layer1"
|
||||
inkscape:window-width="1024"
|
||||
inkscape:window-height="693"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="26" />
|
||||
<metadata
|
||||
id="metadata12528">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Ebene 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1">
|
||||
<rect
|
||||
style="fill:white;stroke:url(#linearGradient14319);stroke-width:3.5587604;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;fill-opacity:1"
|
||||
id="rect12531"
|
||||
width="713.87738"
|
||||
height="431.0202"
|
||||
x="47.493656"
|
||||
y="262.41977"
|
||||
rx="4.4825716"
|
||||
ry="3.7824252"
|
||||
inkscape:export-filename="/home/lars/subversion/cryptobox/branches/pythonrewrite/www-data/background_frame_corner.png"
|
||||
inkscape:export-xdpi="75.269997"
|
||||
inkscape:export-ydpi="75.269997" />
|
||||
<path
|
||||
style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient16109);stroke-width:3.29406023;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="M 759.64935,940.93361 L 177.49352,940.93361"
|
||||
id="path15208"
|
||||
inkscape:export-filename="/home/lars/subversion/cryptobox/branches/pythonrewrite/www-data/footer_line.png"
|
||||
inkscape:export-xdpi="76"
|
||||
inkscape:export-ydpi="76" />
|
||||
<rect
|
||||
style="fill:white;fill-opacity:1;stroke:url(#linearGradient4644);stroke-width:3.06796598;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
id="rect3737"
|
||||
width="714.36841"
|
||||
height="320.06937"
|
||||
x="-770.91931"
|
||||
y="337.26691"
|
||||
rx="4.4856548"
|
||||
ry="2.8087742"
|
||||
inkscape:export-filename="/home/lars/subversion/cryptobox/branches/pythonrewrite/www-data/background_frame_top.png"
|
||||
inkscape:export-xdpi="87.809998"
|
||||
inkscape:export-ydpi="87.809998" />
|
||||
<rect
|
||||
style="fill:url(#linearGradient9992);fill-opacity:1;stroke:url(#linearGradient10889);stroke-width:2;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
id="rect4648"
|
||||
width="118"
|
||||
height="48"
|
||||
x="-582.87494"
|
||||
y="812.25867"
|
||||
rx="10"
|
||||
ry="10" />
|
||||
<rect
|
||||
style="fill:url(#linearGradient11778);fill-opacity:1;stroke:url(#linearGradient11780);stroke-width:2;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;opacity:0.5"
|
||||
id="rect11776"
|
||||
width="118"
|
||||
height="48"
|
||||
x="-385.13144"
|
||||
y="810.3949"
|
||||
rx="10"
|
||||
ry="10" />
|
||||
<rect
|
||||
style="opacity:0.4;fill:url(#linearGradient15346);fill-opacity:1.0;stroke:none;stroke-width:5.09556913;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
id="rect12667"
|
||||
width="614.90448"
|
||||
height="400"
|
||||
x="28.62841"
|
||||
y="-1302.1809"
|
||||
rx="10"
|
||||
ry="10"
|
||||
inkscape:export-filename="/home/lars/subversion/cryptobox/branches/pythonrewrite/www-data/volume_property_frame.png"
|
||||
inkscape:export-xdpi="102.45493"
|
||||
inkscape:export-ydpi="102.45493"
|
||||
transform="scale(-1,-1)" />
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 8.8 KiB |
92
design/icon_background_active.svg
Normal file
|
@ -0,0 +1,92 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://web.resource.org/cc/"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="210mm"
|
||||
height="297mm"
|
||||
id="svg2"
|
||||
sodipodi:version="0.32"
|
||||
inkscape:version="0.44.1"
|
||||
sodipodi:docbase="/home/lars/subversion/cryptobox/branches/pythonrewrite/design"
|
||||
sodipodi:docname="icon_background_active.svg"
|
||||
inkscape:export-filename="/home/lars/subversion/cryptobox/branches/pythonrewrite/www-data/icon_background_passive_100.png"
|
||||
inkscape:export-xdpi="22.5"
|
||||
inkscape:export-ydpi="22.5">
|
||||
<defs
|
||||
id="defs4">
|
||||
<linearGradient
|
||||
id="linearGradient2760">
|
||||
<stop
|
||||
style="stop-color:#9b9b9b;stop-opacity:0.22522523;"
|
||||
offset="0"
|
||||
id="stop2762" />
|
||||
<stop
|
||||
id="stop2768"
|
||||
offset="0.85314685"
|
||||
style="stop-color:#c8c8c8;stop-opacity:0.1891892;" />
|
||||
<stop
|
||||
style="stop-color:#e9e5e9;stop-opacity:0;"
|
||||
offset="1"
|
||||
id="stop2764" />
|
||||
</linearGradient>
|
||||
<radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient2760"
|
||||
id="radialGradient2766"
|
||||
cx="308.57141"
|
||||
cy="383.79077"
|
||||
fx="308.57141"
|
||||
fy="383.79077"
|
||||
r="271.92856"
|
||||
gradientTransform="matrix(1.378293,-3.957684e-7,1.759598e-7,1.129975,-189.6586,-48.38559)"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="0.35"
|
||||
inkscape:cx="350"
|
||||
inkscape:cy="524.28571"
|
||||
inkscape:document-units="px"
|
||||
inkscape:current-layer="layer1"
|
||||
inkscape:window-width="1024"
|
||||
inkscape:window-height="693"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="26" />
|
||||
<metadata
|
||||
id="metadata7">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Ebene 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1">
|
||||
<rect
|
||||
style="fill:url(#radialGradient2766);fill-opacity:1;fill-rule:evenodd;stroke:#9c9c9c;stroke-width:2.55945635;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
id="rect1872"
|
||||
width="397.44052"
|
||||
height="437.44055"
|
||||
x="36.922581"
|
||||
y="166.57048"
|
||||
rx="3.6606367"
|
||||
ry="4.9709153" />
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 2.9 KiB |
245
design/icons/applications-system_tango.svg
Normal file
|
@ -0,0 +1,245 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://web.resource.org/cc/"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns:sodipodi="http://inkscape.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="48.000000px"
|
||||
height="48.000000px"
|
||||
id="svg53383"
|
||||
sodipodi:version="0.32"
|
||||
inkscape:version="0.43+devel"
|
||||
sodipodi:docbase="/home/jimmac/src/cvs/tango-icon-theme/scalable/categories"
|
||||
sodipodi:docname="applications-system.svg">
|
||||
<defs
|
||||
id="defs3">
|
||||
<linearGradient
|
||||
id="linearGradient3264">
|
||||
<stop
|
||||
style="stop-color:#c9c9c9;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop3266" />
|
||||
<stop
|
||||
id="stop3276"
|
||||
offset="0.25"
|
||||
style="stop-color:#f8f8f8;stop-opacity:1;" />
|
||||
<stop
|
||||
id="stop3272"
|
||||
offset="0.5"
|
||||
style="stop-color:#e2e2e2;stop-opacity:1;" />
|
||||
<stop
|
||||
style="stop-color:#b0b0b0;stop-opacity:1;"
|
||||
offset="0.75"
|
||||
id="stop3274" />
|
||||
<stop
|
||||
style="stop-color:#c9c9c9;stop-opacity:1;"
|
||||
offset="1"
|
||||
id="stop3268" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3264"
|
||||
id="linearGradient3281"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x1="14.462892"
|
||||
y1="12.284524"
|
||||
x2="34.534348"
|
||||
y2="39.684914"
|
||||
gradientTransform="matrix(1.241935,0,0,1.241935,-5.027508,-7.208988)" />
|
||||
<linearGradient
|
||||
id="linearGradient2300">
|
||||
<stop
|
||||
id="stop2302"
|
||||
offset="0.0000000"
|
||||
style="stop-color:#000000;stop-opacity:0.32673267;" />
|
||||
<stop
|
||||
id="stop2304"
|
||||
offset="1"
|
||||
style="stop-color:#000000;stop-opacity:0;" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="aigrd1"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x1="99.7773"
|
||||
y1="15.4238"
|
||||
x2="153.0005"
|
||||
y2="248.6311">
|
||||
<stop
|
||||
offset="0"
|
||||
style="stop-color:#184375"
|
||||
id="stop53300" />
|
||||
<stop
|
||||
offset="1"
|
||||
style="stop-color:#C8BDDC"
|
||||
id="stop53302" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#aigrd1"
|
||||
id="linearGradient53551"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x1="99.7773"
|
||||
y1="15.4238"
|
||||
x2="153.0005"
|
||||
y2="248.6311"
|
||||
gradientTransform="matrix(0.200685,0.000000,0.000000,0.200685,-0.585758,-1.050787)" />
|
||||
<radialGradient
|
||||
gradientUnits="userSpaceOnUse"
|
||||
r="11.689870"
|
||||
fy="72.568001"
|
||||
fx="14.287618"
|
||||
cy="68.872971"
|
||||
cx="14.287618"
|
||||
gradientTransform="matrix(1.399258,-2.234445e-7,8.196178e-8,0.513264,4.365074,4.839285)"
|
||||
id="radialGradient2308"
|
||||
xlink:href="#linearGradient2300"
|
||||
inkscape:collect="always" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3264"
|
||||
id="linearGradient3760"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(1.241935,0,0,1.241935,-5.027508,-7.208988)"
|
||||
x1="14.462892"
|
||||
y1="12.284524"
|
||||
x2="34.534348"
|
||||
y2="39.684914" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#aigrd1"
|
||||
id="linearGradient3773"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(0.200685,0,0,0.200685,-54.33576,-1.050787)"
|
||||
x1="99.7773"
|
||||
y1="15.4238"
|
||||
x2="153.0005"
|
||||
y2="248.6311" />
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
inkscape:showpageshadow="false"
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="0.11764706"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="5.6568542"
|
||||
inkscape:cx="43.652227"
|
||||
inkscape:cy="21.164787"
|
||||
inkscape:current-layer="layer1"
|
||||
showgrid="false"
|
||||
inkscape:grid-bbox="true"
|
||||
inkscape:document-units="px"
|
||||
inkscape:window-width="872"
|
||||
inkscape:window-height="697"
|
||||
inkscape:window-x="2398"
|
||||
inkscape:window-y="249" />
|
||||
<metadata
|
||||
id="metadata4">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title>System Applications</dc:title>
|
||||
<dc:creator>
|
||||
<cc:Agent>
|
||||
<dc:title>Jakub Steiner</dc:title>
|
||||
</cc:Agent>
|
||||
</dc:creator>
|
||||
<dc:source>http://jimmac.musichall.cz/</dc:source>
|
||||
<dc:subject>
|
||||
<rdf:Bag>
|
||||
<rdf:li>system</rdf:li>
|
||||
<rdf:li>applications</rdf:li>
|
||||
<rdf:li>group</rdf:li>
|
||||
<rdf:li>category</rdf:li>
|
||||
<rdf:li>admin</rdf:li>
|
||||
<rdf:li>root</rdf:li>
|
||||
</rdf:Bag>
|
||||
</dc:subject>
|
||||
<cc:license
|
||||
rdf:resource="http://creativecommons.org/licenses/by/2.0/" />
|
||||
</cc:Work>
|
||||
<cc:License
|
||||
rdf:about="http://creativecommons.org/licenses/by/2.0/">
|
||||
<cc:permits
|
||||
rdf:resource="http://web.resource.org/cc/Reproduction" />
|
||||
<cc:permits
|
||||
rdf:resource="http://web.resource.org/cc/Distribution" />
|
||||
<cc:requires
|
||||
rdf:resource="http://web.resource.org/cc/Notice" />
|
||||
<cc:requires
|
||||
rdf:resource="http://web.resource.org/cc/Attribution" />
|
||||
<cc:permits
|
||||
rdf:resource="http://web.resource.org/cc/DerivativeWorks" />
|
||||
<cc:requires
|
||||
rdf:resource="http://web.resource.org/cc/ShareAlike" />
|
||||
</cc:License>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="shadow"
|
||||
id="layer2"
|
||||
inkscape:groupmode="layer">
|
||||
<path
|
||||
transform="matrix(1.186380,0.000000,0.000000,1.186380,-4.539687,-7.794678)"
|
||||
d="M 44.285715 38.714287 A 19.928572 9.8372450 0 1 1 4.4285717,38.714287 A 19.928572 9.8372450 0 1 1 44.285715 38.714287 z"
|
||||
sodipodi:ry="9.8372450"
|
||||
sodipodi:rx="19.928572"
|
||||
sodipodi:cy="38.714287"
|
||||
sodipodi:cx="24.357143"
|
||||
id="path1538"
|
||||
style="color:#000000;fill:url(#radialGradient2308);fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:0.50000042;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4.0000000;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:inline;overflow:visible"
|
||||
sodipodi:type="arc" />
|
||||
</g>
|
||||
<g
|
||||
id="layer1"
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer">
|
||||
<path
|
||||
inkscape:r_cy="true"
|
||||
inkscape:r_cx="true"
|
||||
style="opacity:1;color:#000000;fill:url(#linearGradient3773);fill-opacity:1;fill-rule:nonzero;stroke:#3f4561;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
|
||||
d="M 22.699525,0.94746963 C 22.22635,0.97984519 21.766437,1.0531317 21.301673,1.1063165 L 21.269903,1.1063165 L 20.157975,7.1742671 C 18.345621,7.5870046 16.640562,8.2874574 15.106644,9.2392765 L 10.118853,5.6493371 C 8.770521,6.6961412 7.543552,7.9170049 6.465374,9.2392765 L 9.928236,14.290607 C 8.876814,15.89739 8.086153,17.732094 7.640841,19.659632 C 7.640765,19.668743 7.640779,19.689813 7.640841,19.691401 L 1.60466,20.644482 C 1.494303,21.545851 1.445813,22.477386 1.445813,23.408418 C 1.445813,24.170171 1.466846,24.921747 1.541121,25.664043 L 7.577303,26.744202 C 8.0066,28.840363 8.822112,30.797987 9.960006,32.526228 L 6.370066,37.450482 C 7.398201,38.726866 8.585171,39.888962 9.864698,40.913343 L 14.947798,37.418712 C 16.724273,38.551956 18.707343,39.346604 20.856901,39.737877 L 21.809983,45.742288 C 22.487237,45.803935 23.181758,45.805827 23.874992,45.805827 C 24.853677,45.805826 25.788512,45.768738 26.734236,45.64698 L 27.877933,39.515491 C 29.91886,39.007587 31.836112,38.126493 33.501113,36.942172 L 38.393596,40.500342 C 39.662366,39.420897 40.822583,38.180154 41.824689,36.846863 L 38.266519,31.700225 C 39.230125,30.036028 39.897817,28.199859 40.23622,26.235892 L 46.240632,25.282811 C 46.29329,24.656221 46.30417,24.048546 46.30417,23.408418 C 46.30417,22.296018 46.174875,21.205317 46.018246,20.136172 L 39.918526,19.024244 C 39.440518,17.259164 38.656214,15.612364 37.662901,14.13176 L 41.25284,9.2075071 C 40.140075,7.8466524 38.870718,6.5895264 37.472284,5.5222596 L 32.293876,9.0804296 C 30.805549,8.200202 29.203897,7.5248159 27.464931,7.1424978 L 26.51185,1.1063165 C 25.644369,1.0042729 24.769749,0.94746963 23.874992,0.94746963 C 23.633166,0.94746964 23.384286,0.93986063 23.144296,0.94746963 C 23.027301,0.95117908 22.911525,0.94066346 22.794833,0.94746963 C 22.763228,0.94931296 22.73107,0.94531125 22.699525,0.94746963 z M 23.525529,16.387386 C 23.641592,16.381497 23.757473,16.387386 23.874992,16.387386 C 27.635598,16.387386 30.705408,19.457196 30.705408,23.217802 C 30.705409,26.978407 27.635597,30.016448 23.874992,30.016448 C 20.114387,30.016449 17.076346,26.978407 17.076346,23.217802 C 17.076347,19.574716 19.927558,16.569963 23.525529,16.387386 z "
|
||||
id="path3243" />
|
||||
<path
|
||||
inkscape:r_cy="true"
|
||||
inkscape:r_cx="true"
|
||||
sodipodi:type="arc"
|
||||
style="opacity:0.64772728;color:#000000;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:1.62180054;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
|
||||
id="path3283"
|
||||
sodipodi:cx="23.511301"
|
||||
sodipodi:cy="23.781593"
|
||||
sodipodi:rx="12.727922"
|
||||
sodipodi:ry="12.727922"
|
||||
d="M 36.239223 23.781593 A 12.727922 12.727922 0 1 1 10.783379,23.781593 A 12.727922 12.727922 0 1 1 36.239223 23.781593 z"
|
||||
transform="matrix(0.616598,0,0,0.616598,9.38202,8.539674)" />
|
||||
<path
|
||||
inkscape:r_cy="true"
|
||||
inkscape:r_cx="true"
|
||||
id="path3285"
|
||||
d="M 21.995808,2.1484671 L 21.103024,8.0235243 C 19.404254,8.4103946 16.279442,9.5936035 14.841657,10.485771 L 10.091975,6.9406268 C 8.828145,7.9218257 8.741474,7.9883656 7.730867,9.2277688 L 11.165063,14.320988 C 10.179537,15.827071 8.995796,18.510982 8.570778,20.42893 C 8.570778,20.42893 2.552988,21.443355 2.552988,21.443355 C 2.449547,22.288234 2.49926,24.096528 2.56888,24.792303 L 8.317097,25.82782 C 8.71949,27.79261 10.225324,30.955232 11.291904,32.575161 L 7.656902,37.377719 C 8.620601,38.57411 8.813474,38.683589 10.01281,39.64377 L 14.873441,36.082733 C 16.538581,37.144954 19.84373,38.437109 21.858571,38.80386 L 22.656299,44.604952 C 23.291109,44.662736 25.044829,44.824827 25.931283,44.710701 L 26.824066,38.671821 C 28.737084,38.195749 32.042539,36.838896 33.603191,35.728798 L 38.458624,39.236958 C 39.647878,38.225166 39.658533,38.072709 40.597835,36.822978 L 36.999815,31.708667 C 37.90303,30.148767 39.070902,27.098068 39.388097,25.257187 L 45.279046,24.279744 C 45.328399,23.692424 45.330802,22.054578 45.18399,21.052439 L 39.182092,20.016922 C 38.73404,18.362463 37.196418,15.381153 36.265359,13.993342 L 40.080075,9.1907857 C 39.037052,7.915218 38.64924,7.7402002 37.338448,6.7398212 L 32.313994,10.337839 C 30.918941,9.5127782 28.137095,8.2550417 26.507114,7.8966842 L 25.619528,2.1484671 C 24.806414,2.0528187 22.460488,2.0952921 21.995808,2.1484671 z "
|
||||
style="opacity:0.34659089;color:#000000;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:0.99999923;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
|
||||
sodipodi:nodetypes="ccccccccccccccccccccccccccccccccc" />
|
||||
<path
|
||||
style="opacity:0.5;color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
|
||||
d="M 10.102903,6.2970655 C 8.7545689,7.3438694 8.1656464,7.9719226 7.0874684,9.2941942 L 10.489927,14.259153 C 9.4385072,15.857755 8.3316275,18.426114 8.1423859,19.987706 C 8.1423859,19.987706 2.0798859,21.0319 2.0798859,21.0319 C 2.0109129,21.595256 1.90625,22.884803 1.90625,22.884803 L 2.0830267,24.447303 C 2.5107567,24.535638 2.9231817,24.617818 3.3642767,24.666053 L 3.8642767,23.134803 C 4.2083177,23.163279 4.5439297,23.197303 4.8955267,23.197303 C 5.2467347,23.197303 5.6139847,23.163473 5.9580267,23.134803 L 6.4267767,24.666053 C 6.8680647,24.617818 7.3115487,24.535638 7.7392767,24.447303 L 7.7392767,22.884803 C 8.4250337,22.72518 9.0712777,22.497045 9.7080267,22.228553 L 10.645527,23.509803 C 11.047878,23.327709 11.421123,23.133984 11.801777,22.916053 L 11.301777,21.416053 C 11.89901,21.053803 12.463529,20.620706 12.989277,20.166053 L 14.270527,21.103553 C 14.596162,20.806973 14.91164,20.491691 15.208027,20.166053 L 14.270527,18.916053 C 14.725373,18.390305 15.127027,17.826171 15.489277,17.228553 L 16.989277,17.697303 C 17.207208,17.316456 17.432571,16.943209 17.614277,16.541053 L 16.333027,15.603553 C 16.601517,14.966804 16.798016,14.320561 16.958027,13.634803 L 18.551777,13.634803 C 18.640112,13.207076 18.691236,12.763591 18.739277,12.322303 L 17.239277,11.853553 C 17.268139,11.509705 17.301777,11.142456 17.301777,10.791053 C 17.301776,10.43965 17.267753,10.104039 17.239277,9.7598034 L 18.739277,9.2910534 C 18.69373,8.8711662 18.633686,8.4490548 18.551777,8.0410534 C 17.404349,8.4403544 15.999117,9.1941729 14.983265,9.8245243 L 10.102903,6.2970655 z "
|
||||
id="path3767"
|
||||
inkscape:r_cx="true"
|
||||
inkscape:r_cy="true"
|
||||
sodipodi:nodetypes="cccccccccsccccccccccccccccccccsccccc" />
|
||||
<path
|
||||
style="opacity:0.5;color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
|
||||
d="M 37.236641,17.217754 C 36.85286,17.39913 36.490003,17.603509 36.123236,17.813295 L 36.692886,19.548136 C 35.995792,19.970436 35.338156,20.467825 34.725008,20.998151 L 33.249099,19.910639 C 32.869013,20.256538 32.507327,20.618223 32.161588,20.998151 L 33.249099,22.474059 C 32.718773,23.087371 32.221547,23.745002 31.799084,24.441937 L 31.255328,24.260685 C 31.207646,24.960968 31.018949,25.62217 30.737466,26.228563 L 30.841038,26.306242 C 30.527881,27.048922 30.27649,27.83664 30.090137,28.636624 L 28.614229,28.636624 C 28.477946,28.722076 28.343676,28.821684 28.199938,28.895555 C 28.121568,29.310822 28.065026,29.712881 28.018687,30.138426 L 29.77942,30.708074 C 29.746033,31.10935 29.727633,31.515269 29.727633,31.925052 C 29.727631,32.334993 29.746034,32.740753 29.77942,33.142029 L 28.018687,33.711677 C 28.074705,34.226432 28.148678,34.740347 28.251725,35.239372 L 30.090137,35.213479 C 30.218255,35.763466 30.393202,36.320918 30.582107,36.844746 C 31.327023,36.557466 32.05594,36.214561 32.731236,35.809021 C 32.319649,34.59298 32.083908,33.279913 32.083908,31.925052 C 32.083909,26.727119 35.376289,22.288397 39.981313,20.583861 L 38.893802,20.402608 C 38.671014,19.579946 38.382478,18.774017 38.013435,18.020441 C 38.002581,17.998277 37.99851,17.96486 37.987542,17.942761 L 37.935756,17.890975 L 37.236641,17.217754 z "
|
||||
id="path3770"
|
||||
inkscape:r_cx="true"
|
||||
inkscape:r_cy="true" />
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 16 KiB |
738
design/icons/computer_tango.svg
Normal file
|
@ -0,0 +1,738 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://web.resource.org/cc/"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns:sodipodi="http://inkscape.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="48.000000px"
|
||||
height="48.000000px"
|
||||
id="svg2327"
|
||||
sodipodi:version="0.32"
|
||||
inkscape:version="0.42+devel"
|
||||
sodipodi:docbase="/home/jimmac/gfx/ximian/tango-icon-theme/scalable/devices"
|
||||
sodipodi:docname="computer.svg">
|
||||
<defs
|
||||
id="defs3">
|
||||
<linearGradient
|
||||
id="linearGradient2985"
|
||||
inkscape:collect="always">
|
||||
<stop
|
||||
id="stop2987"
|
||||
offset="0"
|
||||
style="stop-color:#d8dfd6;stop-opacity:1;" />
|
||||
<stop
|
||||
id="stop2989"
|
||||
offset="1"
|
||||
style="stop-color:#d8dfd6;stop-opacity:0;" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient2752">
|
||||
<stop
|
||||
id="stop2754"
|
||||
offset="0"
|
||||
style="stop-color:#9d9d9d;stop-opacity:1;" />
|
||||
<stop
|
||||
id="stop2756"
|
||||
offset="1.0000000"
|
||||
style="stop-color:#b9b9b9;stop-opacity:1.0000000;" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient2711">
|
||||
<stop
|
||||
id="stop2713"
|
||||
offset="0.0000000"
|
||||
style="stop-color:#909090;stop-opacity:1.0000000;" />
|
||||
<stop
|
||||
id="stop2715"
|
||||
offset="1.0000000"
|
||||
style="stop-color:#bebebe;stop-opacity:0.0000000;" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient2701">
|
||||
<stop
|
||||
id="stop2703"
|
||||
offset="0.0000000"
|
||||
style="stop-color:#585956;stop-opacity:1.0000000;" />
|
||||
<stop
|
||||
id="stop2705"
|
||||
offset="1.0000000"
|
||||
style="stop-color:#bbbeb8;stop-opacity:1.0000000;" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient2691">
|
||||
<stop
|
||||
id="stop2693"
|
||||
offset="0.0000000"
|
||||
style="stop-color:#868686;stop-opacity:1.0000000;" />
|
||||
<stop
|
||||
id="stop2695"
|
||||
offset="1.0000000"
|
||||
style="stop-color:#e9e9e9;stop-opacity:1.0000000;" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient2683"
|
||||
inkscape:collect="always">
|
||||
<stop
|
||||
id="stop2685"
|
||||
offset="0"
|
||||
style="stop-color:#000000;stop-opacity:1;" />
|
||||
<stop
|
||||
id="stop2687"
|
||||
offset="1"
|
||||
style="stop-color:#000000;stop-opacity:0;" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient2675">
|
||||
<stop
|
||||
id="stop2677"
|
||||
offset="0.0000000"
|
||||
style="stop-color:#5b5b97;stop-opacity:1.0000000;" />
|
||||
<stop
|
||||
id="stop2679"
|
||||
offset="1.0000000"
|
||||
style="stop-color:#1b1b43;stop-opacity:1.0000000;" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient2667">
|
||||
<stop
|
||||
id="stop2669"
|
||||
offset="0.0000000"
|
||||
style="stop-color:#ffffff;stop-opacity:1.0000000;" />
|
||||
<stop
|
||||
id="stop2671"
|
||||
offset="1.0000000"
|
||||
style="stop-color:#fcfcff;stop-opacity:0.0000000;" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient2635"
|
||||
inkscape:collect="always">
|
||||
<stop
|
||||
id="stop2637"
|
||||
offset="0"
|
||||
style="stop-color:#f9fff5;stop-opacity:1;" />
|
||||
<stop
|
||||
id="stop2639"
|
||||
offset="1"
|
||||
style="stop-color:#f9fff5;stop-opacity:0;" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient2623">
|
||||
<stop
|
||||
id="stop2625"
|
||||
offset="0.0000000"
|
||||
style="stop-color:#dfdfde;stop-opacity:1.0000000;" />
|
||||
<stop
|
||||
id="stop2627"
|
||||
offset="1.0000000"
|
||||
style="stop-color:#9d9f9a;stop-opacity:1.0000000;" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
id="linearGradient2454">
|
||||
<stop
|
||||
style="stop-color:#000000;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop2456" />
|
||||
<stop
|
||||
style="stop-color:#000000;stop-opacity:0;"
|
||||
offset="1"
|
||||
id="stop2458" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
id="linearGradient2415">
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop2417" />
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:0;"
|
||||
offset="1"
|
||||
id="stop2419" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient2379">
|
||||
<stop
|
||||
style="stop-color:#1a4876;stop-opacity:1.0000000;"
|
||||
offset="0.0000000"
|
||||
id="stop2381" />
|
||||
<stop
|
||||
style="stop-color:#3f54a3;stop-opacity:0.0000000;"
|
||||
offset="1.0000000"
|
||||
id="stop2383" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
id="linearGradient2328">
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop2330" />
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:0;"
|
||||
offset="1"
|
||||
id="stop2332" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
id="linearGradient2307">
|
||||
<stop
|
||||
style="stop-color:#5a7aa4;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop2309" />
|
||||
<stop
|
||||
style="stop-color:#5a7aa4;stop-opacity:0;"
|
||||
offset="1"
|
||||
id="stop2311" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient2253">
|
||||
<stop
|
||||
style="stop-color:#8f8f8f;stop-opacity:1.0000000;"
|
||||
offset="0.0000000"
|
||||
id="stop2255" />
|
||||
<stop
|
||||
style="stop-color:#494949;stop-opacity:1.0000000;"
|
||||
offset="1.0000000"
|
||||
id="stop2257" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient2245">
|
||||
<stop
|
||||
style="stop-color:#dde1d9;stop-opacity:1.0000000;"
|
||||
offset="0.0000000"
|
||||
id="stop2247" />
|
||||
<stop
|
||||
style="stop-color:#cacdc6;stop-opacity:1.0000000;"
|
||||
offset="1.0000000"
|
||||
id="stop2249" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient2245"
|
||||
id="linearGradient2251"
|
||||
gradientTransform="matrix(1.129863,0.000000,0.000000,0.885063,-1.625000,-1.304372)"
|
||||
x1="8.6116238"
|
||||
y1="7.2293582"
|
||||
x2="34.784473"
|
||||
y2="33.339787"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient2307"
|
||||
id="linearGradient2313"
|
||||
gradientTransform="matrix(1.208393,0.000000,0.000000,0.984410,-0.789284,-0.503380)"
|
||||
x1="16.851954"
|
||||
y1="9.3235140"
|
||||
x2="24.418941"
|
||||
y2="53.734985"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient2328"
|
||||
id="linearGradient2334"
|
||||
gradientTransform="matrix(1.289166,0.000000,0.000000,0.922731,-0.789284,-0.503380)"
|
||||
x1="16.119127"
|
||||
y1="10.842293"
|
||||
x2="27.289009"
|
||||
y2="39.031910"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient2415"
|
||||
id="linearGradient2421"
|
||||
gradientTransform="matrix(1.108069,0.000000,0.000000,0.902471,1.000000,1.000000)"
|
||||
x1="17.698339"
|
||||
y1="13.004725"
|
||||
x2="34.974548"
|
||||
y2="55.200756"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient2379"
|
||||
id="linearGradient2445"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(1.027870,0.000000,0.000000,0.822296,1.523986,1.001198)"
|
||||
x1="21.356108"
|
||||
y1="30.078255"
|
||||
x2="19.994572"
|
||||
y2="-1.3221773" />
|
||||
<radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient2454"
|
||||
id="radialGradient2460"
|
||||
gradientTransform="scale(1.925808,0.519262)"
|
||||
cx="12.575710"
|
||||
cy="67.501709"
|
||||
fx="12.575710"
|
||||
fy="67.501709"
|
||||
r="8.7662794"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
<radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient2454"
|
||||
id="radialGradient2464"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="scale(1.925808,0.519262)"
|
||||
cx="12.575710"
|
||||
cy="67.501709"
|
||||
fx="12.575710"
|
||||
fy="67.501709"
|
||||
r="8.7662794" />
|
||||
<linearGradient
|
||||
y2="92.570930"
|
||||
x2="10.728384"
|
||||
y1="84.029198"
|
||||
x1="10.728384"
|
||||
gradientTransform="scale(1.983556,0.504145)"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
id="linearGradient2653"
|
||||
xlink:href="#linearGradient2623"
|
||||
inkscape:collect="always" />
|
||||
<linearGradient
|
||||
y2="74.098007"
|
||||
x2="8.6485014"
|
||||
y1="101.28460"
|
||||
x1="13.628710"
|
||||
gradientTransform="scale(2.143634,0.466498)"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
id="linearGradient2655"
|
||||
xlink:href="#linearGradient2635"
|
||||
inkscape:collect="always" />
|
||||
<radialGradient
|
||||
r="8.7662794"
|
||||
fy="67.501709"
|
||||
fx="12.575710"
|
||||
cy="67.501709"
|
||||
cx="12.575710"
|
||||
gradientTransform="scale(1.925808,0.519262)"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
id="radialGradient2659"
|
||||
xlink:href="#linearGradient2454"
|
||||
inkscape:collect="always" />
|
||||
<linearGradient
|
||||
gradientUnits="userSpaceOnUse"
|
||||
y2="26.729263"
|
||||
x2="17.199417"
|
||||
y1="1.6537577"
|
||||
x1="11.492236"
|
||||
gradientTransform="matrix(1.238977,0.000000,0.000000,0.895955,0.590553,-1.331524)"
|
||||
id="linearGradient2673"
|
||||
xlink:href="#linearGradient2667"
|
||||
inkscape:collect="always" />
|
||||
<linearGradient
|
||||
gradientUnits="userSpaceOnUse"
|
||||
y2="8.8666229"
|
||||
x2="16.315819"
|
||||
y1="32.622238"
|
||||
x1="19.150396"
|
||||
gradientTransform="matrix(1.174139,0.000000,0.000000,0.945431,0.721825,-1.331524)"
|
||||
id="linearGradient2681"
|
||||
xlink:href="#linearGradient2675"
|
||||
inkscape:collect="always" />
|
||||
<linearGradient
|
||||
gradientUnits="userSpaceOnUse"
|
||||
y2="162.45061"
|
||||
x2="3.7069974"
|
||||
y1="171.29134"
|
||||
x1="3.7069976"
|
||||
gradientTransform="matrix(5.705159,0.000000,0.000000,0.175280,1.000000,-0.679373)"
|
||||
id="linearGradient2689"
|
||||
xlink:href="#linearGradient2683"
|
||||
inkscape:collect="always" />
|
||||
<linearGradient
|
||||
gradientUnits="userSpaceOnUse"
|
||||
y2="64.892525"
|
||||
x2="12.127711"
|
||||
y1="53.535141"
|
||||
x1="12.206709"
|
||||
gradientTransform="scale(1.816345,0.550556)"
|
||||
id="linearGradient2707"
|
||||
xlink:href="#linearGradient2701"
|
||||
inkscape:collect="always" />
|
||||
<linearGradient
|
||||
gradientUnits="userSpaceOnUse"
|
||||
y2="3.8451097"
|
||||
x2="35.520542"
|
||||
y1="3.9384086"
|
||||
x1="34.300991"
|
||||
id="linearGradient2717"
|
||||
xlink:href="#linearGradient2711"
|
||||
inkscape:collect="always" />
|
||||
<linearGradient
|
||||
y2="3.8451097"
|
||||
x2="35.520542"
|
||||
y1="3.9384086"
|
||||
x1="34.300991"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
id="linearGradient2721"
|
||||
xlink:href="#linearGradient2711"
|
||||
inkscape:collect="always" />
|
||||
<linearGradient
|
||||
y2="3.8451097"
|
||||
x2="35.520542"
|
||||
y1="3.9384086"
|
||||
x1="34.300991"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
id="linearGradient2725"
|
||||
xlink:href="#linearGradient2711"
|
||||
inkscape:collect="always" />
|
||||
<linearGradient
|
||||
y2="3.8451097"
|
||||
x2="35.520542"
|
||||
y1="3.9384086"
|
||||
x1="34.300991"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
id="linearGradient2729"
|
||||
xlink:href="#linearGradient2711"
|
||||
inkscape:collect="always" />
|
||||
<linearGradient
|
||||
y2="3.8451097"
|
||||
x2="35.520542"
|
||||
y1="3.9384086"
|
||||
x1="34.300991"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
id="linearGradient2733"
|
||||
xlink:href="#linearGradient2711"
|
||||
inkscape:collect="always" />
|
||||
<linearGradient
|
||||
y2="74.098007"
|
||||
x2="8.6485014"
|
||||
y1="101.28460"
|
||||
x1="13.628710"
|
||||
gradientTransform="matrix(2.143634,0.000000,0.000000,0.466498,1.000000,-0.508826)"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
id="linearGradient2741"
|
||||
xlink:href="#linearGradient2635"
|
||||
inkscape:collect="always" />
|
||||
<linearGradient
|
||||
gradientUnits="userSpaceOnUse"
|
||||
y2="100.20015"
|
||||
x2="8.1134233"
|
||||
y1="88.509071"
|
||||
x1="8.1134243"
|
||||
gradientTransform="scale(2.309851,0.432928)"
|
||||
id="linearGradient2758"
|
||||
xlink:href="#linearGradient2752"
|
||||
inkscape:collect="always" />
|
||||
<linearGradient
|
||||
gradientUnits="userSpaceOnUse"
|
||||
y2="31.246054"
|
||||
x2="32.536823"
|
||||
y1="5.3817744"
|
||||
x1="10.390738"
|
||||
gradientTransform="scale(1.104397,0.905471)"
|
||||
id="linearGradient2979"
|
||||
xlink:href="#linearGradient2253"
|
||||
inkscape:collect="always" />
|
||||
<linearGradient
|
||||
y2="52.536461"
|
||||
x2="18.176752"
|
||||
y1="48.643234"
|
||||
x1="18.316999"
|
||||
gradientTransform="scale(1.129863,0.885063)"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
id="linearGradient2981"
|
||||
xlink:href="#linearGradient2245"
|
||||
inkscape:collect="always" />
|
||||
<linearGradient
|
||||
gradientUnits="userSpaceOnUse"
|
||||
y2="44.878883"
|
||||
x2="-23.885700"
|
||||
y1="49.953003"
|
||||
x1="-23.885700"
|
||||
gradientTransform="scale(1.492875,0.669848)"
|
||||
id="linearGradient2991"
|
||||
xlink:href="#linearGradient2985"
|
||||
inkscape:collect="always" />
|
||||
<linearGradient
|
||||
y2="100.20015"
|
||||
x2="8.1134233"
|
||||
y1="88.509071"
|
||||
x1="8.1134243"
|
||||
gradientTransform="scale(2.309851,0.432928)"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
id="linearGradient1409"
|
||||
xlink:href="#linearGradient2752"
|
||||
inkscape:collect="always" />
|
||||
<linearGradient
|
||||
y2="100.20015"
|
||||
x2="8.1134233"
|
||||
y1="88.509071"
|
||||
x1="8.1134243"
|
||||
gradientTransform="scale(2.309851,0.432928)"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
id="linearGradient1411"
|
||||
xlink:href="#linearGradient2752"
|
||||
inkscape:collect="always" />
|
||||
<linearGradient
|
||||
y2="31.246054"
|
||||
x2="32.536823"
|
||||
y1="5.3817744"
|
||||
x1="10.390738"
|
||||
gradientTransform="scale(1.104397,0.905471)"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
id="linearGradient1413"
|
||||
xlink:href="#linearGradient2253"
|
||||
inkscape:collect="always" />
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="0.12156863"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="1"
|
||||
inkscape:cx="75.353821"
|
||||
inkscape:cy="12.176086"
|
||||
inkscape:current-layer="layer1"
|
||||
showgrid="false"
|
||||
inkscape:grid-bbox="true"
|
||||
inkscape:document-units="px"
|
||||
inkscape:window-width="770"
|
||||
inkscape:window-height="576"
|
||||
inkscape:window-x="402"
|
||||
inkscape:window-y="25"
|
||||
inkscape:showpageshadow="false" />
|
||||
<metadata
|
||||
id="metadata4">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title>Computer</dc:title>
|
||||
<dc:date>2005-03-08</dc:date>
|
||||
<dc:creator>
|
||||
<cc:Agent>
|
||||
<dc:title>Jakub Steiner</dc:title>
|
||||
</cc:Agent>
|
||||
</dc:creator>
|
||||
<dc:subject>
|
||||
<rdf:Bag>
|
||||
<rdf:li>workstation</rdf:li>
|
||||
<rdf:li>computer</rdf:li>
|
||||
<rdf:li>node</rdf:li>
|
||||
<rdf:li>client</rdf:li>
|
||||
</rdf:Bag>
|
||||
</dc:subject>
|
||||
<cc:license
|
||||
rdf:resource="http://creativecommons.org/licenses/by-sa/2.0/" />
|
||||
<dc:source>http://jimmac.musichall.cz/</dc:source>
|
||||
</cc:Work>
|
||||
<cc:License
|
||||
rdf:about="http://creativecommons.org/licenses/by-sa/2.0/">
|
||||
<cc:permits
|
||||
rdf:resource="http://web.resource.org/cc/Reproduction" />
|
||||
<cc:permits
|
||||
rdf:resource="http://web.resource.org/cc/Distribution" />
|
||||
<cc:requires
|
||||
rdf:resource="http://web.resource.org/cc/Notice" />
|
||||
<cc:requires
|
||||
rdf:resource="http://web.resource.org/cc/Attribution" />
|
||||
<cc:permits
|
||||
rdf:resource="http://web.resource.org/cc/DerivativeWorks" />
|
||||
<cc:requires
|
||||
rdf:resource="http://web.resource.org/cc/ShareAlike" />
|
||||
</cc:License>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
id="layer1"
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer">
|
||||
<path
|
||||
sodipodi:type="arc"
|
||||
style="color:#000000;fill:url(#radialGradient2460);fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:1.0000000;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dashoffset:0.0000000;stroke-opacity:0.70063692;visibility:visible;display:inline;overflow:visible"
|
||||
id="path2452"
|
||||
sodipodi:cx="24.218407"
|
||||
sodipodi:cy="35.051105"
|
||||
sodipodi:rx="16.882174"
|
||||
sodipodi:ry="4.5520000"
|
||||
d="M 41.100580 35.051105 A 16.882174 4.5520000 0 1 1 7.3362331,35.051105 A 16.882174 4.5520000 0 1 1 41.100580 35.051105 z"
|
||||
transform="matrix(1.000000,0.000000,0.000000,1.368932,-1.978553,-13.61713)" />
|
||||
<path
|
||||
sodipodi:type="arc"
|
||||
style="color:#000000;fill:#adb0aa;fill-opacity:1.0000000;fill-rule:evenodd;stroke:#4b4d4a;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible"
|
||||
id="path2407"
|
||||
sodipodi:cx="-35.658386"
|
||||
sodipodi:cy="29.716238"
|
||||
sodipodi:rx="9.3944187"
|
||||
sodipodi:ry="3.9395950"
|
||||
d="M -26.263968 29.716238 A 9.3944187 3.9395950 0 1 1 -45.052805,29.716238 A 9.3944187 3.9395950 0 1 1 -26.263968 29.716238 z"
|
||||
transform="translate(57.53339,3.203427)" />
|
||||
<path
|
||||
transform="matrix(0.940273,0.000000,0.000000,0.940273,55.40361,4.271194)"
|
||||
d="M -26.263968 29.716238 A 9.3944187 3.9395950 0 1 1 -45.052805,29.716238 A 9.3944187 3.9395950 0 1 1 -26.263968 29.716238 z"
|
||||
sodipodi:ry="3.9395950"
|
||||
sodipodi:rx="9.3944187"
|
||||
sodipodi:cy="29.716238"
|
||||
sodipodi:cx="-35.658386"
|
||||
id="path1825"
|
||||
style="color:#000000;fill:none;fill-opacity:1.0000000;fill-rule:evenodd;stroke:#7b7f7a;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible"
|
||||
sodipodi:type="arc" />
|
||||
<path
|
||||
sodipodi:type="arc"
|
||||
style="color:#000000;fill:none;fill-opacity:1.0000000;fill-rule:evenodd;stroke:url(#linearGradient2991);stroke-width:0.68065339;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible"
|
||||
id="path2983"
|
||||
sodipodi:cx="-35.658386"
|
||||
sodipodi:cy="29.716238"
|
||||
sodipodi:rx="9.3944187"
|
||||
sodipodi:ry="3.9395950"
|
||||
d="M -26.263968 29.716238 A 9.3944187 3.9395950 0 1 1 -45.052805,29.716238 A 9.3944187 3.9395950 0 1 1 -26.263968 29.716238 z"
|
||||
transform="matrix(0.940273,0.000000,0.000000,0.940273,55.40361,3.521194)" />
|
||||
<path
|
||||
sodipodi:nodetypes="ccccccccccccccccc"
|
||||
style="fill:#d0d0d0;fill-opacity:1.0000000;fill-rule:evenodd;stroke:#979797;stroke-width:0.40000001;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4.0000000;stroke-opacity:1.0000000"
|
||||
d="M 25.687500,28.766243 L 25.625000,29.766243 C 25.625000,29.766243 29.949108,33.365409 34.625000,33.968750 C 36.962946,34.270420 39.378675,34.671162 41.375000,35.156250 C 43.371325,35.641338 44.963356,36.275856 45.500000,36.812500 C 45.810411,37.122911 45.951063,37.386139 46.000000,37.593750 C 46.048937,37.801361 46.038217,37.948565 45.906250,38.156250 C 45.642317,38.571620 44.826393,39.123902 43.437500,39.562500 C 40.659715,40.439695 35.717076,41.000000 28.875000,41.000000 L 28.875000,42.000000 C 35.770998,42.000000 40.738665,41.472329 43.718750,40.531250 C 45.208792,40.060710 46.243692,39.515563 46.750000,38.718750 C 47.003154,38.320344 47.107321,37.830301 47.000000,37.375000 C 46.892679,36.919699 46.615445,36.490445 46.218750,36.093750 C 45.341180,35.216180 43.681912,34.687310 41.625000,34.187500 C 39.568088,33.687690 37.109264,33.273171 34.750000,32.968750 C 30.031473,32.359908 25.687500,28.766243 25.687500,28.766243 z "
|
||||
id="path2411" />
|
||||
<path
|
||||
transform="matrix(1.000000,0.000000,0.000000,1.368932,-1.978553,-19.02126)"
|
||||
d="M 41.100580 35.051105 A 16.882174 4.5520000 0 1 1 7.3362331,35.051105 A 16.882174 4.5520000 0 1 1 41.100580 35.051105 z"
|
||||
sodipodi:ry="4.5520000"
|
||||
sodipodi:rx="16.882174"
|
||||
sodipodi:cy="35.051105"
|
||||
sodipodi:cx="24.218407"
|
||||
id="path2462"
|
||||
style="color:#000000;fill:url(#radialGradient2464);fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:1.0000000;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dashoffset:0.0000000;stroke-opacity:0.70063692;visibility:visible;display:inline;overflow:visible"
|
||||
sodipodi:type="arc" />
|
||||
<rect
|
||||
y="30.703611"
|
||||
x="17.472397"
|
||||
height="2.7400389"
|
||||
width="9.0396729"
|
||||
id="rect2699"
|
||||
style="color:#000000;fill:url(#linearGradient2707);fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:0.60872948;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible" />
|
||||
<path
|
||||
style="color:#000000;fill:url(#linearGradient2251);fill-opacity:1.0000000;fill-rule:evenodd;stroke:url(#linearGradient2979);stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible"
|
||||
d="M 7.0809024,1.6956221 L 36.669097,1.6956221 C 37.580439,1.6956221 38.293244,2.2791039 38.335849,3.0972091 L 39.667893,28.675323 C 39.726102,29.793058 38.766837,30.695628 37.647588,30.695628 L 6.1024120,30.695628 C 4.9831629,30.695628 4.0238980,29.793058 4.0821068,28.675323 L 5.4141506,3.0972091 C 5.4544343,2.3236745 5.9616533,1.6956221 7.0809024,1.6956221 z "
|
||||
id="rect2404"
|
||||
sodipodi:nodetypes="cssssssss" />
|
||||
<path
|
||||
sodipodi:nodetypes="ccccc"
|
||||
id="path2377"
|
||||
d="M 8.4105348,4.3058272 L 7.1683398,26.351144 L 34.818729,26.351144 L 33.483712,4.3992558 L 8.4105348,4.3058272 z "
|
||||
style="fill:url(#linearGradient2681);fill-opacity:1.0000000;fill-rule:evenodd;stroke:#000079;stroke-width:0.50000000;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-opacity:1.0000000" />
|
||||
<path
|
||||
style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:url(#linearGradient2689);stroke-width:0.99618119;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4.0000000;stroke-opacity:0.24840762"
|
||||
d="M 6.1774331,28.735789 L 37.605910,28.735789"
|
||||
id="path2393" />
|
||||
<path
|
||||
sodipodi:nodetypes="cssssssss"
|
||||
id="path2397"
|
||||
d="M 6.9145985,2.7063396 L 36.760101,2.6685383 C 37.043798,2.6681790 37.319403,2.9057881 37.342206,3.3210821 L 38.704098,28.124330 C 38.762137,29.181361 38.164349,29.910201 37.105727,29.910201 L 6.5817583,29.910201 C 5.5231355,29.910201 4.9887439,29.181410 5.0458869,28.124330 L 6.3699773,3.6301633 C 6.4086732,2.9143326 6.5363627,2.7068187 6.9145985,2.7063396 z "
|
||||
style="color:#000000;fill:none;fill-opacity:1.0000000;fill-rule:evenodd;stroke:url(#linearGradient2421);stroke-width:0.99999964;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dashoffset:0.0000000;stroke-opacity:0.70063692;visibility:visible;display:inline;overflow:visible" />
|
||||
<path
|
||||
sodipodi:nodetypes="ccccc"
|
||||
style="opacity:0.53142858;fill:url(#linearGradient2673);fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:0.25000000pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000"
|
||||
d="M 8.7115364,4.7463626 L 7.9090069,22.616693 C 18.953645,20.216063 19.330470,12.124494 33.063039,9.4699426 L 32.901567,4.8124267 L 8.7115364,4.7463626 z "
|
||||
id="path2443" />
|
||||
<path
|
||||
transform="matrix(1.264398,0.000000,0.000000,1.291262,-6.216332,-4.000423)"
|
||||
d="M 41.100580 35.051105 A 16.882174 4.5520000 0 1 1 7.3362331,35.051105 A 16.882174 4.5520000 0 1 1 41.100580 35.051105 z"
|
||||
sodipodi:ry="4.5520000"
|
||||
sodipodi:rx="16.882174"
|
||||
sodipodi:cy="35.051105"
|
||||
sodipodi:cx="24.218407"
|
||||
id="path2657"
|
||||
style="color:#000000;fill:url(#radialGradient2659);fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:1.0000000;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dashoffset:0.0000000;stroke-opacity:0.70063692;visibility:visible;display:inline;overflow:visible"
|
||||
sodipodi:type="arc" />
|
||||
<path
|
||||
sodipodi:nodetypes="cssssssss"
|
||||
id="path2409"
|
||||
d="M 6.4621839,36.817452 L 37.464590,36.817452 C 38.583839,36.817452 38.441945,37.088890 38.556817,37.430298 L 41.391463,45.855108 C 41.506335,46.196517 41.418485,46.467954 40.299236,46.467954 L 3.6275382,46.467954 C 2.5082891,46.467954 2.4204387,46.196517 2.5353107,45.855108 L 5.3699564,37.430298 C 5.4848284,37.088889 5.3429348,36.817452 6.4621839,36.817452 z "
|
||||
style="opacity:1.0000000;color:#000000;fill:url(#linearGradient2981);fill-opacity:1.0000000;fill-rule:evenodd;stroke:url(#linearGradient1413);stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible" />
|
||||
<path
|
||||
sodipodi:nodetypes="ccccccccc"
|
||||
id="path2611"
|
||||
d="M 6.3916892,38.829113 L 4.6239223,43.955638 L 10.104000,43.955638 L 10.634330,41.922706 L 25.483572,41.922706 L 26.033251,43.997820 L 32.201086,43.997820 L 30.521708,38.829113 L 6.3916892,38.829113 z "
|
||||
style="fill:#7a7d77;fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:0.25000000pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000" />
|
||||
<path
|
||||
id="path2613"
|
||||
d="M 11.076272,42.276260 L 10.634330,43.955639 L 25.395184,43.955639 L 24.953242,42.187872 L 11.076272,42.276260 z "
|
||||
style="fill:#777874;fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:0.25000000pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000" />
|
||||
<path
|
||||
style="color:#000000;fill:#777a75;fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:0.25000000pt;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible"
|
||||
d="M 37.592776,38.829114 L 39.272155,43.867250 L 33.792077,43.778861 L 32.289475,38.917502 L 37.592776,38.829114 z "
|
||||
id="path2619" />
|
||||
<path
|
||||
id="path2615"
|
||||
d="M 37.592776,38.298786 L 39.272155,43.336922 L 33.792077,43.248533 L 32.289475,38.387174 L 37.592776,38.298786 z "
|
||||
style="opacity:1.0000000;color:#000000;fill:url(#linearGradient2758);fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:0.25000000pt;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible" />
|
||||
<path
|
||||
style="fill:url(#linearGradient1411);fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:0.25000000pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000"
|
||||
d="M 6.3916892,38.210397 L 4.6239223,43.336922 L 10.104000,43.336922 L 10.634330,41.303990 L 25.483572,41.303990 L 26.033251,43.379104 L 32.201086,43.379104 L 30.521708,38.210397 L 6.3916892,38.210397 z "
|
||||
id="path2617"
|
||||
sodipodi:nodetypes="ccccccccc" />
|
||||
<path
|
||||
style="opacity:1.0000000;color:#000000;fill:url(#linearGradient1409);fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:0.25000000pt;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible"
|
||||
d="M 11.076272,41.745932 L 10.634330,43.425311 L 25.395184,43.425311 L 24.953242,41.657544 L 11.076272,41.745932 z "
|
||||
id="path2621" />
|
||||
<path
|
||||
style="color:#000000;fill:none;fill-opacity:1.0000000;fill-rule:evenodd;stroke:url(#linearGradient2741);stroke-width:0.50000000;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible"
|
||||
d="M 6.1278189,37.578116 L 37.953634,37.578116 L 40.590813,45.670679 L 3.3297429,45.670679 L 6.1278189,37.578116 z "
|
||||
id="path2631"
|
||||
sodipodi:nodetypes="ccccc" />
|
||||
<path
|
||||
transform="matrix(1.331237,0.000000,0.000000,0.658449,-10.41933,2.853866)"
|
||||
d="M 35.620504 3.9384086 A 0.83968931 0.83968931 0 1 1 33.941126,3.9384086 A 0.83968931 0.83968931 0 1 1 35.620504 3.9384086 z"
|
||||
sodipodi:ry="0.83968931"
|
||||
sodipodi:rx="0.83968931"
|
||||
sodipodi:cy="3.9384086"
|
||||
sodipodi:cx="34.780815"
|
||||
id="path2709"
|
||||
style="color:#000000;fill:url(#linearGradient2717);fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:0.50000000;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible"
|
||||
sodipodi:type="arc" />
|
||||
<path
|
||||
sodipodi:type="arc"
|
||||
style="color:#000000;fill:url(#linearGradient2721);fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:0.50000000;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible"
|
||||
id="path2719"
|
||||
sodipodi:cx="34.780815"
|
||||
sodipodi:cy="3.9384086"
|
||||
sodipodi:rx="0.83968931"
|
||||
sodipodi:ry="0.83968931"
|
||||
d="M 35.620504 3.9384086 A 0.83968931 0.83968931 0 1 1 33.941126,3.9384086 A 0.83968931 0.83968931 0 1 1 35.620504 3.9384086 z"
|
||||
transform="matrix(1.331237,0.000000,0.000000,0.658449,-10.30573,4.959651)" />
|
||||
<path
|
||||
transform="matrix(1.331237,0.000000,0.000000,0.658449,-10.19213,6.959651)"
|
||||
d="M 35.620504 3.9384086 A 0.83968931 0.83968931 0 1 1 33.941126,3.9384086 A 0.83968931 0.83968931 0 1 1 35.620504 3.9384086 z"
|
||||
sodipodi:ry="0.83968931"
|
||||
sodipodi:rx="0.83968931"
|
||||
sodipodi:cy="3.9384086"
|
||||
sodipodi:cx="34.780815"
|
||||
id="path2723"
|
||||
style="color:#000000;fill:url(#linearGradient2725);fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:0.50000000;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible"
|
||||
sodipodi:type="arc" />
|
||||
<path
|
||||
sodipodi:type="arc"
|
||||
style="color:#000000;fill:url(#linearGradient2729);fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:0.50000000;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible"
|
||||
id="path2727"
|
||||
sodipodi:cx="34.780815"
|
||||
sodipodi:cy="3.9384086"
|
||||
sodipodi:rx="0.83968931"
|
||||
sodipodi:ry="0.83968931"
|
||||
d="M 35.620504 3.9384086 A 0.83968931 0.83968931 0 1 1 33.941126,3.9384086 A 0.83968931 0.83968931 0 1 1 35.620504 3.9384086 z"
|
||||
transform="matrix(1.331237,0.000000,0.000000,0.658449,-10.07853,8.959651)" />
|
||||
<path
|
||||
transform="matrix(1.331237,0.000000,0.000000,0.658449,-9.964930,10.95965)"
|
||||
d="M 35.620504 3.9384086 A 0.83968931 0.83968931 0 1 1 33.941126,3.9384086 A 0.83968931 0.83968931 0 1 1 35.620504 3.9384086 z"
|
||||
sodipodi:ry="0.83968931"
|
||||
sodipodi:rx="0.83968931"
|
||||
sodipodi:cy="3.9384086"
|
||||
sodipodi:cx="34.780815"
|
||||
id="path2731"
|
||||
style="color:#000000;fill:url(#linearGradient2733);fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:0.50000000;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible"
|
||||
sodipodi:type="arc" />
|
||||
<path
|
||||
id="text2735"
|
||||
d="M 20.000000,27.317666 L 20.281716,27.317666 C 20.365481,27.317667 20.429701,27.336330 20.474376,27.373656 C 20.519345,27.410690 20.541829,27.463594 20.541830,27.532370 C 20.541829,27.601440 20.519345,27.654638 20.474376,27.691965 C 20.429701,27.728998 20.365481,27.747515 20.281716,27.747515 L 20.169735,27.747515 L 20.169735,27.975885 L 20.000000,27.975885 L 20.000000,27.317666 M 20.169735,27.440669 L 20.169735,27.624512 L 20.263640,27.624512 C 20.296558,27.624512 20.321982,27.616576 20.339911,27.600705 C 20.357839,27.584540 20.366804,27.561762 20.366804,27.532370 C 20.366804,27.502979 20.357839,27.480348 20.339911,27.464476 C 20.321982,27.448605 20.296558,27.440669 20.263640,27.440669 L 20.169735,27.440669 M 20.961979,27.428765 C 20.910250,27.428766 20.870131,27.447870 20.841621,27.486078 C 20.813112,27.524288 20.798857,27.578074 20.798857,27.647437 C 20.798857,27.716507 20.813112,27.770146 20.841621,27.808355 C 20.870131,27.846564 20.910250,27.865668 20.961979,27.865668 C 21.014001,27.865668 21.054267,27.846564 21.082778,27.808355 C 21.111287,27.770146 21.125541,27.716507 21.125542,27.647437 C 21.125541,27.578074 21.111287,27.524288 21.082778,27.486078 C 21.054267,27.447870 21.014001,27.428766 20.961979,27.428765 M 20.961979,27.305762 C 21.067787,27.305763 21.150671,27.336036 21.210630,27.396582 C 21.270588,27.457128 21.300567,27.540747 21.300568,27.647437 C 21.300567,27.753834 21.270588,27.837305 21.210630,27.897851 C 21.150671,27.958398 21.067787,27.988671 20.961979,27.988671 C 20.856464,27.988671 20.773580,27.958398 20.713328,27.897851 C 20.653370,27.837305 20.623391,27.753834 20.623391,27.647437 C 20.623391,27.540747 20.653370,27.457128 20.713328,27.396582 C 20.773580,27.336036 20.856464,27.305763 20.961979,27.305762 M 21.428420,27.317666 L 21.617994,27.317666 L 21.857387,27.769117 L 21.857387,27.317666 L 22.018305,27.317666 L 22.018305,27.975885 L 21.828730,27.975885 L 21.589338,27.524434 L 21.589338,27.975885 L 21.428420,27.975885 L 21.428420,27.317666 M 22.091489,27.317666 L 22.277095,27.317666 L 22.426991,27.552209 L 22.576887,27.317666 L 22.762935,27.317666 L 22.512079,27.698578 L 22.512079,27.975885 L 22.342344,27.975885 L 22.342344,27.698578 L 22.091489,27.317666"
|
||||
style="font-size:0.90290260;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;writing-mode:lr-tb;text-anchor:start;fill:#4a4a4a;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000;font-family:Bitstream Vera Sans" />
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 36 KiB |
316
design/icons/dialog-error_tango.svg
Normal file
|
@ -0,0 +1,316 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://web.resource.org/cc/"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns:sodipodi="http://inkscape.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="48px"
|
||||
height="48px"
|
||||
id="svg1306"
|
||||
sodipodi:version="0.32"
|
||||
inkscape:version="0.43+devel"
|
||||
sodipodi:docbase="/home/garrett/Source/tango-icon-theme/scalable/status"
|
||||
sodipodi:docname="dialog-error.svg">
|
||||
<defs
|
||||
id="defs1308">
|
||||
<linearGradient
|
||||
id="linearGradient3957">
|
||||
<stop
|
||||
style="stop-color:#fffeff;stop-opacity:0.33333334;"
|
||||
offset="0"
|
||||
id="stop3959" />
|
||||
<stop
|
||||
style="stop-color:#fffeff;stop-opacity:0.21568628;"
|
||||
offset="1"
|
||||
id="stop3961" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient2536">
|
||||
<stop
|
||||
style="stop-color:#a40000;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop2538" />
|
||||
<stop
|
||||
style="stop-color:#ff1717;stop-opacity:1;"
|
||||
offset="1"
|
||||
id="stop2540" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient2479">
|
||||
<stop
|
||||
style="stop-color:#ffe69b;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop2481" />
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:1;"
|
||||
offset="1"
|
||||
id="stop2483" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient4126"
|
||||
inkscape:collect="always">
|
||||
<stop
|
||||
id="stop4128"
|
||||
offset="0"
|
||||
style="stop-color:#000000;stop-opacity:1;" />
|
||||
<stop
|
||||
id="stop4130"
|
||||
offset="1"
|
||||
style="stop-color:#000000;stop-opacity:0;" />
|
||||
</linearGradient>
|
||||
<radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient4126"
|
||||
id="radialGradient2169"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(1.000000,0.000000,0.000000,0.500000,1.899196e-14,20.00000)"
|
||||
cx="23.857143"
|
||||
cy="40.000000"
|
||||
fx="23.857143"
|
||||
fy="40.000000"
|
||||
r="17.142857" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient2479"
|
||||
id="linearGradient2485"
|
||||
x1="43.93581"
|
||||
y1="53.835983"
|
||||
x2="20.064686"
|
||||
y2="-8.5626707"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient2536"
|
||||
id="linearGradient2542"
|
||||
x1="36.917976"
|
||||
y1="66.288063"
|
||||
x2="19.071495"
|
||||
y2="5.5410109"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient2536"
|
||||
id="linearGradient3046"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x1="36.917976"
|
||||
y1="66.288063"
|
||||
x2="19.071495"
|
||||
y2="5.5410109" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient2479"
|
||||
id="linearGradient3048"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x1="43.93581"
|
||||
y1="53.835983"
|
||||
x2="20.064686"
|
||||
y2="-8.5626707" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient2536"
|
||||
id="linearGradient3064"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x1="36.917976"
|
||||
y1="66.288063"
|
||||
x2="19.071495"
|
||||
y2="5.5410109" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient2479"
|
||||
id="linearGradient3066"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x1="43.93581"
|
||||
y1="53.835983"
|
||||
x2="20.064686"
|
||||
y2="-8.5626707" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3957"
|
||||
id="linearGradient3963"
|
||||
x1="21.993773"
|
||||
y1="33.955299"
|
||||
x2="20.917078"
|
||||
y2="15.814602"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
<radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient4126"
|
||||
id="radialGradient3976"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(1,0,0,0.5,1.893048e-14,20)"
|
||||
cx="23.857143"
|
||||
cy="40.000000"
|
||||
fx="23.857143"
|
||||
fy="40.000000"
|
||||
r="17.142857" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient2536"
|
||||
id="linearGradient3978"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x1="36.917976"
|
||||
y1="66.288063"
|
||||
x2="19.071495"
|
||||
y2="5.5410109" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient2479"
|
||||
id="linearGradient3980"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x1="43.93581"
|
||||
y1="53.835983"
|
||||
x2="20.064686"
|
||||
y2="-8.5626707" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3957"
|
||||
id="linearGradient3982"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x1="21.993773"
|
||||
y1="33.955299"
|
||||
x2="20.917078"
|
||||
y2="15.814602" />
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="0.21568627"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="1"
|
||||
inkscape:cx="27.043297"
|
||||
inkscape:cy="20.463852"
|
||||
inkscape:current-layer="layer2"
|
||||
showgrid="true"
|
||||
inkscape:grid-bbox="true"
|
||||
inkscape:document-units="px"
|
||||
inkscape:window-width="925"
|
||||
inkscape:window-height="846"
|
||||
inkscape:window-x="234"
|
||||
inkscape:window-y="52"
|
||||
inkscape:showpageshadow="false"
|
||||
fill="#ef2929"
|
||||
gridempspacing="4" />
|
||||
<metadata
|
||||
id="metadata1311">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:creator>
|
||||
<cc:Agent>
|
||||
<dc:title>Rodney Dawes</dc:title>
|
||||
</cc:Agent>
|
||||
</dc:creator>
|
||||
<dc:contributor>
|
||||
<cc:Agent>
|
||||
<dc:title>Jakub Steiner, Garrett LeSage</dc:title>
|
||||
</cc:Agent>
|
||||
</dc:contributor>
|
||||
<cc:license
|
||||
rdf:resource="http://creativecommons.org/licenses/by-sa/2.0/" />
|
||||
<dc:title>Dialog Error</dc:title>
|
||||
</cc:Work>
|
||||
<cc:License
|
||||
rdf:about="http://creativecommons.org/licenses/by-sa/2.0/">
|
||||
<cc:permits
|
||||
rdf:resource="http://web.resource.org/cc/Reproduction" />
|
||||
<cc:permits
|
||||
rdf:resource="http://web.resource.org/cc/Distribution" />
|
||||
<cc:requires
|
||||
rdf:resource="http://web.resource.org/cc/Notice" />
|
||||
<cc:requires
|
||||
rdf:resource="http://web.resource.org/cc/Attribution" />
|
||||
<cc:permits
|
||||
rdf:resource="http://web.resource.org/cc/DerivativeWorks" />
|
||||
<cc:requires
|
||||
rdf:resource="http://web.resource.org/cc/ShareAlike" />
|
||||
</cc:License>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:groupmode="layer"
|
||||
id="layer2"
|
||||
inkscape:label="Shadow">
|
||||
<path
|
||||
inkscape:r_cy="true"
|
||||
inkscape:r_cx="true"
|
||||
transform="matrix(1.070555,0,0,0.525,-0.892755,22.5)"
|
||||
d="M 41 40 A 17.142857 8.5714283 0 1 1 6.7142868,40 A 17.142857 8.5714283 0 1 1 41 40 z"
|
||||
sodipodi:ry="8.5714283"
|
||||
sodipodi:rx="17.142857"
|
||||
sodipodi:cy="40"
|
||||
sodipodi:cx="23.857143"
|
||||
id="path6548"
|
||||
style="opacity:0.6;color:#000000;fill:url(#radialGradient3976);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:block;overflow:visible"
|
||||
sodipodi:type="arc" />
|
||||
</g>
|
||||
<g
|
||||
id="layer1"
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer">
|
||||
<g
|
||||
id="g4006">
|
||||
<path
|
||||
transform="matrix(0.920488,0,0,0.920488,2.368532,0.97408)"
|
||||
d="M 46.857143 23.928572 A 23.357143 23.357143 0 1 1 0.1428566,23.928572 A 23.357143 23.357143 0 1 1 46.857143 23.928572 z"
|
||||
sodipodi:ry="23.357143"
|
||||
sodipodi:rx="23.357143"
|
||||
sodipodi:cy="23.928572"
|
||||
sodipodi:cx="23.5"
|
||||
id="path1314"
|
||||
style="fill:url(#linearGradient3978);fill-opacity:1;fill-rule:nonzero;stroke:#b20000;stroke-width:1.08638;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
sodipodi:type="arc"
|
||||
inkscape:r_cx="true"
|
||||
inkscape:r_cy="true" />
|
||||
<path
|
||||
transform="matrix(0.856093,0,0,0.856093,1.818275,0.197769)"
|
||||
d="M 49.901535 26.635273 A 23.991123 23.991123 0 1 1 1.9192886,26.635273 A 23.991123 23.991123 0 1 1 49.901535 26.635273 z"
|
||||
sodipodi:ry="23.991123"
|
||||
sodipodi:rx="23.991123"
|
||||
sodipodi:cy="26.635273"
|
||||
sodipodi:cx="25.910412"
|
||||
id="path3560"
|
||||
style="opacity:0.34659089;fill:#cc0000;fill-opacity:0;stroke:url(#linearGradient3980);stroke-width:1.16809607;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
sodipodi:type="arc"
|
||||
inkscape:r_cx="true"
|
||||
inkscape:r_cy="true" />
|
||||
</g>
|
||||
</g>
|
||||
<g
|
||||
inkscape:groupmode="layer"
|
||||
id="layer3"
|
||||
inkscape:label="Error Box">
|
||||
<rect
|
||||
inkscape:r_cy="true"
|
||||
inkscape:r_cx="true"
|
||||
style="fill:#efefef;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.73876643;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.8627451"
|
||||
id="rect2070"
|
||||
width="27.836435"
|
||||
height="7.1735945"
|
||||
x="10.078821"
|
||||
y="19.164932"
|
||||
transform="matrix(1.005876,0,0,1.115201,-0.138045,-2.372708)" />
|
||||
</g>
|
||||
<g
|
||||
inkscape:groupmode="layer"
|
||||
id="layer4"
|
||||
inkscape:label="Glossy Shine">
|
||||
<path
|
||||
transform="matrix(1.002994,0,0,1.002994,-7.185874e-2,1.968356e-2)"
|
||||
sodipodi:nodetypes="czssc"
|
||||
id="path3955"
|
||||
d="M 43.370686,21.715486 C 43.370686,32.546102 33.016357,15.449178 24.695948,22.101874 C 16.569626,28.599385 4.0989837,34.292422 4.0989837,23.461806 C 4.0989837,12.377753 12.79438,2.0948032 23.625,2.0948032 C 34.455619,2.0948032 43.370686,10.884868 43.370686,21.715486 z "
|
||||
style="fill:url(#linearGradient3982);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
|
||||
inkscape:r_cx="true"
|
||||
inkscape:r_cy="true" />
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 10 KiB |
1145
design/icons/dialog-information_tango.svg
Normal file
After Width: | Height: | Size: 44 KiB |
290
design/icons/dialog-warning_tango.svg
Normal file
|
@ -0,0 +1,290 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://web.resource.org/cc/"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns:sodipodi="http://inkscape.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="48px"
|
||||
height="48px"
|
||||
id="svg1377"
|
||||
sodipodi:version="0.32"
|
||||
inkscape:version="0.43+devel"
|
||||
sodipodi:docbase="/home/garrett/Source/tango-icon-theme/scalable/status"
|
||||
sodipodi:docname="dialog-warning.svg">
|
||||
<defs
|
||||
id="defs1379">
|
||||
<linearGradient
|
||||
y2="56.0523"
|
||||
x2="47.3197"
|
||||
y1="11.1133"
|
||||
x1="4.1914"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
id="aigrd1">
|
||||
<stop
|
||||
id="stop6490"
|
||||
style="stop-color:#D4D4D4"
|
||||
offset="0" />
|
||||
<stop
|
||||
id="stop6492"
|
||||
style="stop-color:#E2E2E2"
|
||||
offset="0.3982" />
|
||||
<stop
|
||||
id="stop6494"
|
||||
style="stop-color:#FFFFFF"
|
||||
offset="1" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
y2="56.0523"
|
||||
x2="47.3197"
|
||||
y1="11.1133"
|
||||
x1="4.1914"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
id="linearGradient7451"
|
||||
xlink:href="#aigrd1"
|
||||
inkscape:collect="always" />
|
||||
<linearGradient
|
||||
id="linearGradient4126"
|
||||
inkscape:collect="always">
|
||||
<stop
|
||||
id="stop4128"
|
||||
offset="0"
|
||||
style="stop-color:#000000;stop-opacity:1;" />
|
||||
<stop
|
||||
id="stop4130"
|
||||
offset="1"
|
||||
style="stop-color:#000000;stop-opacity:0;" />
|
||||
</linearGradient>
|
||||
<radialGradient
|
||||
r="17.142857"
|
||||
fy="40.000000"
|
||||
fx="23.857143"
|
||||
cy="40.000000"
|
||||
cx="23.857143"
|
||||
gradientTransform="matrix(1,0,0,0.5,2.139286e-14,20)"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
id="radialGradient7449"
|
||||
xlink:href="#linearGradient4126"
|
||||
inkscape:collect="always" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient6525"
|
||||
id="linearGradient5250"
|
||||
x1="8.5469341"
|
||||
y1="30.281681"
|
||||
x2="30.85088"
|
||||
y2="48.301884"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(0.899009,0,0,0.934235,1.875108,1.193645)" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#aigrd1"
|
||||
id="linearGradient3922"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x1="4.1914"
|
||||
y1="11.1133"
|
||||
x2="47.3197"
|
||||
y2="56.0523" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient6525"
|
||||
id="linearGradient3924"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(0.899009,0,0,0.934235,1.875108,1.193645)"
|
||||
x1="8.5469341"
|
||||
y1="30.281681"
|
||||
x2="30.85088"
|
||||
y2="48.301884" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient6525"
|
||||
id="linearGradient3933"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(0.899009,0,0,0.934235,1.875108,1.193645)"
|
||||
x1="8.5469341"
|
||||
y1="30.281681"
|
||||
x2="30.85088"
|
||||
y2="48.301884" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#aigrd1"
|
||||
id="linearGradient3935"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x1="4.1914"
|
||||
y1="11.1133"
|
||||
x2="47.3197"
|
||||
y2="56.0523" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#aigrd1"
|
||||
id="linearGradient3946"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x1="4.1914"
|
||||
y1="11.1133"
|
||||
x2="47.3197"
|
||||
y2="56.0523" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient6525"
|
||||
id="linearGradient3948"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(0.899009,0,0,0.934235,1.875108,1.193645)"
|
||||
x1="8.5469341"
|
||||
y1="30.281681"
|
||||
x2="30.85088"
|
||||
y2="48.301884" />
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="14.757891"
|
||||
inkscape:cx="24"
|
||||
inkscape:cy="24"
|
||||
inkscape:current-layer="g7435"
|
||||
showgrid="true"
|
||||
inkscape:grid-bbox="true"
|
||||
inkscape:document-units="px"
|
||||
inkscape:window-width="1105"
|
||||
inkscape:window-height="1084"
|
||||
inkscape:window-x="157"
|
||||
inkscape:window-y="16"
|
||||
gridempspacing="4" />
|
||||
<metadata
|
||||
id="metadata1382">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title>Dialog Warning</dc:title>
|
||||
<dc:date>2005-10-14</dc:date>
|
||||
<dc:creator>
|
||||
<cc:Agent>
|
||||
<dc:title>Andreas Nilsson</dc:title>
|
||||
</cc:Agent>
|
||||
</dc:creator>
|
||||
<dc:contributor>
|
||||
<cc:Agent>
|
||||
<dc:title>Jakub Steiner, Garrett LeSage</dc:title>
|
||||
</cc:Agent>
|
||||
</dc:contributor>
|
||||
<dc:subject>
|
||||
<rdf:Bag>
|
||||
<rdf:li>dialog</rdf:li>
|
||||
<rdf:li>warning</rdf:li>
|
||||
</rdf:Bag>
|
||||
</dc:subject>
|
||||
<cc:license
|
||||
rdf:resource="http://creativecommons.org/licenses/by-sa/2.0/" />
|
||||
</cc:Work>
|
||||
<cc:License
|
||||
rdf:about="http://creativecommons.org/licenses/by-sa/2.0/">
|
||||
<cc:permits
|
||||
rdf:resource="http://web.resource.org/cc/Reproduction" />
|
||||
<cc:permits
|
||||
rdf:resource="http://web.resource.org/cc/Distribution" />
|
||||
<cc:requires
|
||||
rdf:resource="http://web.resource.org/cc/Notice" />
|
||||
<cc:requires
|
||||
rdf:resource="http://web.resource.org/cc/Attribution" />
|
||||
<cc:permits
|
||||
rdf:resource="http://web.resource.org/cc/DerivativeWorks" />
|
||||
<cc:requires
|
||||
rdf:resource="http://web.resource.org/cc/ShareAlike" />
|
||||
</cc:License>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
id="layer1"
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer">
|
||||
<g
|
||||
transform="matrix(1.566667,0.000000,0.000000,1.566667,-8.925566,-23.94764)"
|
||||
id="g7435">
|
||||
<path
|
||||
transform="matrix(0.817145,0,0,0.392908,1.555909,25.27761)"
|
||||
d="M 41 40 A 17.142857 8.5714283 0 1 1 6.7142868,40 A 17.142857 8.5714283 0 1 1 41 40 z"
|
||||
sodipodi:ry="8.5714283"
|
||||
sodipodi:rx="17.142857"
|
||||
sodipodi:cy="40"
|
||||
sodipodi:cx="23.857143"
|
||||
id="path6548"
|
||||
style="opacity:0.5;color:#000000;fill:url(#radialGradient7449);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:block;overflow:visible"
|
||||
sodipodi:type="arc"
|
||||
inkscape:r_cx="true"
|
||||
inkscape:r_cy="true" />
|
||||
<g
|
||||
id="g3937"
|
||||
transform="matrix(1,0,4.537846e-3,1,-0.138907,-1.394718e-15)"
|
||||
inkscape:r_cx="true"
|
||||
inkscape:r_cy="true">
|
||||
<path
|
||||
inkscape:r_cy="true"
|
||||
inkscape:r_cx="true"
|
||||
transform="matrix(1,0,-8.726683e-3,1,0.328074,1.276596)"
|
||||
id="path6485"
|
||||
d="M 33.282781,38.644744 L 22.407791,18.394765 C 22.095292,17.832266 21.532792,17.519767 20.907793,17.519767 C 20.282793,17.519767 19.720294,17.894765 19.407795,18.457265 L 8.7828048,38.707245 C 8.5328048,39.207244 8.5328048,39.894744 8.8453048,40.394743 C 9.1578038,40.894743 9.6578038,41.144742 10.282804,41.144742 L 31.782782,41.144742 C 32.407781,41.144742 32.97028,40.832243 33.220281,40.332243 C 33.53278,39.832243 33.53278,39.207244 33.282781,38.644744 z "
|
||||
style="fill:#cc0000;fill-rule:nonzero;stroke:#9f0000;stroke-width:0.6382978;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
<g
|
||||
inkscape:r_cy="true"
|
||||
inkscape:r_cx="true"
|
||||
id="g6487"
|
||||
transform="matrix(0.625,0,-5.534934e-3,0.634254,6.164053,15.76055)"
|
||||
style="fill-rule:nonzero;stroke:#000000;stroke-miterlimit:4">
|
||||
<linearGradient
|
||||
y2="56.052299"
|
||||
x2="47.319698"
|
||||
y1="11.1133"
|
||||
x1="4.1914001"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
id="linearGradient6525">
|
||||
<stop
|
||||
id="stop6529"
|
||||
style="stop-color:#ffffff;stop-opacity:1;"
|
||||
offset="0" />
|
||||
<stop
|
||||
id="stop6531"
|
||||
style="stop-color:#ffffff;stop-opacity:0.34020618;"
|
||||
offset="1" />
|
||||
</linearGradient>
|
||||
<path
|
||||
inkscape:r_cy="true"
|
||||
inkscape:r_cx="true"
|
||||
id="path6496"
|
||||
d="M 9.5,37.6 C 9.2,38.1 9.5,38.5 10,38.5 L 38.2,38.5 C 38.7,38.5 39,38.1 38.7,37.6 L 24.4,11 C 24.1,10.5 23.7,10.5 23.5,11 L 9.5,37.6 z "
|
||||
style="fill:url(#linearGradient3946);stroke:none" />
|
||||
</g>
|
||||
<path
|
||||
inkscape:r_cy="true"
|
||||
inkscape:r_cx="true"
|
||||
transform="matrix(1,0,-8.726683e-3,1,0.318277,1.276596)"
|
||||
sodipodi:nodetypes="ccsccscccc"
|
||||
id="path1325"
|
||||
d="M 32.323106,38.183905 L 22.150271,19.265666 C 21.71698,18.45069 21.561698,18.189213 20.908406,18.189213 C 20.346525,18.189213 20.054127,18.57002 19.651305,19.339291 L 9.7489285,38.242296 C 9.1737649,39.303588 9.1128238,39.580228 9.3937644,40.047345 C 9.6747034,40.514462 10.032797,40.48902 11.356441,40.519491 L 30.974593,40.519491 C 32.206825,40.534726 32.483988,40.440837 32.70874,39.97372 C 32.989681,39.506602 32.867799,39.136 32.323106,38.183905 z "
|
||||
style="opacity:0.5;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:url(#linearGradient3948);stroke-width:0.63829792;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
</g>
|
||||
<g
|
||||
style="fill-rule:nonzero;stroke:#000000;stroke-miterlimit:4"
|
||||
transform="matrix(0.555088,0,0,0.555052,7.749711,17.80196)"
|
||||
id="g6498"
|
||||
inkscape:r_cx="true"
|
||||
inkscape:r_cy="true">
|
||||
<path
|
||||
style="stroke:none"
|
||||
d="M 23.9,36.5 C 22.6,36.5 21.6,35.5 21.6,34.2 C 21.6,32.8 22.5,31.9 23.9,31.9 C 25.3,31.9 26.1,32.8 26.2,34.2 C 26.2,35.5 25.3,36.5 23.9,36.5 L 23.9,36.5 z M 22.5,30.6 L 21.9,19.1 L 25.9,19.1 L 25.3,30.6 L 22.4,30.6 L 22.5,30.6 z "
|
||||
id="path6500"
|
||||
inkscape:r_cx="true"
|
||||
inkscape:r_cy="true" />
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 10 KiB |
444
design/icons/drive-cdrom_tango.svg
Normal file
|
@ -0,0 +1,444 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://web.resource.org/cc/"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns:sodipodi="http://inkscape.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
sodipodi:docname="drive-cdrom.svg"
|
||||
sodipodi:docbase="/home/tigert/cvs/freedesktop.org/tango-icon-theme/scalable/devices"
|
||||
inkscape:version="0.43+devel"
|
||||
sodipodi:version="0.32"
|
||||
id="svg2913"
|
||||
height="48px"
|
||||
width="48px"
|
||||
inkscape:output_extension="org.inkscape.output.svg.inkscape">
|
||||
<defs
|
||||
id="defs3">
|
||||
<linearGradient
|
||||
id="linearGradient2351"
|
||||
inkscape:collect="always">
|
||||
<stop
|
||||
id="stop2353"
|
||||
offset="0"
|
||||
style="stop-color:#656565;stop-opacity:1;" />
|
||||
<stop
|
||||
id="stop2355"
|
||||
offset="1"
|
||||
style="stop-color:#656565;stop-opacity:0;" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient2345">
|
||||
<stop
|
||||
style="stop-color:#d9d9d9;stop-opacity:1.0000000;"
|
||||
offset="0.0000000"
|
||||
id="stop2347" />
|
||||
<stop
|
||||
style="stop-color:#eeeeee;stop-opacity:0;"
|
||||
offset="1"
|
||||
id="stop2349" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
id="linearGradient2329">
|
||||
<stop
|
||||
style="stop-color:#000000;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop2331" />
|
||||
<stop
|
||||
style="stop-color:#000000;stop-opacity:0;"
|
||||
offset="1"
|
||||
id="stop2333" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
id="linearGradient2315">
|
||||
<stop
|
||||
style="stop-color:#656565;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop2317" />
|
||||
<stop
|
||||
style="stop-color:#656565;stop-opacity:0;"
|
||||
offset="1"
|
||||
id="stop2319" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
id="linearGradient2165">
|
||||
<stop
|
||||
style="stop-color:#000000;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop2167" />
|
||||
<stop
|
||||
style="stop-color:#000000;stop-opacity:0;"
|
||||
offset="1"
|
||||
id="stop2169" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="aigrd1"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x1="14.9966"
|
||||
y1="11.1885"
|
||||
x2="32.511"
|
||||
y2="34.3075">
|
||||
<stop
|
||||
offset="0"
|
||||
style="stop-color:#EBEBEB"
|
||||
id="stop3034" />
|
||||
<stop
|
||||
offset="0.5"
|
||||
style="stop-color:#FFFFFF"
|
||||
id="stop3036" />
|
||||
<stop
|
||||
offset="1"
|
||||
style="stop-color:#EBEBEB"
|
||||
id="stop3038" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
id="linearGradient6036">
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop6038" />
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:0;"
|
||||
offset="1"
|
||||
id="stop6040" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient4264"
|
||||
inkscape:collect="always">
|
||||
<stop
|
||||
id="stop4266"
|
||||
offset="0"
|
||||
style="stop-color:#000000;stop-opacity:1;" />
|
||||
<stop
|
||||
id="stop4268"
|
||||
offset="1"
|
||||
style="stop-color:#000000;stop-opacity:0;" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient4254"
|
||||
inkscape:collect="always">
|
||||
<stop
|
||||
id="stop4256"
|
||||
offset="0"
|
||||
style="stop-color:#ffffff;stop-opacity:1;" />
|
||||
<stop
|
||||
id="stop4258"
|
||||
offset="1"
|
||||
style="stop-color:#ffffff;stop-opacity:0;" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient4244">
|
||||
<stop
|
||||
id="stop4246"
|
||||
offset="0.0000000"
|
||||
style="stop-color:#e4e4e4;stop-opacity:1.0000000;" />
|
||||
<stop
|
||||
id="stop4248"
|
||||
offset="1.0000000"
|
||||
style="stop-color:#d3d3d3;stop-opacity:1.0000000;" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient4228">
|
||||
<stop
|
||||
id="stop4230"
|
||||
offset="0.0000000"
|
||||
style="stop-color:#bbbbbb;stop-opacity:1.0000000;" />
|
||||
<stop
|
||||
id="stop4232"
|
||||
offset="1.0000000"
|
||||
style="stop-color:#9f9f9f;stop-opacity:1.0000000;" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
gradientUnits="userSpaceOnUse"
|
||||
y2="40.943935"
|
||||
x2="36.183067"
|
||||
y1="28.481176"
|
||||
x1="7.6046205"
|
||||
id="linearGradient4234"
|
||||
xlink:href="#linearGradient4228"
|
||||
inkscape:collect="always"
|
||||
gradientTransform="translate(0.000000,-1.944537)" />
|
||||
<radialGradient
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(1.286242,0.781698,-0.710782,1.169552,-2.354348,-6.821398)"
|
||||
r="20.935817"
|
||||
fy="2.9585190"
|
||||
fx="15.571491"
|
||||
cy="2.9585190"
|
||||
cx="15.571491"
|
||||
id="radialGradient4250"
|
||||
xlink:href="#linearGradient4244"
|
||||
inkscape:collect="always" />
|
||||
<linearGradient
|
||||
gradientUnits="userSpaceOnUse"
|
||||
y2="47.620636"
|
||||
x2="44.096100"
|
||||
y1="4.4331360"
|
||||
x1="12.378357"
|
||||
id="linearGradient4260"
|
||||
xlink:href="#linearGradient4254"
|
||||
inkscape:collect="always"
|
||||
gradientTransform="translate(0.000000,-1.944537)" />
|
||||
<radialGradient
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(1.000000,0.000000,0.000000,0.651032,-5.289283e-16,9.455693)"
|
||||
r="23.555494"
|
||||
fy="27.096155"
|
||||
fx="23.201941"
|
||||
cy="27.096155"
|
||||
cx="23.201941"
|
||||
id="radialGradient4270"
|
||||
xlink:href="#linearGradient4264"
|
||||
inkscape:collect="always" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#aigrd1"
|
||||
id="linearGradient2155"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(0.952531,0.000000,0.000000,0.656725,1.345471,19.22026)"
|
||||
x1="14.9966"
|
||||
y1="11.1885"
|
||||
x2="32.511"
|
||||
y2="34.3075" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient6036"
|
||||
id="linearGradient2161"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(0.738933,0.000000,0.000000,0.509459,6.215767,21.99197)"
|
||||
x1="10.501720"
|
||||
y1="3.6100161"
|
||||
x2="48.798885"
|
||||
y2="54.698483" />
|
||||
<radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient2165"
|
||||
id="radialGradient2171"
|
||||
cx="24.218407"
|
||||
cy="33.769478"
|
||||
fx="24.218407"
|
||||
fy="33.769478"
|
||||
r="17.677670"
|
||||
gradientTransform="matrix(1.000000,0.000000,0.000000,0.695000,0.000000,10.29969)"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient2351"
|
||||
id="linearGradient2321"
|
||||
x1="24.306797"
|
||||
y1="33.693432"
|
||||
x2="24.306797"
|
||||
y2="37.609333"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient2329"
|
||||
id="linearGradient2335"
|
||||
x1="23.375000"
|
||||
y1="28.433596"
|
||||
x2="23.375000"
|
||||
y2="32.938416"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient2329"
|
||||
id="linearGradient2337"
|
||||
x1="23.375000"
|
||||
y1="28.433596"
|
||||
x2="23.375000"
|
||||
y2="32.938416"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient2315"
|
||||
id="linearGradient2341"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(1.000000,0.000000,0.000000,0.799429,-9.653736e-16,6.604619)"
|
||||
x1="24.306797"
|
||||
y1="32.790924"
|
||||
x2="24.306797"
|
||||
y2="34.201233" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient2345"
|
||||
id="linearGradient2343"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(0.800126,0.000000,0.000000,0.551649,4.725541,20.59938)"
|
||||
x1="26.332899"
|
||||
y1="34.172115"
|
||||
x2="26.193645"
|
||||
y2="21.987923" />
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
inkscape:window-y="74"
|
||||
inkscape:window-x="294"
|
||||
inkscape:window-height="752"
|
||||
inkscape:window-width="810"
|
||||
inkscape:document-units="px"
|
||||
inkscape:grid-bbox="true"
|
||||
showgrid="false"
|
||||
inkscape:current-layer="layer2"
|
||||
inkscape:cy="20.858772"
|
||||
inkscape:cx="24.951242"
|
||||
inkscape:zoom="11.313708"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
borderopacity="0.17254902"
|
||||
bordercolor="#666666"
|
||||
pagecolor="#ffffff"
|
||||
id="base"
|
||||
inkscape:showpageshadow="false" />
|
||||
<metadata
|
||||
id="metadata4">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title>Drive - CD-ROM</dc:title>
|
||||
<dc:creator>
|
||||
<cc:Agent>
|
||||
<dc:title>Jakub Steiner</dc:title>
|
||||
</cc:Agent>
|
||||
</dc:creator>
|
||||
<dc:subject>
|
||||
<rdf:Bag>
|
||||
<rdf:li>cdrom</rdf:li>
|
||||
<rdf:li>cd-rom</rdf:li>
|
||||
<rdf:li>optical</rdf:li>
|
||||
<rdf:li>drive</rdf:li>
|
||||
</rdf:Bag>
|
||||
</dc:subject>
|
||||
<cc:license
|
||||
rdf:resource="http://creativecommons.org/licenses/by-sa/2.0/" />
|
||||
<dc:identifier />
|
||||
<dc:source>http://jimmac.musichall.cz</dc:source>
|
||||
</cc:Work>
|
||||
<cc:License
|
||||
rdf:about="http://creativecommons.org/licenses/by-sa/2.0/">
|
||||
<cc:permits
|
||||
rdf:resource="http://web.resource.org/cc/Reproduction" />
|
||||
<cc:permits
|
||||
rdf:resource="http://web.resource.org/cc/Distribution" />
|
||||
<cc:requires
|
||||
rdf:resource="http://web.resource.org/cc/Notice" />
|
||||
<cc:requires
|
||||
rdf:resource="http://web.resource.org/cc/Attribution" />
|
||||
<cc:permits
|
||||
rdf:resource="http://web.resource.org/cc/DerivativeWorks" />
|
||||
<cc:requires
|
||||
rdf:resource="http://web.resource.org/cc/ShareAlike" />
|
||||
</cc:License>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="pix"
|
||||
id="layer2"
|
||||
inkscape:groupmode="layer">
|
||||
<path
|
||||
transform="matrix(1.052533,0.000000,0.000000,0.363113,-0.511757,24.92528)"
|
||||
d="M 46.757435 27.096155 A 23.555494 15.335379 0 1 1 -0.35355377,27.096155 A 23.555494 15.335379 0 1 1 46.757435 27.096155 z"
|
||||
sodipodi:ry="15.335379"
|
||||
sodipodi:rx="23.555494"
|
||||
sodipodi:cy="27.096155"
|
||||
sodipodi:cx="23.201941"
|
||||
id="path4262"
|
||||
style="opacity:0.56000000;color:#000000;fill:url(#radialGradient4270);fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:1.0000000;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible"
|
||||
sodipodi:type="arc" />
|
||||
<path
|
||||
sodipodi:nodetypes="cccsccccccccc"
|
||||
id="path4196"
|
||||
d="M 11.285690,6.0180852 C 10.660690,6.0180852 10.254441,6.3082654 10.004442,6.8618382 C 10.004441,6.8618382 3.5356915,23.965402 3.5356915,23.965402 C 3.5356915,23.965402 3.2856915,24.636961 3.2856915,25.746652 C 3.2856915,25.746652 3.2856915,35.396620 3.2856915,35.396620 C 3.2856915,36.479233 3.9434770,37.021622 4.9419415,37.021620 L 43.504440,37.021620 C 44.489293,37.021620 45.098190,36.303440 45.098190,35.177870 L 45.098190,25.527902 C 45.098190,25.527902 45.204153,24.757479 45.004440,24.215402 L 38.285690,7.0180888 C 38.101165,6.5061820 37.648785,6.0299905 37.160690,6.0180852 L 11.285690,6.0180852 z "
|
||||
style="stroke-opacity:1.0000000;stroke-dasharray:none;stroke-miterlimit:4.0000000;stroke-linejoin:round;stroke-linecap:round;stroke-width:2.0000000;stroke:#535353;fill-rule:evenodd;fill-opacity:1.0000000;fill:none" />
|
||||
<path
|
||||
sodipodi:type="arc"
|
||||
style="opacity:0.56571429;color:#000000;fill:url(#radialGradient2171);fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:1.0000000;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:0.42372879;visibility:visible;display:inline;overflow:visible"
|
||||
id="path2163"
|
||||
sodipodi:cx="24.218407"
|
||||
sodipodi:cy="33.769478"
|
||||
sodipodi:rx="17.677670"
|
||||
sodipodi:ry="12.285980"
|
||||
d="M 41.896076 33.769478 A 17.677670 12.285980 0 1 1 6.5407372,33.769478 A 17.677670 12.285980 0 1 1 41.896076 33.769478 z"
|
||||
transform="translate(0.883883,1.260942e-6)" />
|
||||
<path
|
||||
sodipodi:nodetypes="ccccccccc"
|
||||
id="path4170"
|
||||
d="M 3.2735915,25.052276 L 4.0381936,24.360061 L 41.647883,24.422561 L 45.110290,24.739859 L 45.110290,35.178391 C 45.110290,36.303960 44.503272,37.021722 43.518419,37.021722 L 4.9354314,37.021722 C 3.9369667,37.021722 3.2735915,36.479671 3.2735915,35.397058 L 3.2735915,25.052276 z "
|
||||
style="fill:url(#linearGradient4234);fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:1.0204430px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000" />
|
||||
<path
|
||||
sodipodi:nodetypes="csccccccs"
|
||||
id="path3093"
|
||||
d="M 3.5490842,23.969868 C 2.8347985,25.434154 3.5484686,26.362725 4.5847985,26.362725 C 4.5847985,26.362725 43.584797,26.362725 43.584797,26.362725 C 44.703844,26.338915 45.430035,25.350820 45.013368,24.219867 L 38.299082,7.0091618 C 38.114558,6.4972550 37.644320,6.0210632 37.156225,6.0091582 L 11.299083,6.0091582 C 10.674083,6.0091582 10.263369,6.3127314 10.013370,6.8663042 C 10.013370,6.8663042 3.5490842,23.969868 3.5490842,23.969868 z "
|
||||
style="fill:url(#radialGradient4250);fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:1.0000000px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000" />
|
||||
<path
|
||||
sodipodi:nodetypes="cccccccc"
|
||||
id="path4201"
|
||||
d="M 44.796162,23.684152 C 44.859684,24.934126 44.382159,25.999992 43.474046,26.027902 C 43.474046,26.027902 5.3553296,26.027901 5.3553297,26.027902 C 4.0660978,26.027902 3.4875937,25.702955 3.2712790,25.159846 C 3.3630404,26.104178 4.0970964,26.809152 5.3553297,26.809152 C 5.3553296,26.809151 43.474046,26.809152 43.474046,26.809152 C 44.550053,26.776081 45.226851,25.385128 44.826210,23.814361 L 44.796162,23.684152 z "
|
||||
style="fill:#ffffff;fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:1.0000000px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000" />
|
||||
<path
|
||||
style="fill:none;fill-opacity:1.0000000;fill-rule:evenodd;stroke:url(#linearGradient4260);stroke-width:1.0000002;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-opacity:1.0000000"
|
||||
d="M 11.642515,6.4711801 C 11.040823,6.4711801 10.649724,6.7505387 10.409049,7.2834674 C 10.409048,7.2834674 3.9940341,23.874196 3.9940341,23.874196 C 3.9940341,23.874196 3.7533573,24.520711 3.7533573,25.589019 C 3.7533573,25.589019 3.7533573,34.879115 3.7533573,34.879115 C 3.7533573,36.233855 4.1974134,36.506014 5.3478414,36.506014 L 43.034746,36.506014 C 44.357872,36.506014 44.569062,36.189617 44.569062,34.668522 L 44.569062,25.378426 C 44.569062,25.378426 44.671072,24.636735 44.478807,24.114873 L 37.885616,7.3088910 C 37.707973,6.8160745 37.334964,6.4826414 36.865071,6.4711801 L 11.642515,6.4711801 z "
|
||||
id="path4252"
|
||||
sodipodi:nodetypes="cccsccccccccc" />
|
||||
<g
|
||||
id="g2142"
|
||||
transform="matrix(0.933652,0.000000,0.000000,0.933652,1.612716,-0.367774)">
|
||||
<rect
|
||||
y="32.363384"
|
||||
x="5.3414402"
|
||||
height="3.8650389"
|
||||
width="37.930714"
|
||||
id="rect2151"
|
||||
style="overflow:visible;display:inline;visibility:visible;stroke-opacity:0.42372879;stroke-dashoffset:0.0000000;stroke-dasharray:none;stroke-miterlimit:4.0000000;marker-end:none;marker-mid:none;marker-start:none;marker:none;stroke-linejoin:round;stroke-linecap:square;stroke-width:1.0000000;stroke:none;fill-rule:evenodd;fill-opacity:1.0;fill:url(#linearGradient2321);color:#000000;opacity:1.0000000" />
|
||||
<path
|
||||
style="fill:url(#linearGradient2155);fill-rule:nonzero;stroke:none;stroke-miterlimit:4.0000000"
|
||||
d="M 7.9921136,31.810344 C 7.7171786,32.641366 7.5233636,33.513742 7.5233636,34.404094 C 7.5233626,40.774327 14.971312,45.872844 24.210863,45.872844 C 33.450413,45.872844 40.867114,40.774327 40.867114,34.404094 C 40.867114,33.517511 40.702291,32.638143 40.429614,31.810344 L 24.867113,31.810344 C 26.706930,32.055511 28.210863,33.069699 28.210863,34.404094 C 28.210863,35.914562 26.401684,37.154094 24.210863,37.154094 C 22.020041,37.154094 20.210863,35.914562 20.210863,34.404094 C 20.210864,33.069699 21.714796,32.055511 23.554613,31.810344 L 7.9921136,31.810344 z "
|
||||
id="path3040" />
|
||||
<path
|
||||
style="stroke-opacity:1.0000000;stroke-miterlimit:4.0000000;stroke:#808080;fill-rule:nonzero;fill:url(#linearGradient2343)"
|
||||
d="M 7.8358636,32.341594 C 7.6633096,33.007401 7.5233636,33.702881 7.5233636,34.404094 C 7.5233636,40.774327 14.971312,45.872844 24.210863,45.872844 C 33.450413,45.872844 40.867114,40.774327 40.867114,34.404094 C 40.867114,33.702881 40.727168,33.007401 40.554614,32.341594 L 7.8358636,32.341594 z "
|
||||
id="path3049"
|
||||
sodipodi:nodetypes="cccccc" />
|
||||
<path
|
||||
style="opacity:0.10999996;fill-rule:nonzero;stroke:none;stroke-miterlimit:4.0000000"
|
||||
d="M 16.572139,31.835312 C 15.798652,32.755289 15.247183,33.294631 15.247183,34.422908 C 15.247182,37.895941 19.357577,40.629280 24.277804,40.629280 C 29.315180,40.629279 33.308425,37.815173 33.308425,34.422908 C 33.308425,33.278057 32.722182,32.749858 31.948602,31.835312 L 26.571647,31.835312 C 28.249533,32.378741 29.194088,33.072249 29.194088,34.422908 C 29.194089,36.280577 26.972214,37.805032 24.277804,37.805032 C 21.583392,37.805032 19.361520,36.280577 19.361520,34.422908 C 19.361520,33.071466 20.280853,32.378317 21.960294,31.835312 L 16.572139,31.835312 z "
|
||||
id="path3051"
|
||||
sodipodi:nodetypes="ccccccccccc" />
|
||||
<path
|
||||
style="stroke-opacity:1.0000000;stroke-miterlimit:4.0000000;stroke:none;fill-rule:nonzero;fill-opacity:0.41807911;fill:#ffffff"
|
||||
d="M 18.573984,44.742880 L 22.362784,37.212044 C 21.485635,36.996354 20.814201,36.572930 20.390359,36.015734 L 10.011877,39.604017 C 11.761798,41.989464 14.806535,43.844478 18.573984,44.742880 z "
|
||||
id="path4214" />
|
||||
<path
|
||||
style="opacity:0.54644811;fill:none;fill-rule:nonzero;stroke:url(#linearGradient2161);stroke-miterlimit:4.0000000;stroke-opacity:1.0000000"
|
||||
d="M 8.9118137,32.267515 C 8.6630467,33.007387 8.5077732,33.947164 8.5077732,34.740917 C 8.5077732,40.331493 16.102156,44.813068 24.210871,44.813068 C 32.319587,44.813067 39.713147,40.331492 39.713147,34.740917 C 39.713146,33.946625 39.529342,33.007846 39.280247,32.267515 L 8.9118137,32.267515 z "
|
||||
id="path5264"
|
||||
sodipodi:nodetypes="cccccc" />
|
||||
<rect
|
||||
style="opacity:1.0000000;color:#000000;fill:url(#linearGradient2341);fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:1.0000000;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:0.42372879;visibility:visible;display:inline;overflow:visible;font-family:Bitstream Vera Sans"
|
||||
id="rect4963"
|
||||
width="37.863773"
|
||||
height="1.1911809"
|
||||
x="5.3414402"
|
||||
y="31.627470" />
|
||||
</g>
|
||||
<path
|
||||
style="opacity:0.36000000;stroke-opacity:1.0000000;stroke-linejoin:miter;stroke-linecap:butt;stroke-width:1.0000000px;stroke:none;fill-rule:evenodd;fill-opacity:1.0;fill:url(#linearGradient2335)"
|
||||
d="M 26.312500,30.250000 L 40.062500,30.250000 C 40.062500,30.250000 40.603959,31.370993 40.000000,33.625000 C 40.000000,33.625000 26.687500,33.125000 26.687500,33.125000 C 28.537859,31.274641 26.312500,30.250000 26.312500,30.250000 z "
|
||||
id="path2325"
|
||||
sodipodi:nodetypes="ccccc" />
|
||||
<path
|
||||
sodipodi:nodetypes="ccccc"
|
||||
id="path2327"
|
||||
d="M 22.098146,30.250000 L 8.3481460,30.250000 C 8.3481460,30.250000 7.8066870,31.370993 8.4106460,33.625000 C 8.4106460,33.625000 21.723146,33.125000 21.723146,33.125000 C 19.872787,31.274641 22.098146,30.250000 22.098146,30.250000 z "
|
||||
style="opacity:0.36000000;stroke-opacity:1.0000000;stroke-linejoin:miter;stroke-linecap:butt;stroke-width:1.0000000px;stroke:none;fill-rule:evenodd;fill-opacity:1.0;fill:url(#linearGradient2337)" />
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 21 KiB |
469
design/icons/drive-harddisk_tango.svg
Normal file
|
@ -0,0 +1,469 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://web.resource.org/cc/"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
sodipodi:docname="drive-harddisk.svg"
|
||||
sodipodi:docbase="/home/jimmac/src/cvs/tango-icon-theme/scalable/devices"
|
||||
inkscape:version="0.43+devel"
|
||||
sodipodi:version="0.32"
|
||||
id="svg2913"
|
||||
height="48px"
|
||||
width="48px">
|
||||
<defs
|
||||
id="defs3">
|
||||
<radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient5060"
|
||||
id="radialGradient6719"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(-2.774389,0,0,1.969706,112.7623,-872.8854)"
|
||||
cx="605.71429"
|
||||
cy="486.64789"
|
||||
fx="605.71429"
|
||||
fy="486.64789"
|
||||
r="117.14286" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
id="linearGradient5060">
|
||||
<stop
|
||||
style="stop-color:black;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop5062" />
|
||||
<stop
|
||||
style="stop-color:black;stop-opacity:0;"
|
||||
offset="1"
|
||||
id="stop5064" />
|
||||
</linearGradient>
|
||||
<radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient5060"
|
||||
id="radialGradient6717"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(2.774389,0,0,1.969706,-1891.633,-872.8854)"
|
||||
cx="605.71429"
|
||||
cy="486.64789"
|
||||
fx="605.71429"
|
||||
fy="486.64789"
|
||||
r="117.14286" />
|
||||
<linearGradient
|
||||
id="linearGradient5048">
|
||||
<stop
|
||||
style="stop-color:black;stop-opacity:0;"
|
||||
offset="0"
|
||||
id="stop5050" />
|
||||
<stop
|
||||
id="stop5056"
|
||||
offset="0.5"
|
||||
style="stop-color:black;stop-opacity:1;" />
|
||||
<stop
|
||||
style="stop-color:black;stop-opacity:0;"
|
||||
offset="1"
|
||||
id="stop5052" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient5048"
|
||||
id="linearGradient6715"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(2.774389,0,0,1.969706,-1892.179,-872.8854)"
|
||||
x1="302.85715"
|
||||
y1="366.64789"
|
||||
x2="302.85715"
|
||||
y2="609.50507" />
|
||||
<linearGradient
|
||||
id="linearGradient2555">
|
||||
<stop
|
||||
id="stop2557"
|
||||
offset="0"
|
||||
style="stop-color:#ffffff;stop-opacity:1;" />
|
||||
<stop
|
||||
style="stop-color:#e6e6e6;stop-opacity:1.0000000;"
|
||||
offset="0.50000000"
|
||||
id="stop2561" />
|
||||
<stop
|
||||
id="stop2563"
|
||||
offset="0.75000000"
|
||||
style="stop-color:#ffffff;stop-opacity:1.0000000;" />
|
||||
<stop
|
||||
style="stop-color:#e1e1e1;stop-opacity:1.0000000;"
|
||||
offset="0.84166664"
|
||||
id="stop2565" />
|
||||
<stop
|
||||
id="stop2559"
|
||||
offset="1.0000000"
|
||||
style="stop-color:#ffffff;stop-opacity:1.0000000;" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient4274">
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:0.25490198;"
|
||||
offset="0.0000000"
|
||||
id="stop4276" />
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:1.0000000;"
|
||||
offset="1.0000000"
|
||||
id="stop4278" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient4264"
|
||||
inkscape:collect="always">
|
||||
<stop
|
||||
id="stop4266"
|
||||
offset="0"
|
||||
style="stop-color:#000000;stop-opacity:1;" />
|
||||
<stop
|
||||
id="stop4268"
|
||||
offset="1"
|
||||
style="stop-color:#000000;stop-opacity:0;" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient4254"
|
||||
inkscape:collect="always">
|
||||
<stop
|
||||
id="stop4256"
|
||||
offset="0"
|
||||
style="stop-color:#ffffff;stop-opacity:1;" />
|
||||
<stop
|
||||
id="stop4258"
|
||||
offset="1"
|
||||
style="stop-color:#ffffff;stop-opacity:0;" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient4244">
|
||||
<stop
|
||||
id="stop4246"
|
||||
offset="0.0000000"
|
||||
style="stop-color:#e4e4e4;stop-opacity:1.0000000;" />
|
||||
<stop
|
||||
id="stop4248"
|
||||
offset="1.0000000"
|
||||
style="stop-color:#d3d3d3;stop-opacity:1.0000000;" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient4236"
|
||||
inkscape:collect="always">
|
||||
<stop
|
||||
id="stop4238"
|
||||
offset="0"
|
||||
style="stop-color:#eeeeee;stop-opacity:1;" />
|
||||
<stop
|
||||
id="stop4240"
|
||||
offset="1"
|
||||
style="stop-color:#eeeeee;stop-opacity:0;" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient4228">
|
||||
<stop
|
||||
id="stop4230"
|
||||
offset="0.0000000"
|
||||
style="stop-color:#bbbbbb;stop-opacity:1.0000000;" />
|
||||
<stop
|
||||
id="stop4232"
|
||||
offset="1.0000000"
|
||||
style="stop-color:#9f9f9f;stop-opacity:1.0000000;" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient4184">
|
||||
<stop
|
||||
id="stop4186"
|
||||
offset="0.0000000"
|
||||
style="stop-color:#838383;stop-opacity:1.0000000;" />
|
||||
<stop
|
||||
id="stop4188"
|
||||
offset="1.0000000"
|
||||
style="stop-color:#bbbbbb;stop-opacity:0.0000000;" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
gradientTransform="translate(0.795493,-1.325821)"
|
||||
y2="35.281250"
|
||||
x2="24.687500"
|
||||
y1="35.281250"
|
||||
x1="7.0625000"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
id="linearGradient4209"
|
||||
xlink:href="#linearGradient4184"
|
||||
inkscape:collect="always" />
|
||||
<linearGradient
|
||||
gradientUnits="userSpaceOnUse"
|
||||
y2="40.943935"
|
||||
x2="36.183067"
|
||||
y1="28.481176"
|
||||
x1="7.6046205"
|
||||
id="linearGradient4234"
|
||||
xlink:href="#linearGradient4228"
|
||||
inkscape:collect="always" />
|
||||
<linearGradient
|
||||
gradientUnits="userSpaceOnUse"
|
||||
y2="33.758667"
|
||||
x2="12.221823"
|
||||
y1="37.205811"
|
||||
x1="12.277412"
|
||||
id="linearGradient4242"
|
||||
xlink:href="#linearGradient4236"
|
||||
inkscape:collect="always" />
|
||||
<radialGradient
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(1.286242,0.781698,-0.710782,1.169552,-2.354348,-4.876862)"
|
||||
r="20.935817"
|
||||
fy="2.9585190"
|
||||
fx="15.571491"
|
||||
cy="2.9585190"
|
||||
cx="15.571491"
|
||||
id="radialGradient4250"
|
||||
xlink:href="#linearGradient4244"
|
||||
inkscape:collect="always" />
|
||||
<linearGradient
|
||||
gradientUnits="userSpaceOnUse"
|
||||
y2="47.620636"
|
||||
x2="44.096100"
|
||||
y1="4.4331360"
|
||||
x1="12.378357"
|
||||
id="linearGradient4260"
|
||||
xlink:href="#linearGradient4254"
|
||||
inkscape:collect="always" />
|
||||
<radialGradient
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(1.000000,0.000000,0.000000,0.651032,0.000000,9.455693)"
|
||||
r="23.555494"
|
||||
fy="27.096155"
|
||||
fx="23.201941"
|
||||
cy="27.096155"
|
||||
cx="23.201941"
|
||||
id="radialGradient4270"
|
||||
xlink:href="#linearGradient4264"
|
||||
inkscape:collect="always" />
|
||||
<linearGradient
|
||||
gradientUnits="userSpaceOnUse"
|
||||
y2="26.357183"
|
||||
x2="23.688078"
|
||||
y1="11.318835"
|
||||
x1="23.688078"
|
||||
id="linearGradient4272"
|
||||
xlink:href="#linearGradient4274"
|
||||
inkscape:collect="always" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient2555"
|
||||
id="linearGradient2553"
|
||||
x1="33.431175"
|
||||
y1="31.964777"
|
||||
x2="21.747974"
|
||||
y2="11.780679"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
inkscape:window-y="178"
|
||||
inkscape:window-x="462"
|
||||
inkscape:window-height="907"
|
||||
inkscape:window-width="999"
|
||||
inkscape:document-units="px"
|
||||
inkscape:grid-bbox="true"
|
||||
showgrid="false"
|
||||
inkscape:current-layer="layer2"
|
||||
inkscape:cy="16.661091"
|
||||
inkscape:cx="21.494618"
|
||||
inkscape:zoom="16"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
borderopacity="1.0"
|
||||
bordercolor="#666666"
|
||||
pagecolor="#ffffff"
|
||||
id="base" />
|
||||
<metadata
|
||||
id="metadata4">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title>Drive - Hard Disk</dc:title>
|
||||
<dc:creator>
|
||||
<cc:Agent>
|
||||
<dc:title>Jakub Steiner</dc:title>
|
||||
</cc:Agent>
|
||||
</dc:creator>
|
||||
<dc:subject>
|
||||
<rdf:Bag>
|
||||
<rdf:li>hdd</rdf:li>
|
||||
<rdf:li>hard drive</rdf:li>
|
||||
<rdf:li>fixed</rdf:li>
|
||||
<rdf:li>media</rdf:li>
|
||||
<rdf:li>solid</rdf:li>
|
||||
</rdf:Bag>
|
||||
</dc:subject>
|
||||
<cc:license
|
||||
rdf:resource="http://creativecommons.org/licenses/by-sa/2.0/" />
|
||||
<dc:identifier />
|
||||
<dc:source>http://jimmac.musichall.cz</dc:source>
|
||||
</cc:Work>
|
||||
<cc:License
|
||||
rdf:about="http://creativecommons.org/licenses/by-sa/2.0/">
|
||||
<cc:permits
|
||||
rdf:resource="http://web.resource.org/cc/Reproduction" />
|
||||
<cc:permits
|
||||
rdf:resource="http://web.resource.org/cc/Distribution" />
|
||||
<cc:requires
|
||||
rdf:resource="http://web.resource.org/cc/Notice" />
|
||||
<cc:requires
|
||||
rdf:resource="http://web.resource.org/cc/Attribution" />
|
||||
<cc:permits
|
||||
rdf:resource="http://web.resource.org/cc/DerivativeWorks" />
|
||||
<cc:requires
|
||||
rdf:resource="http://web.resource.org/cc/ShareAlike" />
|
||||
</cc:License>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="pix"
|
||||
id="layer2"
|
||||
inkscape:groupmode="layer">
|
||||
<g
|
||||
transform="matrix(2.45274e-2,0,0,2.086758e-2,45.69054,36.1536)"
|
||||
id="g6707">
|
||||
<rect
|
||||
style="opacity:0.40206185;color:black;fill:url(#linearGradient6715);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
|
||||
id="rect6709"
|
||||
width="1339.6335"
|
||||
height="478.35718"
|
||||
x="-1559.2523"
|
||||
y="-150.69685" />
|
||||
<path
|
||||
style="opacity:0.40206185;color:black;fill:url(#radialGradient6717);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
|
||||
d="M -219.61876,-150.68038 C -219.61876,-150.68038 -219.61876,327.65041 -219.61876,327.65041 C -76.744594,328.55086 125.78146,220.48075 125.78138,88.454235 C 125.78138,-43.572302 -33.655436,-150.68036 -219.61876,-150.68038 z "
|
||||
id="path6711"
|
||||
sodipodi:nodetypes="cccc" />
|
||||
<path
|
||||
sodipodi:nodetypes="cccc"
|
||||
id="path6713"
|
||||
d="M -1559.2523,-150.68038 C -1559.2523,-150.68038 -1559.2523,327.65041 -1559.2523,327.65041 C -1702.1265,328.55086 -1904.6525,220.48075 -1904.6525,88.454235 C -1904.6525,-43.572302 -1745.2157,-150.68036 -1559.2523,-150.68038 z "
|
||||
style="opacity:0.40206185;color:black;fill:url(#radialGradient6719);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
|
||||
</g>
|
||||
<path
|
||||
sodipodi:nodetypes="cccsccccccccc"
|
||||
id="path4196"
|
||||
d="M 11.285690,7.9626278 C 10.660690,7.9626278 10.254441,8.2528080 10.004442,8.8063808 C 10.004441,8.8063808 3.5356915,25.909938 3.5356915,25.909938 C 3.5356915,25.909938 3.2856915,26.581497 3.2856915,27.691188 C 3.2856915,27.691188 3.2856915,37.341156 3.2856915,37.341156 C 3.2856915,38.423769 3.9434770,38.966158 4.9419415,38.966156 L 43.504440,38.966156 C 44.489293,38.966156 45.098190,38.247976 45.098190,37.122406 L 45.098190,27.472438 C 45.098190,27.472438 45.204153,26.702015 45.004440,26.159938 L 38.285690,8.9626314 C 38.101165,8.4507246 37.648785,7.9745331 37.160690,7.9626278 L 11.285690,7.9626278 z "
|
||||
style="stroke-opacity:1.0000000;stroke-dasharray:none;stroke-miterlimit:4.0000000;stroke-linejoin:round;stroke-linecap:round;stroke-width:2.0000000;stroke:#535353;fill-rule:evenodd;fill-opacity:1.0000000;fill:none" />
|
||||
<path
|
||||
sodipodi:nodetypes="ccccccccc"
|
||||
id="path4170"
|
||||
d="M 3.2735915,26.996812 L 4.0381936,26.304597 L 41.647883,26.367097 L 45.110290,26.684395 L 45.110290,37.122927 C 45.110290,38.248496 44.503272,38.966258 43.518419,38.966258 L 4.9354314,38.966258 C 3.9369667,38.966258 3.2735915,38.424207 3.2735915,37.341594 L 3.2735915,26.996812 z "
|
||||
style="fill:url(#linearGradient4234);fill-opacity:1.0;fill-rule:evenodd;stroke:none;stroke-width:1.0204430px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000" />
|
||||
<path
|
||||
sodipodi:nodetypes="csccccccs"
|
||||
id="path3093"
|
||||
d="M 3.5490842,25.914404 C 2.8347985,27.378690 3.5484686,28.307261 4.5847985,28.307261 C 4.5847985,28.307261 43.584797,28.307261 43.584797,28.307261 C 44.703844,28.283451 45.430035,27.295356 45.013368,26.164403 L 38.299082,8.9537044 C 38.114558,8.4417976 37.644320,7.9656058 37.156225,7.9537008 L 11.299083,7.9537008 C 10.674083,7.9537008 10.263369,8.2572740 10.013370,8.8108468 C 10.013370,8.8108468 3.5490842,25.914404 3.5490842,25.914404 z "
|
||||
style="fill:url(#radialGradient4250);fill-opacity:1.0;fill-rule:evenodd;stroke:none;stroke-width:1.0000000px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000" />
|
||||
<rect
|
||||
y="31.174183"
|
||||
x="7.8579960"
|
||||
height="5.5625000"
|
||||
width="17.625000"
|
||||
id="rect4174"
|
||||
style="opacity:1.0000000;color:#000000;fill:url(#linearGradient4209);fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:2.4089999;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible" />
|
||||
<path
|
||||
sodipodi:nodetypes="cscc"
|
||||
id="path4194"
|
||||
d="M 7.8579947,36.736680 C 7.8579947,36.736680 7.8579947,32.725195 7.8579947,32.725195 C 9.6935221,35.904421 16.154485,36.736680 20.795492,36.736680 C 20.795492,36.736680 7.8579947,36.736680 7.8579947,36.736680 z "
|
||||
style="opacity:0.81142857;stroke-opacity:1.0000000;stroke-linejoin:miter;stroke-linecap:butt;stroke-width:1.0000000px;stroke:none;fill-rule:evenodd;fill-opacity:1.0;fill:url(#linearGradient4242)" />
|
||||
<path
|
||||
sodipodi:nodetypes="cccccccc"
|
||||
id="path4201"
|
||||
d="M 44.796162,25.628688 C 44.859684,26.878662 44.382159,27.944528 43.474046,27.972438 C 43.474046,27.972438 5.3553296,27.972437 5.3553297,27.972438 C 4.0660978,27.972438 3.4875937,27.647491 3.2712790,27.104382 C 3.3630404,28.048714 4.0970964,28.753688 5.3553297,28.753688 C 5.3553296,28.753687 43.474046,28.753688 43.474046,28.753688 C 44.550053,28.720617 45.226851,27.329664 44.826210,25.758897 L 44.796162,25.628688 z "
|
||||
style="fill:#ffffff;fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:1.0000000px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000" />
|
||||
<path
|
||||
id="path4211"
|
||||
d="M 10.968750 10.156250 C 10.922675 10.356571 10.781250 10.543047 10.781250 10.750000 C 10.781250 11.698605 11.372230 12.539474 12.125000 13.343750 C 12.365268 13.189675 12.490117 12.989342 12.750000 12.843750 C 11.809691 12.027746 11.196604 11.127168 10.968750 10.156250 z M 37.625000 10.156250 C 37.396273 11.125866 36.782988 12.028676 35.843750 12.843750 C 36.117894 12.997332 36.247738 13.211990 36.500000 13.375000 C 37.257262 12.568344 37.812500 11.701956 37.812500 10.750000 C 37.812500 10.543047 37.670906 10.356571 37.625000 10.156250 z M 39.812500 18.593750 C 39.198709 22.633861 32.513887 25.843750 24.281250 25.843750 C 16.068996 25.843751 9.4211001 22.650964 8.7812500 18.625000 C 8.7488928 18.822132 8.6562500 19.016882 8.6562500 19.218750 C 8.6562503 23.536697 15.645354 27.062501 24.281250 27.062500 C 32.917146 27.062500 39.937499 23.536698 39.937500 19.218750 C 39.937500 19.005826 39.848449 18.801394 39.812500 18.593750 z "
|
||||
style="opacity:0.69142857;color:#000000;fill:url(#linearGradient4272);fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:2.0000000;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible" />
|
||||
<path
|
||||
transform="translate(8.838843e-2,0.176776)"
|
||||
d="M 8.5736699 25.593554 A 1.3700194 1.0164660 0 1 1 5.8336310,25.593554 A 1.3700194 1.0164660 0 1 1 8.5736699 25.593554 z"
|
||||
sodipodi:ry="1.0164660"
|
||||
sodipodi:rx="1.3700194"
|
||||
sodipodi:cy="25.593554"
|
||||
sodipodi:cx="7.2036505"
|
||||
id="path4224"
|
||||
style="opacity:1.0000000;color:#000000;fill:#ffffff;fill-opacity:0.45762709;fill-rule:evenodd;stroke:none;stroke-width:2.0000000;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible"
|
||||
sodipodi:type="arc" />
|
||||
<path
|
||||
sodipodi:type="arc"
|
||||
style="opacity:1.0000000;color:#000000;fill:#ffffff;fill-opacity:0.45762709;fill-rule:evenodd;stroke:none;stroke-width:2.0000000;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible"
|
||||
id="path4226"
|
||||
sodipodi:cx="7.2036505"
|
||||
sodipodi:cy="25.593554"
|
||||
sodipodi:rx="1.3700194"
|
||||
sodipodi:ry="1.0164660"
|
||||
d="M 8.5736699 25.593554 A 1.3700194 1.0164660 0 1 1 5.8336310,25.593554 A 1.3700194 1.0164660 0 1 1 8.5736699 25.593554 z"
|
||||
transform="translate(33.96705,8.838804e-2)" />
|
||||
<path
|
||||
style="fill:none;fill-opacity:1.0000000;fill-rule:evenodd;stroke:url(#linearGradient4260);stroke-width:1.0000002;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-opacity:1.0000000"
|
||||
d="M 11.642515,8.4157227 C 11.040823,8.4157227 10.649724,8.6950813 10.409049,9.2280100 C 10.409048,9.2280100 3.9940341,25.818732 3.9940341,25.818732 C 3.9940341,25.818732 3.7533573,26.465247 3.7533573,27.533555 C 3.7533573,27.533555 3.7533573,36.823651 3.7533573,36.823651 C 3.7533573,38.178391 4.1974134,38.450550 5.3478414,38.450550 L 43.034746,38.450550 C 44.357872,38.450550 44.569062,38.134153 44.569062,36.613058 L 44.569062,27.322962 C 44.569062,27.322962 44.671072,26.581271 44.478807,26.059409 L 37.885616,9.2534336 C 37.707973,8.7606171 37.334964,8.4271840 36.865071,8.4157227 L 11.642515,8.4157227 z "
|
||||
id="path4252"
|
||||
sodipodi:nodetypes="cccsccccccccc" />
|
||||
<path
|
||||
style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.0000005px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:0.42372882"
|
||||
d="M 40.500000,31.429166 L 40.500000,36.450101"
|
||||
id="path4282" />
|
||||
<path
|
||||
id="path4284"
|
||||
d="M 38.500000,31.488943 L 38.500000,36.509878"
|
||||
style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.0000005px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:0.42372882" />
|
||||
<path
|
||||
style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.0000005px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:0.42372882"
|
||||
d="M 36.500000,31.488943 L 36.500000,36.509878"
|
||||
id="path4286" />
|
||||
<path
|
||||
id="path4288"
|
||||
d="M 34.500000,31.488943 L 34.500000,36.509878"
|
||||
style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.0000005px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:0.42372882" />
|
||||
<path
|
||||
style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.0000005px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:0.42372882"
|
||||
d="M 32.500000,31.488943 L 32.500000,36.509878"
|
||||
id="path4290" />
|
||||
<path
|
||||
id="path4292"
|
||||
d="M 30.500000,31.488943 L 30.500000,36.509878"
|
||||
style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.0000005px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:0.42372882" />
|
||||
<path
|
||||
id="path4294"
|
||||
d="M 39.500000,31.479065 L 39.500000,36.500000"
|
||||
style="opacity:0.097142857;fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.0000005px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:1.0000000" />
|
||||
<path
|
||||
style="opacity:0.097142857;fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.0000005px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:1.0000000"
|
||||
d="M 37.500000,31.538842 L 37.500000,36.559777"
|
||||
id="path4296" />
|
||||
<path
|
||||
id="path4298"
|
||||
d="M 35.500000,31.538842 L 35.500000,36.559777"
|
||||
style="opacity:0.097142857;fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.0000005px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:1.0000000" />
|
||||
<path
|
||||
style="opacity:0.097142857;fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.0000005px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:1.0000000"
|
||||
d="M 33.500000,31.538842 L 33.500000,36.559777"
|
||||
id="path4300" />
|
||||
<path
|
||||
id="path4302"
|
||||
d="M 31.500000,31.538842 L 31.500000,36.559777"
|
||||
style="opacity:0.097142857;fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.0000005px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:1.0000000" />
|
||||
<path
|
||||
id="path4572"
|
||||
d="M 7.8750000,31.187500 L 7.8750000,36.718750 L 20.437500,36.718750 L 8.2187500,36.375000 L 7.8750000,31.187500 z "
|
||||
style="opacity:0.44000000;fill:#ffffff;fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:1.0000000px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000" />
|
||||
<path
|
||||
sodipodi:type="arc"
|
||||
style="opacity:0.20571424;color:#000000;fill:url(#linearGradient2553);fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:0.93365198;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:0.42372879;visibility:visible;display:inline;overflow:visible"
|
||||
id="path2545"
|
||||
sodipodi:cx="25.000000"
|
||||
sodipodi:cy="19.562500"
|
||||
sodipodi:rx="14.875000"
|
||||
sodipodi:ry="6.6875000"
|
||||
d="M 39.875000 19.562500 A 14.875000 6.6875000 0 1 1 10.125000,19.562500 A 14.875000 6.6875000 0 1 1 39.875000 19.562500 z"
|
||||
transform="matrix(1.037815,0.000000,0.000000,1.060747,-1.632878,-2.094626)" />
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 23 KiB |
390
design/icons/drive-removable-media_tango.svg
Normal file
|
@ -0,0 +1,390 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://web.resource.org/cc/"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
sodipodi:docname="drive-removable-media.svg"
|
||||
sodipodi:docbase="/home/jimmac/src/cvs/tango-icon-theme/scalable/devices"
|
||||
inkscape:version="0.43+devel"
|
||||
sodipodi:version="0.32"
|
||||
id="svg2913"
|
||||
height="48px"
|
||||
width="48px">
|
||||
<defs
|
||||
id="defs3">
|
||||
<radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient5060"
|
||||
id="radialGradient6719"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(-2.774389,0,0,1.969706,112.7623,-872.8854)"
|
||||
cx="605.71429"
|
||||
cy="486.64789"
|
||||
fx="605.71429"
|
||||
fy="486.64789"
|
||||
r="117.14286" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
id="linearGradient5060">
|
||||
<stop
|
||||
style="stop-color:black;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop5062" />
|
||||
<stop
|
||||
style="stop-color:black;stop-opacity:0;"
|
||||
offset="1"
|
||||
id="stop5064" />
|
||||
</linearGradient>
|
||||
<radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient5060"
|
||||
id="radialGradient6717"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(2.774389,0,0,1.969706,-1891.633,-872.8854)"
|
||||
cx="605.71429"
|
||||
cy="486.64789"
|
||||
fx="605.71429"
|
||||
fy="486.64789"
|
||||
r="117.14286" />
|
||||
<linearGradient
|
||||
id="linearGradient5048">
|
||||
<stop
|
||||
style="stop-color:black;stop-opacity:0;"
|
||||
offset="0"
|
||||
id="stop5050" />
|
||||
<stop
|
||||
id="stop5056"
|
||||
offset="0.5"
|
||||
style="stop-color:black;stop-opacity:1;" />
|
||||
<stop
|
||||
style="stop-color:black;stop-opacity:0;"
|
||||
offset="1"
|
||||
id="stop5052" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient5048"
|
||||
id="linearGradient6715"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(2.774389,0,0,1.969706,-1892.179,-872.8854)"
|
||||
x1="302.85715"
|
||||
y1="366.64789"
|
||||
x2="302.85715"
|
||||
y2="609.50507" />
|
||||
<linearGradient
|
||||
id="linearGradient5699">
|
||||
<stop
|
||||
id="stop5701"
|
||||
offset="0"
|
||||
style="stop-color:#7a7a7a;stop-opacity:1;" />
|
||||
<stop
|
||||
id="stop5703"
|
||||
offset="1"
|
||||
style="stop-color:#a5a5a5;stop-opacity:1;" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient2681">
|
||||
<stop
|
||||
style="stop-color:#000000;stop-opacity:0.47524753;"
|
||||
offset="0.0000000"
|
||||
id="stop2683" />
|
||||
<stop
|
||||
style="stop-color:#000000;stop-opacity:0;"
|
||||
offset="1"
|
||||
id="stop2685" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient2673">
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop2675" />
|
||||
<stop
|
||||
style="stop-color:#6f6f6f;stop-opacity:1.0000000;"
|
||||
offset="1.0000000"
|
||||
id="stop2677" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient4264"
|
||||
inkscape:collect="always">
|
||||
<stop
|
||||
id="stop4266"
|
||||
offset="0"
|
||||
style="stop-color:#000000;stop-opacity:1;" />
|
||||
<stop
|
||||
id="stop4268"
|
||||
offset="1"
|
||||
style="stop-color:#000000;stop-opacity:0;" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient4254"
|
||||
inkscape:collect="always">
|
||||
<stop
|
||||
id="stop4256"
|
||||
offset="0"
|
||||
style="stop-color:#ffffff;stop-opacity:1;" />
|
||||
<stop
|
||||
id="stop4258"
|
||||
offset="1"
|
||||
style="stop-color:#ffffff;stop-opacity:0;" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient4244">
|
||||
<stop
|
||||
id="stop4246"
|
||||
offset="0.0000000"
|
||||
style="stop-color:#e4e4e4;stop-opacity:1.0000000;" />
|
||||
<stop
|
||||
id="stop4248"
|
||||
offset="1.0000000"
|
||||
style="stop-color:#d3d3d3;stop-opacity:1.0000000;" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient4228">
|
||||
<stop
|
||||
id="stop4230"
|
||||
offset="0.0000000"
|
||||
style="stop-color:#bbbbbb;stop-opacity:1.0000000;" />
|
||||
<stop
|
||||
id="stop4232"
|
||||
offset="1.0000000"
|
||||
style="stop-color:#9f9f9f;stop-opacity:1.0000000;" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
gradientUnits="userSpaceOnUse"
|
||||
y2="40.943935"
|
||||
x2="36.183067"
|
||||
y1="28.481176"
|
||||
x1="7.6046205"
|
||||
id="linearGradient4234"
|
||||
xlink:href="#linearGradient4228"
|
||||
inkscape:collect="always"
|
||||
gradientTransform="translate(0.000000,5.546300e-2)" />
|
||||
<radialGradient
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(1.286242,0.781698,-0.710782,1.169552,-2.354348,-4.821398)"
|
||||
r="20.935817"
|
||||
fy="2.9585190"
|
||||
fx="15.571491"
|
||||
cy="2.9585190"
|
||||
cx="15.571491"
|
||||
id="radialGradient4250"
|
||||
xlink:href="#linearGradient4244"
|
||||
inkscape:collect="always" />
|
||||
<linearGradient
|
||||
gradientUnits="userSpaceOnUse"
|
||||
y2="47.620636"
|
||||
x2="44.096100"
|
||||
y1="4.4331360"
|
||||
x1="12.378357"
|
||||
id="linearGradient4260"
|
||||
xlink:href="#linearGradient4254"
|
||||
inkscape:collect="always"
|
||||
gradientTransform="translate(0.000000,5.546300e-2)" />
|
||||
<radialGradient
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(1.000000,0.000000,0.000000,0.651032,-6.731815e-16,9.455693)"
|
||||
r="23.555494"
|
||||
fy="27.096155"
|
||||
fx="23.201941"
|
||||
cy="27.096155"
|
||||
cx="23.201941"
|
||||
id="radialGradient4270"
|
||||
xlink:href="#linearGradient4264"
|
||||
inkscape:collect="always" />
|
||||
<radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient2673"
|
||||
id="radialGradient2679"
|
||||
cx="40.796875"
|
||||
cy="33.734375"
|
||||
fx="40.796875"
|
||||
fy="33.734375"
|
||||
r="0.98437500"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(1.253968,-7.218212e-15,7.218212e-15,1.253968,-10.36111,-8.567460)" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient2681"
|
||||
id="linearGradient2687"
|
||||
x1="25.785229"
|
||||
y1="32.363384"
|
||||
x2="25.785229"
|
||||
y2="35.670216"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient2681"
|
||||
id="linearGradient2689"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x1="25.785229"
|
||||
y1="32.363384"
|
||||
x2="25.785229"
|
||||
y2="35.670216" />
|
||||
<linearGradient
|
||||
gradientUnits="userSpaceOnUse"
|
||||
y2="10.596288"
|
||||
x2="16.127340"
|
||||
y1="22.705490"
|
||||
x1="34.420757"
|
||||
id="linearGradient5705"
|
||||
xlink:href="#linearGradient5699"
|
||||
inkscape:collect="always" />
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
fill="#f57900"
|
||||
inkscape:showpageshadow="false"
|
||||
inkscape:window-y="163"
|
||||
inkscape:window-x="275"
|
||||
inkscape:window-height="683"
|
||||
inkscape:window-width="872"
|
||||
inkscape:document-units="px"
|
||||
inkscape:grid-bbox="true"
|
||||
showgrid="false"
|
||||
inkscape:current-layer="layer2"
|
||||
inkscape:cy="10.253819"
|
||||
inkscape:cx="89.378036"
|
||||
inkscape:zoom="2.8284271"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
borderopacity="0.36078431"
|
||||
bordercolor="#666666"
|
||||
pagecolor="#ffffff"
|
||||
id="base" />
|
||||
<metadata
|
||||
id="metadata4">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title>Drive - Removable</dc:title>
|
||||
<dc:creator>
|
||||
<cc:Agent>
|
||||
<dc:title>Jakub Steiner</dc:title>
|
||||
</cc:Agent>
|
||||
</dc:creator>
|
||||
<dc:subject>
|
||||
<rdf:Bag>
|
||||
<rdf:li>media</rdf:li>
|
||||
<rdf:li>removable</rdf:li>
|
||||
</rdf:Bag>
|
||||
</dc:subject>
|
||||
<cc:license
|
||||
rdf:resource="http://creativecommons.org/licenses/by-sa/2.0/" />
|
||||
<dc:identifier />
|
||||
<dc:source>http://jimmac.musichall.cz</dc:source>
|
||||
</cc:Work>
|
||||
<cc:License
|
||||
rdf:about="http://creativecommons.org/licenses/by-sa/2.0/">
|
||||
<cc:permits
|
||||
rdf:resource="http://web.resource.org/cc/Reproduction" />
|
||||
<cc:permits
|
||||
rdf:resource="http://web.resource.org/cc/Distribution" />
|
||||
<cc:requires
|
||||
rdf:resource="http://web.resource.org/cc/Notice" />
|
||||
<cc:requires
|
||||
rdf:resource="http://web.resource.org/cc/Attribution" />
|
||||
<cc:permits
|
||||
rdf:resource="http://web.resource.org/cc/DerivativeWorks" />
|
||||
<cc:requires
|
||||
rdf:resource="http://web.resource.org/cc/ShareAlike" />
|
||||
</cc:License>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="pix"
|
||||
id="layer2"
|
||||
inkscape:groupmode="layer">
|
||||
<g
|
||||
transform="matrix(2.45274e-2,0,0,2.086758e-2,45.69054,36.1536)"
|
||||
id="g6707">
|
||||
<rect
|
||||
style="opacity:0.40206185;color:black;fill:url(#linearGradient6715);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
|
||||
id="rect6709"
|
||||
width="1339.6335"
|
||||
height="478.35718"
|
||||
x="-1559.2523"
|
||||
y="-150.69685" />
|
||||
<path
|
||||
style="opacity:0.40206185;color:black;fill:url(#radialGradient6717);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
|
||||
d="M -219.61876,-150.68038 C -219.61876,-150.68038 -219.61876,327.65041 -219.61876,327.65041 C -76.744594,328.55086 125.78146,220.48075 125.78138,88.454235 C 125.78138,-43.572302 -33.655436,-150.68036 -219.61876,-150.68038 z "
|
||||
id="path6711"
|
||||
sodipodi:nodetypes="cccc" />
|
||||
<path
|
||||
sodipodi:nodetypes="cccc"
|
||||
id="path6713"
|
||||
d="M -1559.2523,-150.68038 C -1559.2523,-150.68038 -1559.2523,327.65041 -1559.2523,327.65041 C -1702.1265,328.55086 -1904.6525,220.48075 -1904.6525,88.454235 C -1904.6525,-43.572302 -1745.2157,-150.68036 -1559.2523,-150.68038 z "
|
||||
style="opacity:0.40206185;color:black;fill:url(#radialGradient6719);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
|
||||
</g>
|
||||
<path
|
||||
sodipodi:nodetypes="cccsccccccccc"
|
||||
id="path4196"
|
||||
d="M 11.285690,8.0180850 C 10.660690,8.0180850 10.254441,8.3082650 10.004442,8.8618380 C 10.004441,8.8618380 3.5356915,25.965402 3.5356915,25.965402 C 3.5356915,25.965402 3.2856915,26.636961 3.2856915,27.746652 C 3.2856915,27.746652 3.2856915,37.396620 3.2856915,37.396620 C 3.2856915,38.479233 3.9434770,39.021622 4.9419415,39.021620 L 43.504440,39.021620 C 44.489293,39.021620 45.098190,38.303440 45.098190,37.177870 L 45.098190,27.527902 C 45.098190,27.527902 45.204153,26.757479 45.004440,26.215402 L 38.285690,9.0180890 C 38.101165,8.5061820 37.648785,8.0299910 37.160690,8.0180850 L 11.285690,8.0180850 z "
|
||||
style="fill:none;fill-opacity:1.0000000;fill-rule:evenodd;stroke:#535353;stroke-width:2.0000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-opacity:1.0000000" />
|
||||
<path
|
||||
sodipodi:nodetypes="ccccccccc"
|
||||
id="path4170"
|
||||
d="M 3.2735915,27.052276 L 4.0381936,26.360061 L 41.647883,26.422561 L 45.110290,26.739859 L 45.110290,37.178391 C 45.110290,38.303960 44.503272,39.021722 43.518419,39.021722 L 4.9354314,39.021722 C 3.9369667,39.021722 3.2735915,38.479671 3.2735915,37.397058 L 3.2735915,27.052276 z "
|
||||
style="fill:url(#linearGradient4234);fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:1.0204430px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000" />
|
||||
<path
|
||||
sodipodi:nodetypes="csccccccs"
|
||||
id="path3093"
|
||||
d="M 3.5490842,25.969868 C 2.8347985,27.434154 3.5484686,28.362725 4.5847985,28.362725 C 4.5847985,28.362725 43.584797,28.362725 43.584797,28.362725 C 44.703844,28.338915 45.430035,27.350820 45.013368,26.219867 L 38.299082,9.0091620 C 38.114558,8.4972550 37.644320,8.0210630 37.156225,8.0091580 L 11.299083,8.0091580 C 10.674083,8.0091580 10.263369,8.3127310 10.013370,8.8663040 C 10.013370,8.8663040 3.5490842,25.969868 3.5490842,25.969868 z "
|
||||
style="fill:url(#radialGradient4250);fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:1.0000000px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000" />
|
||||
<path
|
||||
sodipodi:nodetypes="ccccccc"
|
||||
id="path4201"
|
||||
d="M 43.562434,27.674347 C 43.562434,27.674347 5.4437179,27.674346 5.4437180,27.674347 C 4.1544861,27.674347 3.5317878,27.437788 3.3154731,26.894679 C 3.4072345,27.839011 4.1854847,28.455597 5.4437180,28.455597 C 5.4437179,28.455596 43.562434,28.455597 43.562434,28.455597 C 44.638441,28.422526 45.301832,27.596846 45.047181,26.300495 C 44.913133,27.142077 44.470547,27.646437 43.562434,27.674347 z "
|
||||
style="opacity:1.0000000;fill:#ffffff;fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:1.0000000px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000" />
|
||||
<path
|
||||
sodipodi:nodetypes="ccccccccc"
|
||||
id="path5637"
|
||||
d="M 38.344670,9.2120874 C 38.344670,9.2120874 44.500000,24.750000 44.500000,24.750000 C 43.881282,24.352252 43.618718,24.036612 43.000000,24.125000 L 5.2500000,24.125000 C 4.5428932,24.125000 3.8383883,24.875000 3.8383883,24.875000 L 10.125000,8.8750000 C 10.258882,8.3753463 10.748699,8.0732233 11.411612,8.0732233 L 36.830806,7.9848350 C 38.156631,8.1616117 38.123699,8.5933690 38.344670,9.2120874 z "
|
||||
style="opacity:1;color:#000000;fill:url(#linearGradient5705);fill-opacity:1.0;fill-rule:nonzero;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible" />
|
||||
<path
|
||||
style="stroke-opacity:1.0000000;stroke-linejoin:miter;stroke-linecap:butt;stroke-width:1.0000000px;stroke:none;fill-rule:evenodd;fill-opacity:1;fill:#686868"
|
||||
d="M 44.707773,25.362009 C 44.373548,25.128501 44.072800,25.167489 43.518240,25.139579 C 43.518240,25.139579 4.7366112,24.874414 4.7366112,24.874414 C 4.1620870,24.918608 3.4957121,25.684093 3.4957121,25.684093 C 3.4957121,25.684093 4.0667741,24.284062 4.0667741,24.284062 C 4.0667741,24.284062 4.4064556,23.120892 5.6646889,23.120892 C 5.6646888,23.120893 42.855327,23.120892 42.855327,23.120892 C 43.577781,23.153963 44.022560,23.550547 44.207491,24.016460 L 44.707773,25.362009 z "
|
||||
id="path5697"
|
||||
sodipodi:nodetypes="cccsccccc" />
|
||||
<path
|
||||
style="fill:none;fill-opacity:1.0000000;fill-rule:evenodd;stroke:url(#linearGradient4260);stroke-width:1.0000002;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-opacity:1.0000000"
|
||||
d="M 11.642515,8.4711800 C 11.040823,8.4711800 10.649724,8.7505390 10.409049,9.2834670 C 10.409048,9.2834670 3.9940341,25.874196 3.9940341,25.874196 C 3.9940341,25.874196 3.7533573,26.520711 3.7533573,27.589019 C 3.7533573,27.589019 3.7533573,36.879115 3.7533573,36.879115 C 3.7533573,38.233855 4.1974134,38.506014 5.3478414,38.506014 L 43.034746,38.506014 C 44.357872,38.506014 44.569062,38.189617 44.569062,36.668522 L 44.569062,27.378426 C 44.569062,27.378426 44.671072,26.636735 44.478807,26.114873 L 37.885616,9.3088910 C 37.707973,8.8160750 37.334964,8.4826410 36.865071,8.4711800 L 11.642515,8.4711800 z "
|
||||
id="path4252"
|
||||
sodipodi:nodetypes="cccsccccccccc" />
|
||||
<g
|
||||
id="g2142"
|
||||
transform="matrix(0.828197,0.000000,0.000000,0.610240,4.176000,11.16143)"
|
||||
style="fill:url(#linearGradient2687);fill-opacity:1.0000000">
|
||||
<rect
|
||||
y="32.363384"
|
||||
x="5.3414402"
|
||||
height="3.8650389"
|
||||
width="37.930714"
|
||||
id="rect2151"
|
||||
style="opacity:1.0000000;color:#000000;fill:url(#linearGradient2689);fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:1.0000000;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:0.42372879;visibility:visible;display:inline;overflow:visible" />
|
||||
</g>
|
||||
<path
|
||||
style="opacity:0.71428573;fill:#ffffff;fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:1.0000000px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000"
|
||||
d="M 8.6250000,33.250000 C 8.6250000,33.250000 9.0696486,34.066942 9.8651437,34.022748 C 9.8651437,34.022748 40.715385,34.000000 40.715385,34.000000 C 40.671191,31.569320 40.027885,30.881430 40.027885,30.881430 L 40.062500,33.312500 L 8.6250000,33.250000 z "
|
||||
id="path1899"
|
||||
sodipodi:nodetypes="cccccc" />
|
||||
<path
|
||||
sodipodi:type="arc"
|
||||
style="opacity:1.0000000;color:#000000;fill:url(#radialGradient2679);fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:1.0204430px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible;font-family:Bitstream Vera Sans"
|
||||
id="path2671"
|
||||
sodipodi:cx="41.015625"
|
||||
sodipodi:cy="33.984375"
|
||||
sodipodi:rx="0.98437500"
|
||||
sodipodi:ry="0.98437500"
|
||||
d="M 42.000000 33.984375 A 0.98437500 0.98437500 0 1 1 40.031250,33.984375 A 0.98437500 0.98437500 0 1 1 42.000000 33.984375 z"
|
||||
transform="matrix(1.380952,0.000000,0.000000,1.380952,-15.62500,-10.94643)" />
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 18 KiB |
512
design/icons/globe-lips.svg
Normal file
After Width: | Height: | Size: 28 KiB |
1004
design/icons/gnome-dev-removable-usb_nuvola.svg
Normal file
After Width: | Height: | Size: 41 KiB |
1195
design/icons/gnome-globe_nuvola.svg
Normal file
After Width: | Height: | Size: 72 KiB |
433
design/icons/gtk-zoom-in_nuvola.svg
Normal file
|
@ -0,0 +1,433 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
<svg
|
||||
xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/"
|
||||
xmlns:i="http://ns.adobe.com/AdobeIllustrator/10.0/"
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://web.resource.org/cc/"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns:sodipodi="http://inkscape.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
version="1.0"
|
||||
width="48pt"
|
||||
height="48pt"
|
||||
viewBox="0 0 256 256"
|
||||
id="svg2"
|
||||
xml:space="preserve"
|
||||
sodipodi:version="0.32"
|
||||
inkscape:version="0.42+devel"
|
||||
sodipodi:docname="gtk-zoom-in.svg"
|
||||
sodipodi:docbase="/home/cschalle/gnome/gnome-themes-extras/Nuvola/icons/scalable/stock"><metadata
|
||||
id="metadata72"><rdf:RDF><cc:Work
|
||||
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><sodipodi:namedview
|
||||
inkscape:cy="417.84947"
|
||||
inkscape:cx="305.25953"
|
||||
inkscape:zoom="0.43415836"
|
||||
inkscape:window-height="563"
|
||||
inkscape:window-width="822"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
borderopacity="1.0"
|
||||
bordercolor="#666666"
|
||||
pagecolor="#ffffff"
|
||||
id="base"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="30"
|
||||
inkscape:current-layer="svg2" /><defs
|
||||
id="defs125" />
|
||||
|
||||
<g
|
||||
id="switch6">
|
||||
<foreignObject
|
||||
id="foreignObject8"
|
||||
height="1"
|
||||
width="1"
|
||||
y="0"
|
||||
x="0"
|
||||
requiredExtensions="http://ns.adobe.com/AdobeIllustrator/10.0/">
|
||||
<i:pgfRef
|
||||
xlink:href="#adobe_illustrator_pgf">
|
||||
</i:pgfRef>
|
||||
</foreignObject>
|
||||
<g
|
||||
id="g10">
|
||||
<g
|
||||
id="Layer_1">
|
||||
<g
|
||||
id="g13">
|
||||
<linearGradient
|
||||
x1="15.1685"
|
||||
y1="99.097702"
|
||||
x2="183.0273"
|
||||
y2="99.097702"
|
||||
id="XMLID_14_"
|
||||
gradientUnits="userSpaceOnUse">
|
||||
<stop
|
||||
style="stop-color:#494949;stop-opacity:1"
|
||||
offset="0"
|
||||
id="stop16" />
|
||||
<stop
|
||||
style="stop-color:#616161;stop-opacity:1"
|
||||
offset="0.5"
|
||||
id="stop18" />
|
||||
<stop
|
||||
style="stop-color:#000000;stop-opacity:1"
|
||||
offset="1"
|
||||
id="stop20" />
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</linearGradient>
|
||||
<path
|
||||
d="M 39.521,39.521 L 39.521,39.521 C 7.05,71.993 7.05,124.83 39.521,157.302 C 53.626,171.407 72.322,179.987 92.166,181.459 C 111.368,182.884 130.468,177.538 146.195,166.466 C 148.178,168.45 160.082,180.353 160.082,180.353 C 164.44,184.711 172.085,183.641 177.863,177.863 C 181.257,174.468 183.027,170.43 183.027,166.793 C 183.027,164.237 182.153,161.88 180.355,160.082 C 180.355,160.082 168.451,148.178 166.466,146.193 C 176.357,132.146 181.687,115.413 181.687,98.31 C 181.687,96.265 181.612,94.215 181.459,92.164 C 179.985,72.322 171.406,53.626 157.302,39.52 C 124.83,7.051 71.994,7.051 39.521,39.521 z "
|
||||
style="fill:url(#XMLID_14_)"
|
||||
id="path22" />
|
||||
<linearGradient
|
||||
x1="196.70509"
|
||||
y1="248.7227"
|
||||
x2="196.70509"
|
||||
y2="149.4514"
|
||||
id="XMLID_15_"
|
||||
gradientUnits="userSpaceOnUse">
|
||||
<stop
|
||||
style="stop-color:#7c0000;stop-opacity:1"
|
||||
offset="0"
|
||||
id="stop25" />
|
||||
<stop
|
||||
style="stop-color:#cf0000;stop-opacity:1"
|
||||
offset="1"
|
||||
id="stop27" />
|
||||
|
||||
|
||||
|
||||
</linearGradient>
|
||||
<path
|
||||
d="M 160.184,160.188 C 155.228,165.142 152.578,171.192 152.578,176.548 C 152.578,179.695 153.493,182.605 155.395,184.909 L 155.457,184.983 L 155.515,185.132 L 207.64,237.259 C 213.674,243.291 224.906,241.513 233.21,233.21 C 241.515,224.904 243.293,213.672 237.261,207.64 L 185.07,155.449 L 184.952,155.429 C 178.726,150.247 168.079,152.292 160.184,160.188 z "
|
||||
style="fill:url(#XMLID_15_)"
|
||||
id="path29" />
|
||||
<linearGradient
|
||||
x1="17.168501"
|
||||
y1="99.1045"
|
||||
x2="181.0253"
|
||||
y2="99.1045"
|
||||
id="XMLID_16_"
|
||||
gradientUnits="userSpaceOnUse">
|
||||
<stop
|
||||
style="stop-color:#a2a2a2;stop-opacity:1"
|
||||
offset="0"
|
||||
id="stop32" />
|
||||
<stop
|
||||
style="stop-color:#494949;stop-opacity:1"
|
||||
offset="1"
|
||||
id="stop34" />
|
||||
|
||||
|
||||
|
||||
</linearGradient>
|
||||
<path
|
||||
d="M 42.35,42.35 C 27.4,57.301 19.167,77.211 19.167,98.412 C 19.167,119.613 27.4,139.523 42.35,154.475 C 55.779,167.903 73.575,176.07 92.462,177.471 C 111.29,178.868 130.04,173.472 145.258,162.276 L 146.643,161.258 L 162.911,177.526 C 165.657,180.272 170.87,179.202 175.036,175.036 C 179.201,170.869 180.272,165.656 177.528,162.911 L 161.258,146.641 L 162.276,145.257 C 173.473,130.039 178.87,111.289 177.471,92.462 C 176.069,73.574 167.902,55.777 154.475,42.35 C 123.562,11.438 73.263,11.438 42.35,42.35 z "
|
||||
style="fill:url(#XMLID_16_)"
|
||||
id="path36" />
|
||||
|
||||
<linearGradient
|
||||
x1="47.964802"
|
||||
y1="190.2119"
|
||||
x2="69.606903"
|
||||
y2="211.8539"
|
||||
id="XMLID_17_"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(-1.000000,0.000000,0.000000,1.000000,258.0000,0.000000)">
|
||||
<stop
|
||||
style="stop-color:#ffc957;stop-opacity:1"
|
||||
offset="0"
|
||||
id="stop39" />
|
||||
<stop
|
||||
style="stop-color:#ff6d00;stop-opacity:1"
|
||||
offset="1"
|
||||
id="stop41" />
|
||||
|
||||
|
||||
|
||||
</linearGradient>
|
||||
<path
|
||||
d="M 181.85,160.041 L 233.354,211.545 C 237.139,215.332 235.325,223.281 229.303,229.303 C 223.28,235.326 215.332,237.139 211.545,233.352 L 160.041,181.848 L 181.85,160.041 z "
|
||||
style="fill:url(#XMLID_17_)"
|
||||
id="path43" />
|
||||
|
||||
<linearGradient
|
||||
x1="48.526901"
|
||||
y1="194.8232"
|
||||
x2="64.114403"
|
||||
y2="210.4108"
|
||||
id="XMLID_18_"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(-1.224300,-0.128800,0.128800,1.224300,243.0516,-40.91190)">
|
||||
<stop
|
||||
style="stop-color:#ffff66;stop-opacity:1"
|
||||
offset="0"
|
||||
id="stop46" />
|
||||
<stop
|
||||
style="stop-color:#ff6d00;stop-opacity:1"
|
||||
offset="1"
|
||||
id="stop48" />
|
||||
|
||||
|
||||
|
||||
</linearGradient>
|
||||
<path
|
||||
d="M 181.08,162.141 L 231.274,212.335 C 234.962,216.025 234.101,222.867 229.349,227.617 C 224.597,232.369 217.757,233.228 214.067,229.542 L 163.873,179.348 L 181.08,162.141 z "
|
||||
style="fill:url(#XMLID_18_)"
|
||||
id="path50" />
|
||||
<linearGradient
|
||||
x1="182.1367"
|
||||
y1="182.1357"
|
||||
x2="164.09219"
|
||||
y2="164.09129"
|
||||
id="XMLID_19_"
|
||||
gradientUnits="userSpaceOnUse">
|
||||
<stop
|
||||
style="stop-color:#ffd700;stop-opacity:1"
|
||||
offset="0"
|
||||
id="stop53" />
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:1"
|
||||
offset="1"
|
||||
id="stop55" />
|
||||
|
||||
|
||||
|
||||
</linearGradient>
|
||||
<path
|
||||
d="M 181.85,160.041 C 185.635,163.826 183.821,171.777 177.797,177.799 C 171.776,183.82 163.828,185.635 160.041,181.848 C 156.256,178.063 158.068,170.116 164.092,164.092 C 170.113,158.07 178.063,156.256 181.85,160.041 z "
|
||||
style="fill:url(#XMLID_19_)"
|
||||
id="path57" />
|
||||
|
||||
<linearGradient
|
||||
x1="131.58591"
|
||||
y1="-4.0268998"
|
||||
x2="131.58591"
|
||||
y2="210.97231"
|
||||
id="XMLID_20_"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(-0.707100,0.707100,0.707100,0.707100,148.8760,-37.21400)">
|
||||
<stop
|
||||
style="stop-color:#dadada;stop-opacity:1"
|
||||
offset="0"
|
||||
id="stop60" />
|
||||
<stop
|
||||
style="stop-color:#949494;stop-opacity:1"
|
||||
offset="0.6124"
|
||||
id="stop62" />
|
||||
<stop
|
||||
style="stop-color:#dadada;stop-opacity:1"
|
||||
offset="1"
|
||||
id="stop64" />
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</linearGradient>
|
||||
<path
|
||||
d="M 43.43,153.396 C 13.063,123.028 13.063,73.793 43.43,43.428 C 73.795,13.061 123.03,13.061 153.397,43.428 C 181.657,71.687 183.61,116.282 159.272,146.812 L 176.448,163.988 C 178.514,166.052 177.397,170.515 173.958,173.957 C 170.517,177.396 166.054,178.514 163.989,176.447 L 146.813,159.273 C 116.283,183.611 71.688,181.656 43.43,153.396 z "
|
||||
style="fill:url(#XMLID_20_)"
|
||||
id="path66" />
|
||||
|
||||
<linearGradient
|
||||
x1="134.8213"
|
||||
y1="149.9229"
|
||||
x2="124.5826"
|
||||
y2="149.9229"
|
||||
id="XMLID_21_"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(-0.707100,0.707100,0.582600,0.582600,169.5297,-16.56120)">
|
||||
<stop
|
||||
style="stop-color:#b2b2b2;stop-opacity:1"
|
||||
offset="0"
|
||||
id="stop69" />
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:1"
|
||||
offset="1"
|
||||
id="stop71" />
|
||||
|
||||
|
||||
|
||||
</linearGradient>
|
||||
<path
|
||||
d="M 159.183,149.769 C 159.183,149.769 176.389,166.976 177.37,167.954 C 177.063,168.708 176.214,170.158 174.519,171.85 L 174.519,171.85 C 172.822,173.547 171.373,174.397 170.621,174.701 C 169.643,173.723 152.436,156.513 152.436,156.513 L 159.183,149.769 z "
|
||||
style="fill:url(#XMLID_21_)"
|
||||
id="path73" />
|
||||
<linearGradient
|
||||
x1="27.7358"
|
||||
y1="98.412102"
|
||||
x2="169.0889"
|
||||
y2="98.412102"
|
||||
id="XMLID_22_"
|
||||
gradientUnits="userSpaceOnUse">
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:1"
|
||||
offset="0"
|
||||
id="stop76" />
|
||||
<stop
|
||||
style="stop-color:#494949;stop-opacity:1"
|
||||
offset="1"
|
||||
id="stop78" />
|
||||
|
||||
|
||||
|
||||
</linearGradient>
|
||||
<path
|
||||
d="M 148.412,48.412 C 175.98,75.982 175.982,120.842 148.412,148.412 C 120.84,175.982 75.982,175.98 48.412,148.412 C 20.844,120.842 20.844,75.982 48.412,48.412 C 75.982,20.843 120.842,20.843 148.412,48.412 z "
|
||||
style="fill:url(#XMLID_22_)"
|
||||
id="path80" />
|
||||
|
||||
<radialGradient
|
||||
cx="92.632797"
|
||||
cy="20.0571"
|
||||
r="176.5367"
|
||||
fx="92.632797"
|
||||
fy="20.0571"
|
||||
id="XMLID_23_"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(-0.707100,0.707100,0.707100,0.707100,148.8760,-37.21400)">
|
||||
<stop
|
||||
style="stop-color:#0035ed;stop-opacity:1"
|
||||
offset="0.0056"
|
||||
id="stop83" />
|
||||
<stop
|
||||
style="stop-color:#94caff;stop-opacity:1"
|
||||
offset="0.56739998"
|
||||
id="stop85" />
|
||||
<stop
|
||||
style="stop-color:#c9e6ff;stop-opacity:1"
|
||||
offset="0.70789999"
|
||||
id="stop87" />
|
||||
<stop
|
||||
style="stop-color:#034cfe;stop-opacity:1"
|
||||
offset="1"
|
||||
id="stop89" />
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</radialGradient>
|
||||
<path
|
||||
d="M 145.92,50.905 C 172.115,77.1 172.115,119.722 145.92,145.92 C 119.723,172.115 77.102,172.115 50.906,145.92 C 24.709,119.722 24.711,77.1 50.906,50.905 C 77.102,24.709 119.723,24.709 145.92,50.905 z "
|
||||
style="fill:url(#XMLID_23_)"
|
||||
id="path91" />
|
||||
|
||||
<radialGradient
|
||||
cx="92.957001"
|
||||
cy="19.922899"
|
||||
r="176.53951"
|
||||
fx="92.957001"
|
||||
fy="19.922899"
|
||||
id="XMLID_24_"
|
||||
gradientUnits="userSpaceOnUse">
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:1"
|
||||
offset="0.0056"
|
||||
id="stop94" />
|
||||
<stop
|
||||
style="stop-color:#94caff;stop-opacity:1"
|
||||
offset="0.44999999"
|
||||
id="stop96" />
|
||||
<stop
|
||||
style="stop-color:#c9e6ff;stop-opacity:1"
|
||||
offset="0.60000002"
|
||||
id="stop98" />
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:1"
|
||||
offset="1"
|
||||
id="stop100" />
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</radialGradient>
|
||||
<path
|
||||
d="M 53.735,53.733 L 53.735,53.733 C 41.821,65.647 35.26,81.515 35.259,98.412 C 35.259,115.309 41.821,131.177 53.736,143.092 C 78.371,167.727 118.456,167.727 143.092,143.092 C 167.727,118.454 167.727,78.369 143.092,53.734 C 118.455,29.098 78.37,29.098 53.735,53.733 z "
|
||||
style="fill:url(#XMLID_24_)"
|
||||
id="path102" />
|
||||
</g>
|
||||
<rect
|
||||
width="256"
|
||||
height="256"
|
||||
x="0"
|
||||
y="0"
|
||||
style="fill:none"
|
||||
id="_x3C_Slice_x3E_" />
|
||||
<polyline
|
||||
id="_x3C_Slice_x3E__1_"
|
||||
i:knockout="Off"
|
||||
points="0,256 0,0 256,0 256,256 "
|
||||
style="fill:none" />
|
||||
<g
|
||||
id="g106">
|
||||
<linearGradient
|
||||
x1="201.1055"
|
||||
y1="191"
|
||||
x2="17.3937"
|
||||
y2="191"
|
||||
id="XMLID_25_"
|
||||
gradientUnits="userSpaceOnUse">
|
||||
<stop
|
||||
style="stop-color:#003333;stop-opacity:1"
|
||||
offset="0"
|
||||
id="stop109" />
|
||||
<stop
|
||||
style="stop-color:#006a00;stop-opacity:1"
|
||||
offset="1"
|
||||
id="stop111" />
|
||||
|
||||
|
||||
|
||||
</linearGradient>
|
||||
<path
|
||||
d="M 125,163 L 113,163 L 113,151 C 113,142.729 106.271,136 98,136 L 72,136 C 63.729,136 57,142.729 57,151 L 57,163 L 45,163 C 36.729,163 30,169.729 30,178 L 30,204 C 30,212.271 36.729,219 45,219 L 57,219 L 57,231 C 57,239.271 63.729,246 72,246 L 98,246 C 106.271,246 113,239.271 113,231 L 113,219 L 125,219 C 133.271,219 140,212.271 140,204 L 140,178 C 140,169.729 133.271,163 125,163 z "
|
||||
style="fill:url(#XMLID_25_)"
|
||||
id="path113" />
|
||||
<path
|
||||
d="M 125,168 L 108,168 L 108,151 C 108,145.478 103.522,141 98,141 L 72,141 C 66.478,141 62,145.478 62,151 L 62,168 L 45,168 C 39.478,168 35,172.478 35,178 L 35,204 C 35,209.522 39.478,214 45,214 L 62,214 L 62,231 C 62,236.522 66.478,241 72,241 L 98,241 C 103.522,241 108,236.522 108,231 L 108,214 L 125,214 C 130.522,214 135,209.522 135,204 L 135,178 C 135,172.478 130.522,168 125,168 z "
|
||||
style="fill:#ffffff"
|
||||
id="path115" />
|
||||
<linearGradient
|
||||
x1="201.1035"
|
||||
y1="191"
|
||||
x2="17.3915"
|
||||
y2="191"
|
||||
id="XMLID_26_"
|
||||
gradientUnits="userSpaceOnUse">
|
||||
<stop
|
||||
style="stop-color:#33cc33;stop-opacity:1"
|
||||
offset="0"
|
||||
id="stop118" />
|
||||
<stop
|
||||
style="stop-color:#006a00;stop-opacity:1"
|
||||
offset="1"
|
||||
id="stop120" />
|
||||
|
||||
|
||||
|
||||
</linearGradient>
|
||||
<polygon
|
||||
points="125,178 98,178 98,151 72,151 72,178 45,178 45,204 72,204 72,231 98,231 98,204 125,204 125,178 "
|
||||
style="fill:url(#XMLID_26_)"
|
||||
id="polygon122" />
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 13 KiB |
701
design/icons/help_contents.svg
Normal file
|
@ -0,0 +1,701 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://web.resource.org/cc/"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns:sodipodi="http://inkscape.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
inkscape:export-ydpi="240.00000"
|
||||
inkscape:export-xdpi="240.00000"
|
||||
inkscape:export-filename="/home/jimmac/gfx/novell/pdes/trunk/docs/BIGmime-text.png"
|
||||
sodipodi:docname="help-contents.svg"
|
||||
sodipodi:docbase="/home/tigert/cvs/freedesktop.org/tango-icon-theme/scalable/actions"
|
||||
inkscape:version="0.43+devel"
|
||||
sodipodi:version="0.32"
|
||||
id="svg249"
|
||||
height="48.000000px"
|
||||
width="48.000000px"
|
||||
inkscape:output_extension="org.inkscape.output.svg.inkscape">
|
||||
<defs
|
||||
id="defs3">
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
id="linearGradient4542">
|
||||
<stop
|
||||
style="stop-color:#000000;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop4544" />
|
||||
<stop
|
||||
style="stop-color:#000000;stop-opacity:0;"
|
||||
offset="1"
|
||||
id="stop4546" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient15662">
|
||||
<stop
|
||||
id="stop15664"
|
||||
offset="0.0000000"
|
||||
style="stop-color:#ffffff;stop-opacity:1.0000000;" />
|
||||
<stop
|
||||
id="stop15666"
|
||||
offset="1.0000000"
|
||||
style="stop-color:#f8f8f8;stop-opacity:1.0000000;" />
|
||||
</linearGradient>
|
||||
<radialGradient
|
||||
id="aigrd3"
|
||||
cx="20.8921"
|
||||
cy="64.5679"
|
||||
r="5.257"
|
||||
fx="20.8921"
|
||||
fy="64.5679"
|
||||
gradientUnits="userSpaceOnUse">
|
||||
<stop
|
||||
offset="0"
|
||||
style="stop-color:#F0F0F0"
|
||||
id="stop15573" />
|
||||
<stop
|
||||
offset="1.0000000"
|
||||
style="stop-color:#9a9a9a;stop-opacity:1.0000000;"
|
||||
id="stop15575" />
|
||||
</radialGradient>
|
||||
<radialGradient
|
||||
id="aigrd2"
|
||||
cx="20.8921"
|
||||
cy="114.5684"
|
||||
r="5.256"
|
||||
fx="20.8921"
|
||||
fy="114.5684"
|
||||
gradientUnits="userSpaceOnUse">
|
||||
<stop
|
||||
offset="0"
|
||||
style="stop-color:#F0F0F0"
|
||||
id="stop15566" />
|
||||
<stop
|
||||
offset="1.0000000"
|
||||
style="stop-color:#9a9a9a;stop-opacity:1.0000000;"
|
||||
id="stop15568" />
|
||||
</radialGradient>
|
||||
<linearGradient
|
||||
id="linearGradient269">
|
||||
<stop
|
||||
id="stop270"
|
||||
offset="0.0000000"
|
||||
style="stop-color:#a3a3a3;stop-opacity:1.0000000;" />
|
||||
<stop
|
||||
id="stop271"
|
||||
offset="1.0000000"
|
||||
style="stop-color:#4c4c4c;stop-opacity:1.0000000;" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient259">
|
||||
<stop
|
||||
id="stop260"
|
||||
offset="0.0000000"
|
||||
style="stop-color:#fafafa;stop-opacity:1.0000000;" />
|
||||
<stop
|
||||
id="stop261"
|
||||
offset="1.0000000"
|
||||
style="stop-color:#bbbbbb;stop-opacity:1.0000000;" />
|
||||
</linearGradient>
|
||||
<radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient269"
|
||||
id="radialGradient15656"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(0.968273,0.000000,0.000000,1.032767,3.353553,0.646447)"
|
||||
cx="8.8244190"
|
||||
cy="3.7561285"
|
||||
fx="8.8244190"
|
||||
fy="3.7561285"
|
||||
r="37.751713" />
|
||||
<radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient259"
|
||||
id="radialGradient15658"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="scale(0.960493,1.041132)"
|
||||
cx="33.966679"
|
||||
cy="35.736916"
|
||||
fx="33.966679"
|
||||
fy="35.736916"
|
||||
r="86.708450" />
|
||||
<radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient15662"
|
||||
id="radialGradient15668"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(0.968273,0.000000,0.000000,1.032767,3.353553,0.646447)"
|
||||
cx="8.1435566"
|
||||
cy="7.2678967"
|
||||
fx="8.1435566"
|
||||
fy="7.2678967"
|
||||
r="38.158695" />
|
||||
<radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient4542"
|
||||
id="radialGradient4548"
|
||||
cx="24.306795"
|
||||
cy="42.07798"
|
||||
fx="24.306795"
|
||||
fy="42.07798"
|
||||
r="15.821514"
|
||||
gradientTransform="matrix(1.000000,0.000000,0.000000,0.284916,0.000000,30.08928)"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
<radialGradient
|
||||
id="aigrd8"
|
||||
cx="37.6357"
|
||||
cy="-29.6997"
|
||||
r="12.8245"
|
||||
fx="37.6357"
|
||||
fy="-29.6997"
|
||||
gradientTransform="matrix(0 1 -1 0 -17.6563 -25.5215)"
|
||||
gradientUnits="userSpaceOnUse">
|
||||
<stop
|
||||
offset="0.0000000"
|
||||
style="stop-color:#210101;stop-opacity:1.0000000;"
|
||||
id="stop2061" />
|
||||
<stop
|
||||
id="stop3650"
|
||||
style="stop-color:#ff747e;stop-opacity:1.0000000;"
|
||||
offset="0.50000000" />
|
||||
<stop
|
||||
offset="1.0000000"
|
||||
style="stop-color:#830000;stop-opacity:1.0000000;"
|
||||
id="stop2079" />
|
||||
</radialGradient>
|
||||
<radialGradient
|
||||
id="aigrd5"
|
||||
cx="11.5034"
|
||||
cy="11.3452"
|
||||
r="9.2994"
|
||||
fx="11.5034"
|
||||
fy="11.3452"
|
||||
gradientUnits="userSpaceOnUse">
|
||||
<stop
|
||||
offset="0"
|
||||
style="stop-color:#C5C5C5"
|
||||
id="stop1990" />
|
||||
<stop
|
||||
offset="0.237"
|
||||
style="stop-color:#C8C8C8"
|
||||
id="stop1992" />
|
||||
<stop
|
||||
offset="0.4082"
|
||||
style="stop-color:#D1D1D1"
|
||||
id="stop1994" />
|
||||
<stop
|
||||
offset="0.5587"
|
||||
style="stop-color:#E1E1E1"
|
||||
id="stop1996" />
|
||||
<stop
|
||||
offset="0.6964"
|
||||
style="stop-color:#F7F7F7"
|
||||
id="stop1998" />
|
||||
<stop
|
||||
offset="0.736"
|
||||
style="stop-color:#FFFFFF"
|
||||
id="stop2000" />
|
||||
<stop
|
||||
offset="0.8191"
|
||||
style="stop-color:#FCFCFC"
|
||||
id="stop2002" />
|
||||
<stop
|
||||
offset="0.8812"
|
||||
style="stop-color:#F2F2F2"
|
||||
id="stop2004" />
|
||||
<stop
|
||||
offset="0.9364"
|
||||
style="stop-color:#E2E2E2"
|
||||
id="stop2006" />
|
||||
<stop
|
||||
offset="0.9875"
|
||||
style="stop-color:#CCCCCC"
|
||||
id="stop2008" />
|
||||
<stop
|
||||
offset="1"
|
||||
style="stop-color:#C5C5C5"
|
||||
id="stop2010" />
|
||||
</radialGradient>
|
||||
<radialGradient
|
||||
id="aigrd4"
|
||||
cx="18.1523"
|
||||
cy="5.6528"
|
||||
r="3.5497"
|
||||
fx="18.1523"
|
||||
fy="5.6528"
|
||||
gradientUnits="userSpaceOnUse">
|
||||
<stop
|
||||
offset="0"
|
||||
style="stop-color:#3C3C3C"
|
||||
id="stop1957" />
|
||||
<stop
|
||||
offset="0.3633"
|
||||
style="stop-color:#3E3E3E"
|
||||
id="stop1959" />
|
||||
<stop
|
||||
offset="0.4942"
|
||||
style="stop-color:#454545"
|
||||
id="stop1961" />
|
||||
<stop
|
||||
offset="0.5875"
|
||||
style="stop-color:#505050"
|
||||
id="stop1963" />
|
||||
<stop
|
||||
offset="0.6629"
|
||||
style="stop-color:#616161"
|
||||
id="stop1965" />
|
||||
<stop
|
||||
offset="0.7276"
|
||||
style="stop-color:#777777"
|
||||
id="stop1967" />
|
||||
<stop
|
||||
offset="0.7848"
|
||||
style="stop-color:#939393"
|
||||
id="stop1969" />
|
||||
<stop
|
||||
offset="0.8353"
|
||||
style="stop-color:#B2B2B2"
|
||||
id="stop1971" />
|
||||
<stop
|
||||
offset="0.8764"
|
||||
style="stop-color:#D2D2D2"
|
||||
id="stop1973" />
|
||||
<stop
|
||||
offset="0.8998"
|
||||
style="stop-color:#CECECE"
|
||||
id="stop1975" />
|
||||
<stop
|
||||
offset="0.9223"
|
||||
style="stop-color:#C3C3C3"
|
||||
id="stop1977" />
|
||||
<stop
|
||||
offset="0.9446"
|
||||
style="stop-color:#AFAFAF"
|
||||
id="stop1979" />
|
||||
<stop
|
||||
offset="0.9666"
|
||||
style="stop-color:#949494"
|
||||
id="stop1981" />
|
||||
<stop
|
||||
offset="0.9884"
|
||||
style="stop-color:#717171"
|
||||
id="stop1983" />
|
||||
<stop
|
||||
offset="1"
|
||||
style="stop-color:#5B5B5B"
|
||||
id="stop1985" />
|
||||
</radialGradient>
|
||||
<radialGradient
|
||||
id="aigrd1"
|
||||
cx="18.1523"
|
||||
cy="18.3291"
|
||||
r="3.5495"
|
||||
fx="18.1523"
|
||||
fy="18.3291"
|
||||
gradientUnits="userSpaceOnUse">
|
||||
<stop
|
||||
offset="0"
|
||||
style="stop-color:#3C3C3C"
|
||||
id="stop1852" />
|
||||
<stop
|
||||
offset="0.3633"
|
||||
style="stop-color:#3E3E3E"
|
||||
id="stop1854" />
|
||||
<stop
|
||||
offset="0.4942"
|
||||
style="stop-color:#454545"
|
||||
id="stop1856" />
|
||||
<stop
|
||||
offset="0.5875"
|
||||
style="stop-color:#505050"
|
||||
id="stop1858" />
|
||||
<stop
|
||||
offset="0.6629"
|
||||
style="stop-color:#616161"
|
||||
id="stop1860" />
|
||||
<stop
|
||||
offset="0.7276"
|
||||
style="stop-color:#777777"
|
||||
id="stop1862" />
|
||||
<stop
|
||||
offset="0.7848"
|
||||
style="stop-color:#939393"
|
||||
id="stop1864" />
|
||||
<stop
|
||||
offset="0.8353"
|
||||
style="stop-color:#B2B2B2"
|
||||
id="stop1866" />
|
||||
<stop
|
||||
offset="0.8764"
|
||||
style="stop-color:#D2D2D2"
|
||||
id="stop1868" />
|
||||
<stop
|
||||
offset="0.8998"
|
||||
style="stop-color:#CECECE"
|
||||
id="stop1870" />
|
||||
<stop
|
||||
offset="0.9223"
|
||||
style="stop-color:#C3C3C3"
|
||||
id="stop1872" />
|
||||
<stop
|
||||
offset="0.9446"
|
||||
style="stop-color:#AFAFAF"
|
||||
id="stop1874" />
|
||||
<stop
|
||||
offset="0.9666"
|
||||
style="stop-color:#949494"
|
||||
id="stop1876" />
|
||||
<stop
|
||||
offset="0.9884"
|
||||
style="stop-color:#717171"
|
||||
id="stop1878" />
|
||||
<stop
|
||||
offset="1"
|
||||
style="stop-color:#5B5B5B"
|
||||
id="stop1880" />
|
||||
</radialGradient>
|
||||
<linearGradient
|
||||
id="linearGradient3640"
|
||||
inkscape:collect="always">
|
||||
<stop
|
||||
id="stop3642"
|
||||
offset="0"
|
||||
style="stop-color:#ffffff;stop-opacity:1;" />
|
||||
<stop
|
||||
id="stop3644"
|
||||
offset="1"
|
||||
style="stop-color:#ffffff;stop-opacity:0;" />
|
||||
</linearGradient>
|
||||
<radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#aigrd1"
|
||||
id="radialGradient5534"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(2.132196,0.000000,0.000000,2.132196,-97.11122,15.26563)"
|
||||
cx="18.1523"
|
||||
cy="18.3291"
|
||||
fx="18.1523"
|
||||
fy="18.3291"
|
||||
r="3.5495" />
|
||||
<radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#aigrd2"
|
||||
id="radialGradient5536"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(2.132196,0.000000,0.000000,2.132196,-91.44192,15.26563)"
|
||||
cx="5.7334"
|
||||
cy="18.3291"
|
||||
fx="5.7334"
|
||||
fy="18.3291"
|
||||
r="3.5495" />
|
||||
<radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#aigrd3"
|
||||
id="radialGradient5538"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(2.132196,0.000000,0.000000,2.132196,-91.44192,20.93492)"
|
||||
cx="5.7334"
|
||||
cy="5.6528"
|
||||
fx="5.7334"
|
||||
fy="5.6528"
|
||||
r="3.5497" />
|
||||
<radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#aigrd4"
|
||||
id="radialGradient5540"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(2.132196,0.000000,0.000000,2.132196,-97.11122,20.93492)"
|
||||
cx="18.1523"
|
||||
cy="5.6528"
|
||||
fx="18.1523"
|
||||
fy="5.6528"
|
||||
r="3.5497" />
|
||||
<radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#aigrd5"
|
||||
id="radialGradient5542"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(2.132196,0.000000,0.000000,2.132196,-94.27657,18.10027)"
|
||||
cx="11.586308"
|
||||
cy="11.676833"
|
||||
fx="11.586308"
|
||||
fy="11.676833"
|
||||
r="9.2994" />
|
||||
<radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#aigrd8"
|
||||
id="radialGradient5544"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(0.000000,-1.995477,1.995477,0.000000,-40.29889,-16.87378)"
|
||||
cx="-30.104782"
|
||||
cy="-14.617684"
|
||||
fx="-30.104782"
|
||||
fy="-14.617684"
|
||||
r="12.822400" />
|
||||
<radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#aigrd8"
|
||||
id="radialGradient5546"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(-2.020236,0.000000,0.000000,-2.018756,-72.22632,-71.13473)"
|
||||
cx="-1.3652747"
|
||||
cy="-56.636044"
|
||||
fx="-1.3652747"
|
||||
fy="-56.636044"
|
||||
r="12.826500" />
|
||||
<radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#aigrd8"
|
||||
id="radialGradient5548"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(0.000000,1.975946,-1.975946,0.000000,-126.5395,-31.17259)"
|
||||
cx="37.638786"
|
||||
cy="-28.883039"
|
||||
fx="37.638786"
|
||||
fy="-28.883039"
|
||||
r="12.8245" />
|
||||
<radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#aigrd8"
|
||||
id="radialGradient5550"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(1.995477,0.000000,0.000000,1.995477,-93.26485,19.11199)"
|
||||
cx="11.925323"
|
||||
cy="12.071112"
|
||||
fx="11.925323"
|
||||
fy="12.071112"
|
||||
r="12.824500" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3640"
|
||||
id="linearGradient5552"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="translate(-92.27870,19.84228)"
|
||||
x1="15.737945"
|
||||
y1="9.1388483"
|
||||
x2="51.313351"
|
||||
y2="64.278435" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3640"
|
||||
id="linearGradient5554"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="translate(-92.27870,19.84228)"
|
||||
x1="27.426350"
|
||||
y1="30.840612"
|
||||
x2="15.759552"
|
||||
y2="13.170511" />
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
inkscape:window-y="1001"
|
||||
inkscape:window-x="338"
|
||||
inkscape:window-height="747"
|
||||
inkscape:window-width="839"
|
||||
inkscape:document-units="px"
|
||||
inkscape:grid-bbox="true"
|
||||
showgrid="false"
|
||||
inkscape:current-layer="layer5"
|
||||
inkscape:cy="31.232715"
|
||||
inkscape:cx="41.233954"
|
||||
inkscape:zoom="1"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
borderopacity="0.25490196"
|
||||
bordercolor="#666666"
|
||||
pagecolor="#ffffff"
|
||||
id="base"
|
||||
inkscape:showpageshadow="false" />
|
||||
<metadata
|
||||
id="metadata4">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title>Help Contents</dc:title>
|
||||
<dc:subject>
|
||||
<rdf:Bag>
|
||||
<rdf:li>help</rdf:li>
|
||||
<rdf:li>index</rdf:li>
|
||||
<rdf:li>contents</rdf:li>
|
||||
</rdf:Bag>
|
||||
</dc:subject>
|
||||
<cc:license
|
||||
rdf:resource="http://creativecommons.org/licenses/by-sa/2.0/" />
|
||||
<dc:creator>
|
||||
<cc:Agent>
|
||||
<dc:title>Jakub Steiner</dc:title>
|
||||
</cc:Agent>
|
||||
</dc:creator>
|
||||
<dc:source>http://jimmac.musichall.cz</dc:source>
|
||||
</cc:Work>
|
||||
<cc:License
|
||||
rdf:about="http://creativecommons.org/licenses/by/2.0/">
|
||||
<cc:permits
|
||||
rdf:resource="http://web.resource.org/cc/Reproduction" />
|
||||
<cc:permits
|
||||
rdf:resource="http://web.resource.org/cc/Distribution" />
|
||||
<cc:requires
|
||||
rdf:resource="http://web.resource.org/cc/Notice" />
|
||||
<cc:requires
|
||||
rdf:resource="http://web.resource.org/cc/Attribution" />
|
||||
<cc:permits
|
||||
rdf:resource="http://web.resource.org/cc/DerivativeWorks" />
|
||||
<cc:requires
|
||||
rdf:resource="http://web.resource.org/cc/ShareAlike" />
|
||||
</cc:License>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:groupmode="layer"
|
||||
id="layer6"
|
||||
inkscape:label="Shadow">
|
||||
<path
|
||||
sodipodi:type="arc"
|
||||
style="opacity:0.7836257;color:#000000;fill:url(#radialGradient4548);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
|
||||
id="path3667"
|
||||
sodipodi:cx="24.306795"
|
||||
sodipodi:cy="42.07798"
|
||||
sodipodi:rx="15.821514"
|
||||
sodipodi:ry="4.5078058"
|
||||
d="M 40.128309 42.07798 A 15.821514 4.5078058 0 1 1 8.485281,42.07798 A 15.821514 4.5078058 0 1 1 40.128309 42.07798 z"
|
||||
transform="translate(0.000000,0.707108)" />
|
||||
</g>
|
||||
<g
|
||||
style="display:inline"
|
||||
inkscape:groupmode="layer"
|
||||
inkscape:label="Base"
|
||||
id="layer1">
|
||||
<rect
|
||||
style="color:#000000;fill:url(#radialGradient15658);fill-opacity:1.0000000;fill-rule:nonzero;stroke:url(#radialGradient15656);stroke-width:1.0000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4.0000000;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:block;overflow:visible"
|
||||
id="rect15391"
|
||||
width="34.875000"
|
||||
height="40.920494"
|
||||
x="6.6035528"
|
||||
y="3.6464462"
|
||||
ry="1.1490486" />
|
||||
<rect
|
||||
style="color:#000000;fill:none;fill-opacity:1.0000000;fill-rule:nonzero;stroke:url(#radialGradient15668);stroke-width:1.0000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4.0000000;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:block;overflow:visible"
|
||||
id="rect15660"
|
||||
width="32.775887"
|
||||
height="38.946384"
|
||||
x="7.6660538"
|
||||
y="4.5839462"
|
||||
ry="0.14904857"
|
||||
rx="0.14904857" />
|
||||
</g>
|
||||
<g
|
||||
inkscape:groupmode="layer"
|
||||
id="layer5"
|
||||
inkscape:label="Text"
|
||||
style="display:inline">
|
||||
<g
|
||||
transform="matrix(0.909091,0.000000,0.000000,1.000000,2.363628,0.000000)"
|
||||
id="g2253">
|
||||
<rect
|
||||
style="color:#000000;fill:#9b9b9b;fill-opacity:0.54970759;fill-rule:nonzero;stroke:none;stroke-width:1.0000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4.0000000;stroke-dashoffset:0.0000000;stroke-opacity:0.081871338;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:block;overflow:visible"
|
||||
id="rect15686"
|
||||
width="22.000004"
|
||||
height="1.0000000"
|
||||
x="15.000002"
|
||||
y="9.0000000"
|
||||
rx="0.15156493"
|
||||
ry="0.065390877" />
|
||||
<rect
|
||||
style="color:#000000;fill:#9b9b9b;fill-opacity:0.54970759;fill-rule:nonzero;stroke:none;stroke-width:1.0000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4.0000000;stroke-dashoffset:0.0000000;stroke-opacity:0.081871338;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:block;overflow:visible"
|
||||
id="rect15690"
|
||||
width="22.000004"
|
||||
height="1.0000000"
|
||||
x="15.000002"
|
||||
y="13.000000"
|
||||
rx="0.15156493"
|
||||
ry="0.065390877" />
|
||||
<rect
|
||||
style="color:#000000;fill:#9b9b9b;fill-opacity:0.54970759;fill-rule:nonzero;stroke:none;stroke-width:1.0000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4.0000000;stroke-dashoffset:0.0000000;stroke-opacity:0.081871338;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:block;overflow:visible"
|
||||
id="rect15694"
|
||||
width="22.000004"
|
||||
height="1.0000000"
|
||||
x="15.000002"
|
||||
y="17.000000"
|
||||
rx="0.15156493"
|
||||
ry="0.065390877" />
|
||||
<rect
|
||||
style="color:#000000;fill:#9b9b9b;fill-opacity:0.54970759;fill-rule:nonzero;stroke:none;stroke-width:1.0000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4.0000000;stroke-dashoffset:0.0000000;stroke-opacity:0.081871338;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:block;overflow:visible"
|
||||
id="rect15698"
|
||||
width="22.000004"
|
||||
height="1.0000000"
|
||||
x="15.000002"
|
||||
y="21.000000"
|
||||
rx="0.15156493"
|
||||
ry="0.065390877" />
|
||||
<rect
|
||||
style="color:#000000;fill:#9b9b9b;fill-opacity:0.54970759;fill-rule:nonzero;stroke:none;stroke-width:1.0000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4.0000000;stroke-dashoffset:0.0000000;stroke-opacity:0.081871338;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:block;overflow:visible"
|
||||
id="rect15732"
|
||||
width="9.9000053"
|
||||
height="1.0000000"
|
||||
x="14.999992"
|
||||
y="25.000000"
|
||||
rx="0.068204239"
|
||||
ry="0.065390877" />
|
||||
</g>
|
||||
<g
|
||||
id="g5499"
|
||||
transform="matrix(0.857951,0.000000,0.000000,0.857951,89.46235,-7.004529)">
|
||||
<path
|
||||
style="fill:url(#radialGradient5534);fill-rule:nonzero;stroke:none;stroke-width:0.85650003;stroke-miterlimit:4"
|
||||
d="M -58.092025,46.608913 C -62.356416,46.608913 -65.98115,50.233647 -65.98115,54.498038 C -65.98115,58.762431 -62.356416,62.387164 -58.092025,62.387164 C -53.827633,62.387164 -50.202899,58.762431 -50.202899,54.498038 C -50.202899,50.233647 -53.827633,46.608913 -58.092025,46.608913 z M -58.092025,60.681408 C -61.503539,60.681408 -64.275393,57.909553 -64.275393,54.498038 C -64.275393,51.086525 -61.503539,48.31467 -58.092025,48.31467 C -54.68051,48.31467 -51.908656,51.086525 -51.908656,54.498038 C -51.908656,57.909553 -54.68051,60.681408 -58.092025,60.681408 z "
|
||||
id="path1882" />
|
||||
<path
|
||||
style="fill:url(#radialGradient5536);fill-rule:nonzero;stroke:none;stroke-width:0.85650003;stroke-miterlimit:4"
|
||||
d="M -78.861965,46.608913 C -83.126357,46.608913 -86.751091,50.233647 -86.751091,54.498038 C -86.751091,58.762431 -83.126357,62.387164 -78.861965,62.387164 C -74.597572,62.387164 -70.972839,58.762431 -70.972839,54.498038 C -70.972839,50.233647 -74.597572,46.608913 -78.861965,46.608913 L -78.861965,46.608913 z M -78.861965,60.681408 C -82.273479,60.681408 -85.045334,57.909553 -85.045334,54.498038 C -85.045334,51.086525 -82.273479,48.31467 -78.861965,48.31467 C -75.450451,48.31467 -72.678596,51.086525 -72.678596,54.498038 C -72.678596,57.909553 -75.450451,60.681408 -78.861965,60.681408 L -78.861965,60.681408 z "
|
||||
id="path1917" />
|
||||
<path
|
||||
style="fill:url(#radialGradient5538);fill-rule:nonzero;stroke:none;stroke-width:0.85650003;stroke-miterlimit:4"
|
||||
d="M -78.861965,25.199314 C -83.126357,25.199314 -86.751091,28.824047 -86.751091,33.08844 C -86.751091,37.352831 -83.126357,40.977565 -78.861965,40.977565 C -74.597572,40.977565 -70.972839,37.352831 -70.972839,33.08844 C -70.972839,28.824047 -74.597572,25.199314 -78.861965,25.199314 L -78.861965,25.199314 z M -78.861965,39.271808 C -82.273479,39.271808 -85.045334,36.499953 -85.045334,33.08844 C -85.045334,29.676926 -82.273479,26.905071 -78.861965,26.905071 C -75.450451,26.905071 -72.678596,29.676926 -72.678596,33.08844 C -72.678596,36.499953 -75.66367,39.271808 -78.861965,39.271808 z "
|
||||
id="path1952" />
|
||||
<path
|
||||
style="fill:url(#radialGradient5540);fill-rule:nonzero;stroke:none;stroke-width:0.85650003;stroke-miterlimit:4"
|
||||
d="M -58.092025,41.190784 C -53.827633,41.190784 -50.202899,37.566052 -50.202899,33.301659 C -50.202899,29.037267 -53.827633,25.412533 -58.092025,25.412533 C -62.356416,25.412533 -65.98115,29.037267 -65.98115,33.301659 C -65.98115,37.566052 -62.356416,41.190784 -58.092025,41.190784 z M -58.092025,27.11829 C -54.68051,27.11829 -51.908656,29.890145 -51.908656,33.301659 C -51.908656,36.713173 -54.68051,39.485028 -58.092025,39.485028 C -61.503539,39.485028 -64.275393,36.713173 -64.275393,33.301659 C -64.275393,29.890145 -61.503539,27.11829 -58.092025,27.11829 L -58.092025,27.11829 z "
|
||||
id="path1987" />
|
||||
<path
|
||||
style="fill:url(#radialGradient5542);fill-rule:nonzero;stroke:#606060;stroke-width:0.99830979;stroke-miterlimit:4;stroke-opacity:1"
|
||||
d="M -87.453541,43.899849 C -87.453541,54.34761 -78.924756,62.876395 -68.476995,62.876395 C -58.029234,62.876395 -49.500449,54.34761 -49.500449,43.899849 C -49.500449,33.452087 -58.029234,24.923303 -68.476995,24.923303 C -78.924756,24.923303 -87.453541,33.452087 -87.453541,43.899849 L -87.453541,43.899849 z M -75.939682,43.899849 C -75.939682,39.848676 -72.528167,36.437162 -68.476995,36.437162 C -64.425823,36.437162 -61.014308,39.848676 -61.014308,43.899849 C -61.014308,47.951021 -64.425823,51.362535 -68.476995,51.362535 C -72.528167,51.362535 -75.939682,47.951021 -75.939682,43.899849 z "
|
||||
id="path2012" />
|
||||
<path
|
||||
sodipodi:nodetypes="cccccc"
|
||||
style="fill:url(#radialGradient5544);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.85650003;stroke-miterlimit:4"
|
||||
d="M -84.883844,52.723884 L -75.536351,47.336095 C -74.538612,49.132025 -73.802921,49.773966 -72.144039,50.822157 L -76.702387,60.506246 C -79.695604,59.30896 -83.686558,55.318005 -84.883844,52.723884 L -84.883844,52.723884 z "
|
||||
id="path2033" />
|
||||
<path
|
||||
sodipodi:nodetypes="cccccc"
|
||||
style="fill:url(#radialGradient5546);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.85650003;stroke-miterlimit:4"
|
||||
d="M -59.511565,60.324218 L -64.93495,50.898568 C -63.304238,49.98294 -62.464893,49.112937 -61.469299,47.435433 L -51.632647,52.04732 C -52.844788,55.075455 -56.885259,59.112966 -59.511565,60.324218 L -59.511565,60.324218 z "
|
||||
id="path2058" />
|
||||
<path
|
||||
sodipodi:nodetypes="ccccc"
|
||||
style="fill:url(#radialGradient5548);fill-rule:nonzero;stroke:none;stroke-width:0.85650003;stroke-miterlimit:4"
|
||||
d="M -52.132645,35.064095 L -61.419592,40.399149 C -62.438815,38.683298 -63.291694,37.955419 -64.7787,37.04004 L -60.234024,27.357905 C -57.270105,28.543473 -53.318213,32.29777 -52.132645,35.064095 z "
|
||||
id="path2081" />
|
||||
<path
|
||||
sodipodi:nodetypes="ccccc"
|
||||
style="fill:url(#radialGradient5550);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.85650003;stroke-miterlimit:4"
|
||||
d="M -77.30103,27.493 L -71.913242,36.871743 C -73.709171,37.869482 -74.507362,38.605173 -75.399303,40.232805 L -85.083392,35.674457 C -83.886106,32.68124 -80.094699,28.690286 -77.30103,27.493 z "
|
||||
id="path2098" />
|
||||
<path
|
||||
sodipodi:nodetypes="cccccc"
|
||||
id="path3636"
|
||||
d="M -86.476208,43.899847 C -86.476208,53.809524 -78.386675,61.899058 -68.476997,61.899058 C -58.567319,61.899058 -50.477785,53.809524 -50.477785,43.899847 C -50.477785,33.990168 -58.567319,25.900636 -68.476997,25.900636 C -78.386675,25.900636 -86.476208,33.990168 -86.476208,43.899847 L -86.476208,43.899847 z "
|
||||
style="fill:none;fill-rule:nonzero;stroke:url(#linearGradient5552);stroke-width:1.16556895;stroke-miterlimit:4;stroke-opacity:1" />
|
||||
<path
|
||||
style="color:#000000;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:url(#linearGradient5554);stroke-width:1.16556895;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
|
||||
d="M -76.812037,43.899853 C -76.812037,48.488813 -73.065946,52.234903 -68.476987,52.234903 C -63.888027,52.234903 -60.141936,48.488813 -60.141936,43.899853 C -60.141936,39.310893 -63.888027,35.564803 -68.476987,35.564803 C -73.065946,35.564803 -76.812037,39.310893 -76.812037,43.899853 L -76.812037,43.899853 z "
|
||||
id="path3638"
|
||||
sodipodi:nodetypes="cccccc" />
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 27 KiB |
357
design/icons/inaccessible_tango_emblem-unreadable.svg
Normal file
|
@ -0,0 +1,357 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://web.resource.org/cc/"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
inkscape:export-ydpi="90.000000"
|
||||
inkscape:export-xdpi="90.000000"
|
||||
inkscape:export-filename="/home/jimmac/Desktop/wi-fi.png"
|
||||
width="48px"
|
||||
height="48px"
|
||||
id="svg11300"
|
||||
sodipodi:version="0.32"
|
||||
inkscape:version="0.43+devel"
|
||||
sodipodi:docbase="/home/jimmac/src/cvs/tango-icon-theme/scalable/emblems"
|
||||
sodipodi:docname="emblem-unreadable.svg">
|
||||
<defs
|
||||
id="defs3">
|
||||
<radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient5060"
|
||||
id="radialGradient6719"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(-2.774389,0,0,1.969706,112.7623,-872.8854)"
|
||||
cx="605.71429"
|
||||
cy="486.64789"
|
||||
fx="605.71429"
|
||||
fy="486.64789"
|
||||
r="117.14286" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
id="linearGradient5060">
|
||||
<stop
|
||||
style="stop-color:black;stop-opacity:1;"
|
||||
offset="0"
|
||||