租房小程序前端代码
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

338 lines
9.5 KiB

3 months ago
  1. const assert = require('assert');
  2. const { isArray } = require('./common/utils/isArray');
  3. const { checkBucketName: _checkBucketName } = require('../lib/common/utils/checkBucketName');
  4. const { formatTag } = require('../lib/common/utils/formatTag');
  5. const proto = exports;
  6. function toArray(obj) {
  7. if (!obj) return [];
  8. if (isArray(obj)) return obj;
  9. return [obj];
  10. }
  11. /**
  12. * Bucket opertaions
  13. */
  14. proto.listBuckets = async function listBuckets(query = {}, options = {}) {
  15. // prefix, marker, max-keys
  16. const { subres = {} } = query;
  17. const rest = {};
  18. for (const key in query) {
  19. if (key !== 'subres') {
  20. rest[key] = query[key];
  21. }
  22. }
  23. const params = this._bucketRequestParams('GET', '', Object.assign(subres, options.subres), options);
  24. params.query = rest;
  25. const result = await this.request(params);
  26. if (result.status === 200) {
  27. const data = await this.parseXML(result.data);
  28. let buckets = data.Buckets || null;
  29. if (buckets) {
  30. if (buckets.Bucket) {
  31. buckets = buckets.Bucket;
  32. }
  33. if (!isArray(buckets)) {
  34. buckets = [buckets];
  35. }
  36. buckets = buckets.map(item => ({
  37. name: item.Name,
  38. region: item.Location,
  39. creationDate: item.CreationDate,
  40. storageClass: item.StorageClass,
  41. StorageClass: item.StorageClass,
  42. tag: formatTag(item)
  43. }));
  44. }
  45. return {
  46. buckets,
  47. owner: {
  48. id: data.Owner.ID,
  49. displayName: data.Owner.DisplayName
  50. },
  51. isTruncated: data.IsTruncated === 'true',
  52. nextMarker: data.NextMarker || null,
  53. res: result.res
  54. };
  55. }
  56. throw await this.requestError(result);
  57. };
  58. proto.useBucket = function useBucket(name) {
  59. _checkBucketName(name);
  60. return this.setBucket(name);
  61. };
  62. proto.setBucket = function useBucket(name) {
  63. _checkBucketName(name);
  64. this.options.bucket = name;
  65. return this;
  66. };
  67. proto.getBucket = function getBucket() {
  68. return this.options.bucket;
  69. };
  70. proto.getBucketLocation = async function getBucketLocation(name, options) {
  71. _checkBucketName(name);
  72. name = name || this.getBucket();
  73. const params = this._bucketRequestParams('GET', name, 'location', options);
  74. params.successStatuses = [200];
  75. params.xmlResponse = true;
  76. const result = await this.request(params);
  77. return {
  78. location: result.data,
  79. res: result.res
  80. };
  81. };
  82. proto.getBucketInfo = async function getBucketInfo(name, options) {
  83. _checkBucketName(name);
  84. name = name || this.getBucket();
  85. const params = this._bucketRequestParams('GET', name, 'bucketInfo', options);
  86. params.successStatuses = [200];
  87. params.xmlResponse = true;
  88. const result = await this.request(params);
  89. return {
  90. bucket: result.data.Bucket,
  91. res: result.res
  92. };
  93. };
  94. proto.deleteBucket = async function deleteBucket(name, options) {
  95. _checkBucketName(name);
  96. const params = this._bucketRequestParams('DELETE', name, '', options);
  97. const result = await this.request(params);
  98. if (result.status === 200 || result.status === 204) {
  99. return {
  100. res: result.res
  101. };
  102. }
  103. throw await this.requestError(result);
  104. };
  105. // acl
  106. proto.putBucketACL = async function putBucketACL(name, acl, options) {
  107. _checkBucketName(name);
  108. const params = this._bucketRequestParams('PUT', name, 'acl', options);
  109. params.headers = {
  110. 'x-oss-acl': acl
  111. };
  112. params.successStatuses = [200];
  113. const result = await this.request(params);
  114. return {
  115. bucket: (result.headers.location && result.headers.location.substring(1)) || null,
  116. res: result.res
  117. };
  118. };
  119. proto.getBucketACL = async function getBucketACL(name, options) {
  120. _checkBucketName(name);
  121. const params = this._bucketRequestParams('GET', name, 'acl', options);
  122. params.successStatuses = [200];
  123. params.xmlResponse = true;
  124. const result = await this.request(params);
  125. return {
  126. acl: result.data.AccessControlList.Grant,
  127. owner: {
  128. id: result.data.Owner.ID,
  129. displayName: result.data.Owner.DisplayName
  130. },
  131. res: result.res
  132. };
  133. };
  134. // logging
  135. proto.putBucketLogging = async function putBucketLogging(name, prefix, options) {
  136. _checkBucketName(name);
  137. const params = this._bucketRequestParams('PUT', name, 'logging', options);
  138. let xml = `${'<?xml version="1.0" encoding="UTF-8"?>\n<BucketLoggingStatus>\n<LoggingEnabled>\n<TargetBucket>'}${name}</TargetBucket>\n`;
  139. if (prefix) {
  140. xml += `<TargetPrefix>${prefix}</TargetPrefix>\n`;
  141. }
  142. xml += '</LoggingEnabled>\n</BucketLoggingStatus>';
  143. params.content = xml;
  144. params.mime = 'xml';
  145. params.successStatuses = [200];
  146. const result = await this.request(params);
  147. return {
  148. res: result.res
  149. };
  150. };
  151. proto.getBucketLogging = async function getBucketLogging(name, options) {
  152. _checkBucketName(name);
  153. const params = this._bucketRequestParams('GET', name, 'logging', options);
  154. params.successStatuses = [200];
  155. params.xmlResponse = true;
  156. const result = await this.request(params);
  157. const enable = result.data.LoggingEnabled;
  158. return {
  159. enable: !!enable,
  160. prefix: (enable && enable.TargetPrefix) || null,
  161. res: result.res
  162. };
  163. };
  164. proto.deleteBucketLogging = async function deleteBucketLogging(name, options) {
  165. _checkBucketName(name);
  166. const params = this._bucketRequestParams('DELETE', name, 'logging', options);
  167. params.successStatuses = [204, 200];
  168. const result = await this.request(params);
  169. return {
  170. res: result.res
  171. };
  172. };
  173. proto.putBucketCORS = async function putBucketCORS(name, rules, options) {
  174. _checkBucketName(name);
  175. rules = rules || [];
  176. assert(rules.length, 'rules is required');
  177. rules.forEach(rule => {
  178. assert(rule.allowedOrigin, 'allowedOrigin is required');
  179. assert(rule.allowedMethod, 'allowedMethod is required');
  180. });
  181. const params = this._bucketRequestParams('PUT', name, 'cors', options);
  182. let xml = '<?xml version="1.0" encoding="UTF-8"?>\n<CORSConfiguration>';
  183. const parseOrigin = val => {
  184. xml += `<AllowedOrigin>${val}</AllowedOrigin>`;
  185. };
  186. const parseMethod = val => {
  187. xml += `<AllowedMethod>${val}</AllowedMethod>`;
  188. };
  189. const parseHeader = val => {
  190. xml += `<AllowedHeader>${val}</AllowedHeader>`;
  191. };
  192. const parseExposeHeader = val => {
  193. xml += `<ExposeHeader>${val}</ExposeHeader>`;
  194. };
  195. for (let i = 0, l = rules.length; i < l; i++) {
  196. const rule = rules[i];
  197. xml += '<CORSRule>';
  198. toArray(rule.allowedOrigin).forEach(parseOrigin);
  199. toArray(rule.allowedMethod).forEach(parseMethod);
  200. toArray(rule.allowedHeader).forEach(parseHeader);
  201. toArray(rule.exposeHeader).forEach(parseExposeHeader);
  202. if (rule.maxAgeSeconds) {
  203. xml += `<MaxAgeSeconds>${rule.maxAgeSeconds}</MaxAgeSeconds>`;
  204. }
  205. xml += '</CORSRule>';
  206. }
  207. xml += '</CORSConfiguration>';
  208. params.content = xml;
  209. params.mime = 'xml';
  210. params.successStatuses = [200];
  211. const result = await this.request(params);
  212. return {
  213. res: result.res
  214. };
  215. };
  216. proto.getBucketCORS = async function getBucketCORS(name, options) {
  217. _checkBucketName(name);
  218. const params = this._bucketRequestParams('GET', name, 'cors', options);
  219. params.successStatuses = [200];
  220. params.xmlResponse = true;
  221. const result = await this.request(params);
  222. const rules = [];
  223. if (result.data && result.data.CORSRule) {
  224. let { CORSRule } = result.data;
  225. if (!isArray(CORSRule)) CORSRule = [CORSRule];
  226. CORSRule.forEach(rule => {
  227. const r = {};
  228. Object.keys(rule).forEach(key => {
  229. r[key.slice(0, 1).toLowerCase() + key.slice(1, key.length)] = rule[key];
  230. });
  231. rules.push(r);
  232. });
  233. }
  234. return {
  235. rules,
  236. res: result.res
  237. };
  238. };
  239. proto.deleteBucketCORS = async function deleteBucketCORS(name, options) {
  240. _checkBucketName(name);
  241. const params = this._bucketRequestParams('DELETE', name, 'cors', options);
  242. params.successStatuses = [204];
  243. const result = await this.request(params);
  244. return {
  245. res: result.res
  246. };
  247. };
  248. // referer
  249. proto.putBucketReferer = async function putBucketReferer(name, allowEmpty, referers, options) {
  250. _checkBucketName(name);
  251. const params = this._bucketRequestParams('PUT', name, 'referer', options);
  252. let xml = '<?xml version="1.0" encoding="UTF-8"?>\n<RefererConfiguration>\n';
  253. xml += ` <AllowEmptyReferer>${allowEmpty ? 'true' : 'false'}</AllowEmptyReferer>\n`;
  254. if (referers && referers.length > 0) {
  255. xml += ' <RefererList>\n';
  256. for (let i = 0; i < referers.length; i++) {
  257. xml += ` <Referer>${referers[i]}</Referer>\n`;
  258. }
  259. xml += ' </RefererList>\n';
  260. } else {
  261. xml += ' <RefererList />\n';
  262. }
  263. xml += '</RefererConfiguration>';
  264. params.content = xml;
  265. params.mime = 'xml';
  266. params.successStatuses = [200];
  267. const result = await this.request(params);
  268. return {
  269. res: result.res
  270. };
  271. };
  272. proto.getBucketReferer = async function getBucketReferer(name, options) {
  273. _checkBucketName(name);
  274. const params = this._bucketRequestParams('GET', name, 'referer', options);
  275. params.successStatuses = [200];
  276. params.xmlResponse = true;
  277. const result = await this.request(params);
  278. let referers = result.data.RefererList.Referer || null;
  279. if (referers) {
  280. if (!isArray(referers)) {
  281. referers = [referers];
  282. }
  283. }
  284. return {
  285. allowEmpty: result.data.AllowEmptyReferer === 'true',
  286. referers,
  287. res: result.res
  288. };
  289. };
  290. proto.deleteBucketReferer = async function deleteBucketReferer(name, options) {
  291. _checkBucketName(name);
  292. return await this.putBucketReferer(name, true, null, options);
  293. };
  294. // private apis
  295. proto._bucketRequestParams = function _bucketRequestParams(method, bucket, subres, options) {
  296. return {
  297. method,
  298. bucket,
  299. subres,
  300. headers: options && options.headers,
  301. additionalHeaders: options && options.additionalHeaders,
  302. timeout: options && options.timeout,
  303. ctx: options && options.ctx
  304. };
  305. };