|
1 | 1 | #!/usr/bin/env python |
2 | 2 |
|
3 | | -import sys |
4 | | - |
5 | | -try: |
6 | | - from urllib.parse import urljoin |
7 | | -except ImportError: |
8 | | - from urlparse import urljoin |
9 | | - |
10 | | -from bs4 import BeautifulSoup |
11 | | -import requests |
12 | | - |
13 | | -endpoint = "http://localhost:8080" |
14 | | -root_route = urljoin(endpoint, "/") |
15 | | -sign_in_route = urljoin(endpoint, "/users/sign_in") |
16 | | -pat_route = urljoin(endpoint, "/profile/personal_access_tokens") |
17 | | - |
18 | | -login = "root" |
19 | | -password = "5iveL!fe" |
20 | | - |
21 | | - |
22 | | -def find_csrf_token(text): |
23 | | - soup = BeautifulSoup(text, "lxml") |
24 | | - token = soup.find(attrs={"name": "csrf-token"}) |
25 | | - param = soup.find(attrs={"name": "csrf-param"}) |
26 | | - data = {param.get("content"): token.get("content")} |
27 | | - return data |
28 | | - |
29 | | - |
30 | | -def obtain_csrf_token(): |
31 | | - r = requests.get(root_route) |
32 | | - token = find_csrf_token(r.text) |
33 | | - return token, r.cookies |
34 | | - |
35 | | - |
36 | | -def sign_in(csrf, cookies): |
37 | | - data = {"user[login]": login, "user[password]": password} |
38 | | - data.update(csrf) |
39 | | - r = requests.post(sign_in_route, data=data, cookies=cookies) |
40 | | - token = find_csrf_token(r.text) |
41 | | - return token, r.history[0].cookies |
42 | | - |
43 | | - |
44 | | -def obtain_personal_access_token(name, csrf, cookies): |
45 | | - data = { |
46 | | - "personal_access_token[name]": name, |
47 | | - "personal_access_token[scopes][]": ["api", "sudo"], |
48 | | - } |
49 | | - data.update(csrf) |
50 | | - r = requests.post(pat_route, data=data, cookies=cookies) |
51 | | - soup = BeautifulSoup(r.text, "lxml") |
52 | | - token = soup.find("input", id="created-personal-access-token").get("value") |
53 | | - return token |
| 3 | +from six.moves.urllib.parse import urljoin |
| 4 | +from requests_html import HTMLSession |
| 5 | + |
| 6 | +ENDPOINT = "http://localhost:8080" |
| 7 | +LOGIN = "root" |
| 8 | +PASSWORD = "5iveL!fe" |
| 9 | + |
| 10 | + |
| 11 | +class GitlabSession(HTMLSession): |
| 12 | + def __init__(self, endpoint, *args, **kwargs): |
| 13 | + super().__init__(*args, **kwargs) |
| 14 | + self.endpoint = endpoint |
| 15 | + self.csrf = None |
| 16 | + |
| 17 | + def find_csrf_token(self, html): |
| 18 | + param = html.find("meta[name=csrf-param]")[0].attrs["content"] |
| 19 | + token = html.find("meta[name=csrf-token]")[0].attrs["content"] |
| 20 | + self.csrf = {param: token} |
| 21 | + |
| 22 | + def obtain_csrf_token(self): |
| 23 | + r = self.get(urljoin(self.endpoint, "/")) |
| 24 | + self.find_csrf_token(r.html) |
| 25 | + |
| 26 | + def sign_in(self, login, password): |
| 27 | + data = {"user[login]": login, "user[password]": password, **self.csrf} |
| 28 | + r = self.post(urljoin(self.endpoint, "/users/sign_in"), data=data) |
| 29 | + self.find_csrf_token(r.html) |
| 30 | + |
| 31 | + def obtain_personal_access_token(self, name): |
| 32 | + data = { |
| 33 | + "personal_access_token[name]": name, |
| 34 | + "personal_access_token[scopes][]": ["api", "sudo"], |
| 35 | + **self.csrf, |
| 36 | + } |
| 37 | + r = self.post( |
| 38 | + urljoin(self.endpoint, "/profile/personal_access_tokens"), data=data |
| 39 | + ) |
| 40 | + return r.html.find("#created-personal-access-token")[0].attrs["value"] |
54 | 41 |
|
55 | 42 |
|
56 | 43 | def main(): |
57 | | - csrf1, cookies1 = obtain_csrf_token() |
58 | | - csrf2, cookies2 = sign_in(csrf1, cookies1) |
59 | | - |
60 | | - token = obtain_personal_access_token("default", csrf2, cookies2) |
61 | | - print(token) |
| 44 | + with GitlabSession(ENDPOINT) as s: |
| 45 | + s.obtain_csrf_token() |
| 46 | + s.sign_in(LOGIN, PASSWORD) |
| 47 | + print(s.obtain_personal_access_token("default")) |
62 | 48 |
|
63 | 49 |
|
64 | 50 | if __name__ == "__main__": |
|
0 commit comments