cryptal  latest
Cryptography Abstraction Layer
ComposerInstaller.php
1 <?php
2 
3 namespace fpoirotte\Cryptal;
4 
11 
16 class ComposerInstaller extends LibraryInstaller
17 {
18  private function callEntryPoints($eps, $autoload, $wrapper)
19  {
20  $loader = new ClassLoader();
21  if (isset($autoload['psr-0'])) {
22  foreach ($autoload['psr-0'] as $prefix => $path) {
23  $loader->set($prefix, $path);
24  }
25  }
26  if (isset($autoload['psr-4'])) {
27  foreach ($autoload['psr-4'] as $prefix => $path) {
28  $loader->setPsr4($prefix, $path);
29  }
30  }
31 
32  $loader->register();
33  foreach ((array) $eps as $ep) {
34  if (!class_exists($ep, false)) {
35  $loader->loadClass($ep);
36  }
37 
38  $interfaces = (array) class_implements($ep);
39  if (!in_array('fpoirotte\\Cryptal\\Implementers\\PluginInterface', $interfaces)) {
40  throw new \InvalidArgumentException('Invalid entry point: ' . $ep);
41  }
42 
43  call_user_func("$ep::registerAlgorithms", $wrapper);
44  }
45  $loader->unregister();
46  }
47 
48  public function install(InstalledRepositoryInterface $repo, PackageInterface $package)
49  {
50  $extra = $package->getExtra();
51  if (empty($extra['cryptal.entrypoint'])) {
52  throw new \UnexpectedValueException('Error while installing ' . $package->getPrettyName() .
53  ', cryptal-plugin packages should have an entry point ' .
54  'defined in their extra key to be usable.');
55  }
56 
57  $res = parent::install($repo, $package);
58 
59  try {
60  $registry = Registry::getInstance();
61  $wrapper = new RegistryWrapper($registry, $package->getPrettyName());
62  $this->callEntryPoints($extra['cryptal.entrypoint'], $package->getAutoload(), $wrapper);
63  $registry->save();
64  } catch (\Exception $e) {
65  $this->io->writeError('Cryptal plugin installation failed, rolling back');
66  parent::uninstall($repo, $package);
67  throw $e;
68  }
69 
70  return $res;
71  }
72 
73  public function update(InstalledRepositoryInterface $repo, PackageInterface $initial, PackageInterface $target)
74  {
75  $extra = $target->getExtra();
76  if (empty($extra['cryptal.entrypoint'])) {
77  throw new \UnexpectedValueException('Error while installing ' . $target->getPrettyName() .
78  ', cryptal-plugin packages should have an entry point ' .
79  'defined in their extra key to be usable.');
80  }
81 
82  $res = parent::update($repo, $initial, $target);
83 
84  try {
85  $registry = Registry::getInstance();
86  $registry->removeAlgorithms($initial->getPrettyName());
87  $wrapper = new RegistryWrapper($registry, $target->getPrettyName());
88  $this->callEntryPoints($extra['cryptal.entrypoint'], $target->getAutoload(), $wrapper);
89  $registry->save();
90  } catch (\Exception $e) {
91  $this->io->writeError('Cryptal plugin update failed, rolling back');
92  parent::install($repo, $initial);
93  throw $e;
94  }
95 
96  return $res;
97  }
98 
99  public function uninstall(InstalledRepositoryInterface $repo, PackageInterface $package)
100  {
101  $res = parent::uninstall($repo, $package);
102  $registry = Registry::getInstance();
103  $registry->removeAlgorithms($package->getPrettyName());
104  $registry->save();
105  return $res;
106  }
107 
108  public function supports($packageType)
109  {
110  return 'cryptal-plugin' === $packageType;
111  }
112 
113  public function registerRootPackage(PackageInterface $package)
114  {
115  $extra = $package->getExtra();
116  if (empty($extra['cryptal.entrypoint'])) {
117  throw new \UnexpectedValueException('Error while installing ' . $package->getPrettyName() .
118  ', cryptal-plugin packages should have an entry point ' .
119  'defined in their extra key to be usable.');
120  }
121 
122  try {
123  $registry = Registry::getInstance();
124  $registry->removeAlgorithms($package->getPrettyName());
125  $wrapper = new RegistryWrapper($registry, $package->getPrettyName());
126  $this->callEntryPoints($extra['cryptal.entrypoint'], $package->getAutoload(), $wrapper);
127  $registry->save();
128  } catch (\Exception $e) {
129  $this->io->writeError('Cryptal plugin registration failed');
130  throw $e;
131  }
132  }
133 }