/
CAuth2.php
138 lines (116 loc) · 2.81 KB
/
CAuth2.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
<?php
/**
* Created by PhpStorm.
* User: AyGLR
* Date: 23/01/16
* Time: 21:53
*/
namespace Hoathis\CAuth;
final class CAuth2
{
const ELEMENT_VOID = '<void/>';
/**
* @var Crawler
*/
public $crawler;
/**
* @var Form
*/
public $form;
/**
* @var string
*/
public $xpath;
/**
* @var \SimpleXMLElement
*/
private $_source;
/**
* @return CAuth2
*/
public static function create()
{
return new self();
}
/**
* CAuth constructor.
*/
public function __construct()
{
$this->crawler = new Crawler();
$this->form = new Form();
$this->xpath = '//form';
$this->_source = new \SimpleXMLElement(self::ELEMENT_VOID);
}
/**
* @param string $url
* @param string $clientId
* @param string $scope
* @return $this
* @throws NoFormException
*/
public function open($url, $clientId, $scope = '')
{
$this->_source = new \SimpleXMLElement(self::ELEMENT_VOID);
$this->crawler
->setUrl($url)
->setClientId($clientId)
->setScope($scope)
->setRedirectUri('http://localhost');
$this->_source = $this->crawler
->load()
->extractSimpleXmlForm($this->xpath);
return $this;
}
/**
* @param array $completions
* @param array $uninputs
* @return $this
* @throws ErrorException
* @throws NoLocationException
* @throws StateException
* @throws \Exception
*/
public function submit(array $completions, array $uninputs = [])
{
$this->form
->setSimpleXMLForm($this->_source)
->addCompletions($completions);
foreach ($uninputs as $uninput) {
$this->form->removeInput($uninput);
}
$method = 'get';
$action = $this->crawler->getUrl();
if ($this->form->hasAttribute('method')) {
$method = $this->form->getAttribute('method');
}
if ($this->form->hasAttribute('action')) {
$action = $this->form->getAttribute('action');
if (isset($action[0])) {
if ('/' === $action[0]) {
$action = $this->crawler->getBaseUrl() . $action;
} else {
throw new \Exception("TODO: " . __FILE__ . " L" . __LINE__);
}
}
}
$this->crawler->submit($method, $action, $this->form->getData());
return $this;
}
/**
* @return string
*/
public function getCode()
{
return $this->crawler->getCode();
}
/**
* @param $message
* @return $this
*/
public function write($message)
{
echo $message, PHP_EOL;
return $this;
}
}